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分片了
相關文章
相關標籤/搜索