私は最初にコミュニケーションメジャーを勉強しました。卒業後、私のクラスメートは自分の夢を追求するために別々の方法で行き、あらゆるサイズの建設現場を旅しました。ハハ、冗談です、特定の研究所に入った素晴らしい人々もいますか?彼の父親は監督ではないので、彼は内側が暗すぎてはいけません。コンピューターネットワークと呼ばれる非常に高レベルのコースがあったことを覚えています(おそらくこの名前)。握手に関する概念があり、今それをレビューしています。
最初に回路図を見てみましょう。
TCPは接続指向です。他の当事者がどの方向にデータを送信しても、2つの当事者間に接続を確立する必要があります。 TCP/IPプロトコルでは、TCPプロトコルは信頼できる接続サービスを提供し、接続は3つのハンドシェイクによって初期化されます。 3方向の握手の目的は、両方の当事者のシリアル番号と確認番号を同期し、TCPウィンドウサイズの情報を交換することです。
1。ファーストハンドシェイク:接続を確立します。クライアントは接続要求メッセージセグメントを送信し、Syn位置を1に設定し、シーケンス番号はxです。次に、クライアントはsyn_send状態に入り、サーバーが確認されるのを待ちます。
2。首位握手:サーバーはSynメッセージセグメントを受信します。サーバーがクライアントからSynメッセージセグメントを受信した場合、Synメッセージセグメントを確認し、承認番号をx+1(シーケンス番号+1)に設定する必要があります。同時に、Syn要求情報を送信し、Syn位置を1に、シーケンス番号をYに設定する必要があります。サーバーは、上記のすべての情報をパケットセグメント(つまり、Syn+ACKメッセージセグメント)に配置し、クライアントに送信します。この時点で、サーバーはsyn_recv状態に入ります。
3.サードハンドシェイク:クライアントは、サーバーのSyn+ACKパケットセグメントを受信します。次に、確認番号をY+1に設定し、ACKメッセージセグメントをサーバーに送信します。メッセージセグメントが送信された後、クライアントとサーバーの両方が確立された状態に入り、TCP 3回の握手を完了します。
3つのハンドシェイクを完了した後、クライアントとサーバーはデータの送信を開始できます。上記は、TCPの3回の握手の全体的な紹介です。
これらの4つの波はどうですか?
クライアントとサーバーが3つのハンドシェイクを通じてTCP接続を確立した後、データ送信が完了すると、TCP接続を切断する必要があります。次に、TCPの切断のためにここに神秘的な「4つの波」があります。
1。最初の波:ホスト1(クライアントとしてまたはサーバーとして使用できます)、シーケンス番号と承認番号を設定し、2つのフィンメッセージセグメントをホストに送信します。この時点で、ホスト1がFIN_WAIT_1状態に入ります。これは、ホスト1にホスト2に送信されるデータがないことを意味します。
2。2番目のウェーブ:ホスト2は、ホスト1から送信されたFINメッセージセグメントを受け取り、ACKメッセージセグメントを返してホスト1を返します。確認番号はシーケンス番号と1です。ホスト1はFIN_WAIT_2状態に入ります。ホスト2は、送信するデータがないことをホスト1に伝えているため、接続を閉じることができます。
3。3番目の波:ホスト2は、接続を閉じることを要求し、同時にホスト2がClose_wait状態に入るように要求して、ホスト1にフィンメッセージセグメントを送信します。
4。第4波:ホスト1は、ホスト2から送信されたFINメッセージセグメントを受信し、ACKメッセージセグメントをホスト2に送信し、ホスト1がtime_wait状態に入ります。ホスト2がホスト1のACKメッセージセグメントを受信した後、接続を閉じます。現時点では、ホスト1は2MSLを待っていた後も返信を受け取らないため、サーバー側が正常に閉じられていることが証明されているため、ホスト1も接続を閉じることができます。
この時点で、TCPの4つの波は喜んで完了しました。これを見ると、心に多くの質問があり、多くの質問がありません。大丈夫です、引き続き要約しましょう。
なぜ3回手を振る必要があるのですか?
いわゆる3方向の握手は、TCP接続を確立することを意味します。つまり、TCP接続を確立する場合、クライアントとサーバーは、接続の確立を確認するために合計3つのパケットを送信する必要があります。ソケットプログラミングでは、このプロセスは、Connectを実行するクライアントによってトリガーされます。
TCPの3つの握手を要約したので、なぜ3回行わなければならないのですか?なぜ私たちはそれを2回完了できると思うのですか?では、なぜTCPは3つの接続を行う必要があるのでしょうか?これは、Xie Xirenが「コンピューターネットワーク」で言ったことです。
失敗した接続要求セグメントがサーバーに突然送信されるのを防ぐために、エラーが発生します。
本では、例が次のように記載されています。
「失敗した接続要求セグメント」の生成は、そのような場合です。クライアントが送信した最初の接続要求セグメントは失われません。
代わりに、特定のネットワークノードに長い間留まり、サーバーに到達する前に接続が解放されてから特定の時間まで遅延が発生します。これはもともとaでした
ずっと前にメッセージセグメントに失敗しました。ただし、サーバーがこの無効な接続要求メッセージセグメントを受け取った後、クライアントが再び送信した新しいものであると誤って考えました
接続リクエスト。そのため、承認セグメントはクライアントに送信され、接続の確立に同意しました。 「3回の握手」が採用されていないと仮定すると、サーバーのみ
確認を発行すると、新しい接続が確立されます。クライアントは接続を確立するリクエストを発行していないため、サーバーの確認は無視されません。
データもサーバーに送信されません。しかし、サーバーは、新しい輸送接続が確立されていると考え、クライアントがデータを送信するのを待っていました。それで、
サーバーのリソースの多くは無駄になっています。上記の現象は、「3回の握手」を使用して発生するのを防ぐことができます。たとえば、今の状況、
クライアントは、サーバーの承認に対する謝辞を発行しません。サーバーは確認を受信できないため、クライアントが接続を確立する必要がないことを知っています。 「
これは非常に明確であり、サーバーがリソースを待機したり無駄にしたりするのを防ぎます。
なぜ4回振る必要があるのですか?
なぜあなたは4回振るのですか?
いわゆる4ウェイウェーブハンドは、TCP接続を終了することです。つまり、TCP接続が切断された場合、クライアントとサーバーは合計4つのパケットを送信して接続の切断を確認する必要があります。ソケットプログラミングでは、このプロセスはクライアントまたはサーバーが閉じることによってトリガーされます。
TCPプロトコルは、接続指向の信頼性の高いバイトストリームベースの輸送層通信プロトコルです。 TCPはフルデュプレックスモードです。つまり、ホスト1がフィンセグメントを送信する場合、ホスト1に送信されるデータがないことを意味します。ホスト1は、そのデータが送信されたことをホスト2に伝えます。ただし、現時点では、ホスト1はホスト2のデータを受け入れることができます。ホスト2がACKセグメントを返すと、ホスト1には送信されるデータがないことがすでにわかっていますが、ホスト2はホスト1にデータを送信できます。ホスト2がフィンセグメントも送信する場合、ホスト2には送信されるデータがないことを意味し、ホスト1に送信するデータがないことを指示し、互いにこのTCP接続を喜んで中断します。 4つの波の原理を正しく理解したい場合は、4つの波の間に状態の変化を理解する必要があります。
FIN_WAIT_1:この状態は慎重に説明する必要があります。実際、FIN_WAIT_1およびFIN_WAIT_2状態の真の意味は、どちらも相手のFINメッセージを待つことです。これら2つの状態の違いは、Fin_Wait_1状態は、実際にソケットが確立された状態にあるとき、接続を積極的に閉じて、相手にFINメッセージを送信したいということです。この時点で、ソケットはFIN_WAIT_1状態に入ります。相手がACKメッセージに応答すると、Fin_Wait_2状態に入ります。もちろん、実際の通常の状況では、他の当事者が何であれ、ACKメッセージをACKメッセージにすぐに応答する必要があります。したがって、FIN_WAIT_1状態は一般に見るのが難しく、FIN_WAIT_2状態はNetStatでよく見られます。 (アクティブパーティー)
FIN_WAIT_2:この状態は上記で詳細に説明されています。実際、FIN_WAIT_2状態のソケットはセミ接続を意味します。つまり、一方の当事者は密接な接続を必要としますが、当面はあなたに送信されるデータ(ACK情報)があることを他の当事者に伝え、後で接続を閉じます。 (アクティブパーティー)
Close_wait:この状態の意味は、実際に閉じるのを待っていることです。理解する方法は?相手がソケットを閉じてフィンメッセージを自分に送信すると、システムは間違いなく他のパーティにACKメッセージに応答し、その後、close_wait状態に入ります。次に、本当に考慮する必要があるのは、他の当事者に送信するデータがまだあるかどうかを確認することです。そうでない場合は、ソケットを閉じて、他のパーティにFINメッセージを送信できます。つまり、接続を閉じることができます。したがって、あなたがclose_wait状態にあるとき、あなたがする必要があるのは、あなたが接続を閉じるのを待つことです。 (パッシブ側)
Last_ack:この状態は比較的理解しやすいです。 FINメッセージを送信した後、相手のACKメッセージを受動的に閉じます。 ACKメッセージを受信した後、利用可能な閉じた状態を入力できます。 (パッシブ側)
Time_Wait:相手のFINメッセージが受信され、ACKメッセージが送信されたことを意味します。 2MSLが利用可能な閉鎖状態に戻るのを待ってください。 Finwait1状態で、FINフラグとACKフラグの両方を使用して相手の関係者とメッセージを受信する場合、FIN_WAIT_2状態を通過せずにTime_Wait状態を直接入力できます。 (アクティブパーティー)
閉じている:接続が中断されていることを示します。
要約します
上記は、TCP/IPプロトコルの3つのハンドシェイクと4つの握手の原則とプロセス分析に関するこの記事の全体的な内容です。私はそれが誰にでも役立つことを願っています。欠点がある場合は、メッセージを残して、貴重な意見を楽しみにしてください。