質問: 有線 LAN ⇔ 無線 LAN で TCP 通信すると、データが送信元と受信先で順番が相違する? 謎な現象が起こっています。 無線 LAN, 親機は BUFFALO WSR-300HP / WHR-G45S どちらでも発生 子機は Archer T2UH 具体的には svn の使用中に気が付きました。数個ファイルを転送すると、つぎの 2 つのエラーが任意に発生します。 ``` svn: E210004: Malformed network data svn: E140001: zlib (uncompress): corrupt data: Decompression of svndiff data failed ``` エラーが出るので仕方なく何回も `svn cleanup && svn up` をやっています。何回でもエラーが発生します。 svnserve (Windows Server 2012) は有線 LAN で、svn は無線 LAN 側 (Windows Server 2012) です。 そこでテストプログラムを作り、相違が発生するかどうか検証しました。16 バイトの固定長文字列を延々と送信するプログラムです。 `time is 0` `time is 1` `time is 2` `time is 3` ... 有線 LAN 側ではこのような内容を延々と送信し、無線 LAN 側はそれを受信して内容確認するプログラムです。 結果、何回やっても異なる場所で順番の相違が発生しました。 `Diff! [time is 2348 ] should be [time is 589 ]` `Diff! [time is 2431 ] should be [time is 469 ]` `Diff! [time is 2247 ] should be [time is 600 ]` 無線 LAN 側でダイゼクタ... Wireshark を起動し、通信をキャプチャ。TCP Stream を追跡すると順番の相違はなく 0 から順番にキレイに並んでいることを確認しました。 TCP については詳しくないのですが、ウィンドウサイズ・シーケンス番号・ACK 番号とかそういったものの設定が関わってくるのでしょうか。 こういった現象って一般に認知されていたり回避策があったりするのでしょうか...
回答: Transmission Control Protocol - データ転送で > > TCP には以下のように User Datagram Protocol とは異なる重要な特徴がある。 > > > * データ転送時の順序を保証 - 受信側でシーケンス番号を使って並べ替えを行う。 > * 喪失パケットの再送 - 確認応答のないセグメントは再送する。 > * 誤りのないデータ転送 > > > と説明されているように、TCPは正しく受信できない場合は再送、並べ替えを行います。アプリケーションが読み出す段階では、データ順序が入れ替わることはありません。 使用しているPC・ハードウェアの故障を疑うべきです。メモリーエラー、ドライバ不良など。