数据包分片和重组 MTU与MSS
?
前言
?
任何一臺(tái)主機(jī)都有必要對(duì)IP分片進(jìn)行相應(yīng)的處理。
分片往往出現(xiàn)在網(wǎng)絡(luò)上遇到比較大的報(bào)文無法一下子發(fā)送出去才會(huì)進(jìn)行處理。
?
正文
比如說在前一個(gè)FDDI鏈路中的報(bào)文大小為4352字節(jié),小于其MTU所以能夠安全傳送。如果經(jīng)過一個(gè)路由器后,跳到以太網(wǎng)鏈路,由于以太鏈路的MTU為1500字節(jié),所以顯然報(bào)文無法傳輸。因此,路由器會(huì)將其分片成三個(gè)報(bào)文段進(jìn)行分別順序發(fā)送。這里分片的任務(wù)交給了路由器,而經(jīng)過分片之后的IP數(shù)據(jù)報(bào)在重組的時(shí)候,只能在目標(biāo)主機(jī)上進(jìn)行。
顯然,隨著網(wǎng)絡(luò)的流量的提升,一旦出現(xiàn)較多的分片 情況的話,路由器的負(fù)擔(dān)便會(huì)加重。也會(huì)降低網(wǎng)絡(luò)的傳輸效率。同時(shí)也是出于網(wǎng)絡(luò)安全的考慮。
因此,引入路徑MTU發(fā)現(xiàn)(Path MTU Discovery )
使用了路徑MTU發(fā)現(xiàn)技術(shù)后,使得路由器可以提前得知下一個(gè)鏈路的MTU大小。
在傳送過來的報(bào)文中,由于首先在發(fā)送端主機(jī)發(fā)送IP數(shù)據(jù)報(bào)的時(shí)候?qū)⑵涫撞康姆制箻?biāo)志位設(shè)置為1,根據(jù)這個(gè)標(biāo)志位,在遇到下一個(gè)路由器的時(shí)候就不會(huì)進(jìn)行分片處理,而是直接棄包。同時(shí)路由器通過一個(gè)ICMP的不可達(dá)消息將數(shù)據(jù)鏈路的MTU發(fā)送給主機(jī)。主機(jī)接收到這個(gè)值后在下一次發(fā)送報(bào)文的時(shí)候,IP層進(jìn)行分片。
IP分片發(fā)生在IP層,不僅源端主機(jī)會(huì)進(jìn)行分片,中間的路由器也有可能分片,因?yàn)椴煌木W(wǎng)絡(luò)的MTU是不一樣的,如果傳輸路徑上的某個(gè)網(wǎng)絡(luò)的MTU比源端網(wǎng)絡(luò)的MTU要小,路由器就可能對(duì)IP數(shù)據(jù)報(bào)再次進(jìn)行分片。而分片數(shù)據(jù)的重組只會(huì)發(fā)生在目的端的IP層。
注意:
1)對(duì)于UDP,由于UDP是不可重發(fā)的。UDP一般數(shù)據(jù)包大小會(huì)限制在512字節(jié)。
Internet大多數(shù)網(wǎng)絡(luò)接口MTU>512,即使DNS報(bào)文 + UDP+ IP= 512+8+20=540,這個(gè)大小幾乎可以在Internet上暢通無阻,而無需IP分片。
為何IP分片不好?
一個(gè)UDP報(bào)文如果因?yàn)閟ize > MTU,則會(huì)被IP層分成兩片或者多片,但是只有一片有端口號(hào),由于其它分片沒有端口號(hào),能否通過防火墻則完全看防火墻的臉色,所以對(duì)于能否通信成功是一個(gè)未知數(shù)。
如果防火墻網(wǎng)開一面,不檢查端口號(hào),分片可以全部通行,到目的地再組裝到一起,IP層提交給UDP/DNS,一點(diǎn)問題沒有。但是防火墻的安全功能大打折扣,如何阻止非法的外來攻擊包?
如果防火墻嚴(yán)格檢查端口號(hào),則沒有端口號(hào)的分片則統(tǒng)統(tǒng)丟棄,造成通信障礙。
所以選擇一個(gè)合適的UDP size至關(guān)重要,避免分片。
?
2)而對(duì)于TCP而言,由于是可重發(fā)的,所以第一次棄包(發(fā)送失敗)的時(shí)候,主機(jī)接收到路由器返回來的MTU值。根據(jù)TCP重發(fā)處理,數(shù)據(jù)包會(huì)被重新發(fā)送,在IP層進(jìn)行分片。
?
MTU:maximum transmission unit,最大傳輸單元,由硬件規(guī)定,如以太網(wǎng)的MTU為1500字節(jié)。
MSS:maximum segment size,最大分節(jié)大小,為TCP數(shù)據(jù)包每次傳輸?shù)淖畲髷?shù)據(jù)分段大小,一般由發(fā)送端向?qū)Χ薚CP通知對(duì)端在每個(gè)分節(jié)中能發(fā)送的最大TCP數(shù)據(jù)。MSS值為MTU值減去IPv4 Header(20 Byte)和TCP header(20 Byte)得到。
分片:若一IP數(shù)據(jù)報(bào)大小超過相應(yīng)鏈路的MTU的時(shí)候,IPV4和IPV6都執(zhí)行分片(fragmentation),各片段到達(dá)目的地前通常不會(huì)被重組(re-assembling)。IPV4主機(jī)對(duì)其產(chǎn)生的數(shù)據(jù)報(bào)執(zhí)行分片,IPV4路由器對(duì)其轉(zhuǎn)發(fā)的數(shù)據(jù)也執(zhí)行分片。然而IPV6只在數(shù)據(jù)產(chǎn)生的主機(jī)執(zhí)行分片;IPV6路由器對(duì)其轉(zhuǎn)發(fā)的數(shù)據(jù)不執(zhí)行分片。
?
例如:一個(gè)以太網(wǎng)上的主機(jī)和一個(gè)令牌環(huán)網(wǎng)上的主機(jī)間建立連接,其中以太網(wǎng)上主機(jī)通告的MSS為1460,令牌環(huán)網(wǎng)上主機(jī)通告的MSS為4096。觀察分組,在兩個(gè)方向上都找不到大于1460字節(jié)的數(shù)據(jù),為什么?
??????? 令牌環(huán)網(wǎng)上發(fā)送到以太網(wǎng)的數(shù)據(jù)大小不大于1460字節(jié)的原因是因?yàn)橐蕴W(wǎng)上主要通告的MSS值就為1460個(gè)字節(jié),所以令牌環(huán)網(wǎng)上發(fā)送出去的數(shù)據(jù)的長(zhǎng)度不能夠大于MSS值;令牌環(huán)網(wǎng)上主機(jī)通告的MSS值為4096,也即是說以太網(wǎng)能夠發(fā)送到令牌環(huán)網(wǎng)上的TCP凈荷值為4096,但是以太網(wǎng)的MTU值又是由硬件所決定的,最大只支持1500(包括IP頭至少20B和TCP頭至少20B),為避免分片,因此以太網(wǎng)發(fā)送到令牌環(huán)網(wǎng)的數(shù)據(jù)的凈荷也為1500-20-20=1460B,所以兩個(gè)方向的凈數(shù)據(jù)長(zhǎng)度不會(huì)大于1460字節(jié)。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的数据包分片和重组 MTU与MSS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub:基于epoll机制的高并发
- 下一篇: 透彻理解Socket网络编程