0%

网络调试工具

iperf

Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;
从而能够帮助我们测试网络性能,定位网络瓶颈。

$ iperf3 -h

TCP 模式下 客户端&服务器

在您需要测试启用 Iperf 服务器模式:

$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

使用客户端模式连接第一台服务器。

$ iperf3 -c 127.0.0.1
Connecting to host 127.0.0.1, port 5201
[  4] local 127.0.0.1 port 50924 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  3.74 GBytes  32.1 Gbits/sec    0   1.12 MBytes       
[  4]   1.00-2.00   sec  3.80 GBytes  32.7 Gbits/sec    0   1.25 MBytes       
[  4]   2.00-3.00   sec  3.65 GBytes  31.3 Gbits/sec    0   1.62 MBytes     

server有类似输出:

[  5] local 127.0.0.1 port 5201 connected to 127.0.0.1 port 50924
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  3.60 GBytes  30.9 Gbits/sec                  
[  5]   1.00-2.00   sec  3.80 GBytes  32.6 Gbits/sec                  
[  5]   2.00-3.00   sec  3.65 GBytes  31.3 Gbits/sec                  
[  5]   3.00-4.00   sec  3.97 GBytes  34.1 Gbits/sec                  
[  5]   4.00-5.00   sec  3.91 GBytes  33.6 Gbits/sec                  
[  5]   5.00-6.00   sec  3.90 GBytes  33.5 Gbits/sec                  
[  5]   5.00-6.00   sec  3.90 GBytes  33.5 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-6.00   sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-6.00   sec  25.7 GBytes  36.8 Gbits/sec                  receiver
iperf3: the client has terminated
-----------------------------------------------------------
Server listening on 5201

测试 UDP 使用参数 -u

双向测试使用参数 -d

netperf

与iperf类似,也使用client/server方式工作。
server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。
在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;
在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。

  1. netperf 与网络性能测量

tcpdump

TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。
它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

tcpdump tcp port 23 host 172.16.14.107 
tcpdump -w /path/to/log -i eth0 host <CLIENTIP> and port 80

wireshark

Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。

host

用于查询DNS的工具,它通过常转换指定主机名称的主机名称为IP地址。当不指定参数时,它显示host命令的帮助信息

$ host -a www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57765
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 4

;; QUESTION SECTION:
;www.baidu.com.INANY

;; ANSWER SECTION:
www.baidu.com.459INCNAMEwww.a.shifen.com.

;; ADDITIONAL SECTION:
www.a.shifen.com.115INA115.239.211.112
www.a.shifen.com.115INA115.239.210.27
www.a.shifen.com.115INA180.97.33.108
www.a.shifen.com.115INA180.97.33.107

Received 122 bytes from 127.0.1.1#53 in 2 ms

nslookup

用于查找域名服务器的程序,nslookup有两种模式:互交和非互交

$ nslookup www.baidu.com
Server:127.0.1.1
Address:127.0.1.1#53

Non-authoritative answer:
www.baidu.comcanonical name = www.a.shifen.com.
Name:www.a.shifen.com
Address: 180.97.33.108
Name:www.a.shifen.com
Address: 180.97.33.107

$ nslookup 
> www.baidu.com
Server:127.0.1.1
Address:127.0.1.1#53

Non-authoritative answer:
www.baidu.comcanonical name = www.a.shifen.com.
Name:www.a.shifen.com
Address: 180.97.33.107
Name:www.a.shifen.com
Address: 180.97.33.108
> set all
Default server: 127.0.1.1
Address: 127.0.1.1#53

Set options:
novcnodebugnod2
searchrecurse
timeout = 0retry = 3  port = 53ndots = 1
querytype = A           class = IN
srchlist = 
> exit

dig

是一个功能类似nslookup命令的工具。能得到更详细的DNS解析报告。在使用上要比 nslookup方便。可以作为网络故障的诊断工具

必要参数:@DNSserver DNS服务器地址 (默认:/etc/resolv.conf 文件查询)

$ dig @127.0.1.1 www.baidu.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @127.0.1.1 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46874
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.INA

;; ANSWER SECTION:
www.baidu.com.817INCNAMEwww.a.shifen.com.
www.a.shifen.com.213INA115.239.210.27
www.a.shifen.com.213INA115.239.211.112

;; AUTHORITY SECTION:
a.shifen.com.1094INNSns1.a.shifen.com.
a.shifen.com.1094INNSns2.a.shifen.com.
a.shifen.com.1094INNSns5.a.shifen.com.
a.shifen.com.1094INNSns4.a.shifen.com.
a.shifen.com.1094INNSns3.a.shifen.com.

;; ADDITIONAL SECTION:
ns1.a.shifen.com.43INA61.135.165.224
ns2.a.shifen.com.274INA180.149.133.241
ns3.a.shifen.com.43INA61.135.162.215
ns4.a.shifen.com.558INA115.239.210.176
ns5.a.shifen.com.204INA119.75.222.17

;; Query time: 3 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Fri Jun 24 15:04:24 CST 2016
;; MSG SIZE  rcvd: 271

用 dig 查看反向解析

dig -x 210.52.83.228 @server

查找一个域的授权 dns 服务器

dig xmgd.com. +nssearch

从根服务器开始追踪一个域名的解析过程

dig xmgd.com +trace

netstat

netstat命令主要用于显示与IP、TCP、UDP和ICMP协议相关的统计数据及网络相关信息,例如可以用于检验本机各端口的网络连接情况。

