Windows TCP 功能的说明

本文介绍 Windows 2000 和 Windows Server 2003 中的 TCP 功能。

原始产品版本:   Windows 10 –所有版本,Windows Server 2012 R2
原始 KB 数:   224829

摘要

本文介绍了 Microsoft Windows 2000 和 Microsoft Windows Server 2003 中的以下 TCP 功能:

  • TCP 窗口大小
  • 现在支持 TCP 选项
  • Windows 扩展-RFC 1323
  • 时间戳-RFC 1323
  • 针对已包装的序列号 (PAWS) 的保护
  • 选择性确认 (SACKS) -RFC 2018
  • TCP 重新传输行为和快速重新传输

可以通过更改注册表中的条目来更改 TCP 功能。

更多信息

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
322756 如何在 Windows 中备份和还原注册表

TCP 窗口大小

TCP 接收窗口大小是连接期间可以缓冲) 的接收数据量 (以字节为单位)。 发送主机在必须等待接收主机的确认和窗口更新之前,只能发送该数量的数据。 Windows TCP/IP 堆栈设计为在大多数环境中自行调整,并使用比早期版本更大的默认窗口大小。

而不是使用硬编码的默认接收窗口大小,而是TCP 调整为在 (MSS) 的最大段大小的偶数增量,这是在连接设置过程中协商的。 将 "接收" 窗口调整为甚至 MSS 的增量增加了在批量数据传输过程中使用的完整大小的 TCP 段的百分比。

接收窗口大小是按以下方式确定的:

  1. 发送到远程主机的第一个连接请求公布的接收窗口大小为 16K (16384 字节) 。
  2. 建立连接后,会将接收窗口的大小向上舍入到 MSS 的偶数增量。
  3. 窗口大小被调整为 MSS 的四倍,最大为 64 K,除非使用的是 (RFC 1323) 中的窗口缩放选项。

备注

请参阅 "Windows 缩放比例" 部分。

对于以太网连接,窗口大小通常设置为17520个字节 (16K 向上舍入到 12 1460 个字节的分段) 。 当建立与支持扩展 TCP 头选项的计算机(如选择性确认 (SACKS) 和时间戳)建立连接时,窗口大小可能会降低。 这两个选项将 TCP 标头大小增加到20个字节以上,从而导致数据空间减少。

在以前版本的 Windows NT 中,以太网连接的窗口大小为8760字节或 6 1460 字节的段。

若要将接收窗口大小设置为特定值,请将 TcpWindowSize 值添加到特定于您的 Windows 版本的注册表子项中。 为此,请按照下列步骤操作:

  1. 单击 " 开始",再单击 " 运行",键入 Regedit,然后单击 "确定"

  2. 展开特定于您的 Windows 版本的注册表子项:

    • 对于 Windows 2000,请展开以下子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • 对于 Windows Server 2003,请展开以下子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. 在“编辑”**** 菜单上,指向“新建”,然后单击“DWORD 值”

  4. 在 " 新值 " 框中键入 TcpWindowSize,然后按 enter

  5. 在 "编辑" 菜单上单击 "修改"。

  6. 在 " 数值数据 " 框中键入所需的窗口大小。

    备注

    窗口大小的有效范围为 0-0x3FFFC000 十六进制。

默认情况下不存在此值。 当您添加 TcpWindowSize 值时,它将覆盖上面讨论的默认窗口大小算法。

备注

也可以将 TcpWindowSize 添加到 Parameters 键,以设置所有接口的全局窗口大小。

现在支持 TCP 选项

过去,TCP 选项主要用于协商最大的分段大小。 在 Windows 中,TCP 选项用于窗口缩放、时间戳和选择性 ACK。

有两种类型的 TCP 选项:

  1. 一个八进制 TCP 选项,用于指示特定的选项类型。
  2. 多个八进制 TCP 选项,其中包含选项类型、选项长度和一系列选项八进制数。

下面的列表显示了每个 TCP 选项种类、长度、名称和说明。

类型:0
Length:1
选项:选项列表的结尾
说明:当最后一个 TCP 选项需要填充时,使用此方法。

类型:1
Length:1
选项:无操作
说明:在需要填充时使用此选项,在同一数据包中遵循更多 TCP 选项。

种类:2
长度:4
选项:最大线段大小
说明:这表示可通过网络发送的 TCP 段的最大大小。

