tcp重传率高了解
转自:https://developer.aliyun.com/article/231738,https://cloud.tencent.com/developer/article/1404089
1、介绍
先给出某一台主机上评估tcp重传的指标,TCP重传率定义:
TCP重传率 = TCP重传的报文数量/TCP输出的报文数量;
即tcp retransfer radio = Retrans/outSegs
TCP有重传是正常的机制,为了保障数据传输可靠性。网络质量不好时,重传出现概率较高。
TCP有重传,也不一定是网络层面的问题。也可能是接收端不存在,接收端receive buffer满了,应用程序有异常链接未正常关闭等等等。
2、确认
可以通过/proc/net/snmp得到各层网络协议收发包的情况。文件内的指标:
监控某台主机重传率的通常方法:可以每隔1秒从这两个文件中分别读到TcpRetransSegs和TcpOutSegs和上一次记录取差值后,再使用重传率计算公式。
可以用如下命令查看 系统中每秒tcp重传报文数量:
watch -n 1 'nstat -z -t 1 | grep -e TcpExtTCPSynRetrans -e TcpRetransSegs -e TcpOutSegs -e TcpInSegs'
其中TcpInSeg代表总的入报文数量通常用于计算tcp吞吐量,TcpOutSegs代表总的tcp报文发出数量,TcpRetransSegs代表总的重传数量,TcpExtTCPSynRetrans代表syn报文和synack报文的重传数量。
要确认是哪些端口重传率较高,可以通过wireshark抓包分析。
3、重传类型
相关参数,在路径/proc/sys/net/ipv4下,
:/proc/sys/net/ipv4$ cat tcp_syn_retries # syn包重传多少次后放弃,重传间隔是2的n次方(1s,2s,4s..) 6 :/proc/sys/net/ipv4$ cat tcp_synack_retries # syn ack包重传多少次后放弃 3 :/proc/sys/net/ipv4$ cat tcp_max_syn_backlog # syn包队列 81920
重传类型:
- 超时重传:在请求包发出去的时候,开启一个计时器,当计时器达到时间之后,没有收到ACK,则就进行重发请求的操作,一直重发直到达到重发上限次数或者收到ACK。
- 快速重传:当接收方收到的数据包是不正常的序列号,那么接收方会重复把应该收到的那一条ACK重复发送,这个时候,如果发送方收到连续3条的同一个序列号的ACK,那么就会启动快速重传机制,把这个ACK对应的发送包重新发送一次。具体可以参考:
常见原因:
- 单台机器或单个应用机器tcp重传,可能是链接的服务器或端口无法访问;
- 多台机器或多个应用同时tcp重传,可能是网络抖动;
- 带宽跑满。查看主机监控,检查是否带宽跑满。(也就是流量太大的情况)