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

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