# 网络测试

# TCP/UDP 测试

# telnet

:一个陈旧的远程登录命令。

  • 通信内容没有加密,容易被监听。因此目前不适合用于远程登录,常用于测试 TCP 端口能否连通。
  • 命令:
    $ telnet <host> [port]    # 连接到某个主机(默认采用 TCP 23 端口)
    
  • 例:
    [root@CentOS ~]# telnet baidu.com 80
    Trying 39.156.69.79...
    Connected to baidu.com.
    Escape character is '^]'.
    
    
    • 可见它成功连接到目标主机的 80 端口。此时先后按 Ctrl + ]Ctrl + D 即可终止命令。

# nmap

:一个命令行工具,用于端口扫描。

  • 安装:yum install nmap
  • 命令:
    $ nmap
          192.168.0.1               # 扫描目标主机有哪些端口可以连接
          192.168.0.1/24            # 扫描一个网段,检测有哪些可连接的主机,并扫描它们的端口
          192.168.0.1 192.168.0-5.1 # 扫描多个主机
          -p 80,443                 # 只扫描指定端口(默认扫描常用的 1000 个端口)
          -A                        # 扫描各种信息(比如推测目标主机的操作系统、版本)
    

# nc

  • netcat :一个命令行工具,于 1996 年发布,可进行简单的 TCP、UDP 通信,常用于测试端口能否连通。

    • nmap 项目开发了 ncat 命令,重新实现了 netcat 的功能。
    • 二者的命令缩写都为 nc 。
  • 安装:yum install nc

  • 命令:

    $ nc [options] [hostname] [port]
          -k        # --keep-open ,作为 TCP 服务器运行时,保持监听端口。默认接收一次连接就会终止命令
          -l        # 作为 TCP 或 UDP 服务器运行时,监听指定的端口
    
          -p <port> # 指定发送数据时,在 Socket 中 bind 的 port
          -s <IP>   # 指定发送数据时,在 Socket 中 bind 的 IP
    
          -u        # 采用 UDP 通信。默认为 TCP 通信
          -v        # --verbose
    
    • 用两个 nc 进程建立 TCP 或 UDP 连接之后,给任一个 nc 的 stdin 输入数据,都会传输到另一个 nc ,默认输出到 stdout 。
  • TCP 通信的示例:
    用 nc 监听 TCP 80 端口:

    [root@CentOS ~]# nc -klv 80
    Ncat: Version 7.50 ( https://nmap.org/ncat )
    Ncat: Listening on :::80
    Ncat: Listening on 0.0.0.0:80
    

    另开一个终端,用 nc 访问 TCP 80 端口:

    [root@CentOS ~]# nc -v 127.0.0.1 80
    Ncat: Version 7.50 ( https://nmap.org/ncat )
    Ncat: Connected to 127.0.0.1:80.
    

    同时,服务器端的 nc 的 stdout 如下:

    Ncat: Connection from 127.0.0.1.
    Ncat: Connection from 127.0.0.1:59700.
    

    执行 curl 127.0.0.1 ,服务器端的 nc 的 stdout 如下:

    Ncat: Connection from 127.0.0.1.
    Ncat: Connection from 127.0.0.1:57408.
    GET / HTTP/1.1
    User-Agent: curl/7.29.0
    Host: 127.0.0.1
    Accept: */*
    
  • UDP 通信的示例:
    用 nc 监听 UDP 80 端口:

    [root@CentOS ~]# nc -luv 80
    Ncat: Version 7.50 ( https://nmap.org/ncat )
    Ncat: Listening on :::80
    Ncat: Listening on 0.0.0.0:80
    

    另开一个终端,用 nc 访问 UDP 80 端口:

    [root@CentOS ~]# nc -uv 127.0.0.1 80
    Ncat: Version 7.50 ( https://nmap.org/ncat )
    Ncat: Connected to 127.0.0.1:80.
    
    • 此时显示的 Connected to 并不表示连接成功,因为 UDP 是无连接的,只是发送数据包,不检查是否发送成功。要看对方的终端是否收到消息。

# tcpdump

:一个网络抓包工具,可以抓取主机网络接口上收发的所有数据包。

  • 命令:

    tcpdump
            -i lo         # 监听指定网口(默认是监听第一个以太网接口 eth0)
            -n            # 将主机名、域名显示成明确的 IP 地址
            -nn           # 将端口名显示成明确的端口号
            -v            # 显示数据包的详细信息
            -vv           # 显示数据包更详细的信息
    
            # 过滤表达式
            host 10.0.0.1       # 指定主机
            net 10.0.0.1/24     # 某个网段
            src 10.0.0.1        # 指定源地址
            dst 10.0.0.1        # 指定目的地址
            tcp                 # 指定协议
            port 80             # 指定端口
            tcp and dst port 80 # 过滤出目的端口为 80 的 tcp 数据包
    
            -c 10               # 抓取指定数量的数据包之后就停止运行
            -w dumps.pcap       # 将抓取信息保存到一个文件中
    
    • 监听 eth0 接口时,会抓取本机与其它主机通信的数据包。
    • 过滤表达式支持使用 and、or、not 运算符。
    • 可以先用 tcpdump 抓包并保存为文件,然后在 Wireshark 的 GUI 界面中分析。
  • 下例是对一次 HTTP 请求的抓包:

    [root@CentOS ~]# tcpdump -nn tcp and dst port 8000
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    13:46:14.669786 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [S], seq 2920488928, win 29200, options [mss 1424,sackOK,TS val 3983484990 ecr 0,nop,wscale 7], length 0
    13:46:14.670038 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [.], ack 174830516, win 229, options [nop,nop,TS val 3983484990 ecr 2392282894], length 0
    13:46:14.670095 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [P.], seq 0:82, ack 1, win 229, options [nop,nop,TS val 3983484990 ecr 2392282894], length 82
    13:46:14.672466 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [.], ack 18, win 229, options [nop,nop,TS val 3983484992 ecr 2392282896], length 0
    13:46:14.672591 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [.], ack 378, win 237, options [nop,nop,TS val 3983484992 ecr 2392282897], length 0
    13:46:14.672667 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [F.], seq 82, ack 378, win 237, options [nop,nop,TS val 3983484993 ecr 2392282897], length 0
    13:46:14.672805 IP 10.124.128.97.52152 > 10.124.130.12.8000: Flags [.], ack 379, win 237, options [nop,nop,TS val 3983484993 ecr 2392282897], length 0
    
    • 每行包含多个字段:时间戳 源地址 > 目的地址 Flags ... length
    • 常见的几种 TCP 数据包标志:
      [S]     # SYN 数据包
      [.]     # ACK 数据包
      [S.]    # SYN+ACK 数据包
      [P]     # PUSH 数据包
      [F]     # FIN 数据包
      [R]     # RST 数据包
      

# 网速测试

# speedtest

:一个命令行工具,用于测试本机到公网的网速,采用 Python 开发。

  • 安装:pip install speedtest-cli
  • 命令:
    speedtest-cli               # 开始测试
                  --list        # 列出所有可用的 speedtest.net 服务器
                  --server <id> # 采用指定的服务器进行测试
                  --json        # 测试结果显示成 json 格式
    
  • 例:
    [root@CentOS ~]# speedtest-cli
    Retrieving speedtest.net configuration...
    Testing from Tencent cloud computing (129.204.40.71)...   # 发现本机的公网 IP
    Retrieving speedtest.net server list...
    Selecting best server based on ping...                    # 自动选择一个延迟最低的 speedtest.net 服务器来测试
    Hosted by China Mobile Group Beijing Co.Ltd (Beijing) [1.69 km]: 50.546 ms
    Testing download speed................................................................................
    Download: 21.60 Mbit/s                                    # 下载速度
    Testing upload speed................................................................................................
    Upload: 22.35 Mbit/s                                      # 上传速度
    

# iperf

:一个命令行工具,可以作为服务端、客户端运行,从而测试任意两台主机之间的 TCP/UDP 带宽。

  • 安装:yum install iperf
  • 用法:
    • 先在一个主机上让 iperf 作为服务器运行,监听 80 端口:
      iperf -s -p 80
      
    • 然后在另一个主机上让 iperf 作为客户端运行,开始测试:
      iperf -c <服务器 IP> -p 80
      

# HTTP 测试

# ab

:一个命令行工具,原名为 Apache Benchmark 。可作为 HTTP 客户端运行,对 HTTP 服务器进行压力测试。

  • 安装:yum install httpd-tools
  • 命令:
    ab -c 100 -n 10000 <服务器 IP>    # 模拟 100 个并发数,总共发送 10000 个请求报文
    

# wrk

:一个命令行工具,用于 HTTP 压测。

  • 命令:
    wrk <服务器 IP>
        -t 12                   # 模拟的线程数
        -c 400                  # 模拟的连接数
        -d 30                   # 测试的持续时间
        -H "Connection: Close"  # 测试短连接(默认是长连接)
    
  • wrk 运行结束之后会显示测试结果,主要指标为:
    • Latency :响应时间
    • Req/Sec :每个线程每秒钟完成的请求数
    • Stdev :标准差

# Postman

:一个 GUI 工具,便于测试 HTTP 服务器的 API 。

  • 可以将测试任务导出为 C、curl、Python 等形式的代码。
  • 可以批量执行测试任务。

# Jmeter

:一个 GUI 工具,提供了通用的网络测试功能,采用 Java 开发。

  • 可作为命令行工具使用,也提供了 GUI 界面。
  • 可测试 HTTP、FTP、MQTT 等多种通信协议,可进行功能测试、性能测试。
  • 在左侧栏制定测试计划,然后点击 run 即可执行它。
  • 测试计划中可以使用定时器等多种控件,实现丰富的控制逻辑。