(4层)TCP 首部字段

TCP 报文段的首部格式

TCP 虽然是面向字节流的,但 TCP 发送的数据单元却是报文段。一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。

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

(4层)TCP 首部字段_第1张图片
首部各字段的意义如下:

  • 源端口和目的端口:各占 2 个字节,分别写入源端口号和目的端口号。
  • 序号:占 4 字节。本报文段所发送的数据的第一个字节的序号。序号范围是 [ 0, 2^32 -1 ],共 2^32 个序号,序号增加到 2^32 -1 后,下一个序号就又回到 0。TCP是面向字节流的。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
  • 确认号:占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号。只有在 ACK = 1 时确认号字段才有意义。由于序号字段有 32 位长,可对 4GB(即 4 千兆字节)的数据进行编号。在一般情况下,可保证当序号重复时,旧序号的数据早已通过网络到达终点了。
  • 数据偏移:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出 TCP 报文段的首部字段长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但应注意,“数据偏移” 的单位是 32 位字。由于 4 位 二进制数能够表示的最大十进制数字是 15,因此数据偏移的最大值是 60 字节(15 * 32bit),这也是 TCP 首部的最大长度(即选项长度不能超过 40 字节 / 60 最大首部 -20 固定首部 = 40 选项长度)
  • 保留:占 6 位,保留位今后使用,但目前应置为 0 。
  • 6 个控制位:包括 URG、ACK、PSH、RST、SYN、FIN,用来说明本报文段的性质。
  • 窗口:占 2 字节。窗口指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。窗口值是 [ 0, 2^16 -1 ] 之间的整数。
  • 检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。和 UDP 数据报一样,在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。伪首部的格式与 UDP 用户数据报的伪首部一样。但应把伪首部第 4 个字段中的 17 改为 6(TCP 的协议号是 6),把第 5 个字段中的 UDP 长度改为 TCP 长度。接收方收到此报文段后,仍要加上这个伪首部来计算校验和。若使用 IPv6,则相应的伪首部也要改变。
  • 紧急指针:占 2 字节。紧急指针仅在 URG = 1 时才有意义,它指出本报文字段中的紧急数据的字节数(紧急数据之后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP 就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。
  • 选项:长度可变,最长可达 40 字节。当没有使用 “选项” 时,TCP 的首部长度是 20字节。

TCP 有 6 个控制位,用来说明报文段的性质。

  • 同步 SYN
  • 确认 ACK
  • 推送 PSH
  • 紧急 URG
  • 终止 FIN
  • 复位 RST

同步 SYN

在连接建立时用来同步序号。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中是 SYN = 1 和 ACK = 1。因此 SYN 置为 1 就表示这是一个连接请求或连接接受报文。

确认 ACK

仅当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

推送 PSH

当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP 就可以使用推送操作。这时,发送方 TCP 把 PSH 置 1,并立即创建一个报文段发送出去。接收方 TCP 收到 PSH = 1 的报文段,就尽快地(即 “推送” 向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

紧急 URG

当 URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。

当 URG 置 1时,发送应用进程就告诉发送方的 TCP 有紧急数据要传送。于是发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面仍是普通数据。这时要与首部中紧急指针字段配合使用。

紧急指针指出本报文字段中的紧急数据的字节数(紧急数据之后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。

终止 FIN

用来释放一个连接。当 FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

复位 RST

当 RST = 1时,表明 TCP 连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。RST 也可称为 重建位 或 重置位。

选项

  • 最大报文段长度 MSS
  • 窗口扩大选项
  • 时间戳选项
  • 选择确认(SACK)

最大报文段长度 MSS

为什么要规定一个最大报文段长度 MSS 呢?实际上,MSS与接收窗口值没有关系。若选择较小的 MSS 长度,网络的利用率就降低。但反过来,若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的 TCP 报文段。当传输出错时还要进行重传。这些也都会时开销增大。

因此,MSS 应尽可能大些,只要在 IP 层传输时不需要再分片就行。由于 IP 数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要分片的 MSS,如果改走另一条路径就可能需要进行分片。因此最佳 MSS 是很难确定的。在连接建立的过程中,双方都把自己能够支持的 MSS 写入这一字段,以后就按照这个数值传送数据,两个传送方向可以有不同的 MSS 值。若主机未填写这一项,则 MSS 的默认值是 536 字节长。因此,所有在互联网上的主机都应能接受的报文段长度是 536 + 20(固定首部)= 556 字节。

窗口扩大选项

窗口扩大选项是为了扩大窗口。窗口扩大选项占 3 字节,其中有一个字节表示 移位值 S。新是窗口值等于 TCP 首部中的窗口位数从 16 增大到 (16 + S)。移位值允许使用的最大值是 14。

窗口扩大选项可以在双方初始建立 TCP 连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其端口时,可发送 S= 0 的选项,使窗口大小回到 16。

时间戳选项

时间戳选项占 10 字节,其中最主要的字段是 时间戳值字段(4 字节)和 时间戳回送回答字段(4 字节)。时间戳选项有以下两个功能:

  • 用来计算往返时间 RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出 RTT 来。
  • 用于处理 TCP 序号超过 2^32 的情况,这又称为防止序号绕回 PAWS。TCP 报文段的序号只有 32 位,而每增加 2^32 个序号就会重复使用原来用过的序号。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以在报文段中加上这种时间戳。

选择确认(SACK)

若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?答案是可以的。选择确认就是一种可行的处理方法。

然而,SACK 文档并没有指明发送方应当怎样响应 SACK。因此大多数的实现还是重传所有未被确认的数据块。

你可能感兴趣的:(计算机网络,网络)