Linux/网络

网络丢包&网络延迟排查

2020-08-12  本文已影响0人  霸体

网络问题往往都是比较复杂的,并且通常定位问题后也无能为力,只能推动相关运营商解决;

常见网络丢包的原因:

  1. 骨干网拥塞
  2. 网络链路某个交换机坏了
  3. 服务器cpu负载高,数据包到网卡后cpu不能及时处理,但是缓冲区溢出,导致丢包
  4. 服务器网卡故障

ICMP协议

ICMP是一个网络层的协议,用来测试网络的连通性,因为ICMP非传输层,所以不需要端口号,pingtraceroutemtr都使用的是ICMP协议, 这也是ping命令不能指定端口号的原因;ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6;

ICMP协议可以用来:

  1. 成功到达目标地址后,目标主机会返回确认包,从而验证联通性;
  2. 如果没有到达目标主机,中间节点会通知发送主机IP包被丢弃的原因;

ICMP协议的实现,是内嵌在IP包里的,IP包头部有固定的20个字节,如果IP包头里面协议字段设置为ICMP,则IP包的包体里是ICMP包体;

ICMP包体可以简单理解为typecontent, 有2个字节用于标识是什么类型的ICMP包,剩下的字节存储内容;ICMP的具体使用,举例如下:

ping 命令

ping命令会先发送一个 ICMP Echo Request给对端,对端接收到之后, 会返回一个ICMP Echo Reply,若没有返回,就是超时了,会认为指定的网络地址不存在。

ping能验证网络的连通性,并会统计响应时间和TTL(IP包中的Time To Live,生存周期),也可以用于查看网络丢包率;

ping -c 5 -s 1024 -i 1 baidu.com
 -c 代表发送次数 
 -s 代表包体字节数 
 -i 代表超时秒数
image.png

traceroute 命令

traceroute也是基于ICMP协议实现的。可用于打印执行主机到目标主机之前经历多少路由器。

traceroute -n baidu.com
image.png

mtr 命令

mtr命令实际是集成了tracerouteping的功能;
mtr底层首先利用traceroute计算出所有的路由器节点,然后针对每个路由器节点发送ping命令,最后对数据做了汇总和展示;

# 如果不使用任何参数 mtr会动态不停的运行
sudo mtr -c 10  -r  baidu.com
-c 代表发包数量
-r 代表生成report 等效于 --report
-w 代表使用hostname 而不是ip地址

image.png

Loss% 表示在每一跳的丢包率
Snt 每个中间设备收到的发送的报的数目(上图为400个包),MTR会同时对所有中间节点发送ICMP包进行测试。
Last 最后一个数据包往返时间(ms)
Avg 数据包往返平均时间(ms)
Best 数据包往返最小时间(ms)
Wrst 数据包往返最大时间(ms)
StDev 标准偏差。如果标准偏差越高,说明数据包在这个节点上的延时越分散。

如何分析MTR报告?

  1. 节点分析
  1. 分析丢包率时
  1. 分析网络延迟

tcpdump 命令

tcpdump本身是排查tcp/ip 网络问题的大杀器;
tcpdump可以单独使用,但结合wireshark.app 等可视化软件来使用会更加直观;
tcpdump使用本身较为复杂,可以参考相关官方文档;

这里举例说明如何使用tcpdump抓取ICMP包:

# 在目标机器监听来源机器的icmp包
tcpdump -i en7 -n -vv -p icmp and src host 10.38.160.64
# 在源机器发送ping命令 注意接收端的包大小需要+8字节 也就是1032
ping -c 1 -s 1024 10.231.59.179
image.png

参考资料


ICMP协议

网络丢包分析

网络排查工具mtr使用

上一篇 下一篇

猜你喜欢

热点阅读