2014-04-01 5 views
21

Wir haben ein TCP-Stream-Protokoll, bei dem wir unsere Datennutzlast durch die Größe voranstellen. So können die Daten beim Empfang korrekt decodiert werden. Ziemlich normales Zeug.TCP-Paket wird nicht von Russland nach Kanada empfangen, wenn die Daten mit "1c" beginnen

Dies funktioniert gut für Tausende von Menschen. Leider haben wir mindestens 4 gemeldete Fälle von Verbindungsproblemen in abgelegenen Ländern. Ein Kunde in Russland konnte uns helfen, viele Tests durchzuführen und das Problem zu reduzieren. Wenn wir ein Paket senden, bei dem die Präfixgröße auf 0 gezwungen wird, wird das gesamte Paket durchkommen. Wenn die Paketdaten mit 1c beginnen, wird das Paket es nicht schaffen.

Ich habe zwei nebeneinander Wireshark von seinem Computer erfasst, die dies zeigen:

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! 

Der eigentliche Client und Server verwenden IOCP aber mein Test-App verwendet C# TcpListener und TcpClient mit Flaggen nicht benutzerdefinierten Optionen überhaupt.

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

Gibt es weitere Tests dieses zu erhalten weitere Informationen/lösen empfehlen? Meine Vermutung war, dass seine Hardware/Treiber korrupt sind, aber er behauptet, keine Probleme mit irgendeiner anderen Anwendung oder dem Internet im Allgemeinen zu haben.

+7

Ich würde vermuten, dass es dazwischen einige tiefe Inspektionsgeräte gibt, die den Verkehr filtern. Oft sind diese Geräte nicht sehr intelligent und schauen sich nur einige Muster und Ports an. Sie könnten versuchen, alternative Verbindungen zu verwenden, z. Versuchen Sie, verschiedene Ports zu verwenden oder einen VPN-Tunnel zu verwenden. –

+0

Wir verwenden Port 9001 für den Server. Leider ist VPN keine Option. Die betreffende App ist ein Spielclient, von dem man nicht erwarten kann, dass ein VPN eingerichtet wird! – Spish

+0

Ich wollte nicht permanent auf VPN oder einen anderen Port wechseln, sondern einfach testen, ob das Problem verschwindet. Wenn es verschwindet, ist es wahrscheinlich eine filternde Middlebox, zwischen der man entweder versuchen kann, zu arbeiten oder einfach mit diesem Klienten aufzuhören. Wenn das Problem weiterhin besteht, müssen Sie nach anderen Erklärungen suchen. –

Antwort

1

Könnte es sein, dass einer der Endlinks über einen Mobilfunkanbieter läuft?

Ich habe die Daten nicht mehr, aber da wir im Bereich der Spekulationen sind, erinnere ich mich an ein ähnliches Problem mit einem italienischen Mobilfunkanbieter: scheinbar würde eine bestimmte Bitfolge über eine Datenverbindung gehen den Träger fallen lassen. Vage ähnlich dem +++ ATH0 alten 'Ping' Trick.

Könnten Sie versuchen, eine ähnliche Sequenz (1c0000000 ....) über ein anderes Medium zu senden, z. B. einen Netcat-Stream?

Verwandte Themen