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重传,可能是网络抖动;
  • 带宽跑满。查看主机监控,检查是否带宽跑满。(也就是流量太大的情况)

 

posted @ 2023-07-09 21:58  lypbendlf  阅读(770)  评论(0编辑  收藏  举报