2012-10-09 43 views
1

將幾個UDP數據包組合成一個數據包,而不是一個接一個地發送它們有什麼好處?我知道,如果大包被淹沒了,那麼我就把它們全都放了,但是把它們全部放在一起可能有一些好處嗎?例如較大的丟失概率較低?結合UDP數據包?

+1

udp是「盡力而爲」協議。繁忙的路由器可能會選擇丟棄一個較大的udp數據包,而一個小型的路由器可能會通過流量中斷。沒有任何保證。 –

+0

如果不是評論,我會給這個最好的答案 – Lauer

回答

0

這將由發送應用程序決定。

請注意,您的大數據包受底層網絡的MTU限制。例如UDP數據包的理論大小爲64k,但以太網幀僅爲〜1500字節。所以我懷疑這不是一個實用的功能。

+0

我正在編寫應用程序。 – Lauer

+0

IPv4 UDP包有效載荷的理論最大尺寸爲65535-20-8,首先減去IP頭,然後減去UDP頭,得到65509個字節。 – EJP

0

通常,聯網通道將受限於每秒可發送數據包的速率。因此,如果您希望每秒發送數百萬條消息,則通常希望將它們合併爲更少數量的數據包,以避免重大數據包丟失。

作爲一種過度概括,Windows不會像UDP每秒大於10,000個數據包,但是您可以使用大型MTU數據包飽和一個千兆網絡。

0

將幾個UDP數據包組合成一個數據包,而不是一個接一個地發送它們有什麼好處?

可以保存在每個數據報8字節的UDP報頭上,從而減少通過線路發送的數據量。只要確保不發送更多的MTU sans IP和UDP標頭大小以避免IP層上的碎片化。另外,標準的POSIX套接字API需要一個send/sendto/sendmsg()系統調用來發送或接收一個數據報,所以通過發送較少的數據報,一個系統調用減少了總體延遲(每個調用幾微秒的順序),所需的系統調用更少。從3.0開始的Linux內核提供sendmsg()recvmmsg()函數來在一次系統調用中發送和接收多個數據報。

我知道,如果大數據包被courrupted然後我失去所有的

真。但是,如果協議無法應對UDP數據報丟失,那麼可能無關緊要 - 只要一個數據報丟失,它就會被破壞。

0

對於包大小很小(小於100字節)的情況很重要。 IP/UDP標頭至少有28個字節。

想象一下,您有流式連接到服務器,每個數據包包含50個字節,並且您的軟件以每秒1000個數據包速率發送數據包。

實際的有效載荷是1000 * 50 bytes = 50000 bytes.頭開銷1000 * 28 = 28000 bytes總字節數:50000 + 28000 = 87000 ==> 87 KBps

想象一下,你可以每3個UDP數據包組合成一個包:

頁眉開銷1000/3 * 28 = 9333總字節數:50000 + 9333 ===> 60 KBps

這-in一些應用程序 - 節省了很大一部分帶寬。