03. TCP的3次握手4次挥手

发布时间 2023-10-27 20:15:08作者: 星河映梦

一、三次握手

  TCP 是稳定的传输方式,在接收、发送之前,双发需要建立一个虚拟的通道,这个过程称为 3 次握手。3 次握手的流程如下:

三次握手

  1. 客户端调用 connect() 时发送一个带有标记的数据包,我们把建立连接时的第 1 次数据叫做 SYN,其中由 1 个数字;
  2. 服务器接收到这个 SYN 数据包,提取出数字,然后 +1,回送给客户端。这个数据包中有 2 部分:SYN + ACK;
    1. ACK 是对接收到的数据的确认;
    2. SYN 表示要向客户端发送的数据;
  3. 当客户端接收到 SYN + ACK 数据包之后,提取数字,然后加 1,然后用 ACK 数据包回送给服务器;

当客户端调用 connect() 方法的时候,就有了 TCP 的 3 次握手,目的是让双方都分配一些资源(内存等)为将来进行网络通信时做准备;

服务器会阻塞到 accept() 方法这里,直到客户端发起连接,即 3 次握手完成之后,accept() 才会解阻塞,并且 accept() 返回一个新的套接字还有刚刚连接成功的 IP 和 PORT;

二、四次挥手

  为了释放资源,所以双方需要协商怎样关闭这个虚拟的通道,这就是 4 次挥手。4 次挥手的过程如下:

四次挥手

  1. 客户端先发送一个数据包,这里有 1 个数字,4 次挥手开始的第 1 次数据包称为 FIN;
  2. 服务器接收到 FIN 数据包,然后将数字提取出来,然后 +1,通过 ACK 数据包发送给客户端;
    1. 此时服务器的 recv() 会解阻塞,并且返回的数据长度为 0;
    2. 如果服务器对已经建立的套接字调用 close(),那么就会有下面的 2 次挥手;
  3. 服务器发送一个数据,这里有 1 个数字,这个包类型是 FIN;
  4. 当客户端接收服务器的 FIN 时,提取出数字,然后 +1,然后用 ACK 数据包回送给服务器;

当客户端调用 close() 方法时,操作系统会发起 TCP 的 4 次挥手;

当服务器调用 close() 方法时,才会发送第 3 次挥手数据;