资讯专栏INFORMATION COLUMN

谈谈Linux中的TCP重传抓包分析

Batkid / 2836人阅读

摘要:文章来源作者介绍京东资深工程师梁松华,长期关注稳定性保障敏捷开发高级微服务架构收到研发反馈,重传严重。

文章来源:www.liangsonghua.me
作者介绍:京东资深工程师-梁松华,长期关注稳定性保障、敏捷开发、JAVA高级、微服务架构

收到研发反馈,TCP重传严重。主机报文重传是TCP最基本的错误恢复功能,它的目的是防止报文丢失

报文丢失的可能因素有很多种

1、 网络设备或线路故障
案例:设备接口常常出现的CRC数据校验错误
特点:问题一直持续,所有经过该节点的数据都受影响,影响服务器数量大
2、 数据路径上的流量突发导致链路拥塞
案例:专线打满导致丢包严重
特点:突发性极强,持续时间短。更多时候有周期性。所有经过该节点的数据都受影响,影响服务器数量大
3、 客户端服务器故障
案例:某服务器网卡故障,或者性能下降
特点:故障长时间持续,仅仅影响单台设备
4、 服务器端服务器故障
案例:某服务器网卡故障
特点:故障长时间持续,所有请求到该节点的数据都受影响,影响服务器数量大
5、 服务器端性能下降
案例:有运营活动的时候服务端请求量太大,导致性能下降
特点:突发,如果服务端有巨量请求会有周期性,所有请求到这台设备(集群)的数据都有可能受影响,影响服务器数量大
6、 代理节点或者VIP性能下降
案例:某一负载均衡集群故障或性能下降
特点:突发,有周期性。所有请求到该节点的数据都受影响,影响服务器数量大
先抓包生成pcap文件,tcpdump -i nsdb475e5d-86 -vvv -w tcp_retry.pcap,保留证据要紧,同时留意值班群和网络应急响应群是否有相同的反馈,如果有其他人反馈,及时确认受影响范围,服务器是否有一些共性,比如集中在某个数据中心上、某个POD下、某台物理机上

使用以下命令实时可以观察系统中每秒tcp重传报文数量,线上监控工具推荐使用阿里出品的tsar-Taobao System Activity Reporter

nstat -z -t 1 | grep -e TcpExtTCPSynRetrans -e TcpRetransSegs -e TcpOutSegs -e TcpInSegs

使用netstat -s查看整体情况,按各个协议进行统计结果如下

ss -anti |grep -B 1 retrans查看重传统计情况,具体到IP+端口,这里方便显示使用ss -tanl演示

1、 LISTEN 状态:
这两个值表示的是最大的listen backlog积压数值,这里显示为0,实际上会取内核参数net.core.somaxconn的值

2、 其他状态:
(1)、 recv-Q:表示网络接收队列,表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,如果短暂不为0,可能是处于半连接状态,如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击
(2)、send-Q:表示网路发送队列,对方没有收到的数据或者说没有Ack的,还是在本地缓冲区.如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快
非LISTEN状态下则通常应该为0,如果不为0可能是有问题的,packets在两个队列里都不应该有堆积状态,可接受短暂的非0情况

ulimit -a检查服务打开的文件句柄上限,10多万正常是足够的

通过ifconfig查看网卡是否存在持续drop、error现象

容器状态正常,开始使用wiresherk分析抓包文件

查看IO graph,确保链路不忙,不忙的链路IO会有很多高低起落,峰值以及空闲间隙

进入Analyze–>Expert Info 查看不同标签下不同级别的提示信息,比如重传的统计、连接的建立和重置统计

过滤重传,发现集中在22000和22001这两个内网服务框架JSF的通信端口上

猜测是上游某个接口的服务异常或者通信异常,点击某个note查看详情,或者回到控制面板,输入tcp.analysis.retransmission过滤再点击查看详情

大部分是DATA数据传输时发生了重传,PSH ACK报文表示开始向服务端发送数据

可以看到有很多上游接口和不同的依赖类型(比如JMQ)都有重传,说明不是某个接口的问题,应该是网络问题。使用mtr(集成了traceroute、ping、nslookup的功能)来检查下路径上的互联地址延迟和丢包情况,发现中间某一跳丢包率为16.7%,于是去找网络组的同事检查

补充一、Wiresherk常用操作
1、Statistics->Conversations会话统计功能,统计通信会话之间接收和发送的数据包和字节数,通过这个工具可以找出网络中哪个会话(IP地址或端口号)最占用带宽,进一步作出网络策略

2、Statistics–>Flow graph会话通信过程图形可视化,还可以看到是否有TCP的延迟包括延迟确认(Delayed ACK),服务端是否开启Nagle算法

