当前位置: 首页 > ops >正文

【计算机网络】TCP状态转移

目录

TCP状态转移概述

三次握手阶段

四次挥手阶段

异常状态转移

关键参数与公式


TCP状态转移概述

TCP协议通过状态机管理连接生命周期,共有11种标准状态。状态转移由特定事件触发,如数据包收发、超时或应用层操作。

三次握手阶段

首先服务器处于listen状态,客户端程序主动打开:即执行connect,进行三次握手。客户端先发出SYN即为第一次握手,服务器收SYN即为第二次握手(对于服务器就是第一次握手,服务器发出SYN和ack就是第二次);服务器发出ack就是客户端的第三次确认(服务器收ack就是服务器端的第三次)。

SYN_RCVD,SYN_SENT都是握手的中间状态,握手完成后编程ESTABLISHED,变成已完成握手的状态。最后执行close,变成待机状态。因此连接状态会随着握手的状态发生变化。

  • CLOSED:初始状态,表示无连接,是一个假想的即时阶段,实际上不存在这个状态。
  • LISTEN:服务器端调用listen()后进入该状态,等待SYN请求。
  • SYN-SENT:客户端发送SYN后进入此状态,等待服务器响应。
  • SYN-RECEIVED:服务器收到SYN并回复SYN+ACK后进入该状态。
  • ESTABLISHED:完成三次握手后双方进入此状态,可开始数据传输。

什么时候握手?代码执行connect时开始握手。

什么时候挥手?代码执行close时开始挥手。

四次挥手阶段

挥手时任何一方关闭就执行了close。无论哪一方谁执行close,谁就给对方发送一个FIN,(以A先给B发送close为例)通知B关闭,这是A第一次挥手;B会进行接收,这是B的第一次挥手;B收到之后给A发送ack,这是B的第二次挥手(这时的状态就不是初始状态,变成FIN-WAIT-1状态;然后A接收B发来的ack,这是A的第二次挥手(这时状态变为FIN-WAIT-2状态)。这时B变成CLOSE-WAIT状态,B执行关闭即执行close,B向A发送FIN通知关闭,这时就是B的第三次挥手,同时A接收FIN通知要关闭(为A的第三次);这时A发送ACK给B,即为A的第四次挥手;B接收ACK即为B的第四次挥手。

  • FIN-WAIT-1:主动关闭方发送FIN后进入该状态,等待ACK或FIN。
  • FIN-WAIT-2:收到对端ACK后进入此状态,等待对端FIN。
  • CLOSE-WAIT:被动关闭方收到FIN后进入该状态,需等待应用层关闭。
  • LAST-ACK:被动关闭方发送FIN后进入此状态,等待最终ACK。
  • TIME-WAIT:主动关闭方收到FIN并发送ACK后进入,持续2MSL确保报文消失

1、存在原因/意义?

  • 可靠的终止TCP链接

因为TCP有应答确认超时重传,我们发出去一个报文,无法保证其一定到达对方,因此当发送时,对方收到后回复一个确认信息。但是这个ACK会丢,这时对方无法收到ACK,就认为对方发送的FIN没收到,因此可能会重新发送FIN。如果不存在TIME-WAIT,会直接消失,默认四次挥手完成。

  • 保证迟来的TCP报文段有足够的时间被识别丢弃

用于服务器结束的情况,此时就没有服务器了。但是此时网络中可能有延迟的报文。

2、如何防止服务器出现TIME-WAIT状态?

先关闭客户端,因为客户端出现TIME-WAIT端口被占用了,如果运行客户端的话,系统会随机分配一个暂时没人用的端口;但是服务器不能随机分配,服务器的端口是固定的,一旦端口被占用就运行不了了。

  • CLOSED:TIME-WAIT超时后进入最终关闭状态。

异常状态转移

SYN_TIMEOUT:SYN-SENT状态未收到响应时直接返回CLOSED。

RESET:收到RST包立即终止连接,所有未完成状态直接跳转CLOSED。

同时关闭:双方同时发送FIN时进入CLOSING状态,最终通过TIME-WAIT过渡到CLOSED。

关键参数与公式

MSL(Maximum Segment Lifetime)默认为2分钟,TIME-WAIT持续时间计算: $$ TIME_WAIT = 2 \times MSL $$

状态转移超时重传机制采用指数退避算法: $$ Timeout = min(60, 2^{n-1} \times RTO) $$ 其中$n$为重传次数,RTO(Retransmission Timeout)基于动态RTT计算。

http://www.xdnf.cn/news/19690.html

相关文章:

  • 开发板直连电脑的搭建网络环境(以正点原子阿尔法imx6ull开发板为讲解)
  • Flutter代码生成:告别重复劳动,效率飙升
  • 《我是如何用C语言写工控系统的漏洞和Bug》连载(1)内容大纲
  • FART 自动化脱壳框架优化实战:Bug 修复与代码改进记录
  • 充电枪结构设计-经验总结
  • 计算机网络:概述层---TCP/IP参考模型
  • shell编程从0基础--进阶 1
  • Day20_【机器学习—逻辑回归 (1)—原理】
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(上)
  • 找Jenkins代替工具,可以体验下这款国产开源CICD工具
  • Web 集群高可用全方案:Keepalived+LVS (DR) 负载均衡 + Apache 服务 + NFS 共享存储搭建指南
  • 【C++】深入浅出:string类模拟实现全解析
  • 碰一下可打开小程序,在web系统中如何嵌入将小程序写入NFC
  • 企业文档安全守护者全面测评:7款加密软件深度解析,让商业机密固若金汤
  • Parasoft C/C++test案例:基于CERT/CWE的代码合规自动化
  • 力扣hot100:螺旋矩阵(边界压缩,方向模拟)(54)
  • Canaan 阿瓦隆 A1246I 81T矿机评测:性能、功耗与能效全面分析
  • 高效对象属性复制工具
  • 2025 年行政岗转型突破:解锁技能提升新方向
  • 【V8引擎】介绍
  • 基因表达数据的K-M生存曲线的数据处理及绘制
  • C++条件变量学习
  • UML状态图之trigger(触发器)、guard(守卫条件)和action(动作)
  • Linux 文本处理神器——sed
  • 拔河(蓝桥杯)(前缀和)
  • OpenStack:典型的面向服务架构(Service-Oriented Architecture, SOA)
  • milvus-standalone启动失败unhealthy,错误日志context deadline exceeded
  • 面试官常问:Redis 为什么快?这篇回答满分!
  • 【数据结构探秘】手把手用单链表实现增删查改:一篇面向 C 程序员的实战指南
  • C#枚举类型的定义及其用法