三次握手和四次挥手

1. 三次握手

  三次握手建立连接过程如下

  ①客户端发送一个 SYN包给服务端(包含了客户端初始化序列号),并且将连接的状态设置为 SYN_SENT,这个过程由 connect() 系统调用完成。

  ②服务端接收到客户端发送过来的SYN包后,回复一个 SYN+ACK包 给客户端(包含了服务端初始化序列号),并且设置连接的状态为 SYN_RCVD。

   ③客户端接收到服务端发送过来的 SYN+ACK包 后,设置连接状态为 ESTABLISHED(表示连接已经建立),并且回复一个ACK包 给服务端。

   服务端接收到客户端发送过来的 ACK包后,将连接状态设置为 ESTABLISHED(表示连接已经建立)。 当三次握手过程完成后,一个 TCP 连接就此建立完成。 

2. 四次挥手

  四次挥手关闭连接过程如下:

  在断开连接之前客户端和服务端都处于ESTABLISHED状态,双方都可以主动断开连接,以下面以客户端主动断开连接为例进行讲解。

  ①客户端想要断开连接,于是发送一个FIN包给服务端,并将连接状态设置为FIN_WAIT_1。FIN包指定了一个序列号,即客户端发送的最后一个数据字节的序号加1(客户端不再发送数据的序号)。

  ②服务端收到客户端发送过来的FIN包后,确认了客户端不再发送数据,但服务端仍可以向客户端发送数据。服务端回复一个ACK包给客户端,并将连接状态设置为CLOSE_WAIT(等待关闭)状态。

  客户端收到来自服务器的ACK包后,将连接状态设置为FIN_WAIT_2。

  ③服务端也打算断开连接,于是发送一个FIN包给客户端。之后服务端进入LASK_ACK(最后确认)状态,等待客户端的确认。

  ④客户端收到来自服务端的FIN包后,会发送一个ACK包给服务端之后客户端进入TIME_WAIT(时间等待)状态。

  服务器收到ACK包后,就进入CLOSE(关闭)状态,到此服务端的连接已经完成关闭。

  客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。

posted @   无事闲逛  阅读(16)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示