在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?
當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對
像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助:
首先,我們知道,tcp/ip通常被認為是乙個四層協議系統,包括鏈路層,網路層,運輸層,應用層.
udp屬於運輸層,下面我們由下至上一步一步來看:
乙太網(ethernet)資料幀的長度必須在46-1500位元組之間,這是由乙太網的物理特性決定的.
這個1500位元組被稱為鏈路層的mtu(最大傳輸單元).
但這並不是指鏈路層的長度被限制在1500位元組,其實這這個mtu指的是鏈路層的資料區.
並不包括鏈路層的首部和尾部的18個位元組.
所以,事實上,這個1500位元組就是網路層ip資料報的長度限制.
因為ip資料報的首部為20位元組,所以ip資料報的資料區長度最大為1480位元組.
而這個1480位元組就是用來放tcp傳來的tcp報文段或udp傳來的udp資料報的.
又因為udp資料報的首部8位元組,所以udp資料報的資料區最大長度為1472位元組.
這個1472位元組就是我們可以使用的位元組數。:)
當我們傳送的udp資料大於1472的時候會怎樣呢?
這也就是說ip資料報大於1500位元組,大於mtu.這個時候傳送方ip層就需要分片(fragmentation).
把資料報分成若干片,使每一片都小於mtu.而接收方ip層則需要進行資料報的重組.
這樣就會多做許多事情,而更嚴重的是,由於udp的特性,當某一片資料傳送中丟失時,接收方便
無法重組資料報.將導致丟棄整個udp資料報。
因此,在普通的區域網環境下,我建議將udp的資料控制在1472位元組以下為好.
進行internet程式設計時則不同,因為internet上的路由器可能會將mtu設為不同的值.
如果我們假定mtu為1500來傳送資料的,而途經的某個網路的mtu值小於1500位元組,那麼系統將會使用一系列的機
制來調整mtu值,使資料報能夠順利到達目的地,這樣就會做許多不必要的操作.
目前大多數的路由裝置的mtu都為1500
鑑於internet上的標準mtu值為576位元組,所以我建議在進行internet的udp程式設計時.
最好將udp的資料長度控制項在548位元組(576-8-20)以內.
看到另外一篇文章說,還應該有個ppp的包頭包尾的開銷(8bytes),那就為1492了
udp 包的大小就應該是 1492 - ip頭(20) - udp頭(8) = 1464(bytes)
tcp 包的大小就應該是 1492 - ip頭(20) - tcp頭(20) = 1452(bytes)
總結:我們設定包的大小對於udp和tcp協議是不同的,關鍵是看系統效能和網路效能,網路是狀態很好的區域網,那麼udp包分大點,提高系統的效能。不好,就分小於1464,這樣可以減低丟包率。對於tcp來說,這個就要靠經驗了,因為,tcp丟包可以自動重傳,分大了,系統效能提高了,分包和錯誤重組可能會耗費時間,使傳送時間延長,分小了,系統效能又降低了。
總之 ,如果網路不好,包大小最好為1400以下
可用頻寬與udp包大小的關係
昨天花了大量時間在 調優 因為伺服器的網路輸出頻寬死活與計算值不符合。理論判斷網路輸出頻寬應該是90mbps,但是檢測卻只有50 mbps而已。做了幾個試驗後,我們覺得是伺服器效能問題,於是祭出profile殺器,可是優化了幾個耗時多的函式後,頻寬巍然不動。之後我們先xxoo,再 ooxx,搞得是雞...
UDP中乙個包的大小最大能多大
1.在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對 像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助 首先,我們知道,tcp ip通常被認為是乙個四層...
tcp與udp緩衝區大小總結
1.tcp收發緩衝區預設值 root localhost cat proc sys net ipv4 tcp rmem 4096 87380 4194304 87380 tcp接收緩衝區的預設值 root localhost cat proc sys net ipv4 tcp wmem 4096 1...