編者:李國帥
相關問題在2023年遇到,簡要提供如下建議。
對於大批量,高頻度的網路收發,總會遇到這樣的問題。
mtu,即maximum transmission unit(最大傳輸單元),此值設定tcp/ip協議傳輸資料報時的最大傳輸單元。
設定多大的mtu值取決於你的上網方式,不同的上網方式支援不同的mtu,下面列出了一些上網方式的mtu值:
ethernet(一般上網方式,預設值):1500
pppoe/adsl:1492
dial up/modem:576
鏈路層具有最大傳輸單元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
我們假設資料的淨荷(payload)部分預留是1472位元組。如果資料部分大於1472位元組,就會出現分片現象。
另外ip層對資料報進行分片(fragmentation)操作,使每一片的長度都小於或等於mtu。
ip首部包含了分片和重組所需的資訊:
identification:傳送端傳送的ip資料報標識欄位都是乙個唯一值,該值在分片時被複製到每個片中。
r:保留未用。
df:don't fragment,「不分片」位,如果將這一位元置1 ,ip層將不對資料報進行分片。
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位元組。
UDP報文分片問題
在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對 像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助 首先,我們知道,tcp ip通常被認為是乙個四層協議...
關於最大傳輸單元(MTU)的整理
mtu設定不當,可能會導致許多網路問題,如某些網路應用無法使用,某些 無法訪問等。下面是在網上搜尋整理的關於mtu設定的東西,某些可能未作驗證,僅供參考。1.如何確定網路mtu 某些isp接入的mtu可能會比常規使用的mtu小,這時如果設定了過大的mtu,就可能會導致很多服務無法使用的問題。可以通過...
關於網路傳輸中最大傳輸報文MTU的思考
一般tcp的書都會說在網路傳輸中最大傳輸報文mtu一般為1500位元組,但是在一次區域網的測試卻發現了如下問題 首先從後兩張我們可以確定c s兩端都是相互確認了mss為1460個位元組的,但是為啥第一張圖卻出了乙個2962位元組的包了呢,這明顯這是跟書上觀點相違背的。經過一段痛苦的查究下,發現原來網...