TCP が接続を確立する過程で、なぜ 3 回握手をし、4 回手を振る必要があるのでしょうか?

分析と回答

TCP(伝送制御プロトコル)

TCP は、信頼性の高い接続サービスを提供するホスト間の層伝送制御プロトコルです。

TCP フラグ (ビット コード) には 6 種類があります。

  1. SYN (同期接続確立)
  2. ACK(確認応答)
  3. PSH(プッシュ送信)
  4. FIN(フィニッシュ)
  5. RST(リセット・リセット)
  6. URG(緊急緊急)

HTTP スリーウェイ ハンドシェイク:

初回: クライアントは SYN メッセージをサーバーに送信します (SYN は通常、同期に使用されます)。この時点で、クライアントは SYN_SEND 状態に入り、サーバーは確認を待つ SYN_RECE 状態に入ります。
ホスト A は syn=1 のビット コードを送信し、シーケンス番号 =x のデータ パケットをサーバーにランダムに生成します。ホスト B は SYN=1 からそれを認識し、A は接続の確立を要求します。

2 回目: サーバーは SYN メッセージを受信した後、同時に確認メッセージをクライアントに送信し、ACK メッセージ (応答用) を返します。
ホスト B はリクエストを受信した後、接続情報を確認する必要があり、ホスト A に ack 番号 = (x+1)、syn = 1、ack = 1 を送信し、seq = y のパケットをランダムに生成します。

3 回目: クライアントは ACK メッセージを受信し、ACK メッセージが正しいかどうかを確認し、正しい場合は再度 ACK を送信します。受信後、サーバーは検証に合格したことを確認し、接続が成功したことを示します確立され、データパケットを送信できるようになります。
それを受信したホスト A は、ack 番号が正しいか、つまり初めて送信した seq 番号 + 1 とビットコード ack が 1 であるかどうかを確認します。正しい場合、ホスト A は別の ack 番号を送信します。 (ホスト B の y + 1)、ack=1、ホスト B は seq 値を確認し、それを受信した後 ack=1 になると、接続が正常に確立されます。

切り離された 4 つの波:

TCP は全二重であるため、各方向は個別に閉じる必要があります。この原則は、一方の当事者がデータ送信タスクを完了すると、FIN フラグを送信して送信チャネルを終了できるということです。FIN を受信するだけで、この中にデータ フローが存在しないことを意味します(データを送信する必要はありません)、TCP は FIN を受信した後もデータを送信できます。

最初の波: クライアントは FIN をサーバーに送信して、送信したものを受信したのでチャネルを閉じたいことをサーバーに伝えます。したがって、アクティブ パーティが切断要求 (つまり、FIN メッセージ) をパッシブ パーティに送信すると、アクティブ パーティはデータ メッセージを送信しなくなり、アクティブ パーティは引き続きデータ メッセージを受信できることを意味します。

2 番目の波: サーバーはクライアントから FIN を受信し、(応答用の) ACK メッセージを送り返して、クライアントのメッセージの受信を確認します。パッシブ側には、この時点で送信すべき対応するデータ メッセージがまだある可能性があるため、最初に ACK メッセージを送信して、アクティブ側に「切断要求を理解しました」と通知する必要があります。この方法では、応答が受信されないため、イニシアチブは切断要求 (つまり、FIN メッセージ) を送信し続けることはありません。

3 番目の波: サーバーはクライアントとの接続を閉じ、FIN をクライアントに送信します。パッシブ パーティはデータ メッセージを処理した後、FIN メッセージをアクティブ パーティに送信します。これにより、データ通信が正常かつ確実に完了することが保証されます。FIN メッセージを送信した後、パッシブ側は LAST_ACK ステージ (タイムアウト待機) に入ります。

4 回目に接続が閉じられるとき: クライアントは ACK メッセージを受信した後、確認のために ACK メッセージを送り返します。アクティブなパーティが接続の中断を確認するのに間に合うように ACK メッセージを送信すると、パッシブなパーティは接続を直接解放し、利用可能な状態に入ります。

TCP クライアントが最後に確認を送信する必要があるのはなぜですか?

