TCP 虽然是面向字节流,但 TCP 传送的数据单元是 报文段。
- 一个 TCP 报文段分为 首部 和 数据 两部分。
- TCP 报文首部的前
20字节
是固定的,后面4n
个字节根据需要而增加的选项(n
是整数)。 - TCP 最小长度是 20字节。
源端口和目的端口
- 各占
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 首部长度不确定,需要使用此字段标识首部长度。
保留
-
标志位
| 标志 | 数值 | 说明 | | :—-: | :—-: | :—-: | | 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字节
。-
紧急指针
占
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 |