返回的UDP数据包缺少端口,无法到达

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

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

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

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

然后我将服务器移离现场到远程计算机。应用程序停止工作。我可以成功地将第一条消息从客户端发送到服务器 - 接收得很好。服务器将响应“发送回”客户端 - 但客户端永远不会收到它们。

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

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

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

http://img1.mukewang.com/64c0b14600019d8407430563.jpg

有什么想法我可以解决这个问题。我不认为这是一个 UDP 打洞问题,因为虽然我是通过 NAT 建立连接,但它是与服务器而不是对等点建立连接。



蓝山帝景
浏览 124回答 1
1回答

慕桂英3389331

此数据包已分段,您可以在 Internet 协议版本 4 > 标志下看到这一点。如果您查看您提供的图片底部所示的框架,您应该会看到端口。net.ListenUDP 似乎不支持套接字级别的碎片。您有 PPPoe 连接吗?您可能需要将发送的数据包大小减少 8 个字节,或者更改远程端路由器外部接口上的 MTU。如果本地路由器位于 PPPoe 接口上,您可能还需要更改其 MTU。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go