本文档介绍TCP基础知识、Wireshark深度数据包分析和用于优化端到端性能的实用故障排除。
Cisco 建议您了解以下主题:
本文档中的信息基于以下软件和硬件版本:
注意:有关第三方软件或硬件的配置和互操作性的任何问题均不在思科支持范围内。使用第三方工具是展示您对思科设备的配置和操作的最佳方式。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
传输控制协议(TCP)是一种基本的传输层协议,在OSI模型的第4层运行,通过IP网络通信的应用之间提供可靠、有序且错误校验的字节流传输。
图中展示了TCP/IP协议栈,其中TCP数据段(第4层)封装在IP数据包(第3层)中,然后封装在IEEE 802.3定义的以太网帧(第2层)中。这种分层方法可确保模块化通信,其中每一层都添加自己的控制信息(报头)以确保传输、路由和数据完整性。

以太网报头通常为14个字节,包括:
此外,以太网帧还包含一个4字节的帧校验序列(FCS)帧尾,用于第2层进行错误检测。IEEE 802.3定义了成帧、最小/最大帧大小和物理传输限制,这些限制会直接影响TCP等上层协议。
IPv4报头的最小大小为20字节,可通过选项扩展至60字节。关键字段包括:
IP层负责网络中的逻辑编址和路由,但不保证可靠性。
TCP报头的范围是20到60字节,具体取决于选项。关键字段包括:
TCP为IP通信添加了可靠的传输、适当的排序和流量控制。
TCP选项扩展了基本协议。最常见包括:
SYN和FIN标志都使用一个序列号,即使没有负载时也是如此。TCP使用面向字节的排序模型运行,其中传输的每个字节(以及特定的控制标志)都会增加序列空间。此行为对于数据包捕获中的准确TCP分析和诊断排序或确认不一致至关重要。
ACK = SEQ +负载长度+(SYN ?1:0)+(FIN ?1:0)
其中:
ACK计算:
这反映在TCP握手期间发送数据的场景。负载和SYN标志都消耗序列空间。
ACK计算:
这表明TCP可以在连接中断期间包含数据,并且负载和FIN标志会增加序列号。
最大分段大小(MSS)定义了TCP在分段中可以发送的最大负载。
如果存在TCP选项,则MSS会相应减少。MSS在TCP三次握手期间协商并防止IP层分段。
在TCP三次握手期间,使用SYN数据包中的MSS选项交换最大分段大小(MSS):
双方都有效地在说:
这是接受的最大TCP负载。
MSS不会作为单一议定值进行协商。
相反:
因此:
在正常运行的TCP协议栈中:No.
Window Size定义接收方在不确认的情况下可以接受的数据量。
它是什么:
目的:
从何处获取:
供应商/操作系统差异:
零窗口条件:
可变Windows机制
故障排除使用:
本节介绍一种实用的方法,用于诊断运行NX-OS的Cisco Nexus交换机是否影响TCP流量转发或引入性能问题。通过一个假设的场景给出了该方法。
当观察到TCP延迟或性能下降时,通常首先会怀疑是网络导致延迟或性能下降。但是,必须通过数据驱动分析验证此假设。TCP故障排除的授权方法是数据包捕获,最好执行:
这样可以确保对TCP三次握手的可视性,其中MSS、Window Scale和SACK等关键参数是经过协商的,不会在会话后期重复这些参数。如果无法进行同步捕获,则分析可以只进行一次捕获,但结论有限。
方案定义
一位用户已经发现,对大约7.5 TB的应用程序数据集的备份过程(以前大约在9小时内完成)现在需要将近21个小时。虽然客户端和服务器之间的TCP会话仍然成功建立,但备份持续时间的大幅增加表明吞吐量或整体TCP性能可能会降低。由于Nexus交换机是路径中唯一的网络设备,并且还提供第3层网关功能,因此网络管理员怀疑Nexus交换机是问题的原因。

