Javaのネットワークプログラミング--tcpと4波のスリーウェイハンドシェイクの基礎

何かを作成するために、クライアントとサーバーのニーズとの間で送信し、データの復帰のプロセスは、TCPコネクションと呼ばれます。

パケットが発信その間からクライアントを介してTCPによって作成されたTCPコネクションの概念が存在し、かつ唯一の要求に応じて存在していないので、要求と応答がされ、サーバーを接続するチャネルと同様に、この接続があったかもしれない受け取ります保持、HTTPリクエストは、接続に基づいて送信されます。

TCP接続は、HTTPリクエストでこのモデルの異なるバージョンの複数の異なる送信することができるです。

同期作成されたHTTP要求、サーバに送信されたHTTPリクエストが、サーバ応答は、TCP接続が閉じられたときにHTTP / 1.0でTCP接続が作成されます。

HTTP / 1.1は、いくつかの方法で接続が維持されている宣言することができ、送信要求が完了した後、次いで、別の要求を送信してもよいです。このような利点は以下のとおりです。「スリーウェイハンドシェイク」の必要性は、TCP接続プロセスの作成で消費され、「3ウェイハンドシェイクは、」3つのネットワーク伝送を表します。

TCP接続が維持されている場合は、消費のこの「3ウェイハンドシェイク」を送るべき第2のリクエストはありません。同じTCP HTTP / 2にも同時に送信されたHTTPリクエストに接続されていてもよいです。

プロフィールメッセージフォーマット.TCP
ここに画像を挿入説明
シーケンス番号SEQ:データセグメント順マークのために4バイト、TCP接続のすべてのデータが送信されたバイトは、シリアル番号、最初のローカルからのバイト数でコンパイルされていますランダムに生成され、各セグメントを得、バイト数のEDは、シリアル番号が割り当てられ、配列は、データセグメント番号の最初のバイトのシーケンス番号です。

確認応答番号のACK:4バイト、次を期待は、セグメント番号の最初のデータバイトの他方を受信するために、セグメントシーケンス番号の最初のバイトを搬送するデータの数を示し、数字は、参照する確認次のバイト数を受信することが予想されるので、この数とセグメントの最後のバイトが確認応答番号です。

謝辞ACK:ACK = 1、確認応答番号フィールドが有効である1ビットだけ、。ACK = 0、確認応答番号が無効である場合には

同期SYN:シリアル接続の確立を同期させるため。これは、接続要求パケットのセグメントである:= 1 SYN、ACK = 0であることを意味 もし応答メッセージセグメントで合意された接続、そのSYN = 1、ACK = 1。従って、SYN = 1これは、接続要求、または接続受諾メッセージであることを示しています。TCP接続建設生産はハンドシェイクのSYNフラグが完了した後に設定される場合にのみ、SYNフラグが0に設定されています。

終了FIN:接続を解除します。FIN = 1が表す:このセグメントのデータの送信者が送信された、およびトランスポート接続の解放のために

PS:; ACK、SEQ小文字番号ワード表現ACK、SYN、これら大文字の単語のFINフラグは、その値が1または0であるビットを表します。
ここに画像を挿入説明
第2の3方向ハンドシェイクは、理解
ここに画像を挿入説明
最初のハンドシェイクを:接続が確立され、クライアントはサーバにSYNパケット(SYN = X)を送信し、確認するためにサーバを待って、SYN_SENT状態になり、SYN:同期シーケンス番号(同期シーケンス番号)。

第ハンドシェーク:サーバー自体が(SYN = Y)SYNパケットを送信し、すなわち、SYN + ACKパケットを、サーバが状態SYN_RECVに入っている間、顧客にSYN(ACK = X + 1)を確認する必要があり、SYNパケットを受信します。

第三のハンドシェーク:クライアントがサーバにSYN + ACKパケットを受信し、サーバは受信確認パケットACK(ACK = Y + 1)を送信し、このパケットが送信され、ESTABLISHED(TCP接続が成功した)状態にクライアントとサーバは、3つ完了します握手。

3〜4回と.TCP振っ:
ここに画像を挿入説明
1)クライアント・プロセスは、接続解放メッセージを発行し、データの送信を停止します。この場合、データパケットヘッダ、FIN = 1、配列番号SEQ = Uを(以前にデータプラス1から送信された最後のバイトのシーケンス番号に等しい)解放、クライアントは、FIN-WAIT-1(終了待ちに入ります1)状態。TCP規定、FINセグメント、データを搬送しない場合だけでなく、シリアル番号を消費します。
2)サーバが接続解放メッセージ、確認メッセージ、ACK = 1、ACK = U受け + 1、 およびCLOSE-WAITに独自のシーケンス番号seq = V、ケース、サーバー移行をもたらす(閉じるウェイトを)状態。高レベルのアプリケーション・プロセスに通知するTCPサーバは、解除方向上のサーバーへのクライアントは、ある半閉鎖状態、この時間は、クライアントが送信するデータがないが、サーバーがデータを送信した場合、クライアントはまだ受け入れられています。この状態は、全体CLOSE-WAIT状態の継続であるいくつかの時間、継続します。
3)クライアントが確認応答を要求、サーバー側では、その場合には、クライアントは、サーバは、サーバが送信する前に同意する必要があり、接続解除を(送信最後のパケットを待って、FIN-WAIT-2(2終了待ち)状態に入りを受け、データ)。
4)サーバは、クライアントが接続解放メッセージを送信し、最後のデータが終了するFIN = 1、ACK = U送り 、+ 1 半閉状態にあるため、サーバは、おそらくいくつかのデータを送信するために、それはこの場合には想定されていますシリアル番号SEQ = LAST-ACK(肯定応答最後)の状態にサーバー、この時点で、wは、クライアントの確認応答を待っています。
5)クライアントが接続解放メッセージサーバはwは肯定応答、ACK = 1、ACK =を送信する必要があります受信した後 + 1、 及びそれらのシリアル番号SEQ = U + 1は、この場合、クライアントは、時間に入ります(待機)状態を待ちます。TCP接続は、現時点ではリリースされていないことを注意は、TCBアンドゥクライアントはCLOSED状態に入る前に、対応する2 ** MSL(最大セグメント寿命)時間、でなければなりません。
6)長いサーバはクライアントから送信された確認を受けたほど、すぐにCLOSED状態に入ります。同様に、TCBの失効した後、それはTCP接続を介してです。あなたは、以前のクライアント・サーバのTCP接続が終了するよりも時間の終わりを見ることができます。

