08.13 UDP疑難雜症之(面向報文的傳輸方式)

前戲

面向報文的傳輸方式決定了UDP的數據發送方式是一份一份的,也就是應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。終極三問:

那麼UDP的報文大小由哪些影響因素呢?

UDP數據包的理論長度是多少?

合適的UDP數據包應該是多少呢?

UDP報文大小的影響因素,主要有以下3個

[1] UDP協議本身,UDP協議中有16位的UDP報文長度,那麼UDP報文長度不能超過2^16=65536.

[2] 以太網(Ethernet)數據幀的長度,數據鏈路層的MTU(最大傳輸單元)。

[3] socket的UDP發送緩存區大小

UDP數據包最大長度

根據UDP協議,從UDP數據包的包頭可以看出,UDP的最大包長度是2^16-1的個字節。由於UDP包頭佔8個字節,而在IP層進行封裝後的IP包頭佔去20字節,所以這個是UDP數據包的最大理論長度是2^16 - 1 - 8 - 20 = 65507字節。如果發送的數據包超過65507字節,send或sendto函數會錯誤碼1(Operation not permitted, Message too long),當然啦,一個數據包能否發送65507字節,還和UDP發送緩衝區大小(linux下UDP發送緩衝區大小為:cat /proc/sys/net/core/wmem_default)相關,如果發送緩衝區小於65507字節,在發送一個數據包為65507字節的時候,send或sendto函數會錯誤碼1(Operation not permitted, No buffer space available)。

UDP數據包理想長度

這個在我之前的文章有討論過,這裡再次講下。

理論上UDP報文最大長度是65507字節,實際上發送這麼大的數據包效果最好嗎?

我們知道UDP是不可靠的傳輸協議,為了減少UDP包丟失的風險,我們最好能控制UDP包在下層協議的傳輸過程中不要被切割。相信大家都知道MTU這個概念。 MTU最大傳輸單元,這個最大傳輸單元實際上和鏈路層協議有著密切的關係,EthernetII幀的結構DMAC+SMAC+Type+Data+CRC由於以太網傳輸電氣方面的限制,每個以太網幀都有最小的大小64字節,最大不能超過1518字節,對於小於或者大於這個限制的以太網幀我們都可以視之為錯誤的數據幀,一般的以太網轉發設備會丟棄這些數據幀。由於以太網EthernetII最大的數據幀是1518字節,除去以太網幀的幀頭(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes那麼剩下承載上層協議的地方也就是Data域最大就只能有1500字節這個值我們就把它稱之為MTU。

在下層數據鏈路層最大傳輸單元是1500字節的情況下,要想IP層不分包,那麼UDP數據包的最大大小應該是1500字節 – IP頭(20字節) – UDP頭(8字節) = 1472字節。不過鑑於Internet上的標準MTU值為576字節,所以建議在進行Internet的UDP編程時,最好將UDP的數據長度控制在 (576-8-20)548字節以內。

結語

本文討論了關於傳輸方式的問題,下篇文章咱們討論下UDP數據包的發送和接收問題。下期文章見!

在本頭條號的主頁置頂文章中有【文章分類】包含:

[數據庫系列]

[數據結構和算法系列]

[高級網絡編程篇系列]

[Linux系統篇系列]

[C++進階篇系列]

[C++基礎知識篇系列]

[協議篇系列]

[設計模式系列]

不要只收藏和轉發哦,點擊屏幕右上角的【關注】每天文章不落下。


分享到:


相關文章: