將幾個UDP數據包組合成一個數據包,而不是一個接一個地發送它們有什麼好處?我知道,如果大包被淹沒了,那麼我就把它們全都放了,但是把它們全部放在一起可能有一些好處嗎?例如較大的丟失概率較低?結合UDP數據包?
回答
通常,聯網通道將受限於每秒可發送數據包的速率。因此,如果您希望每秒發送數百萬條消息,則通常希望將它們合併爲更少數量的數據包,以避免重大數據包丟失。
作爲一種過度概括,Windows不會像UDP每秒大於10,000個數據包,但是您可以使用大型MTU數據包飽和一個千兆網絡。
將幾個UDP數據包組合成一個數據包,而不是一個接一個地發送它們有什麼好處?
可以保存在每個數據報8字節的UDP報頭上,從而減少通過線路發送的數據量。只要確保不發送更多的MTU sans IP和UDP標頭大小以避免IP層上的碎片化。另外,標準的POSIX套接字API需要一個send/sendto/sendmsg()
系統調用來發送或接收一個數據報,所以通過發送較少的數據報,一個系統調用減少了總體延遲(每個調用幾微秒的順序),所需的系統調用更少。從3.0開始的Linux內核提供sendmsg()
和recvmmsg()
函數來在一次系統調用中發送和接收多個數據報。
我知道,如果大數據包被courrupted然後我失去所有的
真。但是,如果協議無法應對UDP數據報丟失,那麼可能無關緊要 - 只要一個數據報丟失,它就會被破壞。
對於包大小很小(小於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一些應用程序 - 節省了很大一部分帶寬。
- 1. 發送UDP數據包gopacket
- 2. 解析UDP數據包
- 3. UDP發送數據包failling
- 4. 「Lost」UDP數據包(JBoss + DatagramSocket)
- 5. udp數據包丟失
- 6. 加密UDP數據包
- 7. Android udp數據包丟失
- 8. UDP數據包到類
- 9. UDP數據包NPE - Java的
- 10. UDP數據包誤啓動
- 11. 小數據包的UDP流
- 12. 分裂UDP數據包
- 13. Linux丟棄UDP數據包
- 14. 的AsyncTask和UDP數據包
- 15. 數據包損壞和UDP
- 16. 50%udp數據包丟失
- 17. Android UDP數據包丟失
- 18. UDP數據包安排
- 19. UDP數據包兼容型
- 20. UDP數據包分離
- 21. UDP數據包碎片
- 22. UDP數據包的排序
- 23. 讀取UDP數據包
- 24. Java UDP數據包僅包含5個數據包
- 25. 重新組合零碎的UDP數據包
- 26. 在C#自定義的UDP數據包結構
- 27. 平均UDP數據包丟失和數據包重新排序
- 28. 用python接收UDP數據包,造成數據包丟失
- 29. 無法接收NAT數據包後面的UDP數據包
- 30. 發送帶有IP_TOS輔助數據的UDP數據包時sendmsg()失敗,並且發送UDP數據包
udp是「盡力而爲」協議。繁忙的路由器可能會選擇丟棄一個較大的udp數據包,而一個小型的路由器可能會通過流量中斷。沒有任何保證。 –
如果不是評論,我會給這個最好的答案 – Lauer