当某个服务器发生数据丢包时,它们肯定是由于某种原因。我们如何来分析为什么数据包丢失。

以下是我们想要了解的情况:

  1. 一个数据包进入您计算机的网络堆栈( RX )(例如在端口 8000 上)。 在端口 8000 对应的应用程序接收之前被丢。

  2. 发送一个数据包( TX )。 在它从您的机器发出之前被丢。

本文不关注“数据包在网络传输过程丢了,让我们用 traceroute / 通过计数 TCP 重传进行诊断”(虽然这也很重要)!

怎么知道数据包是否被丢弃?

我在 Twitter 上提问,得到了非常有用的答案 “看 netstat -i !”这是我的笔记本电脑上运行得到的结果:

bork@kiwi~> sudo netstat -i
Kernel Interface table
Iface       MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0    1500 0         0      0      0 0             0      0      0      0 BMU
enp0s25    1500 0   1235101      0    242 0        745760      0      0      0 BMRU
lo        65536 0     21558      0      0 0         21558      0      0      0 LRU
nlmon0     3776 0    551262      0      0 0             0      0      0      0 ORU

看起来有一些收到的( RX )数据包在 enp0s25 (我的无线网卡)上丢失了。 但是没有 TX 包丢失。

有人也告诉我,运行 ethtool -S 会有帮助,但是我的 ethtool 没有 -S 选项。

怎么知道为什么数据包被丢弃

通过谷歌搜索,发现一个很酷的工具叫 dropwatch 。 没有现成的 Ubuntu 安装软件包,但可以通过 github 下载:

https//github.com/pavel-odintsov/drop_watch

以下是我可以编译的说明:

sudo apt-get install -y libnl-3-dev libnl-genl-3-dev binutils-dev libreadline6-dev
git clone https://github.com/pavel-odintsov/drop_watch
cd drop_watch/src
vim Makefile # comment out the -Werror argument to gcc
make

这里是输出! 它告诉我哪个内核函数丢失数据包,酷!

sudo ./dropwatch -l kas
Initalizing kallsyms db
dropwatch> start
Enabling monitoring...
Kernel monitoring activated.
Issue Ctrl-C to stop monitoring1 drops at tcp_v4_do_rcv+cd (0xffffffff81799bad)
10 drops at tcp_v4_rcv+80 (0xffffffff8179a620)
1 drops at sk_stream_kill_queues+57 (0xffffffff81729ca7)
4 drops at unix_release_sock+20e (0xffffffff817dc94e)
1 drops at igmp_rcv+e1 (0xffffffff817b4c41)
1 drops at igmp_rcv+e1 (0xffffffff817b4c41)

用perf监控丢弃的数据包

还有另一个很酷的方法,用来调试发生什么。

thomas graf 告诉我,可以使用 perf 监视 kfree_skb 事件,这将告诉你什么时候丢弃数据包(内核堆栈发生的地方):

sudo perf record -g -a -e skb:kfree_skb
sudo perf script

扩展阅读

还有这两个很酷的文章:

监控和调优Linux网络堆栈:接收数据

https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/

监控和调优Linux网络堆栈:发送数据

https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/

文档非常详细。

如果您有更好的调试数据包丢弃的方法,请在本文末留言吧,所有读者也都会感兴趣。

英文原文:https://jvns.ca/blog/2017/09/05/finding-out-where-packets-are-being-dropped/

定位服务器数据丢弃包问题相关推荐

  1. 服务器数据丢包是什么原因?服务器丢包怎么解决?

    服务器数据丢包是什么原因?服务器丢包怎么解决? 相信大家在服务器租用的使用过程中,往往会遇到数据丢包的情况,造成网站的延时或者访问打不开的情况,给用户造成了很大一些困恼,那么服务器数据丢包是什么原因造 ...

  2. 8.服务器数据抓包-微信图片

    在我们开发的时候,有时需要抓包,看一下服务器的返回数据,来校验自己请求的参数和返回的参数是否正确.当然,有时候也想抓一下别人的数据看下,比如微信.我们用 Fiddler 软件来进行抓包. 这是官网:h ...

  3. Fiddler服务器数据抓包

    1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包 ...

  4. python 处理服务器响应数据包,Python如何解析RADIUS服务器数据包?

    我试图从RADIUS服务器解析UDP数据包,我试过不同的工具,包括Scapy,Pynids和pypcap.问题是一些半径属性没有正确解码,其中一些是.这可能是什么原因?Python如何解析RADIUS ...

  5. 即时通讯下数据粘包、断包处理实例(基于CocoaAsyncSocket)

    来源:涂耀辉 www.jianshu.com/p/2e16572c9ddc 如有好文章投稿,请点击 → 这里了解详情 前言 本文旨以实例的方式,使用CocoaAsyncSocket这个框架进行数据封包 ...

  6. ios如何设置系统定位服务器,ios怎么开定位服务器

    ios怎么开定位服务器 内容精选 换一换 Linux操作系统以主机板CMOS芯片的时间作为格林尼治标准时间,再根据设置的时区来确定系统的当前时间.但是一般Windows操作系统并不如此,Windows ...

  7. 关于fi dd ler 手机抓包 网卡地址地址_一篇不错的网络数据抓包

    一,网络抓包 Android 手机抓包  adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap adb pull /sdcard/capture. ...

  8. 一篇不错的网络数据抓包

    一,网络抓包 Android 手机抓包  adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap adb pull /sdcard/capture. ...

  9. 3.机器学习—数据科学包3.2pandas基础

    pandas基础 一.pandas介绍 1.什么是pandas 2.pandas用途 3.课程内容 二.Ipython开发环境搭建 1.安装 2.新建运行环境 3.Ipython技巧 4.Ipytho ...

最新文章

  1. 可综合的SystemVerilog:参数化函数/任务
  2. HarmonyOS之深入解析线程管理
  3. python爬取豆瓣电影并分析_Python爬取豆瓣电影的短评数据并进行词云分析处理
  4. leetcode164. 最大间距 借桶思想秒掉hard题
  5. mysql启动错误处理
  6. php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
  7. 网易云音乐随机歌曲调用API接口
  8. c语言程序设计 简述操作系统管理文件的方法,C语言程序设计基础实验.doc
  9. Navicat 常用快捷键
  10. android BaseAdapter多布局缓存
  11. skimage 安装和子模块
  12. 2019刚开年全球天气已“爆表” 多国极端天气打破历史纪录
  13. 如何卸载赛门铁克(Symantec)企业防病毒客户端软件SEP(Symantec Endpoint Protection)?
  14. mysql workbench画er_MySQL Workbench画ER图
  15. 综述:目标检测二十年(2001-2021)
  16. IIS不能启动的原因
  17. 简单易懂的Kubernetes(K8S)之Pod资源管理与harbor创建
  18. Android开发项目管理7宗罪之五——项目组个性文档文件的管理
  19. dfs序+线段树--青出于蓝胜于蓝
  20. iPhone开发Swift基础08 加密与安全

热门文章

  1. NSString/NSMutable字符串——韩俊强…
  2. 【mongodb系统学习之六】mongodb配置文件方式启动
  3. android 判断当前application 是在前台还是在后台
  4. 【iOS-cocos2d-X 游戏开发之十一】使用New CCSprite() CCUserDefault要注意!
  5. Linkify介绍 编辑textview超链接
  6. WebRTC的优缺点
  7. gcc/g++静态链接和动态链接解决glibc版本不兼容的问题
  8. 使用etcd的proto文件生成编译etcd client v3的c++客户端代码
  9. PCL点云库法向量显示,vtk错误“no override found for vtkActor”
  10. RxJava实现事件总线——RxBus