數據鏈路的不同,導致鏈路上的MTU(最大傳輸單元)也不盡相同,比如對於IP來說最大的MTU是65535字節,但是這個65535字節的MTU僅僅對於IP上一層的TCP,UDP來說可以看做這么大。
對於以太網傳輸IP報文,由於以太網的最大MTU是1500字節,假如傳輸4342字節的IP數據包,就無法在一個幀中完成發送,這時就需要用到IP分片(IP Fragmentation)。
Tips:分片以8個字節的倍數為單位進行
分片之后的IP數據包在傳輸的過程中如果遇到了需要檢查IP上層的TCP、UDP或者其他應用層信息時(防火牆,NAT,端應用),還需要將分片重組,以方便提取IP上層的信息,檢查之后又會按照原分片進行拆分。
分片機制也有一定的不足,中途路由器還做分片處理使得路由器的處理負擔加重,不利於鏈路上的高速傳輸,還有,TCP的一個小分片丟失會導致整個數據包重傳。
路徑MTU發現技術
PMTUD——Path MTU Discovery ,所謂路徑MTU(PMTU)是指從發送端主機到接收端主機之間不需要分片的最大MTU的大小,可以避免在中途的路由器上進行分片處理。
PMTUD的工作原理:
1.在發送端主機發送IP數據包時將首部的分片禁止標志位置為1
2.數據包傳輸途中路由器遇到需要分片的大包也不分片,而是直接丟棄
3.通過ICMP的不可達消息將鏈路MTU返回給主機
4.主機下一次發送根據返回的MTU進行分片處理再發送
5.如果路上又遇到下一台路由器需要分片,則又直接丟棄,返回帶MTU的ICMP
6.主機再次根據這個MTU進行分片,不斷循環,直到最后一次設置的MTU整個路徑都不用分片
7.對於UDP來說,分片指UDP傳過來的UDP首部和UDP數據在IP層被分片,對於IP,不區分UDP的首部和數據,所有分片到達目標主機后先被重組,再傳給UDP層
8.對於TCP來說,分片指TCP超時時自動按照比例縮減MSS的大小,重傳數據包,TCP將數據分成IP層不會再被細分的粒度后傳給IP層,IP層不再做分片處理,所有分片到達目標主機后,照原樣傳給TCP層,而不用先被重組
IPv4首部中部分字段
總長度-Total Length
表示IP首部和數據部分加起來的總字節數,該字段長16比特,所以IP包最大長度 2^16=65535字節
標識-Identification
用於分片重組,長16比特,同一組分片的標識值相同(即使標識相同,源目的地址或者協議不同也視為不同分片),不同分片的標識值不同
標志-Flags
長3比特,比特0,未用;比特1,表示dont fragment,0-可以分片,1-不能分片;比特2,表示是否為最后一個包,0-最后一個分片包,1-分片中段的包