3wayハンドシェイク中のパケット損失
質問
割り当てのために、c++(winsock2を使用)で記述されたクライアントアプリケーションとサーバーアプリケーション間で3way stopとwait handshakeを実行する必要があります。クライアントはSYNを送信します。サーバーはクライアントシーケンス番号をインクリメントし、SYN-ACKを送信します。クライアントはサーバーシーケンス番号をインクリメントし、ACKを送信します。
パケット損失をシミュレートするために、クライアントとサーバーは、パケットを転送しない中間ルータープログラムに接続され、損失を引き起こパケット損失の可能性を考慮するために、sendto()、select()、recvfrom()ステートメントをどのように構造化する必要がありますか?
たとえば、SYNが失われ、クライアントがタイムアウトした場合は、再送信します。SYN-ACKが失われると、クライアントはタイムアウトしてSYNを再送信します。ただし、ACKが失われた場合はどうすればよいかわかりません。
編集: それは基本的に私のクライアントでこのようになります:
- SYNを送信します。
- ループwhile select()ステートメントが失敗し、SYNを再送信します
- SYN-ACKを受け取る
- ACKを送る
- ACKが失われた場合、SYN-ACKを再受信する可能性があります。
ループをいつ停止するかを知るにはどうすればよいですか?
解決
select
ブロックせずにソケットを読み取ることができるかどうかを確認するために使用できます。
ACKがどの送信パケットに属しているかを確認するには、シーケンス番号を確認します。
タイムアウト内にACKを受信しない場合は、最後のパケットを簡単に再送信します。どのようなパケットを送信したかは関係ありませんが、ACKを受信しない場合は再送信する必要があります。
所属していません StackOverflow