1. 程式人生 > >IP 分片丟失重傳

IP 分片丟失重傳

儘管 IP 分片看起來是是透明的,但有一點讓人不想使用它:即使只丟失一片資料也要重傳整個資料報。為什麼會發生這種情況呢?

因為 IP 層本身沒有超時重傳的機制——由更高層來負責超時和重傳( TCP 有超時和重傳機制,但 UDP 沒有。一些 UDP 應用程式本身也執行超時和重傳)。當來自 TCP 報文段的某一片丟失後,TCP 在超時後重發整個 TCP 報文段,該報文段對應於一份 IP 資料報。沒有辦法只重傳資料報中的一個數據片。事實上,如果對資料分片的是中間路由器,而不是起始端系統,那麼起始端系統就不無知道資料報是如何被分片的,因為這個原因,經常要避免分片。

注意:把一份 IP 資料報分片以後,只有到達目的地才進行重新組裝(這裡的重新組裝與其他的網路協議不同,它們要求在下一站就進行重新組裝,而不是在最終的目的地)。重新組裝由目的端的 IP 層來完成,其目的是使分片和重新組裝過程對運輸層 ( TCP 和UDP ) 是透明的,除了某些可能的越級操作處。已經分片過的資料報有可能會再次進行分片(可能不止一次)。IP 首部中包含的資料為分片和重新組裝提供了足夠的資訊。   1、MTU(Maximum Transmission Unit,MTU),最大傳輸單元 (1)乙太網和 802.3 對資料幀的長度都有一個限制,其最大值分別是 1500 和 1492 個位元組。鏈路層的這個特性稱作 MTU。不同型別的網路大多數都有一個上限。如果 IP 層有一個數據要傳,且資料的長度比鏈路層的 MTU 還大,那麼 IP 層就要進行分片(fragmentation),把資料報分成若干片,這樣每一個分片都小於 MTU。

(2)把一份 IP 資料報進行分片以後,由到達目的端的 IP 層來進行重新組裝,其目的是使分片和重新組裝過程對運輸層( TCP/UDP )是透明的。由於每一分片都是一個獨立的包,當這些資料報的片到達目的端時有可能會失序,但是在 IP 首部中有足夠的資訊讓接收端能正確組裝這些資料報片。

(3)儘管 IP 分片過程看起來透明的,但有一點讓人不想使用它:即使只丟失一片資料也要重新傳整個資料報。why?因為 IP 層本身沒有超時重傳機制------由更高層(比如TCP)來負責超時和重傳。當來自 TCP 報文段的某一片丟失後,TCP 在超時後會重發整個 TCP 報文段,該報文段對應於一份 IP 資料報(而不是一個分片),沒有辦法只重傳資料報中的一個數據分片。

(4)使用 UDP 很容易導致 IP 分片,TCP 試圖避免 IP 分片。那麼 TCP 是如何試圖避免IP分片的呢?其實說白了,採用 TCP 協議進行資料傳輸是不會造成 IP 分片的,因為一旦 TCP 資料過大,超過了 MSS,則在傳輸層會對 TCP 包進行分段(如何分,見下文!),自然到了 IP 層的資料報肯定不會超過 MTU,當然也就不用分片了。而對於 UDP 資料報,如果 UDP 組成的 IP 資料報長度超過了 1500,那麼 IP 資料報顯然就要進行分片,因為 UDP 不能像 TCP 一樣自己進行分段。總結:UDP不會分段,就由我 IP 來分。TCP 會分段,當然也就不用我 IP 來分了!

2、MSS(Maxitum Segment Size)最大分段大小的縮寫,是TCP協議裡面的一個概念 (1)MSS 就是 TCP 資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能TCP 協議在建立連線的時候通常要協商雙方的 MSS 值,這個值 TCP 協議在實現的時候往往用 MTU 值代替(需要減去 IP 資料包包頭的大小 20Bytes 和 TCP 資料段的包頭 20Bytes )所以往往 MSS 為 1460。通訊雙方會根據雙方提供的 MSS 值得最小值確定為這次連線的最大 MSS 值。

 (2)相信看到這裡,還有最後一個問題:TCP 是如何實現分段的呢?其實 TCP 無所謂分段,因為每個 TCP 資料報在組成前其大小就已經被 MSS 限制了,所以 TCP 資料報的長度是不可能大於 MSS 的,當然由它形成的 IP 包的長度也就不會大於 MTU,自然也就不用 IP 分片了。 ---------------------  作者:Mike__Jiang  來源:CSDN  原文:https://blog.csdn.net/tennysonsky/article/details/44941957  版權宣告:本文為博主原創文章,轉載請附上博文連結!