データ ペイロードの前にサイズを付ける TCP ストリーム プロトコルがあります。そのため、受信時にデータを適切にデコードできます。かなり標準的なものです。
これは何千人ものユーザーにとって問題なく機能しています。残念ながら、少なくとも 4 件のクライアントが接続の問題を抱えているとの報告があり、すべて遠隔地の国で発生しています。ロシアのクライアントが多数のテストの実行に協力し、問題を絞り込むことができました。プレフィックス サイズが強制的に 0 に設定されたパケットを送信すると、パケット全体が通過します。パケット データが で始まると、1c
パケットは通過しません。
彼のコンピューターから Wireshark でキャプチャした画像を 2 つ並べて表示したところ、次のようになりました。
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()
より多くの情報を得たり、この問題を解決したりするために推奨される追加のテストはありますか? 私の直感では、彼のハードウェア/ドライバーが壊れているようですが、彼は他のアプリケーションやインターネット全般には問題はないと主張しています。
ベストアンサー1
エンドリンクの 1 つがモバイル キャリア経由である可能性はありますか?
もうデータはありませんが、推測の域を出ないので、少し前にイタリアの携帯電話会社で同様の問題が発生したことを覚えています。どうやら、データ接続上の特定のビット シーケンスによって、キャリアが切断されるようです。+++ATH0 の古い「ping」トリックに少し似ています。
同様のシーケンス (1c0000000....) を別の媒体 (netcat ストリームなど) 経由で送信してみませんか?