我们有一个TCP数据流协议,我们在数据有效载荷的前面加上大小。所以数据可以在收到时正确解码。相当标准的东西。当数据以'1c'开始时,TCP数据包将无法从俄罗斯传送到加拿大
这工作正常的成千上万的人。不幸的是,我们至少有4个报告的客户有连接问题,都在偏远的国家。俄罗斯的客户能够帮助我们进行大量测试并缩小问题范围。如果我们发送一个数据包,其中前缀大小被强制为0,那么整个数据包将通过。如果分组数据以1c
开头,那么数据包将无法通过。
我从他的电脑两个并排的Wireshark捕获显示此:
Working
-------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
00000000000000001c0000000000000000000000000000000000000000000000
Toronto -> Rusion [PSH,ACK] <- server in toronto got the data, sent a reply!
Not-Working
--------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
1c000000000000001c0000000000000000000000000000000000000000000000
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Server in Toronto never gets the packet from Russia!
实际的客户端和服务器使用IOCP,但我的测试应用程序使用C#有没有自定义选项的标志在所有TcpListener
和TcpClient
。
Not actual code
--------------
var client = new TcpClient()
client.Connect(host, port)
client.GetStream().Write()
client.GetStream().Read()
var listener = new TcpListener(port);
listener.Start();
var serverClient = listener.AcceptTcpClient();
serverClient.GetStream().Read()
serverClient.GetStream().Write()
是否有任何进一步的测试建议获取更多信息/解决这个问题?我的直觉是他的硬件/驱动程序是腐败的,但他声称与任何其他应用程序或互联网一般没有问题。
我猜测在哪些过滤器流量之间有一些深度检查设备。通常这些设备不是很聪明,只是看一些模式和端口。您可能会尝试使用替代连接,例如尝试使用不同的端口或使用VPN隧道。 –
我们使用端口9001作为服务器。不幸的是,VPN不是一种选择。有问题的应用程序是游戏客户端,不能期望人们设置VPN来玩! – Spish
我不是故意要永久切换到VPN或其他端口,而只是做测试,如果问题消失。如果它消失了,那么它可能是一个过滤中间件,你可以尝试解决这个问题,或者放弃这个客户端。如果问题仍然存在,您必须寻找其他解释。 –