簡體   English   中英

帶有 gso 的 UDP 沒有收到整個消息

[英]UDP with gso doesn't receive the entire message

我正在嘗試使用帶有 GSO(通用分段卸載)的 UDP 來發送 50Kb 大小的數據包。

// sender side 
int val = 1472; // ETHERNET - udp - upv4 header
if (setsockopt(fdt, SOL_UDP, UDP_SEGMENT, &val, sizeof(val)))
    error(1, errno, "setsockopt udp segment");
int ret = sendmsg(fd, msg, flags);

和 recv 大小,我做

// recv side 
int ret = recvmsg(fd, msg, flags);

我可以看到我發送了 50Kb 的消息,而接收方只通過一次呼叫收到了 1472。 我聽說過 GRO(通用接收卸載),但我沒有在網上找到任何示例。 我是否必須進行多次系統調用才能獲取所有數據,是否可以設置 socekt 選項或進行系統調用以一次性接收重新組裝的消息? 如果我必須進行多個系統調用,而不是僅僅依靠 IP 分片和發送大於 MTU 的數據包,如何提高效率?

這是一篇有趣的文章,您可以閱讀以深入了解 GSO 和 GRO。 Ethtool 可能能夠在特定接口上啟用/禁用 GRO。 取決於版本。 如果你能順其自然,那就最好了。

如果沒有,由於 Linux 網絡堆棧確實很復雜,因此很難僅憑結果來檢查哪個部分使段失敗。 我認為最好使用一些工具,如netstat、ss、sar、tcpdump、wireshark等來分析每一層,然后更容易知道哪里出了問題。 但不要忘記檢查您的硬件是否支持此功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM