IP分片

物理網絡層通常要限制每次發送數據幀的最大長度。任什麼時候候IP層接受到一份要發送的IP數據報時,它要判斷向本地哪一個接口發送數據(選路),並查詢該接口得到其MTU(最大傳輸單元:Maximum Transmission Unit,一般與通訊接口有關,單位:字節)。IP把MTU與數據報長度進行比較,若是須要則進行分配。分片能夠發生在原始發送端主機上,也能夠發生在中間路由器上。網絡

把一份IP數據包分片之後,只有到達目的地才進行從新組裝(這裏的從新組裝與其餘網絡協議不一樣,他們要求在下一站就進行從新組裝,而不是在最終的目的地)。從新組裝由目的端的IP層來完成,其目的是使分片和從新組裝過程對運輸層(TCP和UDP)是透明的。已經分片過的數據報有可能會再次進行分片(可能不止一次)。IP首部中包含的數據爲分片和從新組裝提供了足夠的信息。併發

對於發送端發送的每份IP數據報來講,其標識字段都包含一個惟一值。該值在數據報分片時被複制到每一個片中。標誌字段用其中一個比特來標示「更多的片」。除了最後一片,其餘每一組成數據報的片都要把該比特置爲1.片偏移字段指的是該片偏移原始數據報開始處的位置。另外,當數據報被分片後,每一個片的總長度值要改成該片的長度值。blog

最後,標誌字段中有一個比特稱做「不分片」位。若是將這一比特置1,IP將不對數據報進行分片。相反把數據報丟棄併發送一個ICMP差錯報文給起始端。
當IP數據報被分片後,每一片都成爲一個分組,具備本身的IP首部,並在選擇路由時與其餘分組獨立。這樣,當數據報的這些片到達目的端時有可能會丟失,可是在IP首部中有足夠的信息讓接收端能正確組裝這些數據報片。接口

儘管IP分片過程看起來是透明的,但有一點讓人不想使用它:即便只丟失一片數據也要重傳整個IP數據報。爲何會發生這種狀況呢?由於IP層自己沒喲超時重傳的機制--由更高層來負責超時和重傳(TCP有超時和重傳機制,但UDP沒有)。當來自TCP報文段的某一片丟失後,TCP在超時後會重發整個TCP報文段,該報文段對應於一份IP數據報。沒有辦法只重傳數據報中的一個數據報片。事實上,若是對數據報分片的是中間路由器,而不是起始端系統,那麼起始端系統就沒法知道數據報是如何被分片的。就這個緣由,常常要避免分片。
使用UDP很容易致使IP分片,而TCP試圖避免分片(但對於應用程序來講幾乎不可能強迫TCP發送一個須要進行分片的長報文段)。
在一個以太網上,數據幀的最大長度是1500字節,其中1472字節留給數據,假定IP首部爲20字節,UDP首部爲8字節。
例如,分別以數據長度爲1471,1472,1473和1474字節運行sock程序,最後兩次應該發生分片:路由

(1)前兩份UDP數據報能裝入以太網數據幀,沒有被分配。,可是對應於寫1473和1474字節的IP數據報長度爲1501和1502,就必須進行分片。
(2)當IP數據報被分片後,frag 26304和frag 26313指的是IP首部中標示字段的值,冒號和@號之間的1480是除IP首部外的片長。兩份數據報第一片的長度均爲1480:UDP首部8字節,用戶數據1472字節(加上IP首部20字節正好爲1500字節)。
(3)第一份數據報的第2片只包含1字節數據,第二份數據報的第2片只包含2字節的數據。
(4)位於@後的數字是從數據報開始處計算的片偏移值。跟在偏移值後面的加號對應於IP首部中3bit標誌字段中的「更多片」比特。設置這一比特的目的是讓接收端知道何時完成全部的分片組裝。
(5)注意4和6行省略了協議名UDP,源端口和目的端口號協議名能夠打印出來,由於它在IP首部並被複制到各個片中,可是,端口號在UDP首部,只能在第1片中被發現。任何運輸層首部只出如今第一片數據中。
在分片時,除了最後一片外,其餘每一片中的數據部分(除了IP首部外的其餘部分)必須是8字節的整數倍。
IP數據報時指IP層端到端的傳輸單元(在分片以前和從新組裝以後),分組是指IP層和鏈路層之間傳送的數據單元。一個分組可使一個完整的IP數據報,也能夠是IP數據報的一個分片。it

相關文章
相關標籤/搜索