TCP プロトコルを学習するときに最も頻繁に使用されるのは、TCP の 3 ウェイ ハンドシェイクと 4 ウェイ ウェーブです。このあたりの紹介は文章や図で分析されていることがほとんどですが、具体的な合意内容となるとまだよく分からないところもあるので、次に具体的な合意までのプロセスを分析していきたいと思います。
ここでは、Wireshark ネットワーク分析ツールを使用して一連のデータがキャプチャされます。
192.168.0.11 は Modbus サーバー、192.168.0.18 は Modbus クライアントです。クライアントは最初にサーバーに接続します。接続が成功すると、クライアントは読み取りコマンドをサーバーに送信し、サーバーは一連のデータを返します。最後に、クライアントはサーバーから切断されます。
最初の 3 つのデータは 3 ウェイ ハンドシェイク プロセスであり、最後の 4 セットのデータは 4 ウェイ ハンドシェイク プロセスです。
3 ウェイ ハンドシェイクのプロセスは次のとおりです。
最初のハンドシェイク:
クライアントは SYN 信号を 1 に設定し、新しい接続を開始します。このとき、クライアントは、次に受信するデータのシリアル番号が現在のシリアル番号に 1 を加えた値になることを期待して、シリアル番号 1213270320 をランダムに生成します。サーバーとの接続が確立していないため、サーバーの確認番号は不明であり、デフォルトでは0が送信されます。この時点で、クライアントは SYN_SEND 状態に入り、サーバーによる確認を待ちます。
2 回目のハンドシェイク:
サーバーはクライアントの SYN パケットを受信した後、クライアントの SYN を確認する必要があります。つまり、クライアントが最後に送信したシリアル番号に 1 を加算します。クライアントが最後に送信したシリアル番号は 1213270320 です。追加後1, 1213270320=1 同時に SYN パケット、つまり SYN+ACK パケットも送信します サーバーはクライアントに初めてデータを送信するため、サーバーはランダムにシリアルも生成します番号 6510、サーバーは SYN_RECV 状態に入ります。
3回目のハンドシェイク:
クライアントはサーバーからSYN+ACKパケットを受信し、確認パケットACKをサーバーに送信します 2回目のハンドシェイクでサーバーが送信したシリアル番号は6510なので、今回サーバーに確認する際には、サーバーのシリアル番号を追加すると、1、つまり 6510 が返されます。コネクションが確立されたため、SYN信号は0にクリアされ、ACK信号は1に設定されます。パケットが送信された後、クライアントとサーバーは ESTABLISHED 状態に入り、3 ウェイ ハンドシェイクを完了します。
契約における特定のデータの意味は次のとおりです。
4 波のプロセスは次のとおりです。
最初の波:
クライアントはアクティブに終了し、(シーケンス番号を指定しながら) FIN を送信します。これは、クライアントからサーバーへのデータ送信を終了するために使用されます。つまり、クライアントはサーバーに、「これ以上データは送信しません」と伝えます (もちろん、fin パケットの前に送信されたデータが受信されない場合、対応するデータは送信されません)。 ack 確認メッセージを受信しても、クライアントは引き続きデータを再送信しますが、この時点でもクライアントはデータを受け入れることができます。その後、クライアントは FIN_WAIT_1 状態に入ります。
第 2 の波:
FIN パケットを受信した後、サーバーはクライアントに ACK を送信し、シーケンス番号が受信したシーケンス番号 + 1 であることを確認します (SYN と同様、1 つの FIN が 1 つのシーケンス番号を占有します)。その後、サーバーは CLOSE_WAIT (クローズ待ち) 状態になり、このときの TCP はハーフクローズ状態となり、クライアントからサーバーへの接続が解放されます。クライアントはサーバーから ACK 応答セグメントを受信すると、FIN_WAIT_2 状態に入ります。
第三の波:
サーバーはクライアントから切断することも意図しています。クライアントに FIN を送信して、サーバーからメイン クライアントへのデータ送信を終了します。つまり、データは送信済みであり、これ以上データは送信しないことをクライアントに伝えます。その後、サーバーは LASK_ACK (最終確認) 状態に入り、クライアントの確認を待ちます。
第 4 の波:
サーバーから接続解放 (FIN) セグメントを受信した後、クライアントは接続解放 (FIN) セグメントの確認シーケンス番号 ack を ACK 応答メッセージとして使用して、ACK 応答セグメントをサーバーに送信します。セグメントのシーケンス番号 seq の場合、接続解放 (FIN) セグメントのシーケンス番号 seq+1 が確認シーケンス番号 ack として使用されます。その後、クライアントは TIME_WAIT (時間待機) 状態になり、サーバーが ACK 応答メッセージ セグメントを受信した後、サーバーは CLOSE (クローズ) 状態になり、このサーバーへの接続が閉じられます。クライアントが TIME_WAIT 状態にある場合、この時点では TCP は解放されていないため、クライアントが CLOSE 状態に入る前に 2MSL 待機する必要があります。
このように、Wireshark ソフトウェアを介して送信されたデータを詳細に分析することで、TCP の 3 ウェイ ハンドシェイクおよび 4 ウェイ ハンドシェイク プロセスをより深く理解できるようになります。