wireshark排查网络延迟问题

wireshark可以说是网络问题排查的神器,里面的功能非常多,也很实用,本篇文章就是为一次课程试验,使用wireshark排查典型的网络场景。

一 试验环境搭建

采用的主机是版本都是centos 8.5版本,ip分别为192.168.31.50和192.168.31.200

[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 8.5.2111
[root@localhost ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:cc:ff:99 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.50/24 brd 192.168.31.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::31bf:afff:c603:4fa6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[root@MiWiFi-RA72-srv wrk-master]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ed:16:d1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.200/24 brd 192.168.31.255 scope global dynamic noprefixroute ens33
       valid_lft 39956sec preferred_lft 39956sec
    inet6 fe80::20c:29ff:feed:16d1/64 scope link 
       valid_lft forever preferred_lft forever
[root@MiWiFi-RA72-srv wrk-master]#

试验环境采用docker搭建:

docker run --network=host --name=good -itd nginx
docker run --name nginx --network=host -itd feisky/nginx:latenc

验证下是否正常:

[root@localhost ~]#  curl http://192.168.31.50:8080
...
<h1>Welcome to nginx!</h1>
....
[root@localhost ~]#  curl http://192.168.31.50
...
<h1>Welcome to nginx!</h1>
....

均可正常运行,

二 开始试验

2.1 hping3 延迟测试

用hping3 测试延迟,这个两个都差不多,说明-c指定发送的包个数,-S发送SYN报文,-p指定服务器端的端口,下面跟着的是IP。

[root@MiWiFi-RA72-srv ~]# hping3  -c 3 -S -p 80 192.168.31.50 
HPING 192.168.31.50 (ens33 192.168.31.50): S set, 40 headers + 0 data bytes
len=46 ip=192.168.31.50 ttl=64 DF id=0 sport=80 flags=SA seq=0 win=29200 rtt=1.8 ms
len=46 ip=192.168.31.50 ttl=64 DF id=0 sport=80 flags=SA seq=1 win=29200 rtt=1.3 ms
len=46 ip=192.168.31.50 ttl=64 DF id=0 sport=80 flags=SA seq=2 win=29200 rtt=2.7 ms

--- 192.168.31.50 hping statistic ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.3/1.9/2.7 ms
[root@MiWiFi-RA72-srv ~]# hping3  -c 3 -S -p 8080 192.168.31.50 
HPING 192.168.31.50 (ens33 192.168.31.50): S set, 40 headers + 0 data bytes
len=46 ip=192.168.31.50 ttl=64 DF id=0 sport=8080 flags=SA seq=0 win=29200 rtt=0.6 ms
len=46 ip=192.168.31.50 ttl=64 DF id=0 sport=8080 flags=SA seq=1 win=29200 rtt=1.2 ms
len=46 ip=192.168.31.50 ttl=64 DF id=0 sport=8080 flags=SA seq=2 win=29200 rtt=2.0 ms

--- 192.168.31.50 hping statistic ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.6/1.2/2.0 ms

看了下,两个nginx的端口延迟差不多,都在2ms左右。

2.2 wrk测试应用性能

wrk的测试选项如下:

#  --latency     打印延迟统计
# -c 100 保持100个连接
# -t 4 个线程
#--timeout 2     socket请求超时时间  
 [root@MiWiFi-RA72-srv wrk-master]# wrk --latency -c 100 -t 4 --timeout 2 http://192.168.31.50/

测试80端口和8080端口:

[root@MiWiFi-RA72-srv wrk-master]# wrk --latency -c 100 -t 4 --timeout 2 http://192.168.31.50:8080/
Running 10s test @ http://192.168.31.50:8080/
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    41.64ms    6.15ms  83.39ms   96.82%
    Req/Sec   601.11     81.26     1.05k    80.00%
  Latency Distribution
     50%   42.08ms
     75%   42.69ms
     90%   43.51ms
     99%   48.09ms
  24007 requests in 10.04s, 19.48MB read
Requests/sec:   2391.46
Transfer/sec:      1.94MB
[root@MiWiFi-RA72-srv wrk-master]# 
[root@MiWiFi-RA72-srv wrk-master]# 
[root@MiWiFi-RA72-srv wrk-master]# 
[root@MiWiFi-RA72-srv wrk-master]# wrk --latency -c 100 -t 4 --timeout 2 http://192.168.31.50
Running 10s test @ http://192.168.31.50
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     5.29ms    7.57ms 105.21ms   95.68%
    Req/Sec     5.81k     2.07k   10.87k    63.66%
  Latency Distribution
     50%    3.36ms
     75%    5.91ms
     90%    9.66ms
     99%   39.66ms
  232036 requests in 10.09s, 188.76MB read
Requests/sec:  23005.97
Transfer/sec:     18.71MB

两个端口的差距还是很大的,一个Request/sec为2391个,且90%的延迟在43ms,而第二个Request/sec为2万3千多,90%的延迟在9ms左右,下面就要排查下原因。

2.3 原因排查

同样抓包,然后用wireshark打开,我们用两种方式看:通过流量图查看第一种方式,通过过滤流,然后查看”统计“里面的”流量图“。

  1. 我们先在wireshark中的列表中,右键,选择”追踪流“ 查看TCP流视图 , 然后关闭弹出窗口,这个好处是再过滤框中,自动显示过滤刚才选中的流。e8e7dd302d3db21b1afd6efba5606d5f.png

078f4ffee5dde984ef428acf1e6ff1d3.png
自动过滤流
  1. 查看流量图a9768b16fc99b4df8fce097e41c768f6.png注意勾选 限制显示过滤器,选择TCP Flow和任何地址。通过前面的时间来看,连续性没多大问题,每个包之间时间差比较小。

再看延迟大的情况:d16c502f238356b04043925dddfe21cd.png

虽然这种方式也可以看到有的延迟增大,但是还不够直观,可以采用第二种方式。

往返时间统计图

  1. 通过”统计“菜单进入到"TCP流图形” 选择“往返时间”ebbe3ed83d0452f7e85b4c0e454e6bbb.png

eee81bc22e37985c93a5c45622fc078d.png
正常的往返时间

可以很清楚的看到,延迟大的往返时间很多延迟40ms以上,而正常的延迟,大部分点都在10ms之内。

延迟确认再通过第一种方法,可以看到,延迟大的都是确认包,而这个40ms,是TCP延迟确认的最小超时时间。

延迟确认:TCP对确认的一种优化,因为如果单独发确认包,信息携带的比较少,所以不是每次收到请求立刻回复确认包,而是延迟等一会(40ms这里),然后看看是否有包需要发送,有需要发送包的情况下,直接将ACK带过去,如果没有需要发送的数据,再单独发送确认包,所以就有40ms的延迟了。

查看TCP帮助,TCP_QUICKACK ,只有TCP套接字设置了这个选项才会开启快速确认。

TCP_QUICKACK (since Linux 2.4.4)
              Enable  quickack  mode  if  set  or  disable quickack mode if cleared.  In quickack mode, acks are sent immediately, rather than delayed if
              needed in accordance to normal TCP operation.  This flag is not permanent, it only enables a switch to or from quickack  mode.   Subsequent
              operation  of  the  TCP  protocol  will  once again enter/leave quickack mode depending on internal protocol processing and factors such as
              delayed ack timeouts occurring and data transfer.  This option should not be used in code intended to be portable.

这个时间和系统时钟频率有关系,它是一个宏定义:

#define TCP_DELACK_MAX  ((unsigned)(HZ/5))
#define TCP_DELACK_MIN   ((unsigned)(HZ/25))

看下本机时钟频率:

[root@MiWiFi-RA72-srv wrk-master]# cat /boot/config-4.18.0-305.3.1.el8.x86_64 |grep 'CONFIG_HZ='
CONFIG_HZ=1000

那么,最大时间就是1000/5 =200(ms),最小延迟时间1000/25= 40(ms),关闭延迟确认:

setsockopt(sock_fd,IPPROTO_TCP,TCP_QUICKACK,(char*)&value,sizeof(int));

那么来确认下wrk是否开启了这个选项:

[root@MiWiFi-RA72-srv wrk-master]# strace -e trace=network -f  wrk --latency -c 100 -t 4 --timeout 2 http://192.168.31.50
....
strace: Process 21316 attached
strace: Process 21318 attached
strace: Process 21319 attached
Running 10s test @ http://192.168.31.50
  4 threads and 100 connections
strace: Process 21317 attached
[pid 21317] socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 8
[pid 21317] connect(8, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.31.50")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 21317] setsockopt(8, SOL_TCP, TCP_NODELAY, [1], 4) = 0
....

采用strace 跟踪所有和网络有关的系统调用,可以看到setsockopt(8, SOL_TCP, TCP_NODELAY, [1], 4)没有设置TCP_QUICKACK 。

那么问题来了,同样的命令为什么另外一个端口不会问题那。这里面仔细看报文,会发现,延迟大的时候,发送的包也在等,这就涉及到Nagle 算法(纳格算法)。

Nagle算法

Nagle 算法也是一种减少TCP小包发送数据包的一种优化算法,算法策略:1.没有发送未确认报文时候,立刻发送;2. 如果存在未确认报文,需要等到【没有已发送未确认报文】或者【数据包长度达到MSS大小】,再发送数据。

借用网上一张图表示:a32b2d4a984bf41cda0f707e740b9d5a.png启用这个算法后,如果我们通过telnet慢速敲入HELLO,刚开始要发送H,虽然包很小,但是没有需要确认的包,可以立刻发送,但是发送完毕后,由于H的确认还没有来,所以还必须等待,直到H报文的ACK报文来的,报文也积累了ELL三个字符,下面类似。不采用这个算法,可以看到,只要窗口够大,可以直接发送多个字符。

这个算法默认是开启的,关闭,可以通过设置socket 的TCP_NODELAY 选项来关闭。

TCP_NODELAY

If  set, disable the Nagle algorithm.  This means that segments are always sent as soon as possible, even if there is only a small amount of data.  When not set, data is buffered until there is a sufficient amount to send out, thereby avoiding the frequent sending of small packets, which results in poor utilization of the network.   This option is overridden by TCP_CORK; however, setting this option forces an explicit flush of pending output, even if TCP_CORK is currently set.

我们测试的nginx 是关闭的TCP_NODEAY,如下:

[root@localhost ~]# docker exec nginx cat /etc/nginx/nginx.conf|grep tcp_nodelay
    tcp_nodelay    off;

两种算法结合两种算法本来没啥问题,结合在一起的时候,就有可能导致延迟过大的问题,借用网上一位老哥的图,比较清晰的说明这个情况了:bef57df6cf9c2b37a2d926c16f99b3c9.png我们这次试验中,wrk开启了延迟确认,而有问题的Nginx的镜像开启了Nagle算法,所以导致延迟比较大,不过我们的延迟是40ms。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 阿里云盘是一款基于云端的文件存储和共享平台,用户通过上传文件到云盘,就可以在任何地方、任何时间浏览和下载这些文件。而Wireshark网络分析则是一款网络协议分析工具,可以用于捕获和分析网络数据包,以检测网络中的问题和故障。那么,在阿里云盘上进行Wireshark网络分析,可以帮助用户更好地监控和管理云盘的网络传输情况,实时了解数据传输的速度、流量、延迟等信息,以便及时调整网络策略和维护网络服务。同时,Wireshark还可以帮助用户检测网络威胁,识别恶意软件、病毒和攻击者,确保云盘的数据安全和隐私保护。 总之,阿里云盘与Wireshark网络分析结合使用,可以让用户更加深入了解和掌控云盘的网络流量,从而提高网络性能和安全性,满足用户对数据传输的要求。 ### 回答2: 阿里云盘是一款提供云存储服务的产品,而wireshark是一款网络分析工具。所谓网络分析,就是指通过网络捕获器来抓取网络通信数据,然后进行统计、分析和解释。而阿里云盘搭载wireshark网络分析,就是指用户在使用阿里云盘时,有可能会出现网络问题,需要进行调试和排查,此时可以使用wireshark网络通信进行抓包分析,以确定出现问题的具体原因。 举个例子,当用户使用阿里云盘上传、下载文件时,如果出现速度变慢或者连接断开的情况,可以使用wireshark进行抓包分析,从中找出网络连接中的瓶颈所在,比如网络延迟、带宽瓶颈等等。此外,wireshark还可以对网络通信进行详细分析,如协议分析、流量分析等,让用户对网络通信更加了解。 总之,阿里云盘搭载wireshark网络分析可以帮助用户更好地发现、诊断和解决网络连接问题,提高用户在使用云存储服务时的使用体验。 ### 回答3: 阿里云盘和 Wireshark 网络分析是两个不同的概念,它们之间并没有直接关联。 阿里云盘是阿里云推出的一款云存储服务,用户可以将自己的数据、文档、图片等存储到阿里云的服务器上,并通过互联网随时随地访问和共享。阿里云盘具备高可靠性、高可用性、高安全性等特点,受到了越来越多用户的青睐。 而 Wireshark 是一款开源的网络分析工具,可以捕获网络数据包并对其进行深入的分析Wireshark 能够监测并分析各种网络协议,如 TCP/IP、HTTP、FTP 等,从而帮助用户诊断网络故障、保障网络安全、进行网络优化等工作。 虽然阿里云盘和 Wireshark 看似没有什么关系,但在实际使用中,我们可以结合使用这两个工具。例如,当我们使用阿里云盘下载文件时,如果下载速度不够快,我们可以通过使用 Wireshark 分析网络包的情况,找出瓶颈所在,从而优化下载速度。同样地,当我们使用阿里云盘上传文件时,我们也可以使用 Wireshark 分析上传过程中的网络包,确保上传安全、可靠。总之,阿里云盘和 Wireshark 网络分析是两个不同的工具,但它们可以互相补充,为用户提供更好的云存储和网络分析体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值