2014-04-01 13 views
21

我们有一个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#有没有自定义选项的标志在所有TcpListenerTcpClient

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() 

是否有任何进一步的测试建议获取更多信息/解决这个问题?我的直觉是他的硬件/驱动程序是腐败的,但他声称与任何其他应用程序或互联网一般没有问题。

+7

我猜测在哪些过滤器流量之间有一些深度检查设备。通常这些设备不是很聪明,只是看一些模式和端口。您可能会尝试使用替代连接,例如尝试使用不同的端口或使用VPN隧道。 –

+0

我们使用端口9001作为服务器。不幸的是,VPN不是一种选择。有问题的应用程序是游戏客户端,不能期望人们设置VPN来玩! – Spish

+0

我不是故意要永久切换到VPN或其他端口,而只是做测试,如果问题消失。如果它消失了,那么它可能是一个过滤中间件,你可以尝试解决这个问题,或者放弃这个客户端。如果问题仍然存在,您必须寻找其他解释。 –

回答

1

难道是终端链接之一是移动运营商?

我没有数据了,但由于我们处于猜测的领域,我记得前一个意大利移动运营商也遇到过类似的问题:显然,数据连接上的某个位序列会放下载体。与+++ ATH0老'平'技巧类似。

你可以尝试通过另一个媒介发送一个类似的序列(1c0000000 ....),说一个netcat流?