面试题之TCP三次握手和四次挥手详解

一、简介

TCP在通信之前,必须先建立连接,如果无须再传输数据,则需要关闭连接。在建立连接的过程中,存在三次握手阶段,在关闭连接的时候存在四次挥手阶段,本文将总结三次握手和四次挥手的具体过程。

首先需要了解几个概念:

  • 序列号seq:用来标记数据段的顺序,报文段中的第一个字节的数据编号;
  • 确认号ack:指的是期望接收到下一个字节的数据编号,即就是当前报文段最后一个字节的数据编号+1;
  • 确认ACK:表示确认号是否有效,只存在1和0两种取值,当ACK=1时,确认号字段有效,当ACK=0时,确认号无效;
  • 同步SYN(Synchronize Sequence Numbers):同步序列编号,SYN=1表示请求建立一个连接;
  • 终止FIN:请求关闭连接,FIN=1表示此报文段的发送方的数据已经发送完毕,并要求释放连接;

二、三次握手

  • 第一次握手:客户端发送SYN同步序列编号 = 1,请求建立一个链接,此时客户端进入SYN_SENT状态,等待服务器的确认;
  • 第二次握手:服务器端收到客户端的连接请求SYN包,发送ack = x + 1,并且发送ACK确认包给客户端,此时服务器端进入同步收到状态SYN_RECV;
  • 第三次握手:客户端接收到服务器发送过来的SYN + ACK包,自己也发送一个ACK确认给服务器,发送完成,此时客户端与服务器就成功建立了一个连接,此时客户端和服务器端都进入ESTABLISHED连接建立状态;
  • 详细过程如下图所示:

三、四次挥手

  • 第一次挥手:主动关闭一方发送FIN=1请求关闭连接,停止传输数据操作,序列号seq=u即上一次接收的最后一个数据编号+1,此时客户端进入FIN-WAIT-1(终止等待1)状态;
  • 第二次挥手:被动关闭的一方接收到FIN请求关闭信息,发出确认ACK = 1,ack=u+1并且带上序列号seq = v,此时被动关闭的一方就进入了CLOSE-WAIT(关闭等待)状态;
  • 第三次挥手:主动关闭的一方接收到被动方发送过来的确认信号,主动关闭一方进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受被动方发送的最后的数据),被动关闭的一方将最后的数据发送完毕后,就向主动关闭方发送连接释放报文,被动关闭的一方发送FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时被动关闭方就进入了LAST-ACK(最后确认)状态,等待主动关闭方的确认;
  • 第四次挥手:主动关闭方接收到被动方发送过来的释放报文后,自己发出确认信号ACK = 1, ack = w +1,此时主动关闭方就进入了TIME-WAIT(时间等待)状态,注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当主动关闭方撤销相应的TCB后,才进入CLOSED状态,同理,被动关闭一方只要收到了主动发送方发出的确认信号,就立即进入CLOSED状态;
  •  
  • 详细过程如下图所示:

发布了197 篇原创文章 · 获赞 86 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/103751715
今日推荐