补充二、Wiresherk的info常见提示
1、Packet size limited during capture

说明被标记的那个包没有抓全。一般是由抓包方式引起,有些操作系统中默认只抓每个帧的前96个字节
2、TCP Previous segment not captured

如果Wireshark发现后一个包的Seq大于Seq+Len,就知道中间缺失了一段,如果缺失的那段在整个网络包中找不到(排除了乱序),就会提示
3、TCP ACKed unseen segment

当Wireshark发现被Ack的那个包没被抓到,就会提示
4、TCP Out-of-Order

当Wireshark发现后一个包的Seq号小于前一个包的Seq+Len时,就会认为乱序,发出提示
5、TCP Dup ACK

当乱序或丢包发生时,接收方会收到一些Seq号比期望值大的包。没收到一个这种包就会Ack一次期望的Seq值,提现发送方
6、TCP Fast Retransmission

当发送方收到3个或以上的【TCP Dup ACK】,就意识到之前发的包可能丢了,于是快速重传它
7、TCP Retransmission

如果一个包真的丢了,又没有后续包可以在接收方触发【Dup Ack】就不会快速重传,这种情况下发送方只好等到超时了再重传
8、TCP zerowindow

包种的“win”代表接收窗口的大小,当Wireshark在一个包中发现“win=0”时,就会发提示
9、TCP window Full

此提示表示这个包的发送方已经把对方所声明的接收窗口耗尽了
10、Time-to-live exceeded(Fragment reassembly time exceeded)

文章来源:www.liangsonghua.me
作者介绍:京东资深工程师-梁松华,长期关注稳定性保障、敏捷开发、JAVA高级、微服务架构

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63869.html

相关文章

  • 从一起丢包故障来谈谈 nginx 中的 tcp keep-alive

    摘要:猜测原因是一端异常关闭了连接却没有通知对端,或者通知了对端但对端没有收到。序号请求设置了超时时间为,因此发送包。之后继续测试,没有发现丢包。序号空闲分钟后,主动发起报文,关闭连接。 一、故障 showImg(https://segmentfault.com/img/bVbnJQk?w=1610&h=140); 基本架构如图所示,客户端发起 http 请求给 nginx,nginx 转发...

    Shihira 评论0 收藏0
  • 性能优化

    摘要:如果有人负责把控从相对长远些的角度设计系统的迭代,这种情况本是可以避免的优化办法只有一个就是保留主链路,旁支链路异步化。这会导致一次被动读磁盘,性能损耗会很大。 在并发量一定的情况下如何对系统响应时间进行详细分析 分析步骤1.1 在关键点位添加日志信息 -> 缩小目标范围 a) 主要函数耗时 b) 访问外部系统耗时:DB、MQ、Cache、FileSystem、RPC、HTTP等 c)...

    ideaa 评论0 收藏0
  • 性能优化

    摘要:如果有人负责把控从相对长远些的角度设计系统的迭代,这种情况本是可以避免的优化办法只有一个就是保留主链路,旁支链路异步化。这会导致一次被动读磁盘,性能损耗会很大。 在并发量一定的情况下如何对系统响应时间进行详细分析 分析步骤1.1 在关键点位添加日志信息 -> 缩小目标范围 a) 主要函数耗时 b) 访问外部系统耗时:DB、MQ、Cache、FileSystem、RPC、HTTP等 c)...

    legendmohe 评论0 收藏0
  • 性能优化

    摘要:如果有人负责把控从相对长远些的角度设计系统的迭代,这种情况本是可以避免的优化办法只有一个就是保留主链路,旁支链路异步化。这会导致一次被动读磁盘,性能损耗会很大。 在并发量一定的情况下如何对系统响应时间进行详细分析 分析步骤1.1 在关键点位添加日志信息 -> 缩小目标范围 a) 主要函数耗时 b) 访问外部系统耗时:DB、MQ、Cache、FileSystem、RPC、HTTP等 c)...

    gggggggbong 评论0 收藏0
  • 性能优化

    摘要:如果有人负责把控从相对长远些的角度设计系统的迭代,这种情况本是可以避免的优化办法只有一个就是保留主链路,旁支链路异步化。这会导致一次被动读磁盘,性能损耗会很大。 在并发量一定的情况下如何对系统响应时间进行详细分析 分析步骤1.1 在关键点位添加日志信息 -> 缩小目标范围 a) 主要函数耗时 b) 访问外部系统耗时:DB、MQ、Cache、FileSystem、RPC、HTTP等 c)...

    leanxi 评论0 收藏0

发表评论

0条评论

Batkid

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<