再谈TCP连接的三次握手,四次挥手

TCP连接大致分为三个阶段:建立连接,数据传输,释放连接
1.客户端与服务器三次握手建立连接

  • 客户端和服务器一开始都处于关闭状态,客户端主动向服务器发送TCP连接请求,服务器被动打开开始监听端口
  • 第一次握手,客户端向服务器发送同步连接报文,SYN标志位=1,客户端进程32位序列号seq=x,客户端进入同步已发送状态
  • 第二次握手,服务器向客户端发送一个确认连接报文,SYN标志位=1,ACK标志位=1,服务器进程32位序列号seq=y,ack=x+1,服务器进入同步已发送状态,等待客户端的确认
  • 第三次握手,不再发送SYN同步报文,客户端确认来自服务器的确认报文,ACK标志位=1,客户端进程32位序列号seq=x+1,ack=y+1,此时连接已基本建立,可以携带数据包
    FAQ
  • 如果没有第三次握手,可能会有什么后果
    假设客户端第一次与服务器发送的建立连接请求因为网络拥塞等原因未能成功发送给服务器,而客户端一直收不到服务器的确认报文就会超时重传,第二次发送成功了,客户端与服务器正常建立连接发送数据直到关闭连接,某段时间之前拥塞的那条连接成功发送给服务器,但此时客户端是关闭的,服务器因为没有收到客户端的确认报文便会一直超时重传,由于关闭的,客户端也不可能给服务器发确认报文,从而造成资源的开销

2.客户端与服务器四次挥手释放连接

  • 客户端与服务器一开始处于连接状态,由客户端主动向服务器发送释放连接请求,进入终止等待1状态,FIN标志位=1,ACK标志位=1,seq表示客户端发送的最后一个字节的数据的序列号加1,ack表示客户端接收的最后一字节数据序列号加1,此时客户端已经没有数据要发给服务器了,TCP连接处于半关闭状态,
  • 服务器收到客户端的释放连接请求报文,服务器向客户端发送确认报文,ACK标志位=1,seq=h,ack=v+1,服务器进入关闭等待状态
  • 客户端收到服务器的确认报文后,进入关闭等待2状态
  • 服务器再向客户端发送释放连接请求报文后,进入最后确认状态,FIN标志位=1,ACK标志位=1,seq=z,ack=v+1,这里seq不等于h+1是因为分为两种情况,如果该报文携带数据则z>h+1,如果不携带数据,z=h+1
  • 客户端收到服务器的释放连接请求报文后,进入时间等待状态,向服务器发送确认报文,服务器收到后真正关闭连接,而客户端还需要经过2MSL(Maximum Segment lifetime最长报文段寿命)时间才能关闭,客户端之所以还要等待2MSL是因为在这个容错时间范围内,服务器完全可以收到来自客户端的确认报文,使服务器正常关闭
posted @ 2024-08-02 13:04  yuese00  阅读(1)  评论(0编辑  收藏  举报