Linux: ping -c 10 -I 10.93.19.8 -s 1472 -M do 10.91.2.35
Windows: ping -n 10 -l 1472 -f 10.91.2.35
为什么选择1472字节?
可以得出的结论
如何使用它进行故障排除
与TCP的实际相关性
要对Cisco Nexus 9000交换机上的TCP性能进行有效的故障排除,必须确定哪些接口正在接收和转发源和目标之间的流量。
在简单拓扑中,这可以直接从物理连接推断。例如,如果客户端连接到Ethernet1/1,而服务器连接到Ethernet1/2,则流量路径非常简单。但是,在具有多个活动接口、端口通道或vPC配置的真实环境中,这种识别并不总是微不足道。
在这种情况下,推荐的方法是使用嵌入式逻辑分析器模块(ELAM),它提供在ASIC(数据平面硬件)级别的可视性。
ELAM允许您在转发管道处理数据包时捕获该数据包,并揭示如下重要信息:
这种方法比依赖控制平面工具准确得多,因为它反映了实际的硬件转发路径。
请注意,ELAM一次仅捕获一个数据包,因此必须精确定义过滤条件以匹配所需的流量(例如,源IP、目标IP、TCP端口),这一点非常重要。 如果过滤器过于宽泛,可能会捕获不相关的流量,例如ICMP或UDP,而不是预期的TCP流量。
此外,必须针对两个流量方向重复此过程:
在使用vPC或ECMP的环境中,流量可以在多条路径之间实现负载均衡。因此,转发和返回流量可以流经不同的交换机或接口。在这些情况下,必须在每个相关Nexus交换机上执行ELAM以确保完整的可视性。
通过准确识别入口和出口接口,故障排除范围显着减小,从而能够集中验证接口计数器、QoS策略、MTU设置和沿准确转发路径的潜在拥塞点。
本示例过滤源IP地址为10.93.19.8、目的IP地址为10.91.2.35和TCP目的端口为445的流量。
ELAM设置
switch# debug platform internal tah elam
switch(TAH-elam)# trigger init
Slot 1: param values: start asic 0, start slice 0, lu-a2d 1, in-select 6, out-select 0
switch(TAH-elam-insel6)# set outer ipv4 src_ip 10.93.19.8
switch(TAH-elam-insel6)# set outer ipv4 dst_ip 10.91.2.35
switch(TAH-elam-insel6)# set outer l4 l4-type 0
switch(TAH-elam-insel6)# set outer l4 dst-port 445
switch(TAH-elam-insel6)# start
生成流量后,检索结果:
switch(TAH-elam-insel6)# report
反向流量捕获(完全可视性所必需的)
要验证返回路径,请通过交换源IP地址和目标IP地址重复配置:
switch# debug platform internal tah elam
switch(TAH-elam)# trigger init
Slot 1: param values: start asic 0, start slice 0, lu-a2d 1, in-select 6, out-select 0
switch(TAH-elam-insel6)# set outer ipv4 dst_ip 10.93.19.8
switch(TAH-elam-insel6)# set outer ipv4 src_ip 10.91.2.35
switch(TAH-elam-insel6)# set outer l4 l4-type 0
switch(TAH-elam-insel6)# set outer l4 dst-port 445
switch(TAH-elam-insel6)# start
操作说明
Cisco Nexus 9000云扩展ASIC ELAM指南
接口级验证可确保Nexus交换机不会引入任何影响TCP流量的限制或异常。重点是确认配置、运行状态和硬件计数器与高性能数据平面转发的预期行为一致。
配置验证
switch# show running-config interface ethernet1/1-2 | include access-group
switch#show running-config interface ethernet1/1-2 | include service-policyswitch#show policy-map interface ethernet1/1-2
switch# show policy-map
switch# show class-map
switch# show class-map type network-qos
switch# show policy-map type network-qos
switch#show policy-map system type network-qos
switch# show queuing interface ethernet1/1-2
switch# show policy-map type queuing
switch#show running-config interface ethernet1/1-2
switch#show interface ethernet1/1-2 switchport
switch#show spanning-tree interface ethernet1/1-2
switch# show ip interface ethernet1/1-2
运行状态验证
switch#show interface ethernet1/1-2 | include MTU
switch#show interface ethernet1/1-2 | include speed|duplex
switch#show interface ethernet1/1-2 | include rate|flap
错误计数器验证
switch#clear counters interface all
switch#show interface counters errors non-zero | include Port|Eth1/1|Eth1/2
测试后验证
switch#show interface counters errors non-zero | include Port|Eth1/1|Eth1/2
确保路由和ARP稳定性对于确认Nexus交换机具有一致的第3层可达性至关重要,而且不会引入可能影响TCP性能的间歇性解决问题。路由条目或ARP解析中的不稳定可能导致数据包丢失、延迟增加或流量黑洞。
验证条件
switch# show ip route 10.93.19.8
switch# show ip route 10.91.2.35
switch# show ip arp detail | include 10.93.19.8
switch# show ip arp detail | include 10.91.2.35
在Cisco Nexus 9000交换机中,转发在硬件(ASIC)中执行,CPU不参与正常的数据平面操作。因此,在控制平面中观察主机到主机TCP流量是异常的,表明数据包由于异常或配置错误而被传送。一旦流量必须由CPU处理,它就会受到控制平面策略管制,并且如果流量超过允许的控制平面速率,预计可以观察到丢弃。
验证方法
switch# ethanalyzer local interface inband display-filter "ip.addr==10.93.19.8 and ip.addr==10.91.2.35" limit-capture 0
预期行为
意外行为
Nexus 9000交换机中的数据包转发延迟取决于数据包大小、转发模式和启用的功能。思科规范通常参考直通转发下64字节数据包的延迟。
+----------------------+----------------------+-------------------------+-------------------------------+
| Switch Model | ASIC / Architecture | Ports (example config) | Typical Forwarding Latency |
| | | | (64B packet) |
+----------------------+----------------------+-------------------------+-------------------------------+
| Nexus 93180YC-EX | Cloud Scale (EX) | 48x25G + 6x100G | ~1.0 – 1.2 microseconds |
| Nexus 93180YC-FX | Cloud Scale (FX) | 48x25G + 6x100G | ~0.9 – 1.0 microseconds |
| Nexus 93180YC-FX2 | Cloud Scale (FX2) | 48x25G + 6x100G | ~0.8 – 0.9 microseconds |
| Nexus 9364C | Cloud Scale | 64x100G | ~1.0 microsecond |
| Nexus 9336C-FX2 | Cloud Scale (FX2) | 36x100G | ~0.8 microseconds |
| Nexus 93240YC-FX2 | Cloud Scale (FX2) | 48x25G + 12x100G | ~0.8 – 0.9 microseconds |
| Nexus 92300YC | Broadcom Trident II | 48x10/25G + 6x40/100G | ~2 – 3 microseconds |
| Nexus 92160YC-X | Broadcom Tomahawk | 48x25G + 6x100G | ~2 microseconds |
+----------------------+----------------------+-------------------------+-------------------------------+
其他功能可能会增加延迟:
但是:
延迟显着增加的唯一现实情况是拥塞:
即使在这些情况下:
这样可将数据平面流量镜像到控制平面以捕获数据包,并导出到.pcapng文件,从而允许在Wireshark中进行详细分析。
配置
monitor session 1
source interface ethernet1/1 both
source interface ethernet1/2 both
destination interface sup-eth0
no shut
捕获执行
switch# ethanalyzer local interface inband mirror capture-filter "tcp port 445" limit-capture 0 write bootflash:tcp_capture.pcapng
技术注意事项
| 方法 | 优势 | 限制 |
|---|---|---|
| SPAN |
准确,无封装 |
需要物理连接。 |
| ERSPAN |
远程捕获功能 |
易受网络拥塞的影响。 |
为了确保SPAN到CPU的捕获是可靠的,必须验证控制平面是否因速率限制而丢弃镜像数据包。
验证命令
switch(config)# show hardware rate-limiter | i Allowed|span
Allowed, Dropped & Total: aggregated bytes since last clear counters
R-L Class Config Allowed Dropped Total
span 50 0 0 0 <<<
span-egress disabled 0 0 0
验证方法
解释
如果观察到丢包,必须将捕获方法更改为SPAN或ERSPAN。
ICMP测试在执行复杂的TCP分析之前提供数据平面完整性的基线验证。由于ICMP是无状态且更简单,因此它允许快速检测数据包丢失、重复或路径不一致。
SPAN捕获中的预期行为
这可以确认数据平面中的转发正确且不存在丢包现象。
异常行为
如果ICMP流量始终转发而不会丢失,则很有可能第2/3层也正确转发TCP流量。
当使用SPAN捕获到CPU(或SPAN/ERSPAN)的流量时,可以观察到每个数据包两次:一次在入口上,一次在出口上。通过计算同一数据包的两个实例之间的时间差,可以使用此复制来估计Nexus交换机引入的转发延迟。
在实际中,可以通过比较重复的Echo Request和Echo Reply数据包之间的时间差值,使用之前捕获的ICMP流量来测量此延迟。这为交换机转发性能提供了简单而有效的基准。如果需要更深入的分析,可通过捕获流量并测量重复TCP数据包之间的时间差来对TCP流量应用相同的方法。
方法
Wireshark配置
View > Time Display Format > Seconds Since Previous Displayed Packet
Right-click on "Time Delta from Previous Displayed Packet" → Apply as Column
ip.addr==10.93.19.8 and ip.addr==10.91.2.35 and tcp
Right-click packet → Follow → TCP Stream
解释
本部分提供详细的方法来分析Wireshark中的TCP数据包捕获,包括配置文件配置(通过前面所述的假设情况)。显示的图像直接来自Wireshark。提醒一下,情景是:
一位用户已经发现,对大约6.5 TB的应用程序数据集的备份过程(以前大约在9小时内完成)现在需要将近21个小时。唯一可访问的网络设备是连接到源服务器(10.93.19.8)的Cisco Nexus 9300交换机。 交换机接口上配置的MTU为9000字节(巨帧),而服务器上的MTU未知。可从源服务器捕获数据包,并且所有之前的Nexus验证步骤都已完成,未检测到异常。
主要观察和限制
在Wireshark中,您可以创建定制配置文件,以定制要执行的特定类型的分析。
列说明
必须捕获TCP三次握手,因为它包含定义会话行为方式的关键参数,如MSS、Window Scale和SACK。
如果没有此信息,任何TCP分析都是不完整的,可能导致有关性能或根本原因的结论不正确。