种类:3
长度:3
选项:窗口缩放选项
说明:标识在使用大于64k 的窗口大小时要使用的比例因子。

种类:8
长度:10
选项:时间戳选项
描述:用于帮助计算传输的数据包 (RTT) 的往返行程时间。

类型:4
Length:2
选项:允许 TCP SACK
说明:通知其他主机允许有选择性的 Ack。

类型:5
Length:不同
选项: TCP SACK 选项
描述:由主机用来确定是否已收到未通过订单的数据包。

Windows 缩放

为了更高效地使用高带宽网络,可以使用更大的 TCP 窗口大小。 TCP 窗口大小字段控制数据流,并且限制为2个字节或窗口大小为65535字节。

由于无法展开 size 字段,因此使用比例因子。 TCP 窗口比例是用于将最大窗口大小从65535个字节增加到 1 Gb 的选项。

窗口缩放选项仅在 TCP 3 路握手过程中使用。 窗口缩放值代表要左移的16位窗口大小字段的位数。 窗口比例值可以设置为 0 (无 shift) 设置为14。

若要计算真正的窗口大小,请将窗口大小乘以 2 ^ S,其中 S 是缩放值。

例如:

如果窗口大小为65535字节,窗口比例因子为3。
True 窗口大小 = 65535 * 2 ^ 3
True 窗口大小 = 524280

下面的网络监视器跟踪显示了如何使用窗口缩放选项:

TCP: ...。S.,len:0,seq: 725163-725163,ack:0,win:65535,src: 1217 dst: 139 (NBT 会话)
TCP:源端口 = 0x04C1
TCP:目标端口 = NETBIOS 会话服务
TCP: Sequence Number = 725163 (0xB10AB)
TCP:确认号码 = 0 (0x0)
TCP:数据偏移 = 44 (0x2C)
TCP: Reserved = 0 (0x0000)

  • TCP: Flags = 0x02: ...。今天.
    TCP: Window = 65535 (0xFFFF)
    TCP: Checksum = 0x8565
    TCP:紧急指针 = 0 (0x0)
    TCP: Options
  • TCP:最大段大小选项
    TCP: Option Nop = 1 (0x1)
    TCP:窗口缩放选项
    TCP:选项类型 = 窗口比例
    TCP:选项长度 = 3 (0x3)
    TCP:窗口比例 = 3 (0x3)
    TCP: Option Nop = 1 (0x1)
    TCP: Option Nop = 1 (0x1)
  • TCP:时间戳选项
    TCP: Option Nop = 1 (0x1)
    TCP: Option Nop = 1 (0x1)
  • TCP: SACK 允许选项

请务必注意,在实际的三向握手中使用的窗口大小不是缩放的窗口大小。 这是根据 RFC 1323 第2.2 节,"SYN (中的 Window 字段例如,[SYN] 或 [SYN,ACK] ) 段本身永远不会进行缩放。"

这意味着,在三向握手之后发送的第一个数据包是实际的窗口大小。 如果有比例因子,则始终使用65535字节的初始窗口大小。 然后,将窗口大小乘以三向握手中标识的比例因子。 下表表示各种窗口大小的缩放因子边界。

比例因子 缩放值 初始窗口 缩放窗口
0 1 65535或更低 65535或更低
1 双面 65535 131070
双面 4 65535 262140
第三章 8 65535 524280
4 16 65535 1048560
5 32 65535 2097120
6 64 65535 4194240
7 128 65535 8388480
8 256 65535 16776960
9 512 65535 33553920
10 1024 65535 67107840
11x17 2048 65535 134215680
12 4096 65535 268431360
13 8192 65535 536862720
14 16384 65535 1073725440

例如:

如果注册表中的窗口大小以 269000000 (269M) 以十进制为单位,则在3路握手期间的比例因子为13,因为只有12个值的比例因子允许最大为268431360字节 (268M) 。

此示例中的初始窗口大小将计算如下:65535字节,窗口比例因子为13。 真正的窗口大小 = 65535 * 2 ^ 13 True 窗口大小 = 536862720 当窗口大小的值添加到注册表中,并且其大小大于默认值时,Windows 将尝试使用适应新窗口大小的缩放值。

