带有客户端和服务器的Golang应用程序。

服务器使用net.ListenUDP-客户端也使用net.ListenUDP,连接到服务器并发送带有服务器地址conn.WriteToUDP的数据包。

服务器使用ReadFromUDP接收数据包并获取返回地址。然后,使用此返回地址,它将大量数据包发送回客户端。

在本地计算机上同时运行客户端和服务器时,这可以完美运行。使用Wireshark,我可以检查UDP数据包,并查看它们包含源端口和目标端口-在应用程序中,我可以看到它们到达并且我的各种校验和测试表明数据是准确的。

然后,我将服务器从站点移到了远程计算机上。该应用程序停止工作。我可以成功地将第一条消息从客户端发送到服务器-很好。服务器将响应“向”客户端发送回-但客户端从未收到。

使用Wireshark,我可以看到数据包确实以正确的IP地址返回到本地计算机上。看来我的网络路由器已在传出数据包上执行了NAT-并将正确的响应数据包重新寻址到内部IP。但是没有端口。

所以我有UDP数据包到达正确的机器上,但是没有端口-因此客户端应用程序没有收到它们。应用程序在ReadFromUDP上超时。

我不知道它是否相关,但是在本地计算机上,Wireshark将数据包标记为BT-uTP Utorrent数据包。当它们从远程服务器进入时,这就是我在Wireshark中看到的-请注意缺少端口。

sockets - 返回的UDP数据包缺少端口并且无法到达-LMLPHP

有什么想法我可以解决这个问题。我不认为这是UDP打孔问题,因为尽管我正在通过NAT建立连接,但它与服务器而不是对等服务器建立连接。

最佳答案

该数据包是分段的,您可以在“Internet协议(protocol)版本4”>“标志”下看到它。

如果您查看提供的图片底部所示的框架,则应该看到端口。

net.ListenUDP在套接字级别似乎不支持分段。

您有PPPoe连接吗?您可能需要将发送的数据包大小减少8个字节,或更改远程路由器外部接口(interface)上的MTU。如果它在PPPoe接口(interface)上,则可能还需要更改本地路由器MTU。

关于sockets - 返回的UDP数据包缺少端口并且无法到达,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57998208/

10-13 08:12
查看更多