西安網(wǎng)站建設(shè)開發(fā)查派谷歌seo排名公司
文章目錄
- 1. 網(wǎng)絡(luò)層
- 2. IP協(xié)議
- 2.1 協(xié)議頭格式
- 3. 網(wǎng)段劃分
- 3.1 特殊的IP地址
- 3.2 IP地址的數(shù)量限制
- 4. 私有IP地址和公網(wǎng)IP地址
1. 網(wǎng)絡(luò)層
在應(yīng)用層解決了如何讀取完整報文、序列化反序列化、協(xié)議處理問題。在傳輸層解決了可靠性問題。那么網(wǎng)絡(luò)層IP的作用是在復(fù)雜的網(wǎng)絡(luò)環(huán)境中確定一個合適的路徑,將數(shù)據(jù)從A主機送到B主機。
2. IP協(xié)議
主機:配有IP地址,但是不進行路由控制的設(shè)備。
路由器:即配有IP地址,又能進行路由控制。
節(jié)點:主機和路由器的統(tǒng)稱。
2.1 協(xié)議頭格式
4位版本號(version):指定IP協(xié)議的版本,對于IPv4來說就是4。
4位頭部長度: IP頭部的長度是多少個32bit,也就是 length * 4 的字節(jié)數(shù),4bit表示最大的數(shù)字是15,因此IP頭部最大長度是60字節(jié)。這里和TCP報頭理解是一樣的。
8位服務(wù)類型:3位優(yōu)先權(quán)字段(已經(jīng)棄用),4位TOS字段,和1位保留字段(必須置為0)。4位TOS分別表示:最小延時,最大吞吐量,最高可靠性,最小成本。這四者相互沖突,只能選擇一個。對于ssh/telnet這樣的應(yīng)用程序,最小延時比較重要。對于ftp這樣的程序,最大吞吐量比較重要。不過這個一般不用了。
16位總長度:IP數(shù)據(jù)報整體占多少個字節(jié)。
16位頭部校驗和: 使用CRC進行校驗,來鑒別頭部是否損壞。
32位源地址和32位目標(biāo)地址:表示發(fā)送端和接收端。
那么IP協(xié)議如何給上層進行分用呢?是交付給TCP還是UDP呢?
在報頭中,有8位協(xié)議: 表示上層協(xié)議的類型。
如果由于網(wǎng)絡(luò)的BUG或者對端主機不可達等不可控因素的存在,導(dǎo)致IP報文在網(wǎng)絡(luò)中長時間游離,而不消失。該怎么辦呢?
8位生存時間:數(shù)據(jù)報到達目的地的最大報文跳數(shù)。一般是64,每次經(jīng)過一個路由,TTL -= 1,一直減到0還沒到達,那么就丟棄了。這個字段主要是用來防止出現(xiàn)路由循環(huán)。
我們要知道:數(shù)據(jù)在網(wǎng)絡(luò)層后還需要傳給數(shù)據(jù)鏈路層,但是數(shù)據(jù)鏈路層有個規(guī)定:為了減小傳輸時的碰撞,它單次發(fā)送的有效載荷是有限制的。所以就有了IP分片的問題。
需要對IP進行分片,是由誰來做?
是由發(fā)送方的網(wǎng)絡(luò)層來做的。
全部收到之后,是由誰來組裝呢?
是由對方的網(wǎng)絡(luò)層進行組裝。
如何進行組裝呢?
16位標(biāo)識(id):唯一的標(biāo)識主機發(fā)送的報文,如果IP報文在數(shù)據(jù)鏈路層被分片了,那么每一個片里面的這個id都是相同的。
也就是說,一個IP報文它的16位標(biāo)識是1234,如果被分片成3份,那么每份的報文的報頭里的16位標(biāo)識都是1234。
第一點我們要知道的是:我們要識別某個報文的分片的,還是沒有分片的。
3位標(biāo)志字段:第一位保留(保留的意思是現(xiàn)在不用,但是還沒想好說不定以后要用到)。第二位置為1表示禁止分片。這時候如果報文長度超過最大限制,IP模塊就會丟棄報文。第三位表示"更多分片", 如果分片了的話,最后一個分片置為0,其它是1。類似于一個結(jié)束標(biāo)記。
13位分片偏移:是分片相對于原始IP報文開始處的偏移。其實就是在表示當(dāng)前分片在原報文中處在哪個位置。實際偏移的字節(jié)數(shù)是這個值 * 8 得到的。因此,除了最后一個報文之外,其它報文的長度必須是8的整數(shù)倍(否則報文就不連續(xù)了)。
根據(jù)這兩個標(biāo)記位,只要更多分片是1或者更多分片為0但是偏移量不為0。只要滿足這兩點就說明報文被分片過。
第二點我們要將序號相同的報文收集到一起。
我們?nèi)绾闻袛辔覀兪占膱笪谋皇杖四?/strong>?
根據(jù)偏移量,偏移量為0就是開頭,然后下一個報文=上一個報文偏移量+上一個報文自身長度,這樣就能判斷有沒有缺失的了。
第三點我們要正確的把分片報文組裝起來。
這里就根據(jù)偏移量進行排序,然后組裝就行了。
如何進行分片呢?
分片之后,每一個分片也是一個獨立的IP報文,也要有報頭。
舉個例子:
假設(shè)傳輸層有2980個字節(jié)要傳給網(wǎng)絡(luò)層,網(wǎng)絡(luò)層加上報頭就是3000字節(jié),但單次傳輸?shù)纳舷奘?500,那么網(wǎng)絡(luò)層就需要分片。
這個例子,我們最少要分片成3份:
第一份:20+1480=1500
第二份:20+1480=1500
注意:分片下來的報文每個都需要添加自己的報頭。
兩個1480是2960,因為發(fā)送的有效載荷的大小是2980,所以還差20字節(jié)。那么第三份:20+20=40。這樣才是正確的分片。
但是無論是發(fā)送方還是接收方,分片和組裝行為,雙方的傳輸層是不知道的,它只關(guān)系完整的一個報文。
假設(shè)一個報文傳輸?shù)膩G包概率是1%,但是我們進行了分片,分成了3份,如果有一份丟失,就說明了整個報文丟失,那么丟包的概率就大大增加。其實網(wǎng)絡(luò)層進行分片,不是主流的。
那么分片對UDP和TCP有影響嗎?
當(dāng)然有影響,但是TCP有可靠性,可以重傳,但UDP的影響就大大增加了。所以,我們可以進行設(shè)置不進行分片。
那么如何減少分片呢?
其實網(wǎng)絡(luò)層不能決定分片還是不分片,這是由傳輸層決定的。網(wǎng)絡(luò)層只是負責(zé)這個工作。一般在三次握手的時候,就會協(xié)商單次傳輸數(shù)據(jù)的報文大小。
那么傳輸層單個報文的大小一般設(shè)置成為多少合適呢?
3. 網(wǎng)段劃分
IP的構(gòu)成:ip=目的網(wǎng)絡(luò)+目的主機。
網(wǎng)絡(luò)號:保證相互連接的兩個網(wǎng)段具有不同的標(biāo)識。
主機號:同一網(wǎng)段內(nèi),主機之間具有相同的網(wǎng)絡(luò)號,但是必須有不同的主機號。
IP在路由的時候,先根據(jù)目的網(wǎng)絡(luò)進行路由,找到目的網(wǎng)絡(luò)之后,再根據(jù)目的主機的主機號,進行數(shù)據(jù)轉(zhuǎn)發(fā)。
所以,子網(wǎng)劃分的作用是為了提高查找目標(biāo)主機的效率。
過去曾經(jīng)提出一種劃分網(wǎng)絡(luò)號和主機號的方案,把所有IP 地址分為五類:
隨著Internet的飛速發(fā)展,這種劃分方案的局限性很快顯現(xiàn)出來:例如申請了一個B類地址,理論上一個子網(wǎng)內(nèi)能允許6萬5千多個主機,A類地址的子網(wǎng)內(nèi)的主機數(shù)更多。然而實際網(wǎng)絡(luò)架設(shè)中不會存在一個子網(wǎng)內(nèi)有這么多的情況,因此大量的IP地址都被浪費掉了。
針對這種情況提出了新的劃分方案,稱為CIDR(Classless Interdomain Routing):
引入一個額外的子網(wǎng)掩碼(subnet mask)來區(qū)分網(wǎng)絡(luò)號和主機號。
子網(wǎng)掩碼也是一個32位的正整數(shù),通常用一串 “0” 來結(jié)尾。
將IP地址和子網(wǎng)掩碼進行 “按位與” 操作,得到的結(jié)果就是網(wǎng)絡(luò)號。
網(wǎng)絡(luò)號和主機號的劃分與這個IP地址是A類、B類還是C類無關(guān)。
下面舉兩個例子:
IP地址與子網(wǎng)掩碼做按位與運算可以得到網(wǎng)絡(luò)號,主機號從全0到全1就是子網(wǎng)的地址范圍。
IP地址和子網(wǎng)掩碼還有一種更簡潔的表示方法。例如140.252.20.68/24,表示IP地址為140.252.20.68,子網(wǎng)掩碼的高24位是1,也就是255.255.255.0。
3.1 特殊的IP地址
1. 將IP地址中的主機地址全部設(shè)為0,就成為了網(wǎng)絡(luò)號,代表這個局域網(wǎng)。
2. 將IP地址中的主機地址全部設(shè)為1,就成為了廣播地址,用于給同一個鏈路中相互連接的所有主機發(fā)送數(shù)據(jù)包。
3. 127.*的IP地址用于本機環(huán)回(loop back)測試,通常是127.0.0.1。
3.2 IP地址的數(shù)量限制
我們知道: IP地址(IPv4)是一個4字節(jié)32位的正整數(shù),那么一共只有2的32次方個IP地址,大概是43億左右。而TCP/IP協(xié)議規(guī)定:每個主機都需要有一個IP地址。
難道一共只有43億臺主機能接入網(wǎng)絡(luò)嗎?
并且由于一些特殊的IP地址的存在,數(shù)量遠不足43億,另外IP地址并非是按照主機臺數(shù)來配置的,而是每一個網(wǎng)卡都需要配置一個或多個IP地址。CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率,減少了浪費,但是IP地址的絕對上限并沒有增加),仍然不是很夠用。這時候有三種方式:
1.動態(tài)分配IP地址: 只給接入網(wǎng)絡(luò)的設(shè)備分配IP地址。因此同一個MAC地址的設(shè)備,每次接入互聯(lián)網(wǎng)中,得到的IP地址不一定是相同的。
2.IPv6: IPv6并不是IPv4的簡單升級版,這是互不相干的兩個協(xié)議,彼此并不兼容,IPv6用16字節(jié)128位來表示一個IP地址。但是目前IPv6還沒有普及。
前面兩種方法都不能很好的解決問題,但還有個NAT技術(shù)能解決這個問題。
4. 私有IP地址和公網(wǎng)IP地址
如果一個組織內(nèi)部組建局域網(wǎng),IP地址只用于局域網(wǎng)內(nèi)的通信,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC 1918規(guī)定了用于組建局域網(wǎng)的私有IP地址:
10.,前8位是網(wǎng)絡(luò)號,共16,777,216個地址。
172.16.到172.31.,前12位是網(wǎng)絡(luò)號,共1,048,576個地址。
192.168.,前16位是網(wǎng)絡(luò)號,共65,536個地址。
包含在這個范圍中的都成為私有IP,其余的則稱為全局IP(或公網(wǎng)IP)。
一個路由器可以配置兩個IP地址,一個是WAN口IP,一個是LAN口IP(子網(wǎng)IP)。路由器LAN口連接的主機,都從屬于當(dāng)前這個路由器的子網(wǎng)中。
所以,家用路由器和運營商路由器除了可以進行IP報文轉(zhuǎn)發(fā)之外,還可以構(gòu)建子網(wǎng)。
那么當(dāng)我們家里用的主機發(fā)送消息通過運營商路由器發(fā)送到公網(wǎng),然后它需要給我們響應(yīng),那么響應(yīng)的是我們家里的私有IP嗎?前面我們說過,私網(wǎng)IP是不能出現(xiàn)在公網(wǎng)上的。因為家用路由器的子網(wǎng)IP是可以一樣的。
那么發(fā)送到公網(wǎng)的消息流程如下:
我們要從家里主機發(fā)送到公網(wǎng),那么假設(shè)開始IP是:192.168.1.201,目的IP是:122.77.241.3。首先會發(fā)送到家用路由器,它會發(fā)現(xiàn)我們發(fā)送的數(shù)據(jù)不在家用路由器的子網(wǎng)內(nèi),就會把開始IP是:192.168.1.201,替換成家用路由器的WAN口IP:10.1.1.2,然后發(fā)送到運營商路由器,它也能發(fā)現(xiàn)我們發(fā)送的數(shù)據(jù)不在運營商路由器的子網(wǎng)內(nèi),會被開始IP:10.1.1.2替換成運營商路由器的WAN口IP:122.77.241.4,由此就可以訪問公網(wǎng)IP了。
子網(wǎng)內(nèi)的主機需要和外網(wǎng)進行通信時,路由器將IP首部中的IP地址進行替換(替換成WAN口IP),這樣逐級替換,最終數(shù)據(jù)包中的IP地址成為一個公網(wǎng)IP這種技術(shù)稱為NAT(Network Address Translation 網(wǎng)絡(luò)地址轉(zhuǎn)換)。
那么公網(wǎng)怎么把響應(yīng)發(fā)給我們呢?
這個后面再說。