可以将以下注册表项中的 Tcp1323Opts 值添加到控件缩放窗口和时间戳:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. 在工具栏上,单击 "开始",再单击 "运行",然后键入 Regedit 以启动注册表编辑器。
  2. 在注册表编辑器中,单击 "编辑",指向 "新建",然后单击 "DWORD 值"。
  3. 在 "新值" 框中,键入 Tcp1323Opts,再按 ENTER,然后在 "编辑" 菜单上,单击 "修改"。

    备注

    有效范围为0、1、2或3,其中:
    0 (禁用 RFC 1323 选项)
    1仅启用 (窗口比例)
    2仅启用 (时间戳)
    3 (启用这两个选项)

此注册表项控制 RFC 1323 时间戳和窗口缩放选项。 默认情况下会启用时间戳和窗口缩放,但可以使用标志位进行操作。 Bit 0 控件窗口缩放,而 bit 1 控件的时间戳。

以前,TCP/IP 堆栈对每个发送的数据时段使用一个样本,以计算 RTT) (往返时间。 在发送数据包时设置了 (重新传输计时器) 的计时器,直到收到确认。 例如,如果窗口大小为64240个字节 (44 完整网段) 在以太网网络上,则仅使用每个44数据包中的一个来重新计算往返时间。 如果窗口大小的最大值为65535个字节,则此采样率就足够了。 使用窗口缩放,最大窗口大小为 1 Gb,这种 RTT 采样率不够。

TCP 时间戳选项现在可设置为用于 (数据和 ACK) 认为适合的数据段,以执行 RTT 计算、PAWS 检查等操作。 使用此数据,可以使用较大的窗口大小准确计算 RTT。 RTT 用于计算重新传输间隔。 为了获得最佳吞吐量,需要准确的 RTT 和重新传输超时。

当 tcp 会话中使用 TCP 时间戳时,会话的原始发件人会在其 TCP 三路握手的第一个数据包中发送选项, (SYN 数据包) 。 在会话期间,任何一方都可以使用 TCP 选项。

TCP 时间戳选项 (TSopt) :

种类 = 8 长度 = 10 TS 值 (Tsval) TS 回显回复 (Tsecr)
1 个字节 1 个字节 4 字节 4 字节

可以通过展开 "TCP 选项" 字段在网络监视器跟踪中查看 "时间戳" 选项字段,如下所示: TCP:时间戳选项 TCP:选项类型 = 时间戳 TCP:选项长度 = 10 (0xA) TCP: Timestamp = 2525186 (0x268802) TCP: Reply Timestamp = 1823192 (0x1BD1D8)

针对已包装的序列号 (PAWS) 的保护

TCP 序列号字段限制为32位,这将限制可用的序列号数。 在高容量网络和大型数据传输中,可以在数据包遍历网络之前包装序列号。 如果在一个 Giga 上的每秒发送数据 (Gbps) 网络中,序列号可能只会在34秒内换行。 如果数据包延迟,则可能存在具有相同序列号的不同数据包。 为了避免在重复序列号发生时出现混淆,请将 TCP 时间戳用作序列号的扩展。 数据包具有当前时间戳和进度戳。 旧数据包具有较旧的时间戳,并将被丢弃。

选择性确认 (SACKs)

Windows 引入了对称为 "选择性确认" 或 "SACK" 的性能功能的支持。 对于使用较大 TCP 窗口大小的连接,SACK 尤其重要。 在 SACK 之前,接收器只能确认已接收的连续数据流的最新序列号,或接收窗口的 "左边缘"。 启用 SACK 后,接收器会继续使用 ACK 号码来确认接收窗口的左边缘,但它还可以单独确认其他接收的数据块。 SACK 使用 TCP 标头选项,如下所示。

SACK 使用两种类型的 TCP 选项。

TCP Sack-Permitted 选项仅在 TCP 连接) 建立过程中的 SYN 数据包 (中使用,以指示它可以执行选择性 ACK。

第二个 TCP 选项(TCP Sack 选项)包含对一个或多个数据块的确认。 数据块使用数据块的开头和结尾的序列号进行标识。 这也称为数据块的左侧和右侧边缘。

类型4是 TCP Sack-Permitted 选项,类型5是 TCP Sack 选项。 Length 是此 TCP 选项的长度(以字节为单位)。

允许的 Tcp Sack:

种类 = 4 长度 = 2
1 个字节 1 个字节

Tcp SACK 选项:

类型 = 5 Length = 变量
1 个字节 第一个块的左边缘到第一个块的右边缘
...
第 n 个块到第 n 个块的右边缘的左边缘

启用 SACK (默认) 后,可以删除一个数据包或一系列数据包,而收件人会通知发件人哪些数据已收到,以及数据中可能有 "洞" 的地方。 然后,发件人可以选择性地重新传输丢失的数据,而无需重新传输已成功接收的数据块。 SACK 由 SackOpts 注册表参数控制。

可以编辑以下注册表项中的 SackOpts 值,以控制选择性确认的使用:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. 在工具栏上,单击 "开始",再单击 "运行",然后键入 Regedit 以启动注册表编辑器。
  2. 在注册表编辑器中找到并单击上面的键,然后单击 "编辑" 菜单上的 "修改"。
  3. 在 "数值数据" 框中键入所需的值。

备注

有效的二进制值为0或1,默认值为1。 此参数控制是否启用选择性 ACK (SACK-RFC 2018) 支持。

下面的网络监视器跟踪说明主机确认所有数据的序列号为54857341,再加上序列号54858789-54861685 中的数据。 缺少的数据是从54857341到54858788。

TCP: ...,len:0,seq: 925104-925104,ack:54857341,win:32722,src: 1242 dst:139
TCP:源端口 = 0x04DA
TCP:目标端口 = NETBIOS 会话服务
TCP: Sequence Number = 925104 (0xE1DB0)
TCP:确认号码 = 54857341 (0x3450E7D)
TCP:数据偏移 = 44 (0x2C)
TCP: Reserved = 0 (0x0000)

  • TCP: Flags = 0x10: ...。
    TCP: Window = 32722 (0x7FD2)
    TCP: Checksum = 0x4A72
    TCP:紧急指针 = 0 (0x0)
    TCP: Options
    TCP: Option Nop = 1 (0x1)
    TCP: Option Nop = 1 (0x1)
  • TCP:时间戳选项
    TCP: Option Nop = 1 (0x1)
    TCP: Option Nop = 1 (0x1)
    TCP: SACK 选项
    TCP:选项类型 = 0x05
    TCP:选项长度 = 10 (0xA)
    TCP: Block 的左边缘 = 54858789 (0x3451425)
    TCP: Block 的右边缘 = 54861685 (0x3451F75)

TCP 重新传输行为和快速重新传输

TCP 重新传输

作为对正常重新传输行为的审阅,TCP 会在每个出站段向下传递到 Internet 协议 (IP) 时启动一个重新传输计时器。 如果在计时器过期之前没有收到对给定段中数据的确认,则重新传输该分段。

重新传输超时 (RTO) 会连续调整,以与使用 RFC 793 中所述 (SRTT) 计算的连接的特征相匹配。 在每次重新传输段后,给定段的计时器加倍。 在使用此算法时,TCP 会自动调整为连接的正常延迟。

快速重新传输

在某些情况下,重新传输计时器过期之前的 TCP 重新传输数据。 由于称为快速重传的功能,最常见的原因是。 如果支持快速重新传输的接收器收到的数据的序列号超出了当前预期的范围,则很可能删除了某些数据。 为了帮助通知发件人此事件,接收方将立即发送 ACK,ACK 号码设置为其预期的序列号。 对于到达的其他每个 TCP 段,它将继续执行此操作。 当发件人开始接收确认相同序列号的确认流时,可能会丢弃某个分段。 发件人将立即重新发送接收器预期的段,而无需等待重新传输计时器过期。 此优化大大提高了频繁丢弃数据包时的性能。

默认情况下,如果某个网段接收到同一序号的三个 Ack, (一个 ACK 和两个重复) ,并且该序列号滞后于当前的号码,则 Windows 将重新发送该分段。 这是通过 TcpMaxDupAcks 注册表参数控制的。

可以编辑以下注册表项中的 TcpMaxDupAcks 值,以控制启动快速重新传输所需的 Ack 数:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. 在工具栏上,单击 "开始",再单击 "运行",然后键入 Regedit 以启动注册表编辑器。
  2. 在注册表编辑器中找到并单击上面的键,然后单击 "编辑" 菜单上的 "修改"。
  3. 在 "数值数据" 框中键入所需的值。

备注

有效范围为1-3,默认值为2。

此参数确定在触发了在传输过程中,在触发 "快速重新传输" 之前发送的数据的相同序列号必须接收的重复确认次数。