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

TCP首部格式及三次握手四次挥手

TCP协议详解:首部格式与连接管理

一、TCP首部格式

TCP首部最小20字节,最大60字节,包含以下字段:
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 源端口号(16bit) | 目的端口号(16bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 序列号(32bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 确认号(32bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 数据偏移(4bit)| 保留(6bit) |U|A|P|R|S|F| 窗口大小(16bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 校验和(16bit) | 紧急指针(16bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 选项(可选,最多40字节) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 数据部分 |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+

关键字段说明:

  • 源/目的端口:各占2字节,标识发送方和接收方的应用进程
  • 序列号/确认号:各占4字节,用于可靠传输
  • 控制标志位
    • URG:紧急指针有效
    • ACK:确认号有效
    • PSH:接收方应尽快交付应用层
    • RST:连接复位
    • SYN:同步序列号(连接建立)
    • FIN:发送方数据发送完毕(连接释放)

二、TCP三次握手(连接建立)

客户端 服务端
| |
| SYN=1, seq=x |
|--------------------------------->|
| |
| SYN=1, ACK=1, seq=y, ack=x+1 |
|<---------------------------------|
| |
| ACK=1, seq=x+1, ack=y+1 |
|--------------------------------->|
| |

握手过程:

  1. SYN_SENT:客户端发送SYN包(SYN=1, seq=x)进入SYN_SENT状态
  2. SYN_RCVD:服务端回复SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1)进入SYN_RCVD状态
  3. ESTABLISHED:客户端发送ACK包(ACK=1, seq=x+1, ack=y+1)双方进入连接状态

📌 为什么需要三次握手?

  • 防止历史重复连接初始化导致的资源浪费
  • 同步双方的初始序列号
  • 避免资源浪费(防止服务端因无效请求维持连接)

三、TCP四次挥手(连接释放)

客户端 服务端
| |
| FIN=1, seq=u |
|--------------------------------->|
| |
| ACK=1, ack=u+1 |
|<---------------------------------|
| |
| FIN=1, seq=v |
|<---------------------------------|
| |
| ACK=1, seq=u+1, ack=v+1 |
|--------------------------------->|
| |

挥手过程:

  1. FIN_WAIT_1:主动方发送FIN包(FIN=1, seq=u)进入FIN_WAIT_1状态
  2. CLOSE_WAIT:被动方回复ACK包(ACK=1, ack=u+1)进入CLOSE_WAIT状态
  3. FIN_WAIT_2:主动方收到ACK后进入FIN_WAIT_2状态
  4. LAST_ACK:被动方发送FIN包(FIN=1, seq=v)进入LAST_ACK状态
  5. TIME_WAIT:主动方回复ACK包(ACK=1, seq=u+1, ack=v+1)进入TIME_WAIT状态(等待2MSL)
  6. CLOSED:双方最终关闭连接

⚠️ TIME_WAIT状态的作用:

  1. 确保最后一个ACK能到达对端
  2. 让网络中残留的报文段失效(等待2MSL时间)

四、常见问题解答

Q1: 为什么连接是三次握手而关闭要四次挥手?

A: 因为TCP是全双工的,关闭时需要分别关闭两个方向的数据流。当收到FIN时只表示对方不再发送数据,但本方可能还需要发送剩余数据。

Q2: SYN洪泛攻击是什么?

A: 攻击者伪造大量SYN包但不完成握手,导致服务端维持大量半开连接。防御方法包括SYN Cookie、增加积压队列等。

Q3: TIME_WAIT状态为什么要持续2MSL?

A: MSL是报文最大生存时间。2MSL可以保证:

  1. 本方最后一个ACK能到达对端(最多MSL)
  2. 如果对端没收到,重传的FIN会在下一个MSL内到达
http://www.xdnf.cn/news/430453.html

相关文章:

  • 操作系统导论——第29章 基于锁的并发数据结构
  • 【25软考网工】第六章(5)应用层安全协议
  • 讯联云库项目开发日志(一)
  • 记录算法笔记(2025.5.13)二叉树的最大深度
  • 基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计
  • flink的TaskManager 内存模型
  • 奇怪的公式
  • 代码随想录三十七天 完全背包二维 完全背包一维 518. 零钱兑换 II 377. 组合总和 Ⅳ
  • 视频编解码学习十一之视频原始数据
  • 思维链实现 方式解析
  • Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)
  • 简单介绍Qt的属性子系统
  • Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践
  • MLA (Multi-head Attention Layer) 详细说明
  • 报告研读:125页2024年大模型轻量化技术研究报告——技术详细讲解【附全文阅读】
  • 9、Activiti-任务(Task)的相关操作
  • 深入浅出MySQL 8.0:新特性与最佳实践
  • java基础-方法的重写、super关键字
  • NVMe学习资料汇总
  • 浅析AI大模型为何需要向量数据库?从记忆存储到认知进化
  • AI Agent开发第65课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(下)
  • 2025年,大模型LLM还有哪些可研究的方向?
  • Mac上安装Mysql的详细步骤及配置
  • Python核心数据类型全解析:字符串、列表、元组、字典与集合
  • 在C#中使用YOLO的几种方式
  • 代码仓提交分支规范
  • docker安装mysql8, 字符集,SQL大小写规范,sql_mode
  • G1JVM内存分配机制详解
  • 华秋2025电子设计与制造技术研讨会(华东站)成功举办!
  • 合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent