それらの事について握手

起源

おそらく、コンピュータネットワークの学生は、TCP / IP接続が確立されて知って勉強したときに3ウェイハンドシェイクの必要性が、私は何が接続を確立するためのスリーウェイハンドシェイクを考慮しなければならないかどうか分からないのですか?あなたは、2ウェイハンドシェイクによって確立することができますか?なぜ、彼らはむしろスリーウェイハンドシェイクを使用するよりも、4ウェイハンドシェイクを切断する必要がありますか?この記事では、これらの質問への答えは一つで1以下です。

メッセージ形式

TCP接続を確立するハンドシェイクプロセスは、その本質は、双方が転送ルールの式に達する接続することで、最終的には共通のルールを合意に達するためにバインドされています。TCPパケットがTCPコネクション確立コンセンサスです。だから、TCPパケットフォーマットが必要であることを理解するために開始する前に。次のように謝Xiren教師資料によると、TCPパケットのフォーマットは次のとおりです。

図は、多くの分野であるが、この場合には、我々は密接にし、ハンドシェイクプロセス以下これらのフィールドに関連している、理解する必要はありません、私たちは事前に説明する必要があります。

  1. 参照:配列番号、送信のソースから宛先へのTCPバイトストリームを識別するために使用される32ビットを表現するには、開始剤は、このラベルのデータを送信します。
  2. 確認応答番号:ACK番号は、唯一のACKフラグビットが1の場合、32を占め、確認応答番号フィールドは、ACK =配列+ 1有効です。
  3. フラグ:6の合計、すなわちURG、ACK、PSH、RST、 SYN、FIN 、および特定の意味は次のようにしている:
    (A)がURG:緊急ポインタ(緊急ポインタ)有効。
    (B)ACK:ACK = 1が確認応答番号フィールドである場合にのみ有効。ACK = 0は、確認応答番号フィールドが無効である場合
    (C) PSHときに、2つの双方向通信アプリケーションプロセス、アプリケーションは他の即時応答が入力したコマンドの終了後に所望されてもよいです。この場合、TCPは(PSH)操作をプッシュするために使用することができます。受信セグメントPSH = 1にされた後、それをできるだけ早くとして受信アプリケーションプロセスに配信される、再送バッファ充填後まで待ちません。
    (D) RST接続をリセットします。RST = 1は、TCP接続に重大な誤りが存在することを示している場合、接続が解放されなければならないし、接続の再確立
    (E)SYN接続を確立するときにシリアル番号を同期するために使用します。
    (F) FIN接続を解放するために使用します。

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

    TCP接続が確立時に接続確認を確立するために、3つのパケットの合計を送信するために、クライアントとサーバーを必要とするように、いわゆる3ウェイハンドシェイクを指します。次のように全体のプロセスは、次のとおりです。

オペレーティング 効果
最初の握手 クライアントSYNフラグビットは、ランダムに生成された値の配列= X、1に設定され、パケットがサーバーに送信され、それは、顧客側SYN_SENT状態に肯定応答するためのサーバを待機に入ります。 クライアント受信手紙サーバは、サーバはクライアント自身のシグナル伝達能力と問題がない受け入れる能力を理解します
第二のハンドシェイク パケットがサーバフラグSYN = 1で受信された後、サーバSYNとACKフラグビット接続を確立するためのクライアント要求を知っているが、ランダム値SEQ = Y、およびデータパケットを生成し、ACK = X + 1、1に設定されています接続要求を確認するためにクライアントに送信され、サーバは状態になりSYN_RCVD Serverクライアントが手紙を受け取り、その後、クライアントは、受信サーバーのシグナル伝達能力と能力を理解して問題ありません、そして、サーバは、彼がの導入ので、能力のシグナリング機能とクライアントの受信方法を知りません。第三握手
サードハンドシェイク 客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给服务器,服务器检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。 客户端发信服务器收到信之后,就会明白自己的发信能力和客户端的收信能力都没有问题,两个都会明白彼此之间收发能力都正常。可以进行数据传输 。

到这里可能会有人问了,两次握手之后客户端直接向服务器端直接发送数据,不也可以吗?
严格意义上讲,第二次握手之后,客户端直接发送数据也可以向服务器确定客户端的接受能力和自己的发信能力。但是直接发送的话,可能由于服务器端没有准备就绪,从而造成数据包的丢失,也就是说第三次的握手在一定程度上是提前让服务器做好接受数据的准备。

挥手道别

所谓四次握手就是指终止TCP连接的时候,需要客户端和服务器总共发送4个数据包以确认连接的断开。整个过程如下图所示:

操作 作用
第一次挥手 客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态。 客户端发信,服务器端到收信。客户端告知服务器端自己需要发送的数据已经发完,但服务器端不一定全部收到
第二次挥手 服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务器进入CLOSE_WAIT状态。 服务器端发信,客户端收信。服务器端告知客户端其发送的数据自己已经全部收到了。但是服务器端不一定数据发送完毕
第三次挥手 服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入LAST_ACK状态。 服务器端发信,客户端收信。服务器端告知客户端自己需要发送的数据以及发送完。但是客户端不一定收到了所有数据
第四次挥手 客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务器端,确认序号为收到序号+1,服务器端进入CLOSED状态,完成四次挥手。 客户端发信,服务器端收信。告知服务器端其发送的数据自己已经全部接收到了,双方可以释放连接了

到这里可能大家又有疑问了,为什么TCP在建立连接的时候需要三次握手就可以了,而分别的时候却要挥手四次?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

小结

到这里可能大家就明白了,TCP在建立连接时要进行三次主要是为了让双方都明确自身和对方收发能力正常。而TCP在断开是进行四次挥手,主要是为了保证收发双方数据都发送完毕,并且对方都完全接收到。

おすすめ

転載: www.cnblogs.com/goWithHappy/p/three_time_handshake.html