ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

TCP数据包长什么样?拆解TCP报文头部结构

2026/8/4 13:58:20 拓冰建站 浏览量
TCP数据包长什么样?拆解TCP报文头部结构 适用网页直接发布段落清晰、无复杂markdown语法通俗易懂附带和UDP对比、ACK原理承接我们前面讨论的带宽、确认包知识点很多开发、运维同学天天和TCP打交道知道TCP可靠、有ACK确认、会重传UDP包头小、无回执实时场景更省带宽。但绝大多数人只停留在概念层面TCP数据包在网线里真实的二进制结构到底长什么样三次握手、ACK确认、流量控制全部功能都写在TCP头部几十个字节中。本文逐层拆解标准TCP报文结构结合抓包现象带你直观看懂TCP数据包。一、数据包分层封装先理清位置当程序发送一段数据操作系统会层层封装报文以太网环境完整封装顺序[以太网头部] [IP头部] [TCP头部] [应用层载荷数据]我们今天聚焦TCP头部。注意区分两个容易混淆概念TCP报文段Segment传输层单元包含TCP头业务数据IP数据包Packet网络层单元IP头 TCP整个报文段TCP头部有一个关键特性最小20字节最大60字节。多出的空间用于TCP可选扩展字段时间戳、SACK、窗口缩放等。对比记忆UDP头部固定只有8字节这也是同等条件下UDP头部开销更小的根源。二、TCP头部标准结构图32bit为一行标准TCP头部布局单位比特bit8bit1字节0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -------------------------------- | 源端口(16bit) | 目标端口(16bit) | -------------------------------- | 序列号(32bit) | -------------------------------- | 确认号ACK(32bit) | -------------------------------- | 数据偏移 |保留|标志位| 接收窗口大小(16bit) | -------------------------------- | 校验和(16bit) | 紧急指针(16bit) | -------------------------------- | 可选字段0~40字节 填充 | -------------------------------- | 应用载荷数据 | --------------------------------三、逐个字段通俗讲解1. 源端口16bit / 目标端口16bit端口标识区分同一台主机上不同应用程序。例如客户端随机端口 → 服务器80/443端口。UDP头部同样存在这两个字段。2. 序列号 Sequence Number32bitTCP把所有传输数据当成一串连续字节流。序列号代表当前报文携带数据的第一个字节编号。作用解决乱序、重复报文问题保障有序交付。3. 确认号 Acknowledgment Number32bit【重点ACK包核心】也就是我们上一轮聊的ACK确认机制核心字段。规则确认号 N代表接收方已经成功收到 N 之前所有字节期待下一次接收字节N。举例子接收方收到1~1000字节回复确认号1001。这就是ACK回执包的本质。⚠️ 重要前提TCP头部的ACK标志位必须开启这个确认号才生效。4. 数据偏移4bit单位4字节。用来标识TCP头部总长度。最小值55×420字节对应无选项的基础头部最大值1560字节。这直接印证TCP头部20~60字节可变。5. 6个核心标志位Flags抓包最常看见一共6个1bit标记可以同时多个置1URG紧急指针有效ACK确认位。只要置1确认号字段生效。绝大多数TCP包都开启ACKPSH推送通知内核立刻把数据交给应用程序不要缓冲区排队RST重置连接强制断开SYN同步三次握手建立连接FIN结束四次挥手关闭连接Wireshark抓包里看到[SYN][ACK][PSH,ACK]来源就是这一组标志。6. 接收窗口 Window16bit流量控制核心。告诉发送方我接收缓冲区还有多少空闲空间你别发太快。配合拥塞控制防止发送方打爆接收端。7. 校验和 Checksum16bit校验TCP头部数据检测传输过程是否出现比特损坏。UDP也有校验和。8. 紧急指针 Urgent Pointer16bitURG标志生效时使用标记紧急数据位置日常业务极少用到。9. 可选字段 Options0 ~ 40字节常用选项MSS最大报文段长度Window Scale窗口缩放解决大带宽高速传输Timestamps时间戳用于RTT计算、防序列号回绕SACK选择性确认丢包时不用全部重传优化性能只要启用任意选项TCP头部就会大于基础20字节进一步增加带宽开销。四、结合带宽话题TCP为什么比UDP更耗流量头部尺寸差距UDP固定8字节头部TCP最少20字节开启选项后通常32~40字节。小包场景游戏、传感器上报头部占比极高差距明显。大量额外ACK报文单向数据流场景下接收方持续发送纯ACK小包。只有TCP原生携带ACK机制UDP协议层不存在任何确认回执。直播推流场景TCP上行推视频数据下行源源不断ACK回执双向产生流量UDP只有上行数据流。重传报文开销网络丢包时发送方收不到ACK触发重传重复发送相同数据。补充提醒如果在UDP之上自研可靠传输KCP、QUIC应用层自己实现ACK、重传。此时UDP协议头虽然很小但上层自定义控制包会补齐开销带宽优势大幅缩水。五、实战小提示Wireshark抓包观察TCP包过滤表达式tcp点开任意报文展开Transmission Control Protocol可以清晰看到Source Port、Seq、Ack、Flags、Window、Options纯ACK包特征TCP载荷长度0仅有[ACK]标记无业务数据这类就是我们所说的ACK确认包。六、总结TCP头部2060字节可变UDP固定8字节基础开销UDP更小。序列号、ACK确认号、标志位、窗口大小共同实现TCP三大特性有序传输、可靠送达、流量控制。ACK确认号是TCP可靠传输的基石也是TCP额外消耗带宽的关键原因。所有TCP复杂功能没有魔法全部定义在这几十字节的头部二进制字段中。