从数据包捕获:
初始RTT(iRTT)计算如下:
该值源自:
大部分延迟(约94%)位于转发路径(客户端→服务器→客户端),而来自源的响应时间最短,表明客户端上没有CPU或应用延迟。
端口445对应于Microsoft Server Message Block(SMB),通常用于文件共享、网络驱动器和Windows身份验证服务。此协议对延迟和吞吐量都很敏感,因此高度依赖TCP效率和网络稳定性。
TCP窗口表示在等待确认之前可以发送的数据量。在这种情况下,源比目的地限制稍多。这些值对于现代环境来说相对较小,可能会限制吞吐量,尤其是在RTT增加时。
最大理论吞吐量可通过以下方式估计:
吞吐量= TCP窗口大小/ RTT
替换观察到的值:
吞吐≈为64,240 / 0.000798 ≈ 80.5 MB/s(~644 Mbps)
这表示上限吞吐量,假设:
在当前吞吐量为644 Mbps的情况下,传输6.5 TB的文件大约需要23.5小时,这与观察到的性能下降情况相符。要实现9小时的传输时段,吞吐量必须提高至约1.68 Gbps,需要更大的TCP时段(大约增加2.7倍)或显着更低的RTT(约291微秒)。
在当前条件下(64 KB窗口和~798 µs RTT),不可能达到9小时目标,因为TCP吞吐量受带宽延迟产品的限制。如果不增加窗口大小或减少延迟,协议将无法利用更高的可用带宽,从而使目标无法实现。
| 场景 | 吞吐量 | 预计传输时间(6.5 TB) | 必需的TCP窗口 | 必需的RTT |
|---|---|---|---|---|
| 当前状态 |
644 Mbps(约80.5 MB/s) |
约23.5小时 |
64 KB |
798微秒 |
| 目标(9小时) |
~1683 Mbps(约210 MB/s) |
9 小时 |
~172 KB |
~291微秒 |
这在过去有效,表示网络、应用程序、源或目标发生更改。必须指出的是,仅基于这一初步分析,就可以得出一个重要的结论:在当前TCP窗口大小和RTT条件下,无法实现9小时目标。
下表比较了吞吐量随RTT和TCP窗口大小增加或减小而变化的情况。
RTT对吞吐量的影响(固定窗口大小= 64,240字节)
| RTT | 吞吐量(MB/s) | 吞吐量(Mbps) |
|---|---|---|
| 200微秒(0.0002秒) |
~321 MB/s |
约2,568 Mbps |
| 798微秒(0.000798秒) |
约80.5 MB/s |
约644 Mbps |
| 2毫秒(0.002秒) |
~32.1 MB/s |
约257 Mbps |
| 10毫秒(0.01秒) |
~6.4 MB/s |
约51 Mbps |
TCP窗口大小影响(固定RTT = 798 µs)
| TCP窗口大小 | 吞吐量(MB/s) | 吞吐量(Mbps) |
|---|---|---|
| 16 KB(16,384 B) |
约20.5 MB/s |
约164 Mbps |
| 64 KB(64,240 B) |
约80.5 MB/s |
约644 Mbps |
| 256 KB(262,144 B) |
~328 MB/s |
约2,624 Mbps |
| 1兆字节(1,048,576字节) |
~1,314 MB/s |
约10.5 Gbps |
技术解释
这表明RTT和TCP窗口大小都是TCP性能的关键因素,在排除吞吐量问题时必须一起进行分析。
20字节的IP报头表示不存在IP选项。32字节的TCP报头确认正在使用TCP选项,在基本报头外增加12个字节。这些选项通常包括MSS、Window Scale和SACK Permitted。
两个终端上均启用了选择性确认(SACK)。这在图片中不可见。SACK允许接收方确认非连续的数据块,从而向发送方准确通知哪些数据段已成功接收。
例如,如果收到数据段1000-2000和3000-4000,但缺少2000-3000,则接收方可以明确指出这一点。如果没有SACK,发送方会在间隙后重新传输所有数据;使用SACK时,仅重新传输丢失的部分。这显着提高了在丢包环境中的性能。
数据包1(SYN)分析
Wireshark将序列号规范化为零,以实现可读性,但实际上它是一个很大的随机值。连接建立期间预期没有负载。MSS值1460字节表示1500字节的MTU(20字节IP报头+ 20字节TCP报头)。TTL 128可以是基于Windows的主机,在捕获中看到此值表明捕获可能是在源位置或非常靠近源位置通过第2层进行的。
数据包2(SYN-ACK)分析
ACK值为1,因为SYN标志会使用一个序列号,即使没有负载时也是如此。因此,ACK = SEQ + 1。
观测到的TTL为59,表明初始TTL为64,这意味着数据包经过大约5个路由跳(64 − 59 = 5)。 每个路由的跃点将TTL递减1。
分散风险和网络影响
大约五个路由跳的存在会引入潜在的性能风险,尤其是与MTU不匹配和分段相关的风险。
如果任何中间链路的MTU低于原始数据包大小,则会发生分段。这会导致以下几种后果:
考虑到这些因素,确保路径中的MTU一致或在必要时实施MSS夹紧至关重要。
当ACK RTT大于iRTT时,表明与TCP握手期间建立的基线相比,延迟已增加。
这意味着网络或终端在会话期间引入额外的延迟,通常是由于:
如果此情况在整个TCP会话期间持续出现,则会导致:
在Wireshark中,可以通过使用I/O Graphs(I/O图形)功能来直观显示ACK RTT > iRTT条件的发生频率:统计→ I/O Graphs,应用显示过滤器(tcp.analysis.ack_rtt > tcp.analysis.initial_rtt),选择Impulse style,将Y轴设置为Packets,并使用50微秒的时间间隔。
在图中,紫色脉冲表示每个50微秒间隔内满足此条件的数据包数量。如前所述,此情况在整个数据包捕获过程中持续出现,表明会话期间的延迟始终高于初始基线。此行为强烈表明性能持续下降,而不是瞬变状态,这进一步表明有必要调查端到端路径中的潜在来源,如拥塞、缓冲或终端处理延迟。

