关于java:TCP三次握手和四次挥手

23次阅读

共计 1343 个字符,预计需要花费 4 分钟才能阅读完成。

三次握手

  • 第一次握手:建设连贯时,客户端发送 syn 包(syn=x)到服务器,并进入 SYN_SENT 状态,期待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
  • 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=x+1),同时本人也发送一个 SYN 包(syn=y),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
  • 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=y+1),此包发送结束,客户端和服务器进入 ESTABLISHED(TCP 连贯胜利)状态,实现三次握手。

为什么不能两次握手

TCP 是一个双向通信协定,通信单方都有能力发送信息,并接管响应。如果只是两次握手,至少只有连贯发起方的起始序列号能被确认,另一方抉择的序列号则得不到确认

四次挥手

  1. 客户端过程收回连贯开释报文,并且进行发送数据。开释数据报文首部,FIN=1,其序列号为 seq=u(等于后面曾经传送过去的数据的最初一个字节的序号加 1),此时,客户端进入 FIN-WAIT-1(终止期待 1)状态。TCP 规定,FIN 报文段即便不携带数据,也要耗费一个序号。
  2. 服务器收到连贯开释报文,收回确认报文,ACK=1,ack=u+1,并且带上本人的序列号 seq=v,此时,服务端就进入了 CLOSE-WAIT(敞开期待)状态。TCP 服务器告诉高层的利用过程,客户端向服务器的方向就开释了,这时候处于半敞开状态,即客户端曾经没有数据要发送了,然而服务器若发送数据,客户端仍然要承受。这个状态还要继续一段时间,也就是整个 CLOSE-WAIT 状态继续的工夫。
  3. 客户端收到服务器的确认申请后,此时,客户端就进入 FIN-WAIT-2(终止期待 2)状态,期待服务器发送连贯开释报文(在这之前还须要承受服务器发送的最初的数据)。
  4. 服务器将最初的数据发送结束后,就向客户端发送连贯开释报文,FIN=1,ack=u+1,因为在半敞开状态,服务器很可能又发送了一些数据,假设此时的序列号为 seq=w,此时,服务器就进入了 LAST-ACK(最初确认)状态,期待客户端的确认。
  5. 客户端收到服务器的连贯开释报文后,必须收回确认,ACK=1,ack=w+1,而本人的序列号是 seq=u+1,此时,客户端就进入了 TIME-WAIT(工夫期待)状态。留神此时 TCP 连贯还没有开释,必须通过 2∗∗MSL(最长报文段寿命)的工夫后,当客户端撤销相应的 TCB 后,才进入 CLOSED 状态。
  6. 服务器只有收到了客户端收回的确认,立刻进入 CLOSED 状态。同样,撤销 TCB 后,就完结了这次的 TCP 连贯。能够看到,服务器完结 TCP 连贯的工夫要比客户端早一些

为什么连贯的时候是三次握手,敞开的时候却是四次握手

因为当 Server 端收到 Client 端的 SYN 连贯申请报文后,能够间接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。然而敞开连贯时,当 Server 端收到 FIN 报文时,很可能并不会立刻敞开 SOCKET,所以只能先回复一个 ACK 报文,通知 Client 端,” 你发的 FIN 报文我收到了 ”。只有等到我 Server 端所有的报文都发送完了,我能力发送 FIN 报文,因而不能一起发送。故须要四步握手。

正文完
 0