TCP/IP 協議難點之一—— IP分片

1 IP協議簡單介紹

就我的而言,網絡中,拋開網絡安全加密這些,就只單單討論協議自己,比較難的有三個地方: 安全

  • IP分片與重組
  • TCP滑動窗口與TCP狀態的改變
  • TCP定時器

其實協議自己根據《TCP/IP詳解卷1》理解起來並不難,可是實現起來就很難:數據的操做,標誌位的設置,網絡狀態的變換,中斷多線程通信等等;網絡

在下圖的七層網絡協議參考模型中,IP層屬於網絡層,網絡層最主要的做用就是:將指定IP的數據報傳輸到對應的主機。多線程

網絡七層參考模型

下圖是以太幀封裝格式(RFC 894),RFC 894封裝格式也是咱們最經常使用的。加密

下面作個簡單介紹:線程

  • 目的地址:6字節,即咱們常說的以太網物理地址,這裏是目標主機的物理地址,物理地址爲惟一的。你們可能疑惑,發送網絡數據時只寫了IP地址,並無寫目的地址啊。這個是底層協議實現的,根據ARP協議,首先將目的地址設爲全1,而後根據IP地址來獲取目的地址。
  • 源地址:6字節,發數據時本身的物理地址。
  • 類型:2字節,協議類型,好比0x0800表明IP協議,0x0806表明ARP協議等等
  • 數據:802.3標準規定,一個以太幀最少64字節,最大1518字節,那麼去掉6字節目的地址、6字節源地址、2字節類型、4字節CRC,對應區間即爲48~1500字節,若是不足48字節能夠填充。
  • CRC:顧名思義,校驗部分,因此網絡數據是很準確的,並且絕大多數都支持硬件CRC校驗,速度很是快,幾乎不會在這上面消耗時間。

下面再看看數據部分:IP數據報指針

IP數據報封裝

圖中從左到右爲0~31位,共四個字節,從上到下依次增加,IP頭部佔20字節,剩下的爲數據,若是傳輸層爲TCP則還有20字節的TCP頭部,若是是UDP則還有8字節(若是分片的話,中間的包沒有UDP頭部,即0字節)的UDP頭部。剩下的纔是真正的用戶要傳送的數據。能夠看出傳送一樣多的數據,UDP協議要比TCP傳送的數據多,但從這一點來講UDP速度也要比TCP快。code

下面對一些字段作個簡單介紹:blog

  • 4位版本:好比IPv四、IPv6
  • 4位手部長度:指的是首部佔32 bit字的數目,包括任何選項。因爲它是一個4比特字段,所以首部最長爲60個字節
  • 16位總長度:一共16位,理論最大長度爲65535字節,可是受硬件限制,和其它方面的考慮,大部分路由器或主機支持8192字節。
  • 3位標誌:標識是否IP分片.第一位無用,第二位0:容許分片,1:不容許。第三位0:最後一片,1:後面還有分片
  • 13位片偏移:此分片在原始數據的偏移,用於分片重組,由於13位,因此支持的最大字節爲8192
  • 8位生存時間TTL:規定網絡數據包在網際層傳輸時,最多能夠通過路由器的個數,它的大小通常爲256/64,每通過一個路由值就會減1,當它爲0時,數據會被丟棄,並回傳一個ICMP包來通知發送者。

2 IP分片

從上面的介紹咱們知道,一個以太幀最大爲1518字節 (14字節以太首部,20字節IP首部,UDP8/TCP20,所以IP包每次最大爲1500==MTU。去掉協議頭UDP有效數據1472字節,TCP爲1460字節。還有最後的4字節CRC),可是一個IP數據報則可能會有8192字節,超過以太幀的最大限制,那麼這時就須要IP分片,分批進行傳輸。排序

發送方會在IP層將要發送的數據分紅多個數據包分批發送,而接收方則將數據按照順序再重新組織起來,等接收到一個完整的數據報以後,而後再提交給上一層傳輸層。網絡安全

注意,TCP協議爲可靠的傳輸協議,它避免了IP分片的發生,它會在TCP層對數據進行處理,對數據進行分段(不在詳述),IP分片用的多的在UDP協議

咱們知道,協議自己並無對數據在各個層中間怎麼傳遞作出要求,好比嵌入式實現和BSD實現就不太同樣,由於嵌入式內存比較少,數據在層與層之間傳遞時會盡可能避免數據拷貝,而只是指針的操做。下面咱們以嵌入式中用的比較多的LwIP舉例

LwIP容許的最大IP由以下決定:IP_REASS_MAX_PBUFS決定IP分片容許最大pbuf數量,IP_REASS_MAXAGE分片的生存時間,超過則錯誤並將以前接收的IP分片丟棄。

若是數據大於IP_REASS_MAX_PBUFS則有兩種選擇,一,直接刪除數據返回;二,是刪除生存時間最長的IP分片PBUF,這個經過IP_REASS_FREE_OLDEST來使能。

當爲UDP協議時,若是緩衝區描述符大小小於完整的IP數據包,IP分片數據包到來時,很快將描述符耗盡,後來的IP包因爲無緩衝區描述符而丟棄,UDP沒有重傳機制,極可能永遠不會接收到完整的IP分片包。從而大於IP_REASS_MAXAGE出現錯誤,所以緩衝區描述符也應增大以適應IP分片重裝。

TCP發送數據時,將大於MSS的數據分段(segment不叫分片),MSS通常爲1460.因此,TCP數據包不會在IP層分片。

IP頭部有3位標誌字段,標誌是否爲分片包。第一位無用,第二位0:容許分片,1:不容許。第三位0:最後一片,1:後面還有分片。13位offset表示偏移,用於IP重組時數據排序,13位所以支持最大IP數據包爲8192字節。

標準的BSD協議實現以下圖所示,採用兩個結構體,IPQ爲表頭,將各個IP分片表頭鏈接起來,並存儲IP信息。Ipasfrag爲具體的分片數據。

BSD實現

相關文章
相關標籤/搜索