TCP重传问题的排查思路与实践,有点干货!_tcp不重传-程序员宅基地

技术标签: TCP  Java基础  

个人博客请访问 http://www.x0100.top 

1、关于TCP重传

TCP有重传是正常的机制,为了保障数据传输可靠性。只是局域网环境,网络质量有保障,因为网络问题出现重传应该极低;互联网或城域网环境,线路复杂(可以想象下城市地下管网,错综复杂的电线杆等),网络质量不好保障,重传出现概率较高。

TCP有重传,也不一定是网络层面的问题。也可能是接收端不存在,接收端receive buffer满了,应用程序有异常链接未正常关闭等等等。

2、TCP/IP相关

排查网络问题,要掌握TCP/IP原理,真相都在一个一个的数据包里。以下是和TCP重传比较关键的几个参数。

2.1 建立TCP链接时的参数

  1. #syn包重传多少次后放弃,重传间隔是2的n次方(1s,2s,4s..)

  2. net.ipv4.tcp_syn_retries

  3.  

  4. #syn ack包重传多少次后放弃

  5. net.ipv4.tcp_synack_retries

  6.  

  7. #syn包队列

  8. net.ipv4.tcp_max_syn_backlog

2.2 TCP重传类型

超时重传

在请求包发出去的时候,开启一个计时器,当计时器达到时间之后,没有收到ACK,则就进行重发请求的操作,一直重发直到达到重发上限次数或者收到ACK。

快速重传

当接收方收到的数据包是不正常的序列号,那么接收方会重复把应该收到的那一条ACK重复发送,这个时候,如果发送方收到连续3条的同一个序列号的ACK,那么就会启动快速重传机制,把这个ACK对应的发送包重新发送一次。具体可以参考: 

3、常见问题与措施

3.1单台机器或单个应用机器tcp重传

可能是链接的服务器或端口无法访问

排查思路

 
  1. 1、抓1000或者更多个tcp包

  2. # 出现2次以上seq一样的包就是发生了重传

  3. # syn包重传间隔是指数增加

  4. # 已经建立了链接的tcp重传间隔,参考RTO

  5. # 收到比较多ack重传,一般说明数据包出现乱序,seq较大的先到达了目的端,发送端收到3次sack会触发立即快速重传缺失的tcp分片。快速重传不太影响rt,但是发送窗口立即减半,会对吞吐带宽有一定影响

  6. # 云环境虚拟机,还要考虑分析宿主机的问题

  7.  

  8. sudo ss -anti |grep -B 1 retrans #重传统计

  9.  

  10. if=bond0

  11. sudo tcpdump -w /tmp/tcp.pcap -i $if -c 1000 -nn tcp 2>/dev/null

  12. sudo tcpdump -nn -r /tmp/tcp.pcap | awk '{print $3,$5,$8,$9}' | sort | uniq -c | sort -rn |sed 's/^ \{1,\}//g'|egrep -v "^1 |Request"

  13.  

  14. 2、联通性检查

  15. ping $ip

  16. nc -nvz $ip $port

  17.  

  18. 3、接收端应用程序问题排查;来源和目的抓包,wireshark分析具体是什么包丢失导致了重传

3.2 多台机器或多个应用同时tcp重传

可能是网络抖动

排查思路

  1. 1、查看网络区域埋点,查看网络设备报警,看是否有区域网络抖动

  2. 2、区域网络没问题的话。可以用常见问题:1 的方法缩小排查范围

3.3 带宽跑满

排查思路

  1. 1、查看主机监控,检查是否带宽跑满

  2. 2、检查重传联路上相关的网络设备是否有带宽跑满

3.4 不常见问题

1 网络设备端口或光模块异常等导致包checksum失败 2 网络路由收敛抖动 3 主机网络驱动有bug,网络设备有bug等

4、如何监控

使用tsar -tcp -C 可以监控到tcp的retran属性也即是重传次数。

tsar --tcp -C | sed 's/:/_/g;s/=/ /g' | xargs -n 2

