TCP/IP(二):IP协议
IP協(xié)議處于OSI參考模型的第三層——網(wǎng)絡(luò)層,網(wǎng)絡(luò)層的主要作用是實現(xiàn)終端節(jié)點間的通信。IP協(xié)議是網(wǎng)絡(luò)層的一個重要協(xié)議,網(wǎng)絡(luò)層中還有ARP(獲取MAC地址)和ICMP協(xié)議(數(shù)據(jù)發(fā)送異常通知)
數(shù)據(jù)鏈路層的作用在于實現(xiàn)同一種數(shù)據(jù)鏈路下的包傳遞,而網(wǎng)絡(luò)層則可以實現(xiàn)跨越不同數(shù)據(jù)鏈路的包傳遞。比如主機A通過Wi-Fi連接到路由器B,路由器B通過以太網(wǎng)連接到路由器C,而路由器C又通過Wi-Fi與主機D保持連接。這時主機A向D發(fā)送的數(shù)據(jù)包就依賴于網(wǎng)絡(luò)層進行傳輸。
這篇文章主要介紹IP協(xié)議的基本知識和IP首部,IP協(xié)議可以分為三大作用模塊:IP尋址、路由和IP分包。
IP地址
IP地址是一種在網(wǎng)絡(luò)層用于識別通信對端信息的地址。它有別于數(shù)據(jù)鏈路層中的MAC地址,后者用于標識同一鏈路下不同的計算機。
舉一個形象的例子,我要從鎮(zhèn)江的家里去沈陽的東北大學,通信兩端的地址分別是家和學校,他們相當于IP地址。然而沒有交通工具可以讓我從家直接去學校,所以我先要打車去火車站,然后坐高鐵到沈陽站,再轉(zhuǎn)公交去學校。這三次中轉(zhuǎn)分別屬于三種交通方式(數(shù)據(jù)鏈路),每一次中轉(zhuǎn)都有起點和終點,他們就相當于MAC地址。每次中轉(zhuǎn)可以稱為一跳(Hop)
IP地址由32位正整數(shù)表示,為了直觀的表示,我們把它分成4個部分,每個部分由8位整數(shù)組成,對應(yīng)十進制的范圍就是0-255。
比如172.20.1.1可以表示為:10101100 00010100 00000001 00000001。轉(zhuǎn)換規(guī)則很簡單,就是分別把四個部分的十進制(0-255)與8位二進制數(shù)字進行轉(zhuǎn)換。
從功能上看,IP地址由兩部分組成:網(wǎng)絡(luò)標識和主機標識。
網(wǎng)絡(luò)標識用于區(qū)分不同的網(wǎng)段,相同段內(nèi)的主機必須擁有相同的網(wǎng)絡(luò)表示,不同段內(nèi)的主機不能擁有相同的網(wǎng)絡(luò)標識。
主機標識用于區(qū)分同一網(wǎng)段下不同的主機,它不能在同一網(wǎng)段內(nèi)重復出現(xiàn)。
32位IP地址被分為兩部分,到底前多少位是網(wǎng)絡(luò)標識呢?一般有兩種方法表示:IP地址分類、子網(wǎng)掩碼。
IP分類
IP地址分為四個級別,分別為A類、B類、C類和D類。分類的依據(jù)是IP地址的前四位:
A類IP地址是第一位為“0”的地址。A類IP地址的前8位是網(wǎng)絡(luò)標識,用十進制標識的話0.0.0.0-127.0.0.0是A類IP地址的理論范圍。另外我們還可以得知,A類IP地址最多只有128個(實際上是126個,下文不贅述),每個網(wǎng)段內(nèi)主機上限為2的24次方,也就是16,777,214個。
B類IP地址是前兩位為“10“的地址。B類IP地址的前16位是網(wǎng)絡(luò)標識,用十進制標識的話128.0.0.0-191.255.0.0是B類IP地址的范圍。B類IP地址的主機標記長度為16位,因此一個網(wǎng)段內(nèi)可容納主機地址上限為65534個。
C類IP地址是前三位為“110”的地址。C類IP地址的前24位是網(wǎng)絡(luò)標識,用十進制標識的話192.0.0.0-223.255.255.0是C類IP地址的范圍。C類地址的后8位是主機標識,共容納254個主機地址。
D類IP地址是前四位為“1110”的地址。D類IP地址的網(wǎng)絡(luò)標識長32位,沒有主機標識,因此常用于多播。
子網(wǎng)掩碼
IP地址總長度32位,它能表示的主機數(shù)量有限,大約在43億左右。而IP地址分類更是造成了極大的浪費,A、B類地址一共也就一萬多個,而世界上包含主機數(shù)量超過254的網(wǎng)段顯然不止這么點。
我們知道IP地址分類的本質(zhì)是區(qū)分網(wǎng)絡(luò)標識和主機標識,另一種更加靈活、細粒度的區(qū)分方法是使用子網(wǎng)掩碼。
子網(wǎng)掩碼長度也是32位,由一段連續(xù)的1和一段連續(xù)的0組成。1的長度就表示網(wǎng)絡(luò)標識的長度。以IP地址172.20.100.52為例,它本來是一個B類IP地址(前16位是網(wǎng)絡(luò)標識),但通過子網(wǎng)掩碼,它可以是前26為為網(wǎng)絡(luò)標識的IP地址:
子網(wǎng)掩碼
路由控制
路由控制(Routing)是指將分組數(shù)據(jù)發(fā)送到目標地址的功能,這個功能一般由路由器完成。(不要與家里用的小型無線路由器混為一談)
路由器中保存著路由控制表,它在路由控制表中查找目標IP地址對應(yīng)的下一個路由器地址。下圖描述了這一過程:
路由控制
主機A的地址是10.1.1.30,要把數(shù)據(jù)發(fā)往地址為10.1.2.10的主機。在主機A的路由表中,保存了兩個字段,由于目標地址10.1.2.10與10.1.1.0/24段不匹配,所以它被發(fā)往默認路由10.1.1.1也就是圖中路由器1的左側(cè)網(wǎng)卡的IP地址。
路由器1繼續(xù)在它自己的路由控制表中查找目標地址10.1.2.10,它發(fā)現(xiàn)目標地址屬于10.1.2.0/24這一段,因此將數(shù)據(jù)轉(zhuǎn)發(fā)至下一個路由器10.1.0.2,也就是路由器2的左側(cè)網(wǎng)卡的地址。
路由器2在自己的路由控制表中查找目標地址10.1.2.10,根據(jù)表中記錄將數(shù)據(jù)發(fā)往10.1.2.1接口,也就是自己的右側(cè)網(wǎng)卡的IP地址。主機B檢查目標IP地址和自己相同,于是接收數(shù)據(jù)。
路由控制表
路由控制的關(guān)鍵在于路由控制表,路由控制表可以由管理員手動設(shè)置,稱為靜態(tài)路由控制,但是估計大部分人沒這么干過。這是因為路由器可以喝其他路由器互換信息比即使自動刷新路由表,這個信息交換的協(xié)議并沒有在IP協(xié)議中定義,而是由一個叫做“路由協(xié)議”的協(xié)議管理。
環(huán)路
上圖中,假設(shè)主機A向一個不存在的IP地址發(fā)送數(shù)據(jù),并且路由器1、2、3設(shè)置的默認路由形成了一個循環(huán),那么數(shù)據(jù)將在網(wǎng)絡(luò)中不斷轉(zhuǎn)發(fā)最終導致網(wǎng)絡(luò)擁堵。這個問題將在下文分析IP首部時得到解決。
IP報文分割重組
在數(shù)據(jù)鏈路層中,我們已經(jīng)提到過不同的數(shù)據(jù)鏈路有不同的最大傳輸單元(MTU)。因此IP協(xié)議的一個任務(wù)是對數(shù)據(jù)進行分片和重組。分片由發(fā)送端主機和路由器負責,重組由接收端主機負責。
路徑MTU發(fā)現(xiàn)
分片會加重路由器的負擔,因此只要條件允許,我們都不希望路由器對IP數(shù)據(jù)包進行分片處理。另外,如果一個分片丟失,整個IP數(shù)據(jù)報都會作廢。
解決以上問題的技術(shù)是“路徑MTU發(fā)現(xiàn)”。主機會首先獲取整個路徑中所有數(shù)據(jù)鏈路的最小MTU,并按照整個大小將數(shù)據(jù)分片。因此傳輸過程中的任何一個路由器都不用進行分片工作。
為了找到路徑MTU,主機首先發(fā)送整個數(shù)據(jù)包,并將IP首部的禁止分片標志設(shè)為1.這樣路由器在遇到需要分片才能處理的包時不會分片,而是直接丟棄數(shù)據(jù)并通過ICMP協(xié)議將整個不可達的消息發(fā)回給主機。
主機將ICMP通知中的MTU設(shè)置為當前MTU,根據(jù)整個MTU對數(shù)據(jù)進行分片處理。如此反復下去,直到不再收到ICMP通知,此時的MTU就是路徑MTU。
以UDP協(xié)議發(fā)送數(shù)據(jù)為例:
路徑MTU發(fā)現(xiàn)
重組
接收端根據(jù)IP首部中的標志(Flag)和片偏移(Fragment Offset)進行數(shù)據(jù)重組。具體內(nèi)容將在分析IP首部時詳細解釋。
IP首部(IPv4)
IP首部是一個有些復雜的結(jié)構(gòu),我們不用記憶它的結(jié)構(gòu),只需了解每個部分的作用即可,這樣可以加深對IP協(xié)議的理解。
IP首部
其中幾個重要的部分介紹如下:
-
總長度(Total Length):表示IP首部與數(shù)據(jù)部分總的字節(jié)數(shù),該段長16比特,所以IP包的最大長度為65535字節(jié)(2^16)。雖然不同數(shù)據(jù)鏈路的MTU不同,但是IP協(xié)議屏蔽了這些區(qū)別,通過自己實現(xiàn)的數(shù)據(jù)分片功能,從上層的角度來看,IP協(xié)議總是能夠以65535為最大包長進行傳輸。
-
標識(ID:Identification):用于分片重組。屬于同一個分片的幀的ID相同。但即使ID相同,如果目標地址、源地址、上層協(xié)議中有任何一個不同,都被認為不屬于同一個分片。
-
標志(Flags):由于分片重組,由三個比特構(gòu)成。
第一個比特未使用,目前必須是0。
第二個比特表示是否進行分片,0表示可以分片,1表示不能分片。在路徑MTU發(fā)現(xiàn)技術(shù)中就用到了這個位。
第三個比特表示在分片時,是否表示最后一個包。1表示不是最后一個包,0表示分配中最后一個包。
-
片偏移(FO: Fragment Offset):由13比特組成,表示被分片的段相對于原始數(shù)據(jù)的位置。它可以表示8192(2^13)個位置,單位為8字節(jié),所以最大可以表示8 x 8192 = 65536字節(jié)的偏移量。
-
生存時間(TTL: Time To Live):表示包可以經(jīng)過多少個路由器的中轉(zhuǎn)。每經(jīng)過一個路由器,TTL減1。這樣可以避免前文提到的無限傳遞包的問題。
- 協(xié)議: 表示IP首部的下一個首部屬于哪個協(xié)議。比如TCP協(xié)議的編號為6,UDP編號為17.
- 首部校驗和:用于檢查IP首部是否損壞
- 可選項:僅在試驗或診斷時用,可以沒有。如果有,需要配合填充(Padding)占滿32比特。
文/bestswifter(簡書作者)
原文鏈接:http://www.jianshu.com/p/9cb5cf1864da
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標注“簡書作者”。
總結(jié)
以上是生活随笔為你收集整理的TCP/IP(二):IP协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP/IP(一):数据链路层
- 下一篇: TCP/IP(三):IP协议相关技术