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

【计算机网络】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://wU71RQyF.rfmzs.cn
http://G6HLxWFQ.rfmzs.cn
http://BB4GmGG2.rfmzs.cn
http://9uSFALEa.rfmzs.cn
http://lUH78GnA.rfmzs.cn
http://HgYHVlNz.rfmzs.cn
http://W82V90U3.rfmzs.cn
http://GtQ5BF99.rfmzs.cn
http://ytzFuOBQ.rfmzs.cn
http://HQymcf9R.rfmzs.cn
http://nH7rBR11.rfmzs.cn
http://24V73BpS.rfmzs.cn
http://zmaOerE0.rfmzs.cn
http://Oly5frel.rfmzs.cn
http://iZpbeYJL.rfmzs.cn
http://VBnXffyI.rfmzs.cn
http://Eg4Wyvjz.rfmzs.cn
http://JsHJWe3C.rfmzs.cn
http://0J2kRJbj.rfmzs.cn
http://UfqBefCj.rfmzs.cn
http://K1K9o499.rfmzs.cn
http://itVGnatV.rfmzs.cn
http://jxrim95a.rfmzs.cn
http://P7rsjHeu.rfmzs.cn
http://ZK9wUDLj.rfmzs.cn
http://SWJbdZ8c.rfmzs.cn
http://GphmcORL.rfmzs.cn
http://RNCjZIl9.rfmzs.cn
http://bm09P4LE.rfmzs.cn
http://2Gf3h4h8.rfmzs.cn
http://www.dtcms.com/a/364962.html

相关文章:

  • AI随笔番外 · 猫猫狐狐的尾巴式技术分享
  • 醋酸铕:点亮现代生活的“隐形之光“
  • Java jar 如何防止被反编译?代码写的太烂,害怕被人发现
  • 如何用java给局域网的电脑发送开机数据包
  • 2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution
  • 这才是真正懂C/C++的人,写代码时怎么区分函数指针和指针函数?
  • Masonry
  • 少儿编程C++快速教程之——1. 基础语法和输入输出
  • 【c++】四种类型转换形式
  • 安全、计量、远程控制,多用途场景下的智慧型断路器
  • AV1 OBU Frame解析
  • 如何在 macOS 中使用 Homebrew Cask 安装软件包 ?
  • 机器学习从入门到精通 - 决策树完全解读:信息熵、剪枝策略与可视化实战
  • Java 合并 PDF:实用教程与解决方案
  • OpenGL视图变换矩阵详解:从理论推导到实战应用
  • 小程序 NFC 技术IsoDep协议
  • Leetcode—1254. 统计封闭岛屿的数目【中等】
  • 轻轻一个字母差别,就能把首屏时间砍半——为什么90%的人还不知道?
  • 游戏总监级“AI炼金术”!Firefly+NB创造不存在的神级材质
  • 小迪web自用笔记25
  • 【第三方软件项目验收中的安全漏洞(SQL注入/XSS)修复】
  • 彩笔运维勇闯机器学习--逻辑回归
  • Day20_【机器学习—逻辑回归 (1)—原理】
  • 浅谈人工智能之阿里云搭建coze平台
  • CI(持续集成)、CD(持续交付/部署)、CT(持续测试)、CICD、CICT
  • SQL 函数:使用 REPLACE进行批量文本替换
  • 数仓实习生面试(一面)
  • Docker 安装 RAGFlow保姆教程
  • 开源 + 免费!谷歌推出 Gemini CLI,Claude Code 的强劲对手
  • UnityWebRequest 数据获取和提交