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