- ベストアンサー
TCP/IPのデータ送受信の確実性はどの程度?
- TCP/IPのデータ送受信における確実性について疑問があります。
- sendとrecvの挙動やデータの欠落について検討しています。
- データの欠落が発生した場合の再送信方法について教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本的にTCP自体が チェックサム等をもち信頼性のあるプロトコルです。 特に1(send単位で欠落)等は途中でデータが損失していますが、 ひとつのパケットに対してシーケンス番号を持っている為 その時点でコネクションロストします。 1~4いずれにしてもデータがおかしい場合 再度connectの必要があります。 あるとするなら 3.send単位で欠落して以後は全て欠落(再度connect必要あり)。損失データ例[AAABBBBB]、[AAA] ただしsend単位ではなくパケット単位です 例えばsendで5Mぐらいのデータを送ろうとしても内部で1024バイトずつに 分割されていたりします。(recvでも1024ずつ受け取ります)
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
すいません。4ですね。 ただ5バイトの文字列(BBBBB)が2つのパケット(BBとBBB)になることは 基本的にはありませんが 勿論プログラム的に必ず5バイトが1パケットで送られることを 前提とするのはよくないです。 1パケットの最大サイズ MTU(Max Transfer Unit)は Windowsならレジストリに設定されていると 思います。 ちなみにWin2kのデフォルトは1024らしいです。 (だからsendが1024ずつに分割されたのかと今納得、、)
- mssine
- ベストアンサー率24% (38/156)
アプリケーションから見た場合、sendが正常なら、ちゃんと受信できている。としか判断できません。 完全にブラックボックスの世界です。 なので、sendで送ったバイト数と戻り値が異なっていれば、socketをshutdown & closesocketして、再度、connectする必要があります。
補足
>sendで送ったバイト数と戻り値が異なっていれば、socketをshutdown & closesocketして、再度、connectする必要があります。 MSDNにはsend関数の解説として ---------------- 宣言 int send(SOCKET s,const char FAR *buf,int len,int flags); 戻り値 If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len for nonblocking sockets. ---------------- と書かれています。現在使おうと考えているソケットは非ブロッキングです。そのため戻り値では単純にチェックできません。プログラム上でタイムアウトを設定して時間内に指定したバイト数送信できなければcloseと考えるということになりそうですね。
補足
4番の例になるということですね。自分の中では1番可能性がありそうだと思っていたものです。参考URLもまだ詳しくは見ていませんが役に立ちそうです。ありがとうございます。