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分片了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章