当前位置: 首页 > 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内到达

相关文章:

  • 【学习笔记】Shell编程---流程控制语句
  • 【用「概率思维」重新理解生活】
  • 深入探讨 Java 性能术语与优化实践
  • 12.1寸工业液晶屏M121XGV20-N10显示单元技术档案
  • ubuntu22.04编译PX4无人机仿真实践
  • Git命令起别名
  • Cursor开发酒店管理系统
  • 【AI论文】健康的大型语言模型(LLMs)?——评估大型语言模型对英国政府公共健康信息的掌握程度
  • 什么是序列化与反序列化
  • Kubernetes 标签和注解
  • Unity
  • [ linux-系统 ] 进程概念与基本操作
  • 【大模型】DeepResearcher:通用智能体通过强化学习探索优化
  • 嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
  • 大便次数与寿命有关?
  • 通过SSRF击穿内网!kali-ssrf靶场实战!
  • 基于MNIST数据集的手写数字识别(简单全连接网络)
  • 蓝桥杯 16. 外卖店优先级
  • 抖音怎么快速涨粉(抖音推流算法研究)
  • Qt多线程编程实践总结:QtConcurrent与moveToThread应用场景对比(可以说都是干货)
  • 这个“超强致癌细菌”,宝宝感染率高达40%,预防却很简单
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • 专访|韩国世宗研究所中国研究中心主任:李在明若上台将推行均衡外交
  • 茅台回应“茅台1935脱离千元价位带竞争”:愿与兄弟酒企共同培育理性消费生态
  • 习近平圆满结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 欧洲理事会前主席米歇尔受聘中欧国际工商学院特聘教授,上海市市长龚正会见