感兴趣的朋友可以直接执行以下监控脚本获取tcp相关的状态监控数据,适用于open-falcon。

  1. #!/usr/bin/env bash

  2. HOSTNAME=`hostname`

  3. timestamp=`date +%s`

  4. tagapp="app=tsar.collect"

  5. data_item=""

  6. tsarcollectstring=`/opt/tsar/bin/tsar --tcp -C | sed 's/:/_/g;s/=/ /g' | xargs  -n 2 | tail -n +2|sed 's/ /|/'`

  7. for i in $tsarcollectstring

  8. do

  9. getkey=`echo $i|awk -F "|" '{print $1}'`

  10. getvalue=`echo $i|awk -F "|" '{print $2}'`

  11. tags="$tagapp"

  12. metric="tsar.collect.$getkey"

  13. metric_item="{\"endpoint\":\"${HOSTNAME}\",\"tags\":\"${tags}\",

  14.  

  15.                  \"timestamp\":${timestamp},\"metric\":\"$metric\",

  16.  

  17.                  \"value\":${getvalue},\"counterType\":\"GAUGE\",

  18.  

  19.                  \"step\":60}"

  20.  

  21. if [ "${data_item}x" = "x" ];then

  22. data_item="$metric_item"

  23. else

  24. data_item="${data_item},${metric_item}"

  25. fi

  26.  

  27. done

  28. echo "[$data_item]"

5、案例实践

1 在遇到丢包重传的机器上抓包并使用wireshark 分析该包,注意因为重传不是时刻都有的,所以抓包命令是要持续执行以便捕捉到重传的包。使用wireshark打开tcpdump的结果,在搜索框里入手tcp.analysis.retransmission 得到如下结果:

图1 表明服务端发生了三次重传动作。

2 由于包比较多,我们可以使用wireshark的追踪流功能获取重传相关的tcp流 

图二 追踪流-->TCP流 可以得到重传相关的数据包

图三 可以看出客户端和服务端的请求与应答。

3 解析重传

特别需要说明的是:

NO 67,68 client端由于某些原因没有收到正确的包数据,向server端发送dup ack,参考基础知识提到的快速重传

NO.68和NO.69之间的时间差200ms(关注time那一列,其他都是相差小于1ms),server等待超时,于是重传。

NO 73-74是client端发送了一个fin包并主动关闭连接。

这个案例仅仅发生一次,没有复现,通过抓包解析出来分析没有得到明确的结论。

6、小结

本文总结自己工作过程中遇到的TCP重传问题的解决过程 ,侧重于大致的解决问题的思路与具体的实践,理论知识偏少,大家有兴趣的可以多查阅相关文章以便深入了解tcp的工作机制。

更多精彩内容扫描下方二维码进入网站。。。。。

关注微信公众号。。。。。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wufaliang003/article/details/90664256

智能推荐

推荐系统基本认识_稀疏矩阵 树模型 神经网络-程序员宅基地

文章浏览阅读992次。太长不读版:由推荐系统带来的推荐服务基本上已经渗透到我们生活的方方面面,本文作为浅谈推荐系统的基础篇,主要从下面几个维度介绍推荐系统的相关知识:什么是推荐系统推荐系统在商业中的地位推荐系统、搜索引擎及广告的关系推荐系统的关键元素推荐系统相关的算法篇幅较长,可能大部分道友比较关心算法部分,所以重点罗列了推荐系统算法思维演进史,每类算法理论点到即止,没有提供详细细节,但给出了相关阅读资..._稀疏矩阵 树模型 神经网络

