TCP 虽然是面向字节流,但 TCP 传送的数据单元是 报文段。

  • 一个 TCP 报文段分为 首部 数据 两部分。
  • TCP 报文首部的前 20字节 是固定的,后面 4n 个字节根据需要而增加的选项(n 是整数)。
  • TCP 最小长度是 20字节。

image.png

源端口和目的端口

  • 各占 2字节
  • 与 UDP 相似,使用端口允许将来自不同应用进程的数据聚合并通过 IP 层发送(复用功能)。接收方通过目的端口找到目标应用进程(分用功能)。

    序号

  • 4字节。序号范围是 0~4294967296,可标识数据大小 4GB。当增加至最大值,下一个序号又回到 0。

  • 字节流中的 每一个字节都按顺序编号
  • 双端起始序号在三次握手时确定。
  • 首部中的 序号 字段值指本报文段所发送的数据的第一个字节的序号。

    确认号

  • 4字节。表示期望收到对方下一个报文段的第一个数据字节的序号。

  • 一般由接收方发送确认信息时填写。
  • 若发送方收到确认号 N,则表达意思是: 到序号 N-1 为止的所有数据都已正确收到。
  • 在一般情况下,可保证当序号重复使用时,旧序号的数据早已通过网络到达终点。

    偏移数据

  • 4字节。TCP 报文段的首部长度。

  • 数值单位: 4字节长。由于4位二进制表示最大十进制长度为 15,所以数据偏移的最大值是 60字节,这也 TCP 首部的最大长度,选项长度不能超过40字节。可以把这个参数理解为 TCP 首部可以有多少行,每行 32位,即 4个字节。
  • 由于 TCP 存在 选项,导致 TCP 首部长度不确定,需要使用此字段标识首部长度。

    保留

  • 6位,为今后使用,目前置为 0。

    标志位

    | 标志 | 数值 | 说明 | | :—-: | :—-: | :—-: | | URG | 1 | 紧急指针字段有效。告诉系统此报文段中有紧急数据,应尽快传送(优先级较高)。 | | ACK | 1 | 确认号字段有效。TCP规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。 | | PUH | 1 | 立即创建一个报文段发送出去。接收方收到PSH=1的报文段,就尽快交付接收应用程序,而非等待缓存填满后再向上交付。 | | RST | 1 | 复位。TCP 连接中出现严重差错(如主机崩溃、关机或其他原因),必须释放连接,然后再重新建立运输连接。还用来拒绝一个非法的报文段或拒绝打开一个连接。 | | SYN | 1 |
    - SYN=1,ACK=0,表明这是一个连接请示报文段。(发送方发送请求)。
    - SYN=1,ACK=1,若双方同意建立连接,则在响应的报文段中设置。(接收方同意建立连接并发送响应)。
    | | FIN | 1 | 此报文段的发送方的数据已发送完毕。 |

窗口

  • 2字节。窗口值可以为 0~65535 之间的整数。
  • 发送方、接收方都有各自的窗口值。窗口值告诉对方: 从本报文段首部中的确认号算起,接收方目前允许对方发送的量(以字节为单位)。
  • 两边(指发送方、接收方)窗口值动态变化。

    检验和

  • 2字节

  • TCP 的检验和 = 首部 + 数据 + 伪首部

    紧急指针

  • 2字节

  • 仅在 URG=1 时有意义,指出本报文段中的紧急数据的字节数 (紧急数据结束后就是普通数据)。也就是说这个报文段不全是紧急数据,可以是由紧急数据+普通数据组成。

    选项

  • 长度可变,最大长度可达 40字节。 | 选项 | 说明 | RFC | | :—-: | :—-: | :—-: | | 最大报文长度 MSS |
    - Maximum Segment Size,MSS
    - MSS 影响网络传输性能
    - 太小: 降低网络利用率(报文开销)
    - 太大: 降低网络性能(分片降低成功传输概述)
    - 最佳 MSS
    - 理论: 尽可能长而不分片
    - 实际: 不存在
    - 通常: 发送端按发送接口的 MTU 来确认
    - 通信双方用 MSS 选项进行 MSS 值的协商
    - 接收方不能处理较长的报文时(如资源有限等)
    - MSS 值表示 TCP 报文段的 数据字段 的最大长度。不包含 TCP 首部
    - MSS 默认值是 536字节长。因此,所有在互联网上的主机都应能接受报文段长度是 536+20=556 字节
    | 879 | | 窗口扩大系数
    WSOPT |
    - 占 3个字节。其中有一个字节表示 移位值 S,新的窗口位数 = 16 + S。
    - 可在双方初始建立 TCP 连接时进行协商。
    - 如果不再需要扩大窗口时,可发送 S=0的选项,使窗口大小回到 16。
    | 1323 | | 时间戳
    TSPOT |
    - 占 10个字节。最主要的字段是 时间戳字段(4字节)和 时间回送回答字段(4字节)。
    - 计算往返时间 RTT。
    - 用于处理 TCP 序号超过 2^32 的情况,又称防止序号绕回 PAWS。
    | 1323 | | 选择确认
    SACK |
    - 用于接收端收到乱序数据。
    - 结合。
    | 2018 |