返回的 UDP 数据包缺少端口且无法到达
Returned UDP packets lacking port and fail to arrive
带有客户端和服务器的 Golang 应用程序。
服务器使用net.ListenUDP -- 客户端也使用net.ListenUDP,连接到服务器并发送带有服务器地址的conn.WriteToUDP数据包。
Server 收到带有 ReadFromUDP 的数据包并获取 return 地址。使用此 return 地址,它会将大量数据包发送回客户端。
当 运行 客户端和服务器都在本地计算机上时,这非常有效。使用 Wireshark 我可以检查 UDP 数据包并查看它们是否包含源端口和目标端口 - 在应用程序中我可以看到它们到达并且我的各种校验和测试显示数据是准确的。
然后我将服务器移到远程机器上。应用程序停止工作。我可以成功地将第一条消息从客户端发送到服务器 - 接收得很好。服务器将响应发回 'toward' 客户端 - 但客户端从未收到它们。
使用 Wireshark,我可以看到数据包确实以正确的 IP 地址返回到本地计算机。看起来我的网络路由器已经对传出数据包执行了 NAT - 并且已经正确地将响应数据包重新寻址到内部 IP..但是没有端口。
所以我有 UDP 数据包到达正确的机器,但没有端口 - 所以客户端应用程序没有收到它们。应用程序在 ReadFromUDP 上超时。
我不知道它是否相关,但在本地机器上,Wireshark 将数据包标记为 BT-uTP Utorrent 数据包。当他们从远程服务器进来时,这就是我在 Wireshark 中看到的——注意缺少端口。
有什么办法可以解决这个问题。我不认为这是一个 UDP 打洞问题,因为虽然我正在通过 NAT 建立连接,但它与服务器而不是对等方建立连接。
这个数据包是碎片化的,您可以在 Internet 协议版本 4 > 标志下看到它。
如果您查看您提供的图片底部所示的框架,您应该会看到端口。
net.ListenUDP 似乎不支持套接字级别的碎片。
你有PPPoe连接吗?您可能需要将发送的数据包大小减少 8 个字节,或者更改远程端路由器外部接口上的 MTU。如果它在 PPPoe 接口上,您可能还需要更改本地路由器的 MTU。
带有客户端和服务器的 Golang 应用程序。
服务器使用net.ListenUDP -- 客户端也使用net.ListenUDP,连接到服务器并发送带有服务器地址的conn.WriteToUDP数据包。
Server 收到带有 ReadFromUDP 的数据包并获取 return 地址。使用此 return 地址,它会将大量数据包发送回客户端。
当 运行 客户端和服务器都在本地计算机上时,这非常有效。使用 Wireshark 我可以检查 UDP 数据包并查看它们是否包含源端口和目标端口 - 在应用程序中我可以看到它们到达并且我的各种校验和测试显示数据是准确的。
然后我将服务器移到远程机器上。应用程序停止工作。我可以成功地将第一条消息从客户端发送到服务器 - 接收得很好。服务器将响应发回 'toward' 客户端 - 但客户端从未收到它们。
使用 Wireshark,我可以看到数据包确实以正确的 IP 地址返回到本地计算机。看起来我的网络路由器已经对传出数据包执行了 NAT - 并且已经正确地将响应数据包重新寻址到内部 IP..但是没有端口。
所以我有 UDP 数据包到达正确的机器,但没有端口 - 所以客户端应用程序没有收到它们。应用程序在 ReadFromUDP 上超时。
我不知道它是否相关,但在本地机器上,Wireshark 将数据包标记为 BT-uTP Utorrent 数据包。当他们从远程服务器进来时,这就是我在 Wireshark 中看到的——注意缺少端口。
有什么办法可以解决这个问题。我不认为这是一个 UDP 打洞问题,因为虽然我正在通过 NAT 建立连接,但它与服务器而不是对等方建立连接。
这个数据包是碎片化的,您可以在 Internet 协议版本 4 > 标志下看到它。
如果您查看您提供的图片底部所示的框架,您应该会看到端口。
net.ListenUDP 似乎不支持套接字级别的碎片。
你有PPPoe连接吗?您可能需要将发送的数据包大小减少 8 个字节,或者更改远程端路由器外部接口上的 MTU。如果它在 PPPoe 接口上,您可能还需要更改本地路由器的 MTU。