4つの一般的な面接の質問:

[1]なぜ終了時刻は4ウェイハンドシェイクの場合に問題が3ウェイハンドシェイクに接続されていますか?
A:端末はSYNサーバークライアント端末接続要求メッセージを受信したときにSYN + ACKパケットを直接送信することができるので。ACKメッセージを応答するために使用される、SYNなどがパケットを同期させるために使用されます。サーバー側FINパケットを受信したときにでも、接続はおそらくSOCKETは、それが最初のACKパケットにのみ応答、話したクライアント側、することができます近くにすぐにない、閉鎖された「あなたは私が受け取ったFINメッセージを送信します。」すべての私のサーバーメッセージの終わりを介して送信されているだけになるまで、私はFINパケットを送信することができますので、一緒に送信することはできません。これは、4段階のハンドシェイクが必要です。

[質問2] 2MSL通過するのはなぜTIME_WAIT状態の必要性は(最大セグメント寿命)CLOSE状態に戻るには?
:論理的には、4つのパケットが送られてきたが、我々はCLOSE状態に直接行くことができますが、私たちはネットワークの錯覚が信頼できない持って、最後のACKが失われているのがあるかもしれません。TIME_WAIT状態が再送信ACKパケットに使用されているように、失われることがあります。最後のACK応答クライアントを送信しますが、ACKが失われる可能性があります。、FINセグメントて送信が繰り返されていないACK場合サーバー。クライアントが近い、すぐに、それはサーバーがACKを受信確認しなければならないことはできません。クライアントがACKを送信した後にTIME_WAIT状態になります。クライアントが2MSL時間を待って、タイマーを設定します。あなたがその時間内に再びFINを受け取った場合、クライアントはACK 2MSLを再送信すると、再び待ちます。いわゆる2MSLは二回MSL(最大セグメント寿命)です。MSLは最大生存時間は、2MSLが伝送されるネットワークのセグメントと応答のために必要な最大時間を指します。2MSLまで、クライアントは再びFINを受け取っていない場合、クライアントはACKが正常に、TCP接続を受信したと結論づけました。

[質問3]なぜ2ウェイハンドシェイクを使用して接続できませんか?
A:2つの重要な機能を完了するための3ウェイハンドシェイク、両側には、ハンドシェーク中(両側がお互いの準備ができて知っている)データを送信するために準備を行う必要がありますが、また当事者が初期シーケンス番号に交渉できるようにするために、シリアル番号これは、送信され、認められています。
今、2人のだけの手を必要とスリーウェイハンドシェイクに入れ、デッドロックが発生する可能性があります。一例として、コンピュータCとSとの間の通信を考慮し、Sは、Cと仮定される接続要求パケットを送信し、受信したパケットがSであり、そして肯定応答パケットを送信します。契約に基づき2は、Sは、データパケットの送信を開始することができ、接続が正常に確立されたと考えて、手を振りました。しかし、Sの応答パケットの場合、Cは、送信中に失われ、そしてSは準備ができているならば、私も疑問それは、独自の接続要求パケットを受信したかどうかをどのような種類の設立Sシリアル番号、C Sのを知りません知ることができません。この場合、Cは、接続が正常に確立されていないとみなし、単に接続確認応答パケットを待って、Sによって送信されたデータパケットを無視します。Sタイムアウトパケットを送信した後に繰り返して同一のパケットを送信します。これは、デッドロックを作成します。

[4]は、接続を確立しているが、クライアントが突然壊れた場合はどのように問題を行うには?
TCPは、障害が発生した場合、サーバは、無駄なリソースを待っているに保つことができない、明らかに、またクライアントキープアライブタイマーです。サーバはクライアントの要求は、タイマーの設定時間をリセットします受信するたびに、通常は2時間で2時間は、クライアントからデータを受信していない場合、サーバーは、すべての75、検出メッセージセグメントを送信します秒1を送信します。まだ回答は得られなかった10個の連続したプローブパケットを送信した場合、サーバーは失敗したと見なさ顧客を持ち出し、その後、彼らは、接続を閉じます。

公開された99元の記事 ウォンの賞賛2 ビュー2589

おすすめ

転載: blog.csdn.net/weixin_41588751/article/details/105348030