📜  TCP 标头中的选项字段

📅  最后修改于: 2022-05-13 01:56:17.759000             🧑  作者: Mango

TCP 标头中的选项字段

TCP 用户之间通过发送数据包进行通信。数据包包含有关源和目标以及其他 TCP 变量的数据和其他信息。这些详细信息存储在作为数据包顶部的 TCP 标头中。当一个数据包通过不同的网络设备传输时,每次都会对报头进行处理,然后进一步转发数据包。数据包在传输过程中不会更改数据,但某些细节可能会通过 NAT 设备在标头中更改,例如 IP 地址和端口号。

TCP 标头

TCP 标头

在标题之后,有一个选项字段。选项字段的最大大小为 40 字节。它的大小是可变的;不断改变数据包。

选项字段的重要性:

最初开发 TCP 时,互联网、内存和技术并不那么先进和便宜。当时,基本标头足以在两个计算机节点之间进行成功通信。但是随着互联网变得流行,旧的 TCP 开始变得过时,并且需要更改标头以适应互联网和内存中的可用更改。但是一旦 TCP 在全球如此流行,几乎不可能在其中引入新的更改并将其部署在每台设备上。那么 TCP 和 Internet 是如何提供解决方案的呢?

他们将选项字段留在主标题下方的数据包中。当时选项字段的使用非常有限,但现在每个新的更改或优化都是使用此选项字段实现的。截至今天,使用 TCP 标头中的此选项字段实现了大约35 种优化。由于 kind 变量的大小为 1 字节,因此它可以表示 256 个数字。除了 35 种优化,其他值被保留。该字段是可选的,因为它用于非常特殊的场合,并不是在每个数据包中都使用。许多优化使用SYN数据包中的选项字段,而其他优化在网络拥塞时使用它。

各种选项:

最大段大小 (MSS):

Kind = 2
Length = 4
MSS

客户端告诉它可以从服务器接受的数据包大小。当客户端与服务器建立连接时,该选项字段在 SYN 数据包中使用。

“Kind=2”占用 1 个字节空间,“length=4”占用 1 个字节空间,“MSS”占用 2 个字节空间。因此,MSS 选项消耗的总空间(长度 = 4)为 4 个字节。

最大段大小 (MSS)

最大段大小 (MSS)

窗口缩放:

Kind = 3
Length = 3
Window Scaling: shift.cnt

“窗口大小”字段为 16 位长,可以表示最大值 2 16 =65,536。客户端可以使用 TCP 标头中的“窗口大小”字段来通告其最大 64KB 的缓冲区。使用窗口缩放选项,客户端可以告诉服务器它的缩放因子,这使发送者能够通告其缓冲区大小高达 2 30 =1 GB。 shift.cnt 采用 0-14 之间的值。因此,16+14=30 是可用于通告缓冲区大小的最大位数。

窗口缩放

窗口缩放

选择性确认:

Kind=4
Length=2
SACK Permitted

Kind=5
Length= 8n
SACK

SACK 通知发送方多个数据包丢失,以便发送方尽快恢复丢失。在 SYN 数据包中,发送者通过使用“Sack allowed”选项告诉服务器它支持 SACK 选项。

当接收方的数据包交付无序时,接收方会发送 SACK 选项来告知丢失的数据包。一个 SACK 块占用 8 个字节,所以 sack 的大小是 8 个字节的倍数。

选择性确认

选择性确认

时间戳

Kind=8
Length=10
Timestamps

Kind 和 Length 变量各占 1 个字节。时间戳有两部分:发送时间和接收时间,每部分占用4个字节。因此,该选项字段总共占用 10 个字节。

时间戳的使用有:RTTM(往返时间测量)、PAWS(防止包装序列号)

时间戳

时间戳

TCP 快速打开:

Kind=34
Length=18
TCP Fast Open Cookie

客户端首先在 SYN 数据包中告诉服务器它支持 TCP FastOpen。然后服务器在 SYN+ACK 数据包中发送加密的 cookie。 kind 和 length 变量一起占用 2 个字节。 cookie 大小为 16 字节。因此,此选项总共消耗 18 个字节。

每次客户端请求服务器建立连接时,TFO 避免了 3 次握手。使用 TFO 客户端可以直接向服务器发送 GET 请求。

TCP 快速打开

TCP 快速打开

否:

Kind=1

此选项字段用于两个选项之间。此选项告诉选项字段/块中下一个选项字段的开始。这可能会或可能不会被发送者使用,因此接收者必须准备好处理带有或不带有此 NOP 的选项。它只消耗 1 个字节的空间,并且与其他选项不同,它没有长度或重要信息。

无

选项列表的结尾:

Kind=0

此选项用于选项列表的末尾。 kind 值为 0,但它用于所有选项的末尾。必须注意的是,它仅在列出标头中的所有选项后才使用一次,不像 NOP,它不会出现在每个选项之后。如果标头字段被完全填满并占用了最大可能的可用空间,则此选项不是强制性的。如果标题中仍有一些可用空间,则显式插入此选项,但发件人突出显示选项列表的末尾。

选项列表结束

选项列表结束

请注意,MSS、Window Scaling 和 TCP FastOpen 仅用于 SYN 数据包。之后,它们就再也不用了。其余选项(在本文中讨论)可以根据使用要求在通信期间发送的任何数据包中使用。