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