FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  1. 网络协议
  2. TCP 协议

TCP 报文结构

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data  |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                          TCP Header Format
  • Source Port 源端口,占用 16bit=2byte;

  • Destination Port 目标端口,占用 16bit=2byte;

  • Sequence Number 序号,占用 32bit=4byte。序号值的范围是 [0, 2^32 - 1],共 2^32 个序号。序号值增加到 2^32 - 1 之后就又回到 0。TCP 是面向字节流的协议,在 TCP 连接中所传输的字节流的每一个字节都是按顺序编码的,字节流的起始序号必须在建立连接时(通过三次握手)被设置。序号值表示 本报文段所发送的数据的第一个字节序号。例如,一个报文段的序号值是 301,而携带的数据共有 100byte,这表明该报文段携带的数据的第一个字节的序号是 301,最后一个字节的序号是 400,并且下一个报文段的数据序号应当是从 401 开始的;

  • Acknowledgment Number 确认号,占用 32bit=4byte。确认号值表示 期望收到对方的下一个报文段的序号值。例如, B 正确收到了 A 发送过来的报文段,其序号值是 501,携带的数据共有 200byte,如果 B 正确收到了 A 发送的序号值到 700 为止的数据,那么 B 期望收到 A 的下一个报文段的序号值是 701,因此 B 发送给 A 的确认报文段中的确认号应该为 701;

  • Data Offset 数据偏移,占用 4bit。数据偏移字段表示 TCP 报文段中的数据距离 TCP 报文段起始处的偏移量;

  • Reserved 保留,占用 6bit。保留字段用于未来使用,目前该字段值设置为 0;

  • 六个控制位

    • URG 用于表示紧急指针字段是有效的。

    • ACK 用于表示确认号字段是有效的。TCP 协议规定在建立连接之后的所有报文段中,都必须把 ACK 字段设置为 1;

    • PSH 用于表示使用 push 操作;

    • RST 用于重新建立连接;

    • SYN 用于在建立连接时同步序号。当 SYN=1 ACK=0 时表示当前报文段是一个请求连接报文段,当 SYN=1 ACK=1 时表示当前报文段是一个同意请求连接的报文段;

    • FIN 用于释放连接。当 FIN=1 时表示当前报文段的发送方已经发送数据完毕;

  • Window 窗口,占用 16bit=2byte。窗口值的范围是 [0, 2^16 - 1]。窗口指的是 当前报文段的发送方的接收窗口(而不是发送窗口)。窗口值 告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。接收方的数据缓存空间是有限的,接收方的窗口值是作为发送方设置其发送窗口的依据。例如,一个报文段的确认序号是 701,窗口字段是 1000,这对与接收方来说,表明从 701 号算起,发送方的接收缓存空间还可以接收 1000 个字节数据,并且接收方在发送数据的时候需要考虑这一点;

  • Checksum 校验和,占用 16bit=2byte。校验和字段用于校验 TCP 首部和数据两部分;

  • Urgent Pointer 紧急指针,占用 16bit=2byte;

  • Options 选项,可变长度,最大可占用 40byte;

  • Padding 填充,作为 Options 的填充内容。

参考资料

最后更新于1年前

RFC 793 - Transmission Control Protocol - Header Format