TCP 快速开放
使用 TCP 快速开放更高效地交换数据
TCP 快速开放 (TFO) 是对 TCP 的更新,在 TCP 会话期间,通过标准的三向连接握手,最多可节省一次完整的往返时间 (RTT)。MS-MPC 和 MS-MIC 支持 TFO。
标准的三向连接握手涉及两台主机之间的三组发送和接收消息,以及以下 SYN(同步)和 ACK(确认)数据包交换:
主机 A 向主机 B 发送 TCP SYN 数据包,主机 B 接收该数据包。
主机 B 向主机 A 发送 SYN-ACK 数据包,主机 A 接收该数据包。
主机A向主机B发送ACK数据包,主机B接收。
在标准 TCP 中,虽然可以在 SYN 数据包中传输数据,但在完成三次握手之前无法传输这些数据。TFO 消除了这一约束,并允许将 SYN 数据包中的数据传送到应用,从而显著改善延迟。
TFO 的关键组件是快速打开 Cookie (cookie),它是服务器生成的消息认证代码 (MAC) 标签。客户端在一个常规 TCP 连接中请求 cookie,然后将其用于将来的 TCP 连接,以便在握手期间交换数据。
TFO 选项用于请求或发送 TFO cookie。当 cookie 不存在或为空时,客户端使用该选项向服务器请求 cookie。当 cookie 存在时,该选项用于将 cookie 从服务器传递到客户端或从客户端传递回服务器。
以下列表概述了客户端如何请求 TFO Cookie:
客户端发送一个带有 TFO 选项的 SYN,该选项的 cookie 字段为空。
服务器生成一个 cookie 并通过 SYN-ACK 数据包的 TFO 选项发送它。
客户端缓存 cookie 以供将来的 TFO 连接使用。
此后,两台设备执行 TFO 交换:
客户端在 TFO 选项中发送包含数据和 cookie 的 SYN。
服务器验证 cookie:
如果 cookie 有效,服务器会发送一个 SYN-ACK,确认 SYN 和数据。
然后,服务器将数据传递到应用程序。
否则,服务器将丢弃数据并发送仅确认 SYN 序列号的 SYN-ACK。
其余连接像正常的 TCP 连接一样进行。客户端在获取 cookie 后可以重复许多 TFO作(直到 cookie 被服务器过期)。因此,TFO 对于同一客户端多次重新连接到同一服务器并交换数据的应用程序很有用。
也可以看看
配置 TFO
本主题介绍了TCP快速开放(TFO)的三种模式并给出了示例。还涵盖了将 NAT 与 TFO 一起使用的情况。
TFO 的三种模式
使用 TFO 无需任何配置。默认情况下启用 TFO。在默认模式下,所有 TFO 数据包均由服务 PIC 转发。除默认模式外,您还可以通过 CLI 配置另外两种 TFO 模式:
丢弃 TFO — 如果设置此模式,则不会转发任何 TFO 数据包。
禁用 TFO—如果设置此模式,则在转发之前,任何携带 TFO、数据或 TFO 的 SYN 或 SYN ACK 数据包都将被剥离 TFO 和数据。
TFO 选项按服务集启用。服务集可以是下一跃点服务集,也可以是接口样式的服务集。以下是接口样式服务集配置示例:
[edit]
services {
service-set ss2 {
stateful-firewall-rules sfw_rule;
interface-service {
service-interface ms-2/3/0;
}
}
stateful-firewall {
rule sfw_rule {
match-direction input-output;
term 0 {
from {
source-address {
any-ipv4;
}
destination-address {
any-ipv4;
}
then {
accept;
}
}
}
}
}
}
在这种情况下,默认启用 TFO(无 TFO 配置)。命令 show services service-sets statistics tcp 的输出如下:
user@host> show services service-sets statistics tcp
Interface: ms-2/3/0
Service set: ss2
TCP open/close statistics:
TCP first packet non-syn: 0
TCP first packet reset: 0
TCP first packet FIN: 0
TCP non syn discard: 0
TCP extension alloc fail: 0
TFO SYN with cookie request: 1
TFO SYN with cookie: 0
TFO SYN ACK with cookie: 0
TFO packets forwarded: 0
TFO packets dropped: 1
TFO packets stripped: 0
如果丢弃启用了 TFO 的数据包,则会得到以下配置和输出:
[edit]
services {
service-set ss2 {
service-set-options {
tcp-fast-open drop;
}
stateful-firewall-rules sfw_rule;
interface-service {
service-interface ms-2/3/0;
}
}
}
user@host> show services service-sets statistics tcp
Interface: ms-2/3/0
Service set: ss2
TCP open/close statistics:
TCP first packet non-syn: 0
TCP first packet reset: 0
TCP first packet FIN: 0
TCP non syn discard: 0
TCP extension alloc fail: 0
TFO SYN with cookie request: 1
TFO SYN with cookie: 0
TFO SYN ACK with cookie: 0
TFO packets forwarded: 0
TFO packets dropped: 1
TFO packets stripped: 0
如果去除 TFO 选项,则配置和输出会相应更改:
[edit]
services {
service-set ss2 {
service-set-options {
tcp-fast-open disabled;
}
stateful-firewall-rules sfw_rule;
interface-service {
service-interface ms-2/3/0;
}
}
}
user@host> show services service-sets statistics tcp
Interface: ms-2/3/0
Service set: ss2
TCP open/close statistics:
TCP first packet non-syn: 0
TCP first packet reset: 0
TCP first packet FIN: 0
TCP non syn discard: 0
TCP extension alloc fail: 0
TFO SYN with cookie request: 1
TFO SYN with cookie: 0
TFO SYN ACK with cookie: 0
TFO packets forwarded: 0
TFO packets dropped: 0
TFO packets stripped: 1
使用 NAT 和 TFO
如果在服务集中配置了 NAT,并且您使用的是 TFO,则应配置地址池配对 (APP)。APP 允许将私有 IP 地址映射到其所有会话的 NAT 池中的同一公共 IP 地址。
如果未配置 APP,则 NAT 可以从与之前发送到服务器的 NAT 池中的 NAT 池向客户端提供不同的 IP 地址。服务器无法识别 IP 地址,丢弃 TFO 选项,并回复 SYN ACK,客户端发送的数据不被确认。因此,即使连接成功且没有丢包,TFO 的优势也会丧失。但是,如果客户端返回相同的 IP 地址,服务器会识别它并确认数据。因此,始终使用 TFO 启用具有高映射超时值的 APP。
要配置 APP:
为 MS-DPC 和 MS-PIC 服务接口配置分片控制
有两个配置选项可用于防止处理大量分段数据包导致服务 PIC 上的计算 CPU 周期过度消耗。这种片段处理可以在 DOS 攻击中被利用。该 fragment-limit 选项可为数据包设置最大分段数。超过此数字时,数据包将被丢弃。指定 reassembly-timeout 从收到数据包中的第一个和最后一个分片到的最长时间。超过该数字时,数据包将被丢弃。
要为 MS-DPC 和 MS-PIC 服务接口配置分段控制:
追踪服务 PIC作
跟踪作跟踪所有自适应服务作,并将其记录在日志文件中。记录的错误描述提供了详细信息,可帮助您更快地解决问题。
默认情况下,不会跟踪任何事件。如果在 or [edit services logging] 层次结构级别包含[edit services adaptive-services-pics]该traceoptions语句,则默认跟踪行为如下:
重要事件记录在位于 /var/log 目录中的名为
serviced的文件中。当 服务的文件 达到 128 KB 时,将其重命名为 serviced.0,然后重命名为 serviced.2,依此类推,直到出现三个跟踪文件。然后,最旧的跟踪文件 (serviced.2) 将被覆盖。(有关如何创建日志文件的详细信息,请参阅 系统日志资源管理器。
日志文件只能由配置跟踪作的用户访问。
无法更改跟踪文件所在的目录 (/var/log)。但是,您可以通过包含以下语句来自定义其他跟踪文件设置:
file filename <files number> <match regular-expression> <size size> <world-readable | no-world-readable>;
flag {
all;
command-queued;
config;
handshake;
init;
interfaces;
mib;
removed-client;
show;
}
在 或 [edit services logging traceoptions] 层次结构级别包含[edit services adaptive-services-pics traceoptions]这些语句。
以下部分中介绍了这些语句:
配置自适应服务日志文件名
默认情况下,将记录跟踪输出的文件名称提供服务。您可以通过在 或 [edit services logging traceoptions] 层次结构级别包含file[edit services adaptive-services-pics traceoptions]该语句来指定不同的名称:
file filename;
配置自适应服务日志文件的数量和大小
默认情况下,当跟踪文件的大小达到 128 KB 时,它将重命名 filename为 .0,然后 filename是 .1,依此类推,直到有三个跟踪文件。然后,将覆盖最旧的跟踪文件 (filename.2)。
您可以通过在 [edit services adaptive-services-pics traceoptions] 或 [edit services logging traceoptions] 层次结构级别包含以下语句来配置对跟踪文件数量和大小的限制:
file <filename> files number size size;
例如,将最大文件大小设置为 2 MB,将最大文件数设置为 20。当接收跟踪作filename()输出的文件达到2MB时, filename 重命名 filename为.0,并创建一个名为 filename 的新文件。当新 filename 值达到 2 MB 时, filename.0 将重命名 filename为 .1 并 filename 重命名 filename为 .0。重复此过程,直到有 20 个跟踪文件。然后,最旧的文件 (filename.19) 被最新的文件 (filename.0) 覆盖。
文件数量可以从 2 到 1000 个文件不等。每个文件的文件大小可以从 10 KB 到 1 GB 不等。
配置对日志文件的访问
默认情况下,只有配置跟踪作的用户才能访问日志文件。
要指定任何用户都可以读取所有日志文件,请在 或 [edit services logging traceoptions] 层次结构级别包含[edit services adaptive-services-pics traceoptions]该file world-readable语句:
file <filename> world-readable;
要显式设置默认行为,请在 or [edit services logging traceoptions] 层次结构级别包含file no-world-readable[edit services adaptive-services-pics traceoptions]该语句:
file <filename> no-world-readable;
为要记录的行配置正则表达式
默认情况下,跟踪作输出包括与记录事件相关的所有行。
您可以通过在 or [edit services logging traceoptions] 层次结构级别包含match[edit services adaptive-services-pics traceoptions file filename]语句并指定要匹配的正则表达式 (regex) 来优化输出:
file <filename> match regular-expression;
配置追踪作
默认情况下,如果配置存在,则 traceoptions 仅记录重要事件。您可以通过在 [edit services adaptive-services-pics traceoptions] 或 [edit services logging traceoptions] 层次结构级别包含以下语句来配置要记录的跟踪作:
flag {
all;
configuration;
routing-protocol;
routing-socket;
snmp;
}
表 1 描述了自适应服务跟踪标志的含义。
标志 |
描述 |
默认设置 |
|---|---|---|
|
跟踪所有作。 |
关闭 |
|
跟踪命令入队事件。 |
关闭 |
|
在层次结构级别读取 |
关闭 |
|
跟踪握手事件。 |
关闭 |
|
跟踪初始化事件。 |
关闭 |
|
跟踪接口事件。 |
关闭 |
|
跟踪 GGSN SNMP MIB 事件。 |
关闭 |
|
跟踪客户端清理事件。 |
关闭 |
|
跟踪 CLI 命令服务。 |
关闭 |
要显示日志的末尾,请发出 show log serviced | last 作模式命令:
[edit] user@host# run show log serviced | last