關于udp傳輸分片問題-MTU
編者:李國帥
qq:9611153 微信lgs9611153
時間:2008/6/1
背景原因:
相關問題在2008年遇到,簡要提供如下建議。
對于大批量,高頻度的網絡收發,總會遇到這樣的問題。
概念:
MTU,即Maximum Transmission Unit(最大傳輸單元),此值設定TCP/IP協定傳輸資料報時的最大傳輸單元。
設定多大的MTU值取決于你的上網方式,不同的上網方式支援不同的MTU,下面列出了一些上網方式的MTU值:
EtherNet(一般上網方式,預設值):1500
PPPoE/ADSL:1492
Dial Up/Modem:576
鍊路層MTU:
鍊路層具有最大傳輸單元MTU這個特性,它限制了資料幀的最大長度,不同的網絡類型都有一個上限值。
鍊路層一般隻能發1514,就是MTU的大小,多餘的就就要分片,理論是64K,但是實際中,首先網卡要支援64K的,但是現在的千兆一般也才支援8k巨幀,然後交換機也要支援巨幀,普通交換機也不支援,支援的一般也是8K,是以,實際使用中UDP在區域網路一般是1514(含42位元組頭),而如果要通過路由器,路由器所支援的UDP一般是536,這樣又隻能用536的了
具體分析如下:
一個IPv4包需要14位元組mac頭,20位元組IP頭,很可能需要8位元組ppp封裝(ADSL上網)。
一個以太網封包大小限制1514,是以一個ipv4包的資料大概有1472或者1480
IP層分片
我們假設資料的淨荷(payload)部分預留是1472位元組。如果資料部分大于1472位元組,就會出現分片現象。
另外IP層對資料包進行分片(fragmentation)操作,使每一片的長度都小于或等于MTU。
IP首部包含了分片和重組所需的資訊:
Identification:發送端發送的IP資料包辨別字段都是一個唯一值,該值在分片時被複制到每個片中。
R:保留未用。
DF:Don't Fragment,“不分片”位,如果将這一比特置1 ,IP層将不對資料報進行分片。
MF:More Fragment,“更多的片”,除了最後一片外,其他每個組成資料報的片都要把該比特置1。
Fragment Offset:該片偏移原始資料包開始處的位置。偏移的位元組數是該值乘以8。
當資料報被分片後,每個片的總長度值要改為該片的長度值。
而每一個分片的有效載荷需要減去分片資訊(32位元組),是以
如果要發送的IP資料包是4096位元組(包含tcp/udp頭),
發送的IP資料20(IP頭)+4090,将會被分三次發送:
32(IP分標頭部)+(1472-32),
32(IP分標頭部)+(1472-32),
32(IP分標頭部)+(1230+填充資料)。
每次發送的IP資料都為發送3次,每次1500位元組。