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が大きくなります。なお、tcコマンドの使い方は、tcコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
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ストリームグラフ」->「往復遅延時間」をクリックします。
「向きを切り替え」をクリックして、パケットの流れをクライアントからサーバに切り替えます。切り替えを実施すると、RTTが表示されます。青丸は遅延を設定していない時のRTTです。赤丸は、それぞれ、50ms,100ms,200msの遅延を設定した時のRTTです。
5 実践編
WindowsでWiresharkを起動して、下記サイトから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をダウンロードしてみます。ダウンロードするファイルは何でもよいです。
受信パケットにマウスカーソルを合わせ、「統計」->「TCPストリームグラフ」->「往復遅延時間」をクリックします。下記のキャプチャ画面をみると、RTTは、およそ0.5ms秒未満であることがわかり
ます。
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