28 Sep 2014, 04:59

TCP のしくみと実装という本を読んだ

TCP の仕組みを学ぶために本を一冊読んだ.

Motivation

WireShark とにらめっこをする日々が続くが, 不具合の原因を推測するためには TCP 制御の仕組みを理解する必要があると考えた.

よくわからないことが起こったとき, TCP の知識がないとまったく太刀打ちできないことがこの一ヶ月に何度もあった.

Web 上でもいくつかよくまとまっているページがあるけれども, 書籍でまとめて学ぶために読んだ.

内容について

TCP と IP がセットで一冊の本になっていることがほとんどだけれども, この本は TCP に特化しているところがよかった.

前半は, TCP についての一通りのことがコンパクトにまとめられているので, あまり時間をかけずに読むことができる.

  • バイトストリームコネクション
  • マルチプレクシング (多重化)
  • 信頼性の確保
    • ACK 応答
    • 再送制御
    • 順序制御 (シーケンス番号)
    • ウィンドウ方式
  • フロー制御
    • ウィンドウ制御

後半はかなりマニアック. TCP の実装モデルについてサンプルコードをウォークスルーで解説される. ここまで詳しい知識は必要ないので自分は読まなかった.

24 Sep 2014, 16:06

TCP の性能測定指標とその計測方法について

TCP の性能を測定する必要があるので, 性能の指標と測定方法について調べてみたまとめです.

特性を表す代表的な数値は以下.

  • 帯域幅 (bandwidth)
  • 遅延時間 (latency/RTT)
  • スループット

帯域幅 (bandwidth)

一定時間に通過できるデータ量.

Windows パフォーマンスモニタでの計測.

Windows 標準でついているツール.

BitMeter OS での計測.

Web 上で結果が見られる.

遅延時間 (latency)

デバイスに対してデータ転送などを要求してから, その結果が返送されるまでの遅延時間のこと.

インターネットにおける往復レイテンシについては ラウンドトリップタイム (Round Trip Time, RTT) とも呼ばれる.

遅延 (レイテンシ) というものは 1 パケットとその ACK (受け取ったという応答) の往復にかかる所要時間 RTT (Round-Trip-Time) で見る.

伝送経路での個々のパケットの時間遅れ. データ経路の長さ (遠さ) と考えると良い. 究極的には “距離÷光速” だけの時間遅れがある.

RTT

パケットを送信して受信した側が送信側に ACK パケットを送り, 送信側でそれを受取るまでの時間.

TCP での通信に関しては, ラウンドトリップタイムはセグメント送信と ACK 受信の間の時間を計測することによる 3 ウェイ・ハンドシェイクで計算される.

パケットを送信して受信した側が送信側に ACK パケットを送り, 送信側でそれを受取るまでの時間.

ping を利用して RTT を計測

C:\Users\tsu-nera>ping www.google.co.jp

www.google.co.jp [173.194.117.183] に ping を送信しています 32 バイトのデータ:
173.194.117.183 からの応答: バイト数 =32 時間 =11ms TTL=55
173.194.117.183 からの応答: バイト数 =32 時間 =20ms TTL=55
173.194.117.183 からの応答: バイト数 =32 時間 =10ms TTL=55
173.194.117.183 からの応答: バイト数 =32 時間 =10ms TTL=55

173.194.117.183 の ping 統計:
    パケット数: 送信 = 4, 受信 = 4, 損失 = 0 (0% の損失),
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 10ms, 最大 = 20ms, 平均 = 12ms

pathping を利用して RTT を計測

Windows のコマンド. ping をよくしたもの.

C:\Users\tsu-nera>pathping www.google.co.jp

www.google.co.jp [173.194.126.216] へのルートをトレースしています
経由するホップ数は最大 30 です:
  0  Lets-Win8 [192.168.11.7]
  1  192.168.11.1
  2  kanagawa12-3.ntt-poi.FreeBit.NET [220.150.74.5]
  3  1.74.150.220.ap.yournet.ne.jp [220.150.74.1]
  4  43.244.2.61
  5  ae0.31.TR1.B9A.FreeBit.NET [219.99.124.178]
  6  ae0.109.TR1.B9A.FreeBit.NET [219.99.88.77]
  7  210.173.176.243
  8  209.85.249.64
  9     *     72.14.232.99
 10  nrt04s07-in-f24.1e100.net [173.194.126.216]

統計を 250 秒間計算しています...
            ソースからここまで   このノード/ リンク
ホップ  RTT    損失/ 送信 = Pct  損失/ 送信 = Pct  アドレス
  0                                           Lets-Win8 [192.168.11.7]
                                0/ 100 =  0%   |
  1    5ms     0/ 100 =  0%     0/ 100 =  0%  192.168.11.1
                                0/ 100 =  0%   |
  2   11ms     0/ 100 =  0%     0/ 100 =  0%  kanagawa12-3.ntt-poi.FreeBit.NET [
220.150.74.5]
                                0/ 100 =  0%   |
  3    8ms     0/ 100 =  0%     0/ 100 =  0%  1.74.150.220.ap.yournet.ne.jp [220
.150.74.1]
                                0/ 100 =  0%   |
  4   14ms     0/ 100 =  0%     0/ 100 =  0%  43.244.2.61
                                0/ 100 =  0%   |
  5   16ms     5/ 100 =  5%     5/ 100 =  5%  ae0.31.TR1.B9A.FreeBit.NET [219.99
.124.178]
                                0/ 100 =  0%   |
  6   15ms     0/ 100 =  0%     0/ 100 =  0%  ae0.109.TR1.B9A.FreeBit.NET [219.9
9.88.77]
                                2/ 100 =  2%   |
  7   18ms     5/ 100 =  5%     3/ 100 =  3%  210.173.176.243
                                0/ 100 =  0%   |
  8   24ms     2/ 100 =  2%     0/ 100 =  0%  209.85.249.64
                                1/ 100 =  1%   |
  9  ---     100/ 100 =100%    97/ 100 = 97%  72.14.232.99
                                0/ 100 =  0%   |
 10   15ms     3/ 100 =  3%     0/ 100 =  0%  nrt04s07-in-f24.1e100.net [173.194
.126.216]

トレースを完了しました.

スループット

理論的に実現可能な TCP の最大転送速度.

スループット (bps) = TCP ウィンドウサイズ (KB) * 8 / RTT (S)

ping で RTT を調べたら, x 2 をすることを忘れない.

ウィンドウサイズが 64K バイトの場合の TCP 最大スループットの理論値は以下のとおり

RTT 1msec のとき 512Mbps
RTT 5msec のとき 102.4Mbps
RTT 10msec のとき 51.2Mbps
RTT 15msec のとき 34.1Mbps
RTT 20msec のとき 25.6Mbps
RTT 50msec のとき 10.24Mbps
RTT 100msec のとき 5.12Mbps
RTT 200msec のとき 2.56Mbps