ASR9000 上的 TCP MSS 调整

介绍

本文档提供了用于调整 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 调整取决于两个因素

  1. 应用于接口时对性能的影响最小
  2. 性能不会随部署规模而变化(即应用该功能的接口数量)

为了满足这些要求,选择的实现需要两个配置步骤:

  1. 在网络处理器 (NP) 级别指定 TCP MSS 大小。
  2. 指定应应用配置的 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章