TCP三次握手和四次挥手


概念

SYN-(Synchronize Sequence Numbers)

  • 同步序列编号。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立TCP连接时,首先会发送的一个信号。客户端在接受到SYN消息时,就会在自己的段内生成一个随机值seq=x。

    ACK-(Acknowledge character)

  • 确认字符,表示发来的数据已确认接收无误。最后,客户端将ACK发送给服务器。序列号被设置为所接收的确认值即Y + 1。

    SYN-ACK

  • 服务器收到SYN后,打开客户端连接,发送一个SYN-ACK作为答复。确认号设置为比接收到的序列号多一个,即X+ 1,服务器为数据包选择的序列号是另一个随机数Y。

    FIN

  • 用于断开连接的

三次握手

三次握手过程

建立TCP连接需要进行三次握手,分配初始序列号和资源,在相互确认之后才开始数据的传输。握手初始化了传输可靠性以及数据顺序性必要的信息,这些信息包括两个方向的初始序列号,确认号由初始序列号生成,使用3次握手是因为3次握手已经准备好了传输可靠性以及数据顺序性所必要的信息

  • 客户端主动打开
  • 服务端被动打开

握手过程

在这里插入图片描述

  • 第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端进入syn_sent状态,等待服务端确认。

  • 第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和 ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。

  • 第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输数据了

为什么需要三次握手

  • TCP的连接是发送消息两个方向的连接都要建立成功。
  • 如果要保证双向连接都成功的话,三次通信是最少的次数了。
  • 大于三次的话,后面的次数通信就没有必要了,是在浪费资源。

TCP四次挥手

断开TCP连接需要四次挥手

挥手过程

在这里插入图片描述

  • 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入finwait1状态。

  • 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

  • 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。

  • 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。

为什么要四次挥手

  • 任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。
  • 当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC