TCP三次握手与四次挥手全解析

🌊 TCP三次握手与四次挥手全解析(含序列号动态追踪)


🔑 TCP 协议核心机制

  • 序列号 (seq):数据字节流的唯一标识(32位循环计数器)
  • 确认号 (ack):期望接收的下一个序列号(ack = 接收方seq + 1)
  • 标志位:SYN(建立连接)、ACK(确认)、FIN(关闭连接)

🛠️ 三次握手详解(连接建立)

ClientServerSYN=1, seq=X (随机生成)状态: SYN_SENTSYN=1, ACK=1, seq=Y, ack=X+1状态: SYN_RECEIVEDACK=1, seq=X+1, ack=Y+1状态: ESTABLISHED状态: ESTABLISHEDClientServer

序列号变化追踪(假设初始序列号:Client=1000, Server=5000)

步骤方向标志位seq 值ack 值关键说明
1C → SSYN=11000-客户端随机初始化seq
2S → CSYN=1,ACK=150001001服务端ack=客户端seq+1
3C → SACK=110015001客户端seq+1,ack=服务端seq+1

📌 SYN消耗序列号:发送SYN会使序列号+1(SYN标志位占据1字节序列空间)


🚪 四次挥手详解(连接释放)

ClientServerFIN=1, seq=U状态: FIN_WAIT_1ACK=1, seq=V, ack=U+1状态: CLOSE_WAIT状态: FIN_WAIT_2FIN=1, ACK=1, seq=W, ack=U+1状态: LAST_ACKACK=1, seq=U+1, ack=W+1状态: TIME_WAIT (2MSL)状态: CLOSEDClientServer

序列号变化追踪(通信结束时:Client seq=8000, Server seq=12000)

步骤方向标志位seq 值ack 值状态变化
1C → SFIN=18000-Client: ESTAB→FIN_WAIT_1
2S → CACK=1120008001Server: ESTAB→CLOSE_WAIT Client: FIN_WAIT_1→FIN_WAIT_2
3S → CFIN=1,ACK=1120018001Server: CLOSE_WAIT→LAST_ACK
4C → SACK=1800112002Client: FIN_WAIT_2→TIME_WAIT Server: CLOSED 等待2MSL后Client关闭

⚠️ 序列号递增规则

  1. FIN标志位消耗1序列号(与SYN相同)
  2. 发送数据时:seq增加 = 数据字节数
  3. 发送控制位:seq增加 = 标志位数量

🔥 关键机制深度解析

1. 初始序列号 (ISN) 的随机性

  • 生成算法:ISN = (计时器 × 加密因子) mod 2³²
    (现代系统使用安全随机数生成)
  • 目的:防止前序连接的报文混淆(旧连接相同端口复用)

2. TIME_WAIT 状态(2MSL等待)

// Linux内核参数配置
net.ipv4.tcp_fin_timeout = 60    // 控制TIME_WAIT持续时间
net.ipv4.tcp_max_tw_buckets = 18000 // 最大TIME_WAIT连接数
  • MSL定义:Max Segment Lifetime(报文最大生存时间,通常30秒)
  • 2MSL = 60秒:保证网络中残余报文消亡

3. 半关闭状态(Half-Close)

当一方发送FIN后进入半关闭状态:

4. 序列号回绕处理

32位序列号在高速网络中可能溢出(10Gbps≈1.2GB/s):

// Linux内核序列号比较函数
static inline bool tcp_before_seq(u32 seq1, u32 seq2) {return (s32)(seq1 - seq2) < 0;
}
// 处理示例: 
// seq1=0xFFFFFF00, seq2=0x00000010 → 判断seq1 < seq2(溢出场景)

⚠️ 高频面试问题

  1. 为什么是三次握手?

    阻止历史重复连接初始化(防止旧SYN干扰新连接)

  2. 为什么需要TIME_WAIT状态?

    确保被动关闭方能收到最终ACK(防止LAST_ACK超时重传FIN)

  3. 服务器如何应对大量TIME_WAIT?

    # 内核优化命令
    echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse    # 重用TIME_WAIT连接
    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle  # 快速回收(慎用)
    
  4. 握手时的序列号为什么随机?

    避免TCP序列号预测攻击(如IP欺骗攻击)

  5. 为什么挥手是四次而不是三次?

    TCP连接允许单向关闭(半关闭状态),需要独立确认双向关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916324.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7月26号打卡

作业&#xff1a;题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一…

C++/CLI与标准C++的语法差异(一)

&#x1f30c; C/CLI与标准C的语法差异&#xff08;一&#xff09;&#x1f52c; 第一章&#xff1a;类型系统革命 - 彻底解构三语言范式 &#x1f9ea; 1.1 类型声明语义差异矩阵 #mermaid-svg-L5kQ3iy05pKo4vIj {font-family:"trebuchet ms",verdana,arial,sans-se…

输电线路微气象在线监测装置:保障电网安全的科技屏障

在电力传输网络中&#xff0c;输电线路微气象在线监测装置通过集成专业传感器与智能分析技术&#xff0c;实现对线路周边环境参数的实时采集与动态分析&#xff0c;为电网运行安全提供数据支撑。该设备针对输电线路特殊工况设计&#xff0c;具备高适应性、高可靠性特点。工作原…

基于springboot的图书借阅系统

用户&#xff1a;借阅信息管理&#xff0c;续借信息管理&#xff0c;还书信息管理&#xff0c;图书信息&#xff0c;系统公告&#xff0c;留言板&#xff0c;我的中心管理员&#xff1a;图书信息管理&#xff0c;图书类型管理&#xff0c;借阅信息管理&#xff0c;续借信息管理…

Xinference vs SGLang:详细对比分析

概述对比特性XinferenceSGLang定位通用AI模型推理平台高性能LLM服务框架专注领域多模态模型统一接口LLM推理性能优化设计理念易用性和兼容性性能和效率核心架构对比 Xinference 架构特点 Xinference 架构&#xff1a; ├── API层&#xff08;REST/CLI/Python&#xff09; ├─…

双非上岸985!专业课140分经验!信号与系统考研专业课140+上岸中南大学,通信考研小马哥

一&#xff0e;经验分享个人情况&#xff1a;初试总分377&#xff0c;政治59&#xff0c;英语二75、数学二103、专业课140。本科为湖南一所双非一本&#xff0c;专业是电子信息工程&#xff0c;本科成绩一般&#xff0c;无奖学金无评优无科研竞赛&#xff0c;属于三无人员&…

配置DNS正反向解析

服务端master配置:yum install bind -y配置静态ip&#xff1a;修改配置文件&#xff1a;主&#xff1a;区域&#xff1a;正向解析&#xff1a;反向解析&#xff1a;开启服务&#xff1a;客户端node1配置&#xff1a;yum install nginx -y配置静态ip&#xff1a;使用xftp将文…

MyBatis-Plus 通用 Service

引言 在开发 Java Web 应用程序时&#xff0c;我们经常需要进行大量的数据库操作&#xff0c;如创建、读取、更新和删除&#xff08;CRUD&#xff09;。MyBatis-Plus 作为一个强大的 MyBatis 增强工具&#xff0c;为我们提供了通用 Service 接口&#xff0c;极大地简化了这些操…

聚类-一种无监督分类算法

目录 1、聚类任务 2、性能度量 &#xff08;1&#xff09;外部指标 &#xff08;2&#xff09;内部指标 3、具体聚类方法 &#xff08;1&#xff09;原型聚类 &#xff08;2&#xff09;密度聚类 &#xff08;3&#xff09;层次聚类 “无监督学习”(unsupervised learnin…

ES6 标签模板:前端框架的灵活利器

ES6&#xff08;ECMAScript 2015&#xff09;引入的模板字符串&#xff08;Template Literals&#xff09;为 JavaScript 开发者提供了更简洁的字符串处理方式&#xff0c;而模板字符串标签&#xff08;Tagged Template Literals&#xff09;则进一步扩展了其功能性。通过标签函…

解锁编程核心能力:深入浅出数据结构和算法

——为什么它们是你代码效率的终极武器&#xff1f; &#x1f31f; 引言&#xff1a;程序世界的基石 想象你正在建造摩天大楼&#xff1a;数据结构是钢筋骨架&#xff0c;决定建筑的结构与承重能力&#xff1b;算法则是施工蓝图&#xff0c;指导如何高效完成建造。两者结合&am…

Jenkins运行pytest时指令失效的原因以及解决办法

错误收集 Started by user 偷走晚霞的人 Running as SYSTEM Building in workspace C:\Users\Administrator\.jenkins\workspace\TestAAA [TestAAA] $ cmd /c call C:\Users\Administrator\AppData\Local\Temp\jenkins5821160869728612887.bat C:\Users\Administrator\.jenkins…

MySQL数据库本地迁移到云端完整教程

一、准备工作 安装MySQL客户端工具获取云端数据库连接信息&#xff1a; 主机地址端口号用户名密码数据库名二、本地数据库导出 mysqldump -h 127.0.0.1 -P 4406 -u root -p 数据库名 > backup.sql执行后会提示输入密码&#xff0c;完成后会在当前目录生成backup.sql文件 三、…

InvokeRepeating避免嵌套调用

InvokeRepeating嵌套这会导致指数级增长的重复调用堆叠。使用单一协程PeriodicActionRoutine替代所有InvokeRepeating避免方法间相互调用造成的堆叠如果需要多层级时间控制&#xff08;如主循环子循环&#xff09;&#xff1a;IEnumerator MultiLevelTimer() {float mainInterv…

【工具】好用的浏览器AI助手

&#x1f9e8; 一、什么是 Sider&#xff1f; Sider 是一个 Chrome 浏览器插件&#xff0c;你可以把它看作一个「网页边上的 AI 小助手」。 &#x1f5e3;️ 它就像你网页旁边的 AI 机器人&#xff0c;可以帮你回答问题、总结文章、翻译、写文案、改写内容、甚至帮你学习英文&…

C++:list(2)list的模拟实现

list的模拟实现一.list与vector1.底层结构的本质区别2.模拟实现的核心差异2.1数据存储的方式2.2 初始化的过程2.3 插入元素的操作2.4 删除元素的操作2.5 访问元素的效率3.总结二.头文件list.h1. **命名空间与模板**2. **核心数据结构**3. **构造函数**4. **模板参数设计**5. **…

【595驱动8*8点阵】2022-9-11

缘由LED点阵屏只能一次亮一列-嵌入式-CSDN问答 #include "REG52.h" sbit dsP1^0;//数据线 595的14脚 sbit shP1^1;//数据输入时钟线 595的11脚 sbit stP1^2;//输出存储器锁存时钟线 595的12脚 void QuDong595(unsigned char sj) {unsigned char aa8;while(aa--){ds…

AI总结视频以及谷歌浏览器插件安装步骤

本篇介绍用AI一键总结全网视频内容的独家方法&#xff0c;支持B站、抖音、小红书等任何平台的视频&#xff0c;提高学习效率&#xff0c;帮助一键提取视频文案、划分章节&#xff0c;还能生成双语翻译&#xff0c;这个方法直接在线总结所有视频。 一.准备工作&#xff1a; 需要…

网络协议HTTP、TCP

概述如何让数据具有自我描述性?为什么网络有层级的划分?交换机、路由器要不要阅读一个信息的头部&#xff1f;要不要阅读数据部分&#xff1f; 网卡&#xff1a;网卡可以完成帧的封装和解封装&#xff0c;工作在数据链路层。 中继器&#xff1a;中继器以比特方式将网络信号进…

Linux选择题

第12题&#xff08;多选题&#xff09;原题: 能够为逻辑卷增加容量的命令有( )。A. lvresize: 此命令可以用来调整逻辑卷的大小&#xff0c;既可以增大也可以缩小。例如&#xff0c;lvresize -L 1G /dev/vgname/lvname 会增加1GB&#xff0c;lvresize -L 10G /dev/vgname/lvnam…