确定iRTT被超出的时间也很重要,而不仅仅是频率。虽然Wireshark不允许直接在字段之间进行减法,但可以使用I/O图形进行直观比较:
在此可视化中,紫色图形表示条件ACK RTT > iRTT,该条件在整个TCP会话中始终存在。数据显示持续的延迟膨胀,多个峰值达到11毫秒,最大峰值超过100毫秒,表示基线iRTT的11倍到100倍。
此行为确认延迟增加不是暂时的,而是持久的,表明系统问题会随着时间影响会话。这种持续偏差强烈表明存在网络拥塞、缓冲(bufferbloat)或终端处理延迟等因素。

本部分通过分析一段时间的重新传输来评估TCP可靠性,从而验证数据包丢失是否会导致性能下降。
图中显示了TCP重新传输随时间变化的分布。总共观察到42次重传,仅占总流量的0.00125%。
这种重传级别可以忽略不计,并且清楚地表明数据包丢失不是造成这种情况的原因。
Wireshark配置(TCP重新传输)
Statistics → I/O Graphs
tcp.analysis.retransmission and !tcp.analysis.spurious_retransmission
该图显示源10.93.19.8在1秒间隔内生成的TCP虚假重传次数。
在Wireshark中,TCP虚假重传表示主机重传了实际上并未丢失的数据段。原始数据包成功到达接收方,但发送方由于不准确的计时估计而错误地假设丢失。此行为并不表示真正的数据包丢失,而是表明发送方重新传输逻辑效率低下。
在本捕获中:
这确认重新传输行为完全由源TCP堆栈控制,而不是由网络控制。
观察到的虚假重传总数为1,112,占捕获总流量的0.0332%。
Wireshark配置(TCP虚假重传)
Statistics → I/O Graphs
tcp.analysis.spurious_retransmission and ip.src==10.93.19.8
技术解释
此分析进一步强调,此问题与网络可靠性无关,而与TCP行为、延迟或终端性能有关。

