關於udp傳輸分片問題 MTU

2021-09-11 04:07:22 字數 1439 閱讀 5669

編者:李國帥

相關問題在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位元組的包了呢,這明顯這是跟書上觀點相違背的。經過一段痛苦的查究下,發現原來網...