【tcp】如何计算、监控TCP重传率?

本文详细解析了TCP重传的概念、计算方式,探讨了高重传率的原因,并提供了使用`nstat`和脚本监控网络状况的技巧。通过`/proc/net/snmp`和相关统计指标来评估网络性能,为排查和优化提供实用指南。

一、什么是TCP重传?

在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传。 

TCP重传率:重新发送信息的与全部的调用信息之间的比值。

二、TCP重传率高的可能原因

发生重传说明网络传输有丢包,基本上从3个点去定位: 客户端网络情况、服务端网络情况、中间链路网络情况。

1. 客户端机器网络异常

2.服务端网卡流量跑满,网卡有丢包现象,关注ifconfig的error输出

3.中间网络连路拥塞,比如交换机上联、核心交换机链路等,需要逐个排查链路流量情况

三、数据包相关统计

# netstat -s

# which nstat

# rpm -qf /usr/sbin/nstat

iproute-4.11.0-14.el7.x86_64

# nstat -a | grep -i Segs

# cat /proc/net/snmp

这些统计值反应的也是历史状态,独立的来看意义并不大。

一般可统计一段时间内的变化,关注以下几个指标:

1. (发送)TCP 分段重传占比:ΔRetransSegs / ΔOutSegs ;

该值越小越好,如果超过 20% 则应该引起注意(这个值根据实际情况而定);

2. (发送)RST 分段占比:ΔOutRsts / ΔOutSegs ;

该值越小越好,一般应该在 1% 以内;

3. (接收)错误分段占比:ΔInErrs / ΔInSegs ;

该值越小越好,一般应该在 1% 以内,同时由 checksum 导致的问题包应该更低;

# awk 'BEGIN {OFS=" "} $1 ~ /Tcp:/ && $2 !~ /RtoAlgorithm/ {print "InSegs\t",$11,"\nOutSegs\t",$12,"\nRetransSegs\t",$13,"\nPctReTrans\t",($13/$12*100)}' /proc/net/snmp

四、重传率计算脚本

#  check_tcp_retrans_rate.sh

#########################################################

#!/bin/bash

awk 'BEGIN {OFS=" "} $1 ~ /Tcp:/ && $2 !~ /RtoAlgorithm/ {print "OutSegs\t",$12,"\nRetransSegs\t",$13}' /proc/net/snmp

out_segs_1=`awk 'BEGIN {OFS=" "} $1 ~ /Tcp:/ && $2 !~ /RtoAlgorithm/ {print $12}' /proc/net/snmp`

retrans_segs_1=`awk 'BEGIN {OFS=" "} $1 ~ /Tcp:/ && $2 !~ /RtoAlgorithm/ {print $13}' /proc/net/snmp`

sleep 60

out_segs_2=`awk 'BEGIN {OFS=" "} $1 ~ /Tcp:/ && $2 !~ /RtoAlgorithm/ {print $12}' /proc/net/snmp`

retrans_segs_2=`awk 'BEGIN {OFS=" "} $1 ~ /Tcp:/ && $2 !~ /RtoAlgorithm/ {print $13}' /proc/net/snmp`

out_segs=$((${out_segs_2} - ${out_segs_1}))

retrans_segs=$((${retrans_segs_2} - ${retrans_segs_1}))

tcp_retrans_rate=$(($retrans_segs/$out_segs))

echo ${tcp_retrans_rate}

#########################################################

五、参考

How passively monitor for tcp packet loss? (Linux)

https://serverfault.com/questions/318909/how-passively-monitor-for-tcp-packet-loss-linux

Linux/TCP 相关统计信息详解.md

https://github.com/moooofly/MarkSomethingDown/blob/master/Linux/TCP%20%E7%9B%B8%E5%85%B3%E7%BB%9F%E8%AE%A1%E4%BF%A1%E6%81%AF%E8%AF%A6%E8%A7%A3.md

Is there documentation for /proc/net/netstat and /proc/net/snmp?

https://unix.stackexchange.com/questions/435579/is-there-documentation-for-proc-net-netstat-and-proc-net-snmp

Linux性能监控 - CPU、Memory、IO、Network

https://www.cnblogs.com/insane-Mr-Li/p/11209076.html

Linux环境 网络流量统计/proc/net/dev和/proc/net/snmp

https://blog.youkuaiyun.com/paradox_1_0/article/details/109175339

Hands-on Guide for Linux /proc file and folders

https://www.coding-bootcamps.com/linux/filesystem/proc.html

Linux计算TCP重传率

http://www.opstool.com/article/309

https://s905060.gitbooks.io/site-reliability-engineer-handbook/content/linux_tcp_retransmission_rate_calculation.html

/proc/net/snmp

https://blog.titanwolf.in/a?ID=00500-531f4315-916d-41c1-a007-7d5a8649934f

Checking for TCP/IP packet loss

https://www.clouddirect.net/knowledge-base/KB0011163/checking-for-tcpip-packet-loss

Linux network metrics: why you should use nstat instead of netstat

https://loicpefferkorn.net/2016/03/linux-network-metrics-why-you-should-use-nstat-instead-of-netstat

### TCP传输中的丢包问题 #### 什么是TCP丢包TCP丢包是指在网络传输过程中丢失的数据包数量占总发送数据包的比例。其计算公式为: \[ \text{丢包} = \frac{\text{(输入报文 - 输出报文)}}{\text{输入报文}} \] 这一指标能够反映网络环境的质量以及传输过程中的可靠性[^1]。 #### 导致TCP丢包的主要原因 TCP丢包现象通常由以下几个方面引起: - **网络拥塞**:当网络流量超过链路容量时,路由器可能会丢弃部分数据包以缓解压力[^2]。 - **硬件故障**:交换机、网卡或其他网络设备的性能下降或损坏可能导致数据包无法正常传递。 - **软件错误**:应用程序在处理数据收发的过程中可能出现异常行为,从而引发丢包情况。 - **协议栈限制**:操作系统或中间件对TCP窗口大小、缓冲区设置不当也可能影响数据传输稳定性[^3]。 #### 如何计算TCP丢包? 通过监控工具可以实时获取到发送与接收之间的差异来评估当前系统的丢包状况;具体操作如下所示: ```bash ping -c 10 www.example.com ``` 上述命令会向目标主机发出十个ICMP回声请求并统计返回的结果数目进而得出相应的百分比作为初步判断依据之一。 #### 解决TCP丢包的方法 为了减少甚至消除TCP丢包带来的负面影响可以从多个角度入手调整优化措施: - **增加带宽资源分配**: 提升物理线路承载能力使得更多有效负载得以顺利抵达目的地[^5]; - **启用QoS(Quality of Service)**: 对不同类型的服务赋予优先级标签以便于关键业务获得更好的保障待遇; - **改进ACK机制响应速度**: 缩短确认消息到达时间间隔有助于加快重传决策制定流程效提升整体吞吐表现水平; - **合理配置MTU(Maximum Transmission Unit)**: 避免分片操作过多造成额外开销同时也降低了潜在失败风险概; 以上策略均需结合实际应用场景灵活运用才能达到最佳效果. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值