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.
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. –
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
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. –