BytePS源码解析(1)-理论-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏8次。最近因为工作需要,研究了一下字节跳动开源的BytePS,虽然其名字上带有"PS"两字,但是研究后发现它其实并不是一个传统的PS架构,而是all-reduce和PS的一个融合,这个在后面会详细说。网络上有一些关于BytePS创新性的一些质疑,这个见仁见智,我个人感觉撇开创新性,BytePS的理论还是比较优雅的,另外根据初步的测试,效果也确实很不错,思路和代码都很有参考价值。因此尝试写个系列文章来记录一下,本篇是第一篇,先从BytePS的论文入手,了解它的一些理论要点。(作者水平有限,如有谬误敬..._byteps

三星最新推出的2416芯片相比2440具有压倒性的优势_三星2416缓存-程序员宅基地

文章浏览阅读983次。1. 性能:2416 主频400MHz和2440持平,但是2416是ARM926JES内核,是ARM920T的增强版本,运行速度方面比2440要快得多。2. 显示方面:2416支持2D图形加速,最高分辨率可以支持1024x768,24位真彩。同_三星2416缓存

安卓和苹果:自定义参数安装_appstore 安装应用后,传递安装参数-程序员宅基地

文章浏览阅读549次。文章目录产品需求需求分析实现方案1、安卓方案(1)渠道包(2)设备号匹配2、iOS方案(1)App Store Connect 来源分析(2)通过 SFSafariViewController 传递 cookie(3)IDFA3、设备通用方案(1)IP+UA(2)剪贴板方法限制:小结4、第三方工具优点:参考产品需求由于双十一期间要开展多渠道推广,市场运营部要求,对每个渠道下用户的安装来源做详细判断,获取每个用户的安装来源渠道,如官网、推广页面、地推人员、广告跳转、应用商店下载等多个渠道,并且追踪每个渠道_appstore 安装应用后,传递安装参数

视频跟踪——CMT算法-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏6次。*部分内容转载于http://blog.csdn.net/songrotek/article/details/47662617CMT,全称是Clustering of Static-Adaptive Correspondences for Deformable Object Tracking主要应用功能为对于物体的视觉跟踪。视频跟踪常见的方法思路可以分为三大类:第一_cmt算法

Asp.Net Mvc框架下的FckEdit控件 从客户端检测到有潜在危险的Request.Form值_"从客户端(fckeditorval=\"<p>空</p>\")中检测到有潜在危险的 request-程序员宅基地

文章浏览阅读1.9k次。从客户端(FckTextBox=" 说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击。通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。 异常详细信息: System.Web.HttpRequest_"从客户端(fckeditorval=\"空\")中检测到有潜在危险的 request.form 值。"

随便推点

如何使用mysql binlog 恢复数据_mysql8 binlog恢复-程序员宅基地

文章浏览阅读794次。如果想通过mysql的binlog恢复数据,首先要开启binlog。这里搭建一个测试的环境,了解一下mysqlbinlog是如何恢复数据库的。原理比较简单,binlog会存储mysql中变化的数据,比如你创建了一个数据库,写入了一些数据,这些都会存储在mysql的binlog中。需要恢复的时候就找到,两个位置,一个起始位置,一个结束的位置。结束的位置,一半是数据被破坏或者删除前的位置。mysql8默认已经开启了binlog。..._mysql8 binlog恢复

Java基础回顾——注解-程序员宅基地

文章浏览阅读805次,点赞17次,收藏26次。注解Annotation:是放在Java源码的类、方法、字段、参数前的一种特殊注释注释会被编译器直接忽略,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”。作用1、编译器使用的注解不会被编译进入.class文件,在编译后就被编译器扔掉了例子:@Override:让编译器检查该方法是否正确地实现了覆写;@SuppressWarnings:告诉编译器忽略此处代码产生的警告。2、由工具处理.class文件使用的注解。

To be a Minesweeper-程序员宅基地

文章浏览阅读389次,点赞19次,收藏7次。本文通过对Minecraft的Minesweeper进行测试,用c语言实现其类似的功能.

prometheus监控多个MySQL实例_prometheus 多mysql-程序员宅基地

文章浏览阅读6.1k次。之前文章介绍了prometheus、grafana、exporter的安装以及基本使用,在添加mysql监控节点的部分,使用了分离部署+环境变量的方式,如下所示:添加MySQL监控添加MySQL监控主机,这里以添加10.10.20.14为例进行说明。解压exporter压缩包。[root@localhost~]#tarxfmysqld_exporter-0.10.0...._prometheus 多mysql

大脑模型认知实验报告(脑与认知期末考核)_端脑实验报告-程序员宅基地

文章浏览阅读1k次,点赞31次,收藏24次。大脑模型认知实验报告_端脑实验报告

Error creating bean with name ‘BAdminMapper‘ defined in file [C:\Users\ASUS\Desktop\FleakMarket-mast-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏3次。项目最初是可正常运行的,我只是把一些.java文件放到(就是直接用鼠标拖动文件)其他包下,然后出现下面这个对话框Refactor后,当我重新Run‘Application’时,意外发生了!Stopping service [Tomcat]控制台报错提示如下:2021-12-24 01:14:34.511 WARN 6440 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered