如何解决带有gso的UDP不会收到完整的消息
我正在尝试将UDP与GSO(通用分段卸载)一起使用,以发送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 side
int ret = recvmsg(fd,flags);
我可以看到我发送了50Kb消息,而接收方仅通过一个呼叫就收到了1472。我听说过GRO(通用接收卸载),但是在网上找不到任何示例。我是否必须进行多个系统调用才能获取所有数据,是否可以设置socekt选项或进行系统调用以一次性接收重新组合的消息?如果我必须进行多个系统调用而不是仅仅依靠IP分段并发送比MTU更大的数据包,怎么能更有效率?
解决方法
这是一个有趣的vaderSentiment GITHUB Scoring,您可以阅读以深入了解GSO和GRO。 Ethtool可能能够在特定接口上启用/禁用GRO。取决于版本。如果可以配合使用,那就最好了。
否则,由于Linux网络堆栈非常复杂,仅凭结果很难检查导致段失败的部分。我认为最好使用netstat,ss,sar,tcpdump,wireshark等工具分析每一层,然后更容易知道哪里出了问题。但不要忘记检查您的硬件是否支持此功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。