首页 > 其他分享 >TCP四次挥手会经历这么多状态

TCP四次挥手会经历这么多状态

时间:2022-11-13 20:56:23浏览次数:68  
标签:挥手 ACK 报文 TCP 四次 服务器 FIN 连接 客户端

TCP三次握手 中讲述了序列号和建立连接,这一篇来说说释放连接

标志位

TCP首部中在属性标志位,和建立连接、释放连接有关,位于保留窗口字段中间,其中三个标识与断开连接有关。

  • ACK: acknowledgment(确认)--- 为1时,确认号字段才有效
  • RST: reset(重置)--- 为1时,表示tcp连接中出现问题,要释放连接并重新建立连接
  • FIN: finish(终止连接)--- 为1时,表示要求释放连接

还有两个属性序号确认号,与发送数据有关。

  • 序号(Sequence Number) --- TCP传输过程中每一个字节都有编号,建立连接后,序号表示TCP数据部分的第一个字节编号
  • 确认号(Acknowledgment Number)--- 期望对方下一次传过来的TCP数据部分的第一个字节编号

四次挥手

当数据发送完毕,客户端或者服务器一方发起释放连接请求时,会经历四个步骤,这里演示客户端发起。

① 客户端 —> 服务器:FIN=1, ACK=1,ack = v,seq = u(客户端请求释放连接,此次发送数据的序号是 u,数据长度为0,希望对方发送数据的编号为 v)

② 服务器 —> 客户端:ACK=1,seq = v,ack = u+1(服务端表示接收到释放连接的请求,此时发送数据的序号是 v,希望服务器下一次发送数据以 u+1 开始,因为客户端上一条请求中序号是u,希望服务器响应数据以v开始)

③ 服务器 —> 客户端:FIN=1, ACK=1,seq = w,ack = u+1(服务端请求释放连接,此时发送数据的序号是 w,数据长度为0,希望对方下一次发送数据从 u+1 开始)

④ 客户端 —> 服务器:ACK=1,seq = u+1,ack = w+1(客户端接收到服务器也希望断开请求的消息,同时发送 u+1 的数据,希望对方发送数据为上一次客户端数据 w+1)

状态变化

这里发送方和接收方各自都有一些状态。

  • ESTABLISHED:表示连接已经建立
  • FIN-WAIT-1:表示想主动关闭连接,向对方发送了FIN报文,此时进入到FIN-WAIT-1状态
  • CLOSE-WAIT:表示在等待关闭,当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态,在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方
  • FIN-WAIT-2:只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文
  • LAST-ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当收到ACK报文后,即可进入CLOSED状态了
  • TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可进入CLOSED状态
  • CLOSED:关闭状态

以上是完整四次挥手流程,但我们在抓包的时候,也有可能会看到三次挥手

当服务器接收到客户端的FIN时,如果服务器后面没有数据要发给客户端时,服务器有可能把第2、3次挥手合并(同时带FIN标志和ACK标志的报文),相当于同时告诉客户端两件事

  • 已经知道client没有数据要发
  • server已经没有数据要发

此时FIN-WAIT-1状态就不经过FIN-WAIT-2,直接到TIME-WAIT

为什么要四次挥手

四次挥手中存在客户端和服务器分别 发起断开请求确认收到对方的断开请求,那这里的四次是不是可以简化成两次,只要一方发起,另一方确认就行。

这样是不可以的,因为TCP是全双工通信,一方发送关闭请求,仍然可以继续接收消息。

① 客户端 —> 服务器:客户端告诉服务器没有数据要发送,但是客户端还可以接收
② 服务器 —> 客户端:服务器已经知道客户端没有数据发送,但是服务器仍可以发送
③ 服务器 —> 客户端:服务器告诉客户端,服务器没有数据要发送了
④ 客户端 —> 服务器:服务器已经知道客户端没有数据要发送,随后正式断开整个TCP连接

经过了四次消息的交互之后,才能完全确认双方都已经没有数据要发送。

2ML

MSL:Maximum Segment Lifetime,最大分段生存期,MSL是TCP报文在Internet上的最长生存时间,一般是2分钟

客户端第四次挥手,发送ACK的确认报文后,不会马上进入 CLOSED 关闭状态,而是会在TIME-WAIT等待2ML的时间,是为了防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在2MSL时间内消失了)

因为可能存在这样的情况:如果网络原因,服务器没有收到ack,那么服务器会重发FIN,如果客户端发送了一次ACK后就马上进入CLOSED阶段,那么客户端收不到服务器的FIN。 如果此时客户端的新应用分配了同一个端口号,那么新的应用程序收到服务器传来FIN的报文,以为是要请求关闭,那么会马上会释放连接。

抓包

抓包工具可以看到释放连接时的四次挥手

使用 netstat 命令可以看到连接状态

以上就是 释放连接与状态变化的内容 , 更多有关 前端网络协议 的内容可以参考我其它的博文,持续更新中~

标签:挥手,ACK,报文,TCP,四次,服务器,FIN,连接,客户端
From: https://www.cnblogs.com/vigourice/p/16886908.html

相关文章

  • Web 性能优化:TCP
    个人博客......
  • 传输层协议之TCP三次握手
    1.TCP协议与UDP协议TCP协议:传输控制协议UDP协议:用户数据报协议1.1TCP协议与UDP协议的区别TCP协议是面向连接的,可靠的,进程到进程通信的协议。TCP提供全双工服务,即数......
  • 抓包整理————tcp 传输数据的基础概念[十一]
    前言简单介绍一下tcp数据传输。正文tcp数据传输是怎么样子的呢?比如我们在代码中写好了,connection去连接。然后我们用write去读取数据,这个时候呢,到底我们的操作系......
  • 抓包整理————tcp 三次握手性能优化[十]
    前言tcp三次握手性能优化。正文服务器三次握手流程示例:下面就是3次握手的过程:知道这个有什么用呢?我举一个我使用到的例子哈。比如有很多tcp连接到一台机器上......
  • Unix/Linux系统编程(TCP/IP和网络编程)
    TCP/IP协议TCP/IP是互联网的基础。TCP代表传输控制协议。IP代表互联网协议。目前有两个版本的IP,即IPv4和IPv6。IPv4使用32位地址,IPv6则使用128位地址。本节围绕IPv4进行......
  • 抓包整理————tcp 三次握手[九]
    前言简单抓包一下3次握手。正文握手的目标:同步sequence序列化初始化序列化ISN(InitialSequenceNumber)交换tcp通信参数如MSS、窗口比例因子、选择性确认、......
  • TCP Connection Status
    ATCPconnectionprogressesthroughaseriesofstatesduringitslifetime.ThefollowingdiagramillustratesthepossiblestatesforaTCPconnectionandhow......
  • TCP-可靠传输-流量-拥塞控制
    1.TCP的可靠传输1.1停止等待ARQ协议主机采用TCP发出信息时会设置一个定时器,若超出定时器所设定的时间还没有响应过来,则主机会认为发出去的消息没有传达到目的......
  • Android TCP客户端
    文章目录​​一、创建工程​​​​二、添加网络权限​​​​三、添加布局代码​​​​四、添加逻辑代码​​​​五、通信测试​​​​六、源码分享​​一、创建工程二、添加......
  • go错误汇总2:[ERROR] listen tcp: address 8082: missing port in address
    go错误汇总2:[ERROR]listentcp:address8082:missingportinaddress错误信息:[ERROR]listentcp:address8082:missingportinaddress 错误原因:代......