【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
我們?cè)趯W(xué)習(xí)TCP/IP協(xié)議時(shí)都知道,TCP報(bào)文段如果很長(zhǎng)的話,會(huì)在發(fā)送時(shí)發(fā)生分段,在接受時(shí)進(jìn)行重組,同樣IP數(shù)據(jù)報(bào)在長(zhǎng)度超過一定值時(shí)也會(huì)發(fā)生分片,在接收端再將分片重組。
? ? 我們先來(lái)看兩個(gè)與TCP報(bào)文段分段和IP數(shù)據(jù)報(bào)分片密切相關(guān)的概念。
? ??MTU(最大傳輸單元)
? ? MTU前面已經(jīng)說(shuō)過了,是鏈路層中的網(wǎng)絡(luò)對(duì)數(shù)據(jù)幀的一個(gè)限制,依然以以太網(wǎng)為例,MTU為1500個(gè)字節(jié)。一個(gè)IP數(shù)據(jù)報(bào)在以太網(wǎng)中 傳輸,如果它的長(zhǎng)度大于該MTU值,就要進(jìn)行分片傳輸,使得每片數(shù)據(jù)報(bào)的長(zhǎng)度小于MTU。分片傳輸?shù)腎P數(shù)據(jù)報(bào)不一定按序到達(dá),但I(xiàn)P首部中的信息能讓這些數(shù)據(jù)報(bào)片按序組裝。IP數(shù)據(jù)報(bào)的分片與重組是在網(wǎng)絡(luò)層進(jìn)完成的。
?
? ??MSS(最大分段大小)
? ??MSS是TCP里的一個(gè)概念(首部的選項(xiàng)字段中)。MSS是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段,TCP報(bào)文段的長(zhǎng)度大于MSS時(shí),要進(jìn)行分段傳輸。TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,每一方都有用于通告它期望接收的MSS選項(xiàng)(MSS選項(xiàng)只出現(xiàn)在SYN報(bào)文段中,即TCP三次握手的前兩次)。MSS的值一般為MTU值減去兩個(gè)首部大小(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes)所以如果用鏈路層以太網(wǎng),MSS的值往往為1460。而Internet上標(biāo)準(zhǔn)的MTU(最小的MTU,鏈路層網(wǎng)絡(luò)為x2.5時(shí))為576,那么如果不設(shè)置,則MSS的默認(rèn)值就為536個(gè)字節(jié)。很多時(shí)候,MSS的值最好取512的倍數(shù)。TCP報(bào)文段的分段與重組是在運(yùn)輸層完成的。
? ? 到了這里有一個(gè)問題自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明顯,分段后的每一段TCP報(bào)文段再加上IP首部后的長(zhǎng)度不可能超過MTU,因此也就不需要在網(wǎng)絡(luò)層進(jìn)行IP分片了。因此TCP報(bào)文段很少會(huì)發(fā)生IP分片的情況。
? ? 再來(lái)看UDP數(shù)據(jù)報(bào),由于UDP數(shù)據(jù)報(bào)不會(huì)自己進(jìn)行分段,因此當(dāng)長(zhǎng)度超過了MTU時(shí),會(huì)在網(wǎng)絡(luò)層進(jìn)行IP分片。同樣,ICMP(在網(wǎng)絡(luò)層中)同樣會(huì)出現(xiàn)IP分片情況。
? ? 總結(jié):UDP不會(huì)分段,就由IP來(lái)分。TCP會(huì)分段,當(dāng)然就不用IP來(lái)分了!
? ? 另外,IP數(shù)據(jù)報(bào)分片后,只有第一片帶有UDP首部或ICMP首部,其余的分片只有IP頭部,到了端點(diǎn)后根據(jù)IP頭部中的信息再網(wǎng)絡(luò)層進(jìn)行重組。而TCP報(bào)文段的每個(gè)分段中都有TCP首部,到了端點(diǎn)后根據(jù)TCP首部的信息在傳輸層進(jìn)行重組。IP數(shù)據(jù)報(bào)分片后,只有到達(dá)目的地后才進(jìn)行重組,而不是向其他網(wǎng)絡(luò)協(xié)議,在下一站就要進(jìn)行重組。
? ??最后一點(diǎn),對(duì)IP分片的數(shù)據(jù)報(bào)來(lái)說(shuō),即使只丟失一片數(shù)據(jù)也要重新傳整個(gè)數(shù)據(jù)報(bào)(既然有重傳,說(shuō)明運(yùn)輸層使用的是具有重傳功能的協(xié)議,如TCP協(xié)議)。這是因?yàn)镮P層本身沒有超時(shí)重傳機(jī)制------由更高層(比如TCP)來(lái)負(fù)責(zé)超時(shí)和重傳。當(dāng)來(lái)自TCP報(bào)文段的某一段(在IP數(shù)據(jù)報(bào)的某一片中)丟失后,TCP在超時(shí)后會(huì)重發(fā)整個(gè)TCP報(bào)文段,該報(bào)文段對(duì)應(yīng)于一份IP數(shù)據(jù)報(bào)(可能有多個(gè)IP分片),沒有辦法只重傳數(shù)據(jù)報(bào)中的一個(gè)數(shù)據(jù)分片。
?
http://blog.csdn.net/ns_code/article/details/30109789
總結(jié)
以上是生活随笔為你收集整理的【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (译+原)std::shared_ptr
- 下一篇: TCP传输的单个报文最大字节(MSS和M