TCP 网络测试工具

最近做了一些网络性能测试的工作,对测试工作有所了解。本文简单记录下用到的工具及使用方法,工具的详细原理日后有机会再做剖析总结。

iperf3

iperf 3 是一个网络性能测试工具。可以测试udp 和 tcp 网络性能。

安装

带宽测试

iperf3 是C/S 架构模式,测试时,需同时在 server 端和 client 端分别启动。

启动 server 端

iperf3 -s -p 5201

启动 client 端

iperf3 -c 192.168.1.1 -p 5201 -t 30 -i 0.1 -f K

查看结果

Connecting to host 9.134.117.252, port 5002
[ 4] local 9.134.14.225 port 60744 connected to 9.134.117.252 port 5002
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-0.10 sec 301 KBytes 3004 KBytes/sec 3 29.0 KBytes
[ 4] 0.10-0.20 sec 185 KBytes 1847 KBytes/sec 1 19.3 KBytes
[ 4] 0.20-0.30 sec 99.3 KBytes 993 KBytes/sec 3 6.89 KBytes
[ 4] 0.30-0.40 sec 62.1 KBytes 620 KBytes/sec 3 2.76 KBytes
[ 4] 0.40-0.50 sec 49.6 KBytes 496 KBytes/sec 0 9.65 KBytes
[ 4] 0.50-0.60 sec 66.2 KBytes 662 KBytes/sec 1 9.65 KBytes
[ 4] 0.60-0.70 sec 71.7 KBytes 717 KBytes/sec 1 9.65 KBytes
[ 4] 0.70-0.80 sec 56.5 KBytes 565 KBytes/sec 4 4.14 KBytes
[ 4] 0.80-0.90 sec 57.9 KBytes 579 KBytes/sec 0 9.65 KBytes
[ 4] 0.90-1.00 sec 86.9 KBytes 869 KBytes/sec 1 6.89 KBytes
[ 4] 1.00-1.10 sec 75.8 KBytes 758 KBytes/sec 2 4.14 KBytes
[ 4] 1.10-1.20 sec 70.3 KBytes 703 KBytes/sec 0 11.0 KBytes

修改拥塞算法(linux only)

查看系统可用的拥塞算法
[root@VM_14_225_centos ~]# cat /proc/sys/net/ipv4/tcp_allowed_congestion_control
reno cubic

或者

[root@VM_14_225_centos ~]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic
查看当前使用的拥塞算法
[root@VM_14_225_centos ~]# cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
修改拥塞算法
[root@VM_14_225_centos ~]# sysctl net.ipv4.tcp_congestion_control=reno 
net.ipv4.tcp_congestion_control = reno

或者使用 iperf3 -C 参数指定

-C, --congestion <algo>   set TCP congestion control algorithm (Linux and FreeBSD only)

Traffic Control (TC)

tc 为流控工具,可以控制数据流的loss、BindWidth、rtt等。
流控脚本如下:

TC=tc
INTERFACE=eth1
FILTER_IP=192.168.0.3
TOTAL_BAND_WIDTH=400Mbit
BAND_WIDTH=40Mbit
DELAY=100ms
LOSS_RATE=0.01%

tc_start() {
# add htb queue
$TC qdisc add dev $INTERFACE root handle 1: htb default 30
# add root class
$TC class add dev $INTERFACE parent 1: classid 1:1 htb rate $TOTAL_BAND_WIDTH ceil $TOTAL_BAND_WIDTH
$TC class add dev $INTERFACE parent 1:1 classid 1:10 htb rate $BAND_WIDTH ceil $BAND_WIDTH
$TC class add dev $INTERFACE parent 1:1 classid 1:20 htb rate $TCP_BAND_WIDTH ceil $TCP_BAND_WIDTH
$TC class add dev $INTERFACE parent 1:1 classid 1:30 htb rate $TOTAL_BAND_WIDTH ceil $TOTAL_BAND_WIDTH

$TC filter add dev $INTERFACE parent 1: prio 4 protocol ip u32 match ip dst $FILTER_IP flowid 1:10
$TC filter add dev $INTERFACE parent 1: prio 4 protocol ip u32 match ip dst $TCP_FILTER_IP flowid 1:20
$TC qdisc add dev $INTERFACE parent 1:10 netem delay $DELAY loss $LOSS_RATE
$TC qdisc add dev $INTERFACE parent 1:20 netem delay $TCP_DELAY loss $TCP_LOSS_RATE
}

tc_stop() {
$TC qdisc del dev $INTERFACE root
}

tc_restart() {
tc_stop
sleep 1
tc_start
}

tc_show() {
echo ""
echo -n "Qdisc:"
#$TC qdisc show dev $INTERFACE
$TC -s qdisc show dev $INTERFACE
echo -n "Class:"
#$TC class show dev $INTERFACE
$TC -s class show dev $INTERFACE
echo -n "Filter:"
#$TC filter show dev $INTERFACE
$TC -s filter show dev $INTERFACE
echo ""
}

case "$1" in
start)
echo -n "Starting bandwidth shaping: "
tc_start
echo "done"
;;

stop)
echo -n "Stopping bandwidth shaping: "
tc_stop
echo "done"
;;

restart)
echo -n "Restarting bandwidth shaping: "
tc_restart
echo "done"
;;

show)
tc_show
;;

*)
echo "Usage: tc.sh {start|stop|restart|show}"
;;
esac

nat 表

TODO

wireshark

抓包工具

手机连接调试

使用wireshark 连接手机抓包有两种方式

  1. 手机连电脑热点后启动wireshark 抓包
  2. 通过数据线联电脑后,映射虚拟网卡进行抓包

通过数据线抓包

mac 平台映射命令如下,’uuid’ 为 iphone 手机 uuid,可在 iTunes 中查到。执行命令后,可以看到 ‘rvi0’ 即为我们需要抓包的虚拟网卡。

➜  ~ rvictl -s uuid

Starting device uuid [SUCCEEDED] with interface rvi0

如果遇到

rvictl: command not found

原因是新系统将rvictl移到了/Library/Apple/usr/bin/rvictl目录。
解决方案

打开paths 文件,`sudo vim /etc/paths`

在最后添加一行 `/Library/Apple/usr/bin/`
保存退出,重启命令行即可

自定义 lua 脚本解析私有协议

wireshark 支持自定义脚本解析私有协议。以 mac 平台为例。

  1. 编写 lua 脚本
  2. 放到 init.lua 同级目录下,mac 平台路径如下
    /Applications/Wireshark.app/Contents/Resources/share/wireshark/
  3. 打开 init.lua,在最后加载解析脚本
    dofile(DATA_DIR.."dtd_gen.lua")
  4. 保存并重启 wireshark 即可

tcpdump

参考文档

TC 流量控制
流量控制工具TC详细说明
Linux流量控制工具TC
Wireshark使用入门
Wireshark抓包iOS入门教程