帶有客戶端和服務器的 Golang 應用程序。服務器使用 net.ListenUDP - 客戶端也使用 net.ListenUDP,連接到服務器并使用 conn.WriteToUDP 和服務器地址發送數據包。服務器接收帶有 ReadFromUDP 的數據包并獲取返回地址。然后,它使用此返回地址將大量數據包發送回客戶端。當在本地計算機上運行客戶端和服務器時,這工作得很好。使用 Wireshark,我可以檢查 UDP 數據包并查看它們包含源端口和目標端口 - 在應用程序中,我可以看到它們到達,并且我的各種校驗和測試顯示數據是準確的。然后我將服務器移離現場到遠程計算機。應用程序停止工作。我可以成功地將第一條消息從客戶端發送到服務器 - 接收得很好。服務器將響應“發送回”客戶端 - 但客戶端永遠不會收到它們。使用 Wireshark,我可以看到數據包確實以正確的 IP 地址返回到本地計算機??磥砦业木W絡路由器已對傳出數據包執行了 NAT - 并已正確地將響應數據包重新尋址到內部 IP。但是沒有端口。所以我有 UDP 數據包到達正確的機器,但沒有端口 - 所以客戶端應用程序不會收到它們。應用程序在 ReadFromUDP 上超時。我不知道這是否相關,但在本地計算機上,Wireshark 將數據包標記為 BT-uTP Utorrent 數據包。當它們從遠程服務器進入時,這就是我在 Wireshark 中看到的 - 請注意缺少端口。有什么想法我可以解決這個問題。我不認為這是一個 UDP 打洞問題,因為雖然我是通過 NAT 建立連接,但它是與服務器而不是對等點建立連接。
1 回答

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
此數據包已分段,您可以在 Internet 協議版本 4 > 標志下看到這一點。
如果您查看您提供的圖片底部所示的框架,您應該會看到端口。
net.ListenUDP 似乎不支持套接字級別的碎片。
您有 PPPoe 連接嗎?您可能需要將發送的數據包大小減少 8 個字節,或者更改遠程端路由器外部接口上的 MTU。如果本地路由器位于 PPPoe 接口上,您可能還需要更改其 MTU。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消