通过 wireshark 体验 IP 层分包
不管是 TCP 包还是 UDP 包,如果 size 太大,到了 IP 层,都会进行分包处理。
如何才算 size 太大呢?这个跟具体的网络类型有关。
以最常用的以太网为例,允许的最大包 size 为 1500 字节,也就是我们俗称的 MTU(Maximum Transmission Unit)值。
今天我们通过 Wireshark 工具,直观的感受一下 IP 层是如何对 TCP 或者 UDP 包进行分包处理的。
实验环境:两台电脑+网络互通
操作系统:Windows 或者 Linux 均可
软件:iPerf3+Wireshark
iPerf3 是一个著名的免费测试网络拥塞情况的测试软件。
我们通过 iPerf3 来给对方发送 TCP 或者 UDP 包。
iPerf3 可以在官方免费下载,下载后拷贝到两台电脑上。
其中一台电脑上使用 iPerf3 的服务端模式,命令为 iPerf3 -s -i 1 -p 10000
命令解析:-s 以服务端模式运行 -p 监听端口号 -i 报告打印时间间隔
另一台电脑则以客户端模式运行,命令为 iPerf3 -c 192.168.6.23 -b 100M -t 5 -p 10000 -u
命令解析:-c 以客户端模式运行,后面为服务端 ip 地址 -b 发包速率 -t 测试时间 -p 同上 -uUDP
大白话就是客户端每秒以 100Mbit 的速率向服务端 10000 端口发送 UDP 包,持续发送 5s。
那每个 UDP 的大小是多少呢?根据 iPerf3 的官方介绍,默认的单个 UDP 发包大小是 8K 字节
事不宜迟,我们开始动手。
首先运行 iPerf 服务端
然后启动 Wireshark,选中当前使用的网卡开始截包。Wireshark 选择在客户端或者服务端电脑都可以。
接着在另外一台电脑上运行 iPerf 客户端,此时两边电脑的 iPerf 都会开始打印收发包的情况。
5 秒后 iperf 会自动停止,此时停止 wireshark 的截包。
使用 ip 地址和端口号可以过滤出 iPerf 发送的包
此时你可能会发现一个很奇怪的现象,请看图:
上图中 UDP 包 Frame 显示的大小是 834byte,但是 udp 包的实际长度却显示的是 8192 字节,这是为何?
我们展开 IP 层信息继续看看:
猜测这个 UDP 包是一个聚合包,我们把过滤条件去掉,看看这个聚合包之前是否有其他的线索
果然,如上图红框所示,每个 UDP 包之前有五个 IP 包,每个包的大小都是 1514 字节,并且每个包后面都有 Reassembled in #XXX,意思是指该 IP 包会被组合到第 XXX 号包中,而第 XXX 号包,就是图中的显示的 UDP 包。其实这 6 个包,是 IP 层对 UDP 包进行分包得出的,上文提到过,以太网的默认的 MTU 是 1500 字节,这个其实是指数据包在 IP 层封装的最大 size 值(包含 IP 头)。我们知道,IP 头的大小固定 20 字节,也就是说,IP 的最大 payload 为 1480(1500-20),再加上帧头帧尾,发送到网络中的整个包大小不会超过 1520 字节。
回到这个例子中,由于 iPerf 发送的 UDP 包大小默认是 8192 字节,因此 IP 层将会分 6 个包(最后一个包不足 1500)进行发送(8192/1480=5 余 792),也许你有疑问,为什么上图是 5 个 ip 包而不是计算得出的 6 个?那是因为最后的 UDP 包也是 IP 包,也就是余数的不足 1500 字节的包,Wireshark 为了显示方便,把前 5 个包整合到第 6 个包中了,这就是上面提到的为何 UDP 的 Frame 大小和 UDP 包实际长度不一致的原因了。
这个可能不太好理解,我再重新表述如下:
UDP 包如果太大,到了 IP 层会进行分包处理,这些包如果被 Wireshark 截获,Wireshark 会重新把他们组成一个 UDP 包进行给用户展示。
版权声明: 本文为 InfoQ 作者【她的男人是程序员】的原创文章。
原文链接:【http://xie.infoq.cn/article/454bcde1478e135ee29c8fda2】。文章转载请联系作者。
评论