雖然 IP 分片看起來是是透明的,但有1點讓人不想使用它:即便只丟失1片數據也要重傳全部數據報。為何會產生這類情況呢?
(1)以太網和 802.3 對數據幀的長度都有1個限制,其最大值分別是 1500 和 1492 個字節。鏈路層的這個特性稱作 MTU。不同類型的網絡大多數都有1個上限。如果 IP 層有1個數據要傳,且數據的長度比鏈路層的 MTU 還大,那末 IP 層就要進行分片(fragmentation),把數據報分成若干片,這樣每個分片都小于 MTU。
(2)把1份 IP 數據報進行分片以后,由到達目的真個 IP 層來進行重新組裝,其目的是使分片和重新組裝進程對運輸層( TCP/UDP )是透明的。由于每分片都是1個獨立的包,當這些數據報的片到達目的端時有可能會失序,但是在 IP 首部中有足夠的信息讓接收端能正確組裝這些數據報片。
(3)雖然 IP 分片進程看起來透明的,但有1點讓人不想使用它:即便只丟失1片數據也要重新傳全部數據報。why?由于 IP 層本身沒有超時重傳機制------由更高層(比如TCP)來負責超時和重傳。當來自 TCP 報文段的某1片丟失后,TCP 在超時后會重發全部 TCP 報文段,該報文段對應于1份 IP 數據報(而不是1個分片),沒有辦法只重傳數據報中的1個數據分片。
(4)使用 UDP 很容易致使 IP 分片,TCP 試圖避免 IP 分片。那末 TCP 是如何試圖避免IP分片的呢?其實說白了,采取 TCP 協議進行數據傳輸是不會造成 IP 分片的,由于1旦 TCP 數據過大,超過了 MSS,則在傳輸層會對 TCP 包進行分段(如何分,見下文!),自然到了 IP 層的數據報肯定不會超過 MTU,固然也就不用分片了。而對 UDP 數據報,如果 UDP 組成的 IP 數據報長度超過了 1500,那末 IP 數據報明顯就要進行分片,由于 UDP 不能像 TCP 1樣自己進行分段??偨Y:UDP不會分段,就由我 IP 來分。TCP 會分段,固然也就不用我 IP 來分了!
(1)MSS 就是 TCP 數據包每次能夠傳輸的最大數據分段。為了到達最好的傳輸效能TCP 協議在建立連接的時候通常要協商雙方的 MSS 值,這個值 TCP 協議在實現的時候常常用 MTU 值代替(需要減去 IP 數據包包頭的大小 20Bytes 和 TCP 數據段的包頭 20Bytes )所以常常 MSS 為 1460。通訊雙方會根據雙方提供的 MSS 值得最小值肯定為這次連接的最大 MSS 值。
(2)相信看到這里,還有最后1個問題:TCP 是如何實現分段的呢?其實 TCP 無所謂分段,由于每一個 TCP 數據報在組成前其大小就已被 MSS 限制了,所以 TCP 數據報的長度是不可能大于 MSS 的,固然由它構成的 IP 包的長度也就不會大于 MTU,自然也就不用 IP 分片了。
轉自:http://blog.163.com