介绍
本文档提供了用于调整 ASR9000 路由器上的 TCP Maximim Segmet Size (MSS) 的示例配置。
当网络运营商希望确保穿越网络的 TCP 数据包不会超过预定大小时,需要进行 TCP MSS 调整,从而防止 TCP 数据包在 MTU 较小的链路上产生不必要的碎片。通常这可能发生在 MTU 为 1500 字节的链路上,此时原始 IP/TCP 数据包被封装到 PPPoE、GRE 或任何其他封装中。
TCP MSS 大小的这种修改不会对 TCP 会话吞吐量造成任何可观察到的影响,因为 TCP 会话的吞吐量主要由 TCP 窗口大小决定。
TCP 基础知识
当 TCP 会话建立时,它们会发送 2 个决定会话传输速度的关键参数。即 MSS、TCP 数据包的最大大小和窗口大小。在 TCP 传输中,在其基本操作中是要被确认的。因此数据包传输,接收 ACK 并发送下一个数据包。这非常慢,尤其是在端到端的高延迟上。窗口化允许发送多个数据包并在该窗口上使用单个 ACK。如果该窗口的一个数据包丢失,则将重新传输整个窗口。窗口大小越大,吞吐量越好,但在不可靠的链路上,如果必须重新传输大的窗口,这可能会产生不利影响。此外,大窗口在接收端需要更大的接收缓冲区。
因此数据包的大小由 MSS 决定。在每个数据包上没有直接 ACK 的情况下发送的该大小的数据包数量是窗口大小。
MSS 调整有什么作用?
MSS 是 TCP 客户端向服务器发送信号的值,指示它可以接收的数据包的最大大小。通常,此值是从客户端的本地 MTU 大小减去 40 字节得出的。这 40 个由 20 个字节的 ip 标头和 20 个字节的 tcp 标头组成。
段大小是指实际承载的 TCP 有效负载。
如果网络中存在 mtu 变化,例如使用 PPPoE 很容易看到,它增加了 8 个字节的额外标头,它可能导致本地 MTU 为 1500 的客户端,发信号通知 TCP MSS为 1460,但实际上需要传输线上 1508 字节(1460 + 20 ip + 20 tcp + 8 pppoe)。这将导致路径闪某些Hop(设备)进行分片。
TCP MSS 调整功能拦截 TCP 同步数据包并扫描 tcp 标头之后的第一个选项。如果该选项是MSS大小,它可以将值重新调整为配置的所需值,并随之更新校验和。
示例场景:
先决条件
基本了解ASR9000架构和IOS-XR操作系统。
限制
- Typhoon 和 Tomahawk 线卡世代支持该功能。
- BNG(Broadband Network Gateway )用户接口、L3 dot1q 子接口和 GRE 隧道支持该功能。(您不能在主接口上配置 ipv4 mss enable)。
- TCP MSS 调整支持的大小范围为 1280 到 1535 字节。
- UDP 数据包显然不受 MSS 重写,只有 TCP SYN 数据包被拦截和重写。
配置
在 ASR9000 上实施 TCP MSS 调整取决于两个因素:
- 应用于接口时对性能的影响最小
- 性能不会随部署规模而变化(即应用该功能的接口数量)
为了满足这些要求,选择的实现需要两个配置步骤:
- 在网络处理器 (NP) 级别指定 TCP MSS 大小。
- 指定应应用配置的 TCP MSS 大小的接口
这种方法的一个结果是给定 NP 上的所有接口必须使用相同的值进行 TCP MSS 调整。
在接口上启用时,TCP MSS 功能在两个方向都适用。即调整应用于入口和出口数据包。即使只配置了其中一个,特性也适用于 IPv4 和 IPv6。
要确定哪个 NP 控制有问题的接口,请使用show controllers np ports exec 命令。
特定于 BNG
对于首先支持 mss-adjust 功能的 BNG,可以使用不同的配置:
subscriber
pta tcp mss-adjust 1410
!
BNG 命令的取值范围是 1280-1536。这样做的原因是,如您所见,我们仅针对高位字节进行调整以节省 ucode 变量中的一些空间。
识别碎片
可以通过查看 NP 计数器来识别碎片。
请注意,对于 BNG 和非 BNG,命令和计数器是不同的。
原因是分片是由 NETIO (Network Input/Output)为常规 L3 接口处理的。但是 BNG subscriber接口不向 NETIO 注册。这样做是出于可扩展性的原因,因为 BNG subs不需要 NETIO 提供的所有服务。对于BNG subscriber,设计了一个名为 SINT(订阅者接口,subscriber interface)的“轻量级”NETIO,它提供一些基本的 L3 服务,例如访问 TCP 堆栈、一些基本的 ICMP 支持等。
验证 BNG subscriber分片:
查看 SPP(the interupt switching path)级别的碎片。
RP/0/RSP0/CPU0:A9K-BNG#show spp node-counters | i frag
Sun Mar 8 11:08:17.501 EST
ipv4_frag
Drop: Dont-fragment set: 3125 <<<< packets that have DF bit set
ipv4-frag: 3854 <<<<< packets fragmented
Verifying the NP counters with show controller np counters NP<x> location 0/<y>/CPU0
16 MDF_TX_LC_CPU 11037 107 <<<<<<<<<< 100pps to the LC CPU
17 MDF_TX_WIRE 17423 201 <<<<< 200 packets to the wire (2 frags)
21 MDF_TX_FABRIC 24798 299 <<<<<<<<<<<200 pps injected from the fab
41 PARSE_INJ_RECEIVE_CNT 17079 201 <<<<<< 200pps injected
45 PARSE_ENET_RECEIVE_CNT 8969 101 <<<<received on wire from the tester
416 RSV_PUNT_IP_MTU_EXCEEDED 9615 99 <<<<<100pps requiring frag
1048 PPPOE_FRAG_NEEDED_PUNT 9615 99 <<<<<on pppoe sessions
验证常规 L3 碎片:
使用相同的命令 show controller np counters NP<x> loc 0/<y>/cpu0 可以观察到以下碎片:
16 MDF_TX_LC_CPU 718 106 << sent to the LC CPU for frag
33 PARSE_FAB_RECEIVE_CNT 681 100 << packets received from the fabric
416 RSV_PUNT_IP_MTU_EXCEEDED 677 100 << packets needing punt because of MTU
842 IPV4_FRAG_NEEDED_PUNT 677 100 << packets punted for FRAG reasons
请注意,在这两种情况下,硬件都不会评估 DF 位,这由控制代理处理,无论是用于BNG subs的 SPP 还是用于常规 L3 接口的 NETIO。
配置示例
在此示例中,TCP MSS 调整应用于接口 Bundle-Ether48.10。
第 1 步:确定要配置 TCP MSS 调整的 NP:
RP/0/RSP0/CPU0:av-asr9001#sh bundle bundle-ether 48
<snip>
Port Device State Port ID B/W, kbps
-------------------- --------------- ----------- -------------- ----------
Gi0/0/1/6 Local Active 0x8000, 0x0003 1000000
Link is Active
Gi0/0/1/7 Local Active 0x8000, 0x0004 1000000
Link is Active
RP/0/RSP0/CPU0:av-asr9001#show controllers np ports all location 0/0/CPU0
Node: 0/0/CPU0:
----------------------------------------------------------------
NP Bridge Fia Ports
-- ------ --- ---------------------------------------------------
0 0 0
0 0 0 TenGigE0/0/2/0, TenGigE0/0/2/1
1 1 1 GigabitEthernet0/0/1/0 - GigabitEthernet0/0/1/19
1 1 1 TenGigE0/0/2/2, TenGigE0/0/2/3
RP/0/RSP0/CPU0:av-asr9001#
第 2 步:配置所需的 TCP MSS 值并激活接口 Bundle-Ether48.10 上的功能。
hw-module location 0/0/CPU0 tcp-mss-adjust np 1 value 1300
!
interface Bundle-Ether48.10
ipv4 address 4.8.10.4 255.255.255.0
ipv4 tcp-mss-adjust enable
encapsulation dot1q 10
验证
要验证在选定接口上启用了该功能,请检查微码接口描述符块 (uidb) 设置:
RP/0/RSP0/CPU0:asr9001#sh uidb data location 0/0/CPU0 Bundle-Ether 48.10 ing-extension | i TCP
TCP MSS ADJ Enable 0x1
RP/0/RSP0/CPU0:asr9001#sh uidb data location 0/0/CPU0 Bundle-Ether 48.10 extension | i TCP
TCP MSS ADJ Enable 0x1
您可以在连接到正在执行 MSS 重写的设备的 IOS 路由器上使用简单的 TCP 会话来验证重写。
启用debug tcp transactions and packet。
你会看到的:
Feb 6 14:17:26.112: tcp0: I LISTEN 54.1.1.2:1234 81.1.1.2:23 seq 0
OPTS 4 SYN WIN 0
Feb 6 14:17:26.112: TCP0: state was LISTEN -> SYNRCVD [23 -> 54.1.1.2(1234)]
Feb 6 14:17:26.112: TCP0: tcb D333A2EC connection to 54.1.1.2:1234, received MSS 1300, MSS is 516
54.1.1.2 is the source and 81.1.1.2 is the destination. The debug is taken from 81.1.1.2
您可以看到,根据位于客户端和目标之间的 asr9000 上的配置,收到的解码 MSS 值为 1300。我们宣传的本地 MSS 值为 516。这只是为了说明 MSS 重写的可能验证,而不是关注实际值。
附加信息
在 GRE 隧道的情况下,它的工作原理类似:
- 在tunnel-ip下开启命令:'ipv4 tcp-mss-adjust enable'
- 到隧道使用的出口接口((无论是在进入隧道之前 -> 流量进入隧道之前,还是在 decap -> 离开隧道之后),然后应用相应的命令'hw-module location <> tcp-mss-adjust np X value <number>'
原文链接:https://community.cisco.com/t5/service-providers-knowledge-base/tcp-mss-adjust-on-asr9000/ta-p/3138507