IP協議處於OSI參考模型的第三層——網絡層,網絡層的主要做用是實現終端節點間的通訊。IP協議是網絡層的一個重要協議,網絡層中還有ARP(獲取MAC地址)和ICMP協議(數據發送異常通知)數組
數據鏈路層的做用在於實現同一種數據鏈路下的包傳遞,而網絡層則能夠實現跨越不一樣數據鏈路的包傳遞。好比主機A經過Wi-Fi鏈接到路由器B,路由器B經過以太網鏈接到路由器C,而路由器C又經過Wi-Fi與主機D保持鏈接。這時主機A向D發送的數據包就依賴於網絡層進行傳輸。網絡
這篇文章主要介紹IP協議的基本知識和IP首部,IP協議能夠分爲三大做用模塊:IP尋址、路由和IP分包。工具
IP地址是一種在網絡層用於識別通訊對端信息的地址。它有別於數據鏈路層中的MAC地址,後者用於標識同一鏈路下不一樣的計算機。3d
舉一個形象的例子,我要從鎮江的家裏去瀋陽的東北大學,通訊兩端的地址分別是家和學校,他們至關於IP地址。然而沒有交通工具可讓我從家直接去學校,因此我先要打車去火車站,而後坐高鐵到瀋陽站,再轉公交去學校。這三次中轉分別屬於三種交通方式(數據鏈路),每一次中轉都有起點和終點,他們就至關於MAC地址。每次中轉能夠稱爲一跳(Hop)code
IP地址由32位正整數表示,爲了直觀的表示,咱們把它分紅4個部分,每一個部分由8位整數組成,對應十進制的範圍就是0-255。cdn
好比172.20.1.1
能夠表示爲:10101100 00010100 00000001 00000001
。轉換規則很簡單,就是分別把四個部分的十進制(0-255)與8位二進制數字進行轉換。blog
從功能上看,IP地址由兩部分組成:網絡標識和主機標識。接口
網絡標識用於區分不一樣的網段,相同段內的主機必須擁有相同的網絡表示,不一樣段內的主機不能擁有相同的網絡標識。路由
主機標識用於區分同一網段下不一樣的主機,它不能在同一網段內重複出現。it
32位IP地址被分爲兩部分,到底前多少位是網絡標識呢?通常有兩種方法表示:IP地址分類、子網掩碼。
IP地址分爲四個級別,分別爲A類、B類、C類和D類。分類的依據是IP地址的前四位:
A類IP地址是第一位爲「0」的地址。A類IP地址的前8位是網絡標識,用十進制標識的話0.0.0.0-127.0.0.0
是A類IP地址的理論範圍。另外咱們還能夠得知,A類IP地址最多隻有128個(其實是126個,下文不贅述),每一個網段內主機上限爲2的24次方,也就是16,777,214個。
B類IP地址是前兩位爲「10「的地址。B類IP地址的前16位是網絡標識,用十進制標識的話128.0.0.0-191.255.0.0
是B類IP地址的範圍。B類IP地址的主機標記長度爲16位,所以一個網段內可容納主機地址上限爲65534個。
C類IP地址是前三位爲「110」的地址。C類IP地址的前24位是網絡標識,用十進制標識的話192.0.0.0-223.255.255.0
是C類IP地址的範圍。C類地址的後8位是主機標識,共容納254個主機地址。
D類IP地址是前四位爲「1110」的地址。D類IP地址的網絡標識長32位,沒有主機標識,所以經常使用於多播。
IP地址總長度32位,它能表示的主機數量有限,大約在43億左右。而IP地址分類更是形成了極大的浪費,A、B類地址一共也就一萬多個,而世界上包含主機數量超過254的網段顯然不止這麼點。
咱們知道IP地址分類的本質是區分網絡標識和主機標識,另外一種更加靈活、細粒度的區分方法是使用子網掩碼。
子網掩碼長度也是32位,由一段連續的1和一段連續的0組成。1的長度就表示網絡標識的長度。以IP地址172.20.100.52
爲例,它原本是一個B類IP地址(前16位是網絡標識),但經過子網掩碼,它能夠是前26爲爲網絡標識的IP地址:
路由控制(Routing)是指將分組數據發送到目標地址的功能,這個功能通常由路由器完成。(不要與家裏用的小型無線路由器混爲一談)
路由器中保存着路由控制表,它在路由控制表中查找目標IP地址對應的下一個路由器地址。下圖描述了這一過程:
主機A的地址是10.1.1.30
,要把數據發往地址爲10.1.2.10
的主機。在主機A的路由表中,保存了兩個字段,因爲目標地址10.1.2.10
與10.1.1.0/24
段不匹配,因此它被髮往默認路由10.1.1.1
也就是圖中路由器1的左側網卡的IP地址。
路由器1繼續在它本身的路由控制表中查找目標地址10.1.2.10
,它發現目標地址屬於10.1.2.0/24
這一段,所以將數據轉發至下一個路由器10.1.0.2
,也就是路由器2的左側網卡的地址。
路由器2在本身的路由控制表中查找目標地址10.1.2.10
,根據表中記錄將數據發往10.1.2.1
接口,也就是本身的右側網卡的IP地址。主機B檢查目標IP地址和本身相同,因而接收數據。
路由控制的關鍵在於路由控制表,路由控制表能夠由管理員手動設置,稱爲靜態路由控制,可是估計大部分人沒這麼幹過。這是由於路由器能夠喝其餘路由器互換信息比即便自動刷新路由表,這個信息交換的協議並無在IP協議中定義,而是由一個叫作「路由協議」的協議管理。
上圖中,假設主機A向一個不存在的IP地址發送數據,而且路由器一、二、3設置的默認路由造成了一個循環,那麼數據將在網絡中不斷轉發最終致使網絡擁堵。這個問題將在下文分析IP首部時獲得解決。
在數據鏈路層中,咱們已經提到過不一樣的數據鏈路有不一樣的最大傳輸單元(MTU)。所以IP協議的一個任務是對數據進行分片和重組。分片由發送端主機和路由器負責,重組由接收端主機負責。
分片會加劇路由器的負擔,所以只要條件容許,咱們都不但願路由器對IP數據包進行分片處理。另外,若是一個分片丟失,整個IP數據報都會做廢。
解決以上問題的技術是「路徑MTU發現」。主機會首先獲取整個路徑中全部數據鏈路的最小MTU,並按照整個大小將數據分片。所以傳輸過程當中的任何一個路由器都不用進行分片工做。
爲了找到路徑MTU,主機首先發送整個數據包,並將IP首部的禁止分片標誌設爲1.這樣路由器在遇到須要分片才能處理的包時不會分片,而是直接丟棄數據並經過ICMP協議將整個不可達的消息發回給主機。
主機將ICMP通知中的MTU設置爲當前MTU,根據整個MTU對數據進行分片處理。如此反覆下去,直到再也不收到ICMP通知,此時的MTU就是路徑MTU。
以UDP協議發送數據爲例:
接收端根據IP首部中的標誌(Flag)和片偏移(Fragment Offset)進行數據重組。具體內容將在分析IP首部時詳細解釋。
IP首部是一個有些複雜的結構,咱們不用記憶它的結構,只需瞭解每一個部分的做用便可,這樣能夠加深對IP協議的理解。
其中幾個重要的部分介紹以下:
總長度(Total Length):表示IP首部與數據部分總的字節數,該段長16比特,因此IP包的最大長度爲65535字節(2^16)。雖然不一樣數據鏈路的MTU不一樣,可是IP協議屏蔽了這些區別,經過本身實現的數據分片功能,從上層的角度來看,IP協議老是可以以65535爲最大包長進行傳輸。
標識(ID:Identification):用於分片重組。屬於同一個分片的幀的ID相同。但即便ID相同,若是目標地址、源地址、上層協議中有任何一個不一樣,都被認爲不屬於同一個分片。
標誌(Flags):因爲分片重組,由三個比特構成。
第一個比特未使用,目前必須是0。
第二個比特表示是否進行分片,0表示能夠分片,1表示不能分片。在路徑MTU發現技術中就用到了這個位。
第三個比特表示在分片時,是否表示最後一個包。1表示不是最後一個包,0表示分配中最後一個包。
片偏移(FO: Fragment Offset):由13比特組成,表示被分片的段相對於原始數據的位置。它能夠表示8192(2^13)個位置,單位爲8字節,因此最大能夠表示8 x 8192 = 65536字節的偏移量。
生存時間(TTL: Time To Live):表示包能夠通過多少個路由器的中轉。每通過一個路由器,TTL減1。這樣能夠避免前文提到的無限傳遞包的問題。
協議: 表示IP首部的下一個首部屬於哪一個協議。好比TCP協議的編號爲6,UDP編號爲17.
首部校驗和:用於檢查IP首部是否損壞
可選項:僅在試驗或診斷時用,能夠沒有。若是有,須要配合填充(Padding)佔滿32比特。