谈谈Linux中TCP重传和抓包的分析根据研发反馈,TCP重传比较严重。主机包重传是TCP最基本的错误恢复功能。其目的是防止丢包。丢包的可能因素有很多。1、网络设备或线路故障情况:设备接口经常出现CRC数据校验错误特点:问题持续存在,经过该节点的所有数据都受到影响,受影响的服务器数量较多。2.数据路径上的突发流量导致链路拥塞。案例:专线已满导致丢包。持续时间短。更多时候是周期性的。所有经过这个节点的数据都会受到影响,影响大量的服务器。3、客户端服务器故障案例:服务器网卡故障,或性能下降特点:故障持续时间长,只影响单个设备4、服务器端服务器故障案例:服务器网卡故障特点:故障持续时间长,请求到该节点的所有数据都受到影响,受影响的服务器数量多。:突发,如果服务器有海量请求,会周期性的,所有请求到本设备(集群)的数据都可能受影响,影响大量服务器。6、代理节点或VIP性能下降案例:某负载均衡集群故障或性能下降特点:突发性、周期性。向该节点请求的所有数据都将受到影响。如果受影响的服务器数量较多,先抓包生成pcap文件,tcpdump-insdb475e5d-86-vvv-wtcp_retry.pcap,留证据很重要,注意值班组是否和网络应急响应组有相同的反馈,如果有别人的反馈,及时确认影响范围,服务器是否有一些共性,比如集中在某个数据中心,在某个下POD,或者在某台物理机上。每秒tcp重传包数。在线监控工具推荐使用tsar-淘宝系统活动报告器nstat-z-t1|grep-eTcpExtTCPSynRetrans-eTcpRetransSegs-eTcpOutSegs-eTcpInSegs使用netstat-s查看整体情况。各协议统计结果如下:ss-anti|grep-B1retrans查看重传统计,具体针对IP+端口,这里使用ss-tanl演示方便展示1.LISTEN状态:这些两个值代表最大的listenbacklog积压值,这里显示为0,实际上会取内核参数net.core.somaxconn的值2.其他状态:(1)、recv-Q:表示网络接收队列,表示接收到的数据已经接收到本地缓存了,但是有多少还没有被进程取走,如果短时间不为0,可能是半连接状态,如果接收队列Recv-Q已被阻塞,可能是拒绝服务攻击(2)、send-Q:表示网络发送队列。对方没有收到或者没有Ack的数据还在本地buffer中。如果发送队列Send-Q不能快速清空,可能有应用发送数据出包太快,或者对方接收数据包不够快,在非LISTEN状态下通常应该为0.如果不为0,则可能有问题。两个队列中应该没有数据包堆积,短非0的情况下,ulimit-a检查服务打开的文件句柄的上限。十万多就够正常了。使用ifconfig查看网卡是否有连续掉线和错误。忙,不忙链路IO会有很多起伏,高峰和空闲间隙进入Analyze-->ExpertInfo查看不同标签下不同级别的提示信息,如重传统计、连接建立和重置统计,过滤重传,发现22000和22001这两个内网服务框架JSF的通信端口,猜测是一些upstream接口服务或通信异常,点击备注查看详情,或返回控制面板输入tcp.analysis.retransmission过滤后点击查看详情。大部分是DATA数据传输时的重传。开始向服务器发送数据,可以看到有很多上游接口和不同的依赖类型(比如JMQ)有重传,说明不是某个接口的问题,应该是网络问题。使用mtr(集成了traceroute、ping、nslookup功能)查看路径上的Internet地址延迟和丢包情况,发现中间某一跳的丢包率为16.7%,于是去找同事networkgrouptocheck补充1.Wiresherk常用操作1.Statistics->Conversationssessionstatistics功能,统计通信会话之间接收和发送的数据包和字节数,通过这个工具可以找出是哪个会话(IP地址或端口号))在网络占用带宽最多的情况下,进一步制定网络策略2、Statistics-->Flowgraph会话通信过程的图形化可视化,还可以看到是否有TCP延迟包括延迟确认(DelayedACK),是否serverhasenabledtheNaglealgorithm补充2,Wiresherk'sinfocommontips1,Packetsizelimitedduringcapture表示标记的包没有捕获全部。一般是抓包方式导致的。默认情况下,某些操作系统仅捕获每个帧的前96个字节。2.TCPPrevioussegmentnotcaptured如果Wireshark发现最后一个包的Seq大于Seq+Len,就知道中间少了一个段,如果在整个网络包中都找不到丢失的段(排除out-of-sequence),会提示3.TCPACKedunseensegment。当Wireshark发现被Acked的包没有被抓到时,会提示4.TCPOut-of-Order当Wireshark发现下一个包的Seq号小于上一个包的Seq+Len时,会考虑5.TCPDupACK当发生乱序或丢包时,接收方会收到一些Seq号大于预期的数据包。如果没有收到这样的数据包,它会确认一次预期的Seq值,并退出发送方6.TCPFastRetransmission当发送方收到3个或更多的[TCPDupACK]时,它意识到之前发送的数据包可能丢失了。所以赶紧重传吧7.TCP重传如果一个包真的丢了,而且没有后续的包可以触发接收端的[DupAck],那么不会很快重传。在这种情况下,发送方必须等到超时时间到期后才能重传8.TCPzerowindow数据包中的“win”表示接收窗口的大小。当Wireshark在数据包中发现“win=0”时,它会发送提示。9.TCPwindowFull的提示,表示这个包的发送方已经向对方发送了声明的接收窗口已经耗尽10.Time-to-liveexceeded(分片重组时间超出)文章来源:www.liangsonghua.me作者简介:京东高级工程师-梁松华,长期专注稳定性保障、敏捷开发、JAVA进阶、微服务架构
