介紹
本文檔提供了用於調整 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