hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

Wiresharkの使い方(RTTの表示方法)



1 はじめに

Wireshakで、RTT(Round Trip Time)を確認する方法を説明します。RTTとは、パケットの往復時間です。WireshakでRTTを表示するだけでは、面白くないので、送信パケットに対する応答を遅延させて、遅延の大小によってWireshakのRTTがどのように変化するのかを確認してみます。

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のeth0はNICの名前です。

                           192.168.122.0/24
client(eth0) ------------------------------------------(eth0) server
        .181                                           .216

図中のT1,T2は、tcpdumpフックポイント(パケットをキャプチャする場所)でのパケット送信時刻、受信時刻を表します。RTTはT2-T1で求めます。また、tcコマンドを使って、サーバのqdiscに対して遅延を設定します。遅延を設定することで、遅延設定なしに比べ、RTTが大きくなります。
f:id:hana_shin:20220404190937p:plain

2.2 版数

CentOS版数は、サーバ、クライアントともに下記版数です。

[root@agent ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@agent ~]# uname -r
3.10.0-1160.el7.x86_64

3 事前準備

3.1 ポート番号の開放

テストで使用するTCPの11111番ポートを開放します。なお、firewall-cmdの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# firewall-cmd --add-port=11111/tcp
success

開放したポート番号を確認します。TCPの11111番ポートが開放されたことがわかります。

[root@server ~]# firewall-cmd --list-ports
11111/tcp

3.2 遅延なしの環境でパケット採取

遅延なしの環境でパケットのやりとりを採取します。このとき、TCP/11111番ポートでやり取りするパケットだけをキャプチャします。なお、tcpdumpコマンドの使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tcpdump -i eth0 tcp port 11111 -w delay.pcap

もう1つターミナルを開いて、ncコマンドを実行します。ncコマンドの使い方は、ncコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# nc -kl 11111

lsofコマンドを実行します。ncプロセスがTCPの11111番ポートでListenしていることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -c nc -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1478 root    3u  IPv6  32320      0t0  TCP *:11111 (LISTEN)
nc      1478 root    4u  IPv4  32321      0t0  TCP *:11111 (LISTEN)

次に、クライアントでncコマンドを実行します。ncコマンドを実行すると、3 way handshakeが実行され、クライアントとサーバ間で、TCPコネクションが確立されます。なお、3 way handshakeについては、TCPコネクションの確立、解放シーケンス - hana_shinのLinux技術ブログを参照してください。

[root@client ~]# nc 192.168.122.216 11111

クライアントからサーバにパケット(12345)を送信します。改行コードも含めて6バイト送信します。

[root@client ~]# nc 192.168.122.216 11111
12345

3.3 遅延ありの環境(50ms秒)でパケット採取

サーバ側で遅延を設定します。設定する遅延は50msです。

[root@server ~]# tc qdisc add dev eth0 root netem delay 50ms

qdiscの設定を確認します。50msの遅延が設定されたことがわかります。

[root@server ~]# tc qdisc show dev eth0
qdisc netem 8001: root refcnt 2 limit 1000 delay 50.0ms

クライアントからサーバにパケット(67890)を送信します。改行コードも含めて6バイト送信します。

[root@client ~]# nc 192.168.122.216 11111
12345
67890

次の設定のため、遅延設定を解除します。

[root@server ~]# tc qdisc del dev eth0 root

qdiscの設定を確認します。遅延設定が解除されたことがわかります。

[root@server ~]# tc qdisc show dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

3.4 遅延ありの環境(100ms秒)でパケット採取

サーバ側で遅延を設定します。設定する遅延は100msです。

[root@server ~]# tc qdisc add dev eth0 root netem delay 100ms

qdiscの設定を確認します。100msの遅延が設定されたことがわかります。

[root@server ~]# tc qdisc show dev eth0
qdisc netem 8002: root refcnt 2 limit 1000 delay 100.0ms

クライアントからサーバにパケット(abcde)を送信します。改行コードも含めて6バイト送信します。

[root@client ~]# nc 192.168.122.216 11111
12345
67890
abcde

次の設定のため、遅延設定を解除します。

[root@server ~]# tc qdisc del dev eth0 root

qdiscの設定を確認します。遅延設定が解除されたことがわかります。

[root@server ~]# tc qdisc show dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

3.5 遅延ありの環境(200ms秒)でパケット採取

サーバ側で遅延を設定します。設定する遅延は200msです。

[root@server ~]# tc qdisc add dev eth0 root netem delay 200ms

qdiscの設定を確認します。200msの遅延が設定されたことがわかります。

[root@server ~]# tc qdisc show dev eth0
qdisc netem 8003: root refcnt 2 limit 1000 delay 200.0ms

クライアントからサーバにパケット(xxxxx)を送信します。改行コードも含めて6バイト送信します。

[root@client ~]# nc 192.168.122.216 11111
12345
67890
abcde
xxxxx

次の設定のため、遅延設定を解除します。

[root@server ~]# tc qdisc del dev eth0 root

qdiscの設定を確認します。遅延設定が解除されたことがわかります。

[root@server ~]# tc qdisc show dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

Ctrl+Cを押下してtcpdumpコマンドを終了します。

[root@server ~]# tcpdump -i eth0 tcp port 11111 -w delay.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C11 packets captured
11 packets received by filter
0 packets dropped by kernel

delay.pcapには、以下の4種類のパケットが格納されています。
・遅延設定なしで採取したパケット
・遅延設定(50ms)ありで採取したパケット
・遅延設定(100ms)ありで採取したパケット
・遅延設定(200ms)ありで採取したパケット

4 Wiresharkでの確認方法

Wiresharkを使って、採取したdelay.pcapを参照します。以下のように「統計」->「TCPストリームグラフ」->「往復遅延時間」をクリックします。
f:id:hana_shin:20220404195657p:plain

「向きを切り替え」をクリックして、パケットの流れをクライアントからサーバに切り替えます。切り替えを実施すると、RTTが表示されます。青丸は遅延を設定していない時のRTTです。赤丸は、それぞれ、50ms,100ms,200msの遅延を設定した時のRTTです。
f:id:hana_shin:20220404201952p:plain

5 実践編

WindowsWiresharkを起動して、下記サイトからrpmパッケージをダウンロードします。
https://ftp.riken.jp/Linux/centos/7.9.2009/updates/x86_64/Packages/
今回、上記サイトからhttpd-2.4.6-97.el7.centos.1.x86_64.rpmをダウンロードしてみます。ダウンロードするファイルは何でもよいです。
f:id:hana_shin:20220404211016p:plain

受信パケットにマウスカーソルを合わせ、「統計」->「TCPストリームグラフ」->「往復遅延時間」をクリックします。下記のキャプチャ画面をみると、RTTは、およそ0.5ms秒未満であることがわかり
ます。
f:id:hana_shin:20220404211258p:plain

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