つまり、なぜ tcp 接続、スリーウェイ ハンドシェイクを実行する必要があるのですか、それを 2 回実行することはできないのでしょうか。
スリーウェイ ハンドシェイクは主に A が別の確認を送信したために確立されますが、なぜ A が再度確認するのでしょうか? これは主に、期限切れの接続要求セグメントが突然 B に送信されてエラーが発生するのを防ぐためです。
いわゆる「無効な接続要求メッセージ」はこのように生成され、通常であれば、A は接続要求を送信しますが、接続メッセージ要求が失われたために確認を受信できないため、A は接続要求を再送信し、その後要求を受信します。 、確認を受信し、接続を確立し、データ送信が完了した後にリンクを解放しました。A は合計 2 つの接続要求セグメントを送信しましたが、最初のセグメントは失われ、2 番目のセグメントは B に到達しました。「期限切れ」はありません。接続「リクエスト メッセージ セグメント」ですが、異常な状況では、A が送信したリクエスト メッセージの接続セグメントは失われませんが、特定のネットワーク ノードに長時間留まるため、ある時点で B に到達するまで遅延します。元々は期限切れのセグメントでしたが、期限切れの接続要求セグメントを受信した B は、A が接続要求セグメントを再送信したと誤って認識し、接続の確立に同意する確認セグメントを A に送信しました。スリーウェイ ハンドシェイクがない場合、B が確認を送信した後に接続が確立されますが、このとき、A は接続を確立するためのリクエスト セグメントを送信しないため、B の確認を無視して B にデータを送信しません。 B は待ち続けます。A はデータを送信するため、B のリソースの多くが無駄になります。スリーウェイ ハンドシェイクにより、これが起こるのを防ぐことができます。たとえば、先ほど、A は B を無視し、B に確認を送信しませんでした。B は送信できませんでした。 A の確認を受け取る A が接続の確立を必要としないことがわかっているため、リソースが無駄に浪費されることはありません。

反映と拡張

1. クライアントはなぜ最後に 2MSL を待たなければならないのですか?

MSL (最大セグメント寿命)、最大セグメント寿命、TCP では、異なる実装で異なる MSL 値を設定できます。

まず、クライアントによって送信された最後の ACK メッセージがサーバーに到達できることを確認します。この ACK メッセージは失われる可能性があるためです。サーバーの観点からは、切断を要求するために FIN+ACK メッセージを送信しましたが、クライアントはまだ存在します。私に応答がありません。私が送信した切断要求メッセージは受信されなかったはずです。そのため、サーバーはそれを再送信し、クライアントはこの 2MSL 時間内に再送信されたメッセージを受信して​​、応答メッセージを送信します。が送信され、2MSL タイマーが再起動されます。

次に、「スリーウェイ ハンドシェイク」で述べたものと同様の「無効な接続要求セグメント」がこの接続に出現しないようにします。クライアントが最後の確認メッセージを送信した後、この 2MSL 時間の間に、この接続中に生成されたすべてのメッセージ セグメントがネットワークから消える可能性があります。これにより、古い接続のリクエスト メッセージが新しい接続に表示されなくなります。ここで、いわゆる古い接続と新しい接続の問題について深く理解しましょう。2msl の待ち時間がない場合、アクティブに閉じている側が閉じ状態になった後、すぐに相手と TCP 接続を確立します (同じです)。 IP、同じポート) このとき、新しい接続は古い接続の無効なセグメントを独自のセグメントとみなす可能性があり、混乱が生じます。

2. 接続を確立するには 3 ウェイ ハンドシェイクが必要で、接続を閉じるには 4 ウェイ ウェーブが必要なのはなぜですか?

コネクション確立時、サーバはLISTEN状態となり、コネクション確立要求のSYNメッセージを受信後、ACKとSYNを1つのメッセージにまとめてクライアントに送信します。

接続を閉じるとき、サーバーが相手の FIN メッセージを受信したとき、それは相手がデータを送信しなくなったがまだデータを受信できることを意味するだけであり、すべてのデータを相手に送信していない可能性があるため、接続を閉じることができます。相手に何らかのデータを送信した後、相手に FIN メッセージを送信して、今すぐ接続を閉じることに同意することを表明するため、通常、自分の ACK と FIN は別々に送信され、結果的に 1 回送信されます。

3. 接続は確立されているが、クライアントが突然失敗した場合はどうなりますか?

TCP にはキープアライブ タイマーもありますが、明らかにクライアントに障害が発生すると、サーバーは永遠に待機することができず、リソースが無駄に浪費されます。サーバーはクライアントからリクエストを受信するたびにこのタイマーをリセットします。この時間は通常 2 時間に設定されます。2 時間クライアントからデータを受信しなかった場合、サーバーは 75 秒ごとに検出セグメントを送信します。一度送信してください。検出メッセージを 10 回連続して送信しても応答がない場合、サーバーはクライアントに障害が発生したと判断し、接続を閉じます。

Meow Interview Assistant:面接の質問に対するワンストップ ソリューション WeChat アプレット[Meow Interview Assistant]を検索するか、 [Meow Interview Assistant] -> Interview Assistant を たどって 質問に無料で回答できます。面接に関する優れた知識やスキルをお持ちの方は、ぜひ共有してください。

おすすめ

転載: blog.csdn.net/jjclove/article/details/127392398