亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

UDP SetWriteBuffer 和 SetReadBuffer 如何處理操作系統的緩沖區?

UDP SetWriteBuffer 和 SetReadBuffer 如何處理操作系統的緩沖區?

Go
慕無忌1623718 2022-05-23 15:02:01
描述我正忙著用 Go 編寫一個高頻 UDP 服務器。我估計兩種方式至少每秒 1000 個數據包。但是,隨著我通過 UDP 套接字發送的數據大小的增加,我最終遇到了以下錯誤:read udp 127.0.0.1:1541->127.0.0.1:9737: wsarecv: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.我最終只是增加了我正在讀取和寫入的緩沖區的大小,如下所示:buffer := make([]byte, 64 * 1024 * 1024) // used to just be 1024l, err := s.socketSim.Read(buffer)這工作正常,我停止收到錯誤......但是,我可以跨net包內的兩個函數:s.socketSim.SetWriteBuffer(64 * 1024 * 1024)s.socketSim.SetReadBuffer(64 * 1024 * 1024)我了解到這兩個作用于operating system's transmit buffer問題我是否關心設置操作系統緩沖區大小,為什么?應用程序緩沖區的大小如何影響操作系統緩沖區的大???它們是否應該始終相同,它們應該/可以變得多大?
查看完整描述

1 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

首先,您不僅有設備上每個接口的 MTU 大小以及發送/接收的任何目的地,而且兩者之間的每個設備也有一個 MTU 大小。出于這個原因,正如其他人所提到的,您可能希望使用 MTU 普遍接受的內容,因為您可能無法控制數據路由中的每個設備。在 UDP 的情況下,MTU 實際上只是表示數據報在分片之前可以有多大。

其次,您幾乎肯定希望您的 SND/RCV 緩沖區大于 MTU。這些是內核緩沖區,當您還沒有準備好接收數據時,它們會保留數據。更大的 UDP RCV 緩沖區意味著內核會在將它們放入深淵之前為您緩沖更多的數據包。也許您對每個數據包都有一些重要的工作要做。根據比特率,您可能需要更大或更小的內核緩沖區。

最后,您使用的是 UDP。無法保證您會按順序或完全收到數據包。您和對等方之間的任何路由器都可能出于任何原因決定丟棄數據包。由于您使用的是 UDP,因此您應該為丟棄和亂序的數據包做好準備。您可能還需要某種重傳機制,這會使事情變得更加復雜。

或者,如果丟棄的數據包不可接受,您可能會考慮使用 TCP,因為您知道時間是不確定的。

如果您使用的是 linux,則可以在 /proc/sys/net 中查看當前緩沖區大小。通常內核會加倍你的要求。

此外,您可以通過觀察 /proc/net/udp 中的數據包丟失來調整緩沖區大小。如果您看到下降,您可能希望使您的 rcv 緩沖區更大,特別是在數據是突發的和處理密集型的情況下。如果您的數據以一致的速率進入并且您仍在丟棄數據包,那么您處理它們的速度不夠快。


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號