一、三次握手
TCP 是稳定的传输方式,在接收、发送之前,双发需要建立一个虚拟的通道,这个过程称为 3 次握手。3 次握手的流程如下:
- 客户端调用 connect() 时发送一个带有标记的数据包,我们把建立连接时的第 1 次数据叫做 SYN,其中由 1 个数字;
- 服务器接收到这个 SYN 数据包,提取出数字,然后 +1,回送给客户端。这个数据包中有 2 部分:SYN + ACK;
- ACK 是对接收到的数据的确认;
- SYN 表示要向客户端发送的数据;
- 当客户端接收到 SYN + ACK 数据包之后,提取数字,然后加 1,然后用 ACK 数据包回送给服务器;
当客户端调用 connect() 方法的时候,就有了 TCP 的 3 次握手,目的是让双方都分配一些资源(内存等)为将来进行网络通信时做准备;
服务器会阻塞到 accept() 方法这里,直到客户端发起连接,即 3 次握手完成之后,accept() 才会解阻塞,并且 accept() 返回一个新的套接字还有刚刚连接成功的 IP 和 PORT;
二、四次挥手
为了释放资源,所以双方需要协商怎样关闭这个虚拟的通道,这就是 4 次挥手。4 次挥手的过程如下:
- 客户端先发送一个数据包,这里有 1 个数字,4 次挥手开始的第 1 次数据包称为 FIN;
- 服务器接收到 FIN 数据包,然后将数字提取出来,然后 +1,通过 ACK 数据包发送给客户端;
- 此时服务器的 recv() 会解阻塞,并且返回的数据长度为 0;
- 如果服务器对已经建立的套接字调用 close(),那么就会有下面的 2 次挥手;
- 服务器发送一个数据,这里有 1 个数字,这个包类型是 FIN;
- 当客户端接收服务器的 FIN 时,提取出数字,然后 +1,然后用 ACK 数据包回送给服务器;
标签:03,挥手,ACK,握手,SYN,TCP,服务器,数据包,客户端 From: https://www.cnblogs.com/kurome/p/17793072.html当客户端调用 close() 方法时,操作系统会发起 TCP 的 4 次挥手;
当服务器调用 close() 方法时,才会发送第 3 次挥手数据;