Linux
為什麼 UDP 客戶端向 100Mbit 伺服器發送 1Gbit 速度?
我剛剛發現,在我在 Linux 使用者空間上編寫的一個簡單的 UDP 客戶端/伺服器應用程序中,UDP 客戶端(1 Gbit 乙太網介面)以 1 Gbit 的速度將數據發送到只有 100 Mbit 乙太網介面的 UDP 伺服器。當然,這會導致伺服器端出現大量丟包。
我必須通過在客戶端執行此操作來調整 NIC 設置:
ethtool -s eth0 speed 100 duplex full autoneg on
為什麼我必須這樣做?這不應該自動處理嗎?
UDP是一種“即發即棄”的傳輸方式,因此它不關心數據包在發送後會發生什麼。這意味著您可以以源系統的出口速率發送,而不管到目的地的路徑特徵如何;顯然,如果源介面發送數據包的速度超過網路可以承受的速度,則會導致封包遺失。
如果您需要自動處理此問題,則需要切換到 TCP 或 SCTP。或者,您可以在 UDP 之上建構自己的錯誤處理協議…
在您的特定情況下,如果您可以依靠 100Mbits/s 到達目的地,則最好在客戶端上使用流量整形,而不是將所有流量限制為 100Mbits/s 介面速度。