当你想看看哪个端口被哪个程序占用了;
当你想查看TCP连接状态;当你想统计网络连接信息时,这些都可以用netstat命令来搞定,这就是netstat。

  • 列出所有端口(包括监听和未监听的)
netstat -a      # 列出所有端口
netstat -at     # 列出所有TCP端口
netstat -au     # 列出所有UDP端口
  • 列出所有处于监听状态的Sockets
netstat -l      # 只显示监听端口
netstat -lt     # 只列出所有监听TCP端口
netstat -lu     # 只列出所有监听UDP端口
netstat -lx     # 只列出所有监听UNIX端口
  • 显示所有端口的统计信息
netstat -s      # 显示所有端口的统计信息
netstat -st     # 显示TCP端口的统计信息
netstat -su     # 显示UDP端口的统计信息
  • 显示路由信息
netstat -r

netstat是一个非常强大的命令,特别是和其它命令进行结合时,更能体现出它的强大性,比如统计TCP每个连接状态的数据:

netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'

又比如查找请求数量排名前20的IP:

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

ss

ss命令用于显示socket状态.
他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等统计.
它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具

常用ss命令:

ss -l 显示本地打开的所有端口
ss -pl 显示每个进程具体打开的socket
ss -t -a 显示所有tcp socket
ss -u -a 显示所有的UDP Socekt
ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接
ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接
ss -x src /tmp/.X11-unix/* 找出所有连接X服务器的进程
ss -s 列出当前socket详细信息:

显示sockets简要信息,列出当前已经连接,关闭,等待的tcp连接

$ ss -s
Total: 1105 (kernel 0)
TCP:   201 (estab 95, closed 4, orphaned 5, synrecv 0, timewait 2/0), ports 0

Transport Total     IP        IPv6
*     0         -         -        
RAW  2         0         2        
UDP  40        27        13       
TCP  197       187       10       
INET  239       214       25       
FRAG  0         0         0        

ss使用IP地址筛选

ss src ADDRESS_PATTERN
src:表示来源
ADDRESS_PATTERN:表示地址规则

如下:
ss src 120.33.31.1 # 列出来之20.33.31.1的连接

# 列出来至120.33.31.1,80端口的连接
ss src 120.33.31.1:http
ss src 120.33.31.1:80

ss使用端口筛选

ss dport OP PORT
OP:是运算符
PORT:表示端口
dport:表示过滤目标端口、相反的有sport

OP运算符如下:

<= or le : 小于等于 >= or ge : 大于等于
== or eq : 等于
!= or ne : 不等于端口
< or lt : 小于这个端口 > or gt : 大于端口

OP实例

ss sport = :http 也可以是 ss sport = :80
ss dport = :http
ss dport \> :1024
ss sport \> :1024
ss sport \< :32000
ss sport eq :22
ss dport != :22
ss state connected sport = :http
ss \( sport = :http or sport = :https \)
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24

netem & tc

netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。
该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。
使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,
比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。

tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。
tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。

将 eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送

$  tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

将 eth0 网卡的传输设置为随机丢掉 1% 的数据包

$ tc qdisc add dev eth0 root netem loss 1%

ping

检测丢包

何判断网络是否存在丢包呢?非常简单,通过常用的「ping」命令即可:

$ ping -f <IP>

关于其中的「-f」选项,在手册中是这样解释的:

Flood ping. For every ECHO_REQUEST sent a period “.” is printed, while for ever ECHO_REPLY received a backspace is printed. This provides a rapid display of how many packets are being dropped. If interval is not given, it sets interval to zero and outputs packets as fast as they come back or one hundred times per second, whichever is more. Only the super-user may use this option with zero interval.

简单点说:发送洪水请求,每个请求打印一个点,每个响应删除一个点。
如果网络存在丢包,那么会呈现出一长串不断增加的点,简单易用,童叟无欺。

$ ping -f -i .2 www.baidu.com
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
......^C
--- www.a.shifen.com ping statistics ---
259 packets transmitted, 253 received, 2% packet loss, time 51837ms
rtt min/avg/max/mdev = 2.948/4.136/15.631/1.465 ms, ipg/ewma 200.920/4.055 ms

traceroute

通过Traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。
当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,
但基本上来说大部分时候所走的路由是相同的。
UNIX系统中,我们称之为Traceroute,MS Windows中为Tracert。
Traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。
一条路径上的每个设备Traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。

$ traceroute www.baidu.com
traceroute to www.baidu.com (115.239.210.27), 30 hops max, 60 byte packets
1  192.168.110.1 (192.168.110.1)  0.673 ms  0.653 ms  0.655 ms
2  * * *
3  192.168.3.1 (192.168.3.1)  1.267 ms  1.611 ms  1.609 ms
4  * * *
5  115.236.90.217 (115.236.90.217)  13.796 ms  13.775 ms  13.787 ms
6  220.191.159.125 (220.191.159.125)  17.639 ms 61.164.3.241 (61.164.3.241)  3.710 ms 61.164.8.45 (61.164.8.45)  3.654 ms
7  61.164.31.218 (61.164.31.218)  6.728 ms * *
8  * * *
9  115.239.209.10 (115.239.209.10)  11.003 ms 115.239.209.30 (115.239.209.30)  10.396 ms 115.239.209.14 (115.239.209.14)  11.438 ms
10  * * *
30  * * *

记录按序列号从1开始,每个纪录就是一跳,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。
探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.58.com ,表示向每个网关发送4个数据包。

有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。


  1. iperf交叉编译和 使用
  2. iperf for Linux 在TOP6410上的交叉编译和使用
  3. 网络性能测试工具iperf编译记录
  4. 域名解析之dig,host,nslookup命令