我發送了很多數據到我的服務器,並且由於接收緩衝區的大小很小而丟失了一部分數據包。
你不知道。有很多可能的原因。
現在我收到的設置緩衝在這樣的方式 -
DatagramChannel serverChannel;
serverChannel.setOption(StandardSocketOptions.SO_RCVBUF, 1024*1024*10); // 10 MB
是否有意義?
不是真的,這是一個巨大的緩衝區,操作系統可能會將它截斷爲更合理的大小。嘗試在設置後獲取選項並查看實際大小。
此代碼並沒有解決數據包丟失問題。
沒人說這會。你只是假設它。
還有一個問題 - 我的網絡控制器的接收緩衝區屬性默認是512 - 是字節還是兆字節?
除非您告訴我們您使用的是什麼網卡,否則沒有人可以回答,但您應該可以從製造商的數據中爲您自己發現。
是否有必要手動增加此屬性,如果它是512字節?
不僅沒有必要,而且是不可能的。
我認爲增加緩衝編程方式實際上增加了操作系統的緩衝區
如果你的意思是SO_RCVBUF
控制套接字接收緩衝區大小,這是正確的。
,但這沒有任何意義
是它。
因爲最初udp數據包「來」到我的網卡。
並從那裏進入操作系統,並從那裏進入IP棧,並從那裏到UDP棧,並從那裏到套接字接收緩衝區。當大多數路徑MTU高達1500字節時,NIC看起來似乎不會有512字節的緩衝區,但是例如它的確有意義。你可以認爲它已經足夠了,畢竟它工作。
您的基本假設是有缺陷的。由於各種原因,UDP數據包可能會丟失:它們從來沒有發送過,它們被中間路由器丟棄,它們被分成碎片並且並非所有的碎片都送到接收器,或者接收器的接收緩衝器滿了,反過來可能是因爲它太小或者因爲接收者無法跟上發送者。只使用巨大的套接字接收器緩衝區只能解決其中一個問題。如果您需要可靠性,請使用TCP,否則執行ACK或NACK機制並重試。
來源
2013-03-18 03:48:12
EJP
UDP協議不保證數據包傳遞。如果您不想丟失數據包,請切換到TCP或增加您發送的數量。 – Makoto 2013-03-18 03:38:48