遇到了一个闻所未闻的问题。
我正在做一个网络游戏,它使用UDP数据包在一个特定的字符动作。在我开发了UDP模块后,它似乎工作正常。虽然我们团队的大多数成员都没有问题,但一个人,谁是我的老板,告诉我那个模块有问题。
我已经调查了这个问题,最后我发现了一个事实,那就是...在他的电脑上,如果udp包的大小小于12,那么这个包就永远不会被传递到另一个主机。
以下是一些补充资料:
- 1~11字节udp包被丢弃,12字节和超过12字节的包可以。
- 操作系统:Microsoft Windows Vista Business
- 网卡:Attansic L1千兆以太网10/100/1000 Base-T控制器
- WSASendTo返回TRUE。
- 环回UDP分组工作正常。
你是怎么看待这个问题的?你认为……是什么原因造成这个问题的?我应该为下一步的原因做什么?
PS.我不想填充这使得所有的数据包长度达12字节。
6条答案
按热度按时间5cnsuln71#
只是为了得到一个不明显的答案:可能UDP校验和卸载在该卡上被破坏,即数据包被发送,但被接收方丢弃?
您可以通过使用Wireshark查看接收到的数据包来检查这一点。
2uluyalo2#
如果你已经检查了防火墙,防病毒,网络防火墙,网络入侵.阅读此
对于UDP数据包,ethernet_header(14字节)+IPv4_header(最小20字节)+ UDP_header(8字节)= 42字节
现在,由于它小于64字节或60在linux上,网络驱动程序将填补数据包与(64-42 = 22)零,使它60字节之前,它发出的数据包。
这是UDP数据包的最小长度。
理论上你可以发送0数据字节的数据包,但还没有尝试过。
至于你的问题,它必须是一个操作系统的问题。检查您的网络的驱动程序手册或检查与制造商。因为这是不suuposed发生。
参考:http://www.freesoft.org/CIE/Course/Section4/8.htm
参考:http://en.wikipedia.org/wiki/User_Datagram_Protocol
ep6jt1vc3#
在他的PC和目标PC上运行Wireshark。
日志是否显示udp数据包离开他的机器?是否显示它到达目的地PC?
什么样的路由器硬件或交换机是他的PC和目的地之间?你可以删除它们,并与交叉电缆连接两者?(或替换为笔记本电脑的目的地,并链接到他的PC与交叉电缆?)
你有没有删除或至少列出他的机器上的所有反病毒和防火墙产品以及安装Winsock LSP的任何东西?
是否所有12字节或更少的数据包都被丢弃,或者只是一些,您可以生成具有随机内容的数据包,并查看是否是内容中的某些内容,而不仅仅是大小,这导致了问题。
k97glaaz4#
假设您的问题是从他的PC发送 *:首先,在有问题的PC上运行数据包嗅探器,看看它是否到达网卡。如果它到达网卡,则可能是网卡或网卡驱动程序有问题。
接下来,检查是否有任何正在运行的防火墙软件。尝试禁用它,看看会发生什么。
如果这不起作用,请使用
netsh winsock catalog reset
清除任何Winsock分层服务提供程序。如果这不起作用,我会被淘汰:)
最后,你可能会发现其他客户也有同样的问题;无论如何,你可能想考虑一下这种解决方法。尝试在连接时发送一些小尺寸的UDP数据包,如果它们始终无法通过,启用填充解决方法。对于探测数据包可以通过的主机,你不需要填充它们。
bxgwgixi5#
mpgws1up6#
这让我在两个物联网相关的项目中遇到了麻烦,在从边缘设备到服务器的路由过程中,小于12字节的小型UDP有效载荷被丢弃,反之亦然。
本文建议Win和Linux OS主机上的路由原因与网络接口有关,并且该问题已被修补。如果您可以访问资源网络设置(在Azure容器示例上,我没有),您还可以修改NIC属性以删除校验和。
参考https://github.com/microsoft/WSL/issues/8610
我们发现在这两种情况下,将UDP数据包填充到12字节可以缓解问题。
解决方案: