Linux下使用udp傳輸recvfrom()函數的應用

原文鏈接:http://www.xiaovdiy.cn/?post=256

UDP包最大是多大呢?UDP頭部大小字段佔16字節,所以理論上是65535個字節大小。但是UDP如果是通過IP(大多數情況)來傳送,由於UDP本身不支持分片,所以一個UDP包只能通過一個IP包來傳送,一個IP包大大小理論上也是用16字節表示,這樣UDP最大大小就是(65535-IP頭部)。

 

而現實中如果IP包大小大於底層鏈路層幀的最大數據區大小,則必須對IP包進行分片傳送。分片會嚴重影響傳送效率,而且增大不穩定性,所以實際的網絡程序發送的IP包都封裝到單一的鏈路層幀中,從而避免分片。問題是鏈路層幀是多大呢?答案是不一定,因爲不同的物理網絡的幀大小不一樣,如以太網是1500字節,但是其他物理網絡可能更小,Internet上的有個最小的限制,那就是576字節。如果UDP程序運行在只運行在以太網中,那麼爲了避免IP分片,可以採用的最大大小爲(1500-20-8)=1472字節。如果UDP程序需要運行在Internet上,那麼建議最大大小爲(576-20-8)=548字節。

 

上面是實踐中的最佳UDP大小,但是並不是所有程序都採用上述經驗,所以對於接收緩衝區的大小也就沒有一個標準,而是取決於應用程序設計者本身。雖然對於Windows平臺,recvfrom()能夠提示調用者buf過小的問題,但是即使得到了這個錯誤,包還是被丟棄了。所以在接收UDP包時,一定要事先了解應用層設計的最大UDP包大小,然後按照最大值開闢接收緩衝區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章