该图显示了有效吞吐量,根据TCP负载(实际传输的数据)计算得出,单位为每秒Mb。观察到的吞吐量主要在600 Mbps和800 Mbps之间波动,这表明网络在主动传输数据的同时,并没有达到更高的带宽潜力。
Wireshark配置(有效吞吐量)
Statistics → TCP Streams Graphs → Throughout

技术解释
该图通过比较接收方容量与传输中的实际数据(传输中的字节数),突出显示TCP会话中的一个关键行为。

观测到的Data in Flight峰值约为1 MB,在8 KB和5 KB附近有额外的峰值,但主要集中在1 KB和250 KB之间。
这表明,虽然接收方能够处理更大量的数据,但发送方并未始终如一地利用可用窗口。
Wireshark配置(飞行中的数据与窗口)
Statistics → TCP Streams Graphs → Throughout
技术解释
根据MSS分析随时间变化的TCP负载大小有助于确定发送方是否高效地利用每个TCP数据段。从源IP地址(10.93.19.8)的角度执行此分析。
在Wireshark中,图形配置如下:
根据分析:

此分析表明,要确定TCP性能问题的根本原因,需要采用全面的端到端方法,而不是假设网络是性能退化的主要根源。
在Cisco Nexus 9300交换机上执行了广泛的验证,包括接口计数器、QoS策略、路由和ARP稳定性、CPU突发验证、基于SPAN的数据包捕获以及使用ELAM的ASIC级转发验证。所有结果一致证实交换机在预期参数下运行:
此外,TCP分析还显示:
性能下降是由于源服务器在支持Jumbo的环境中与MTU 1500一起操作导致的,这阻碍了有效利用可用网络容量。
将源服务器上的MTU从1500字节增加到9000字节,以便与目标和网络基础设施保持一致。优势:
此分析的主要内容是在排除网络性能故障时避免过早总结的重要性。虽然最初将问题归结到网络是很常见的,但此案例清楚地表明网络在整个数据平面路径中运行正常。只有从源和目标两个角度执行深入的TCP分析(包括握手参数、RTT行为、窗口利用率、重新传输和负载效率),才能准确识别真正的瓶颈。
花时间详细分析TCP行为,可防止误诊,减少不必要的网络更改,并确保补救工作针对实际根本原因。
| 版本 | 发布日期 | 备注 |
|---|---|---|
2.0 |
07-May-2026
|
已按作者请求更新标题。 |
1.0 |
06-May-2026
|
初始版本 |