github twitter email
TCP/IP とパフォーマンス
Jul 16, 2017

この文章は、ハイパフォーマンスブラウザネットワーキングを読んで、改めて TCP/IP を自分の中で整理し、パフォーマンスに関する内容を簡単にまとめたものである。 情報通信ネットワーク特論を受講しておりタイミングが良かったという理由もある。

IP

IP は、パケット交換によるデータ通信網を実現するためのプロトコルである。The Internet ができる前は、Hop-by-Hop(中間ノード間)で信頼性を確保していた。TCP/IP は、経路到達性と信頼性を IP と TCP の形で分離したプロトコルスイートである。この分離により、複雑なトランスポート機能はエンドシステムだけで行えるようになった。このような設計思想は End-to-End Principle と呼ばれる。

TCP

TCP は コネクション指向であり、Go-back-N ARQ を基本とする輻輳制御プロトコルである。 コネクション指向通信とは、実際にデータをやりとりする前に、通信を確立する通信である。TCP では、three-way handshake を用いてコネクションを確立する。 シーケンス番号と確認応答番号やチェックサムを使った高品質な伝送のための再送制御は、データ通信網においては必須の機能と言え、TCP の本質的な部分ではない。TCP の本質的に重要な役割は、フロー制御輻輳制御である。 TCP は、ウィンドウによって上記2つを同時に達成している。

フロー制御

フロー制御は、受信側が処理できるペースで送信するエンドツーエンドのメカニズムである。TCP では、スライディングウィンドウでフロー制御を行う。受信側は送信側に受信ウィンドウサイズ (rwnd) を広告する。通信中は動的にウィンドウサイズを変更できる。

輻輳制御

IP では、データをパケットの単位で交換する。パケット網での輻輳とは、ネットワーク上のパケット量が許容値を超えて、パケットが正常に配送されなかったり、遅延する現象のことである。パケット交換は、実際にはルータが行う。ルータはパケット処理のために多少のバッファがある。パケット過多の場合、バッファにはパケットが累積し、これが遅延となる。また、バッファが一杯の場合、パケットは破棄される。慢性的に輻輳し、エンド間ではパケットを再送する処理をした場合、更に輻輳が悪化する。この現象は輻輳崩壊と呼ばれる。輻輳を防ぐ、または回避するためのメカニズムが輻輳制御である。TCP ではパケットロスを輻輳検知に利用して、輻輳を回避する制御を行う。

スロースタート

フロー制御だけでは、ネットワーク自体の許容量を制御できず、輻輳が起こる。通信中に、ネットワークの利用可能な帯域幅に調整する必要がある。利用可能な通信容量を推測する唯一の方法は、実際に送受信をすることである。 TCP 接続毎に輻輳ウィンドウサイズ (cwnd) を初期化し、控えめな値からスタートする。

輻輳制御アルゴリズム

スロースタート後は、ACK が帰ってくるたびにウィンドウサイズを大きくする。実際に使用されるウィンドウサイズは、min(rwnd, cwnd) である。TCP では、ウインドウサイズを指数的に増加させる。どこかのタイミングでパケットロスが発生した場合、cwnd を引き下げることで、パケットロスを最小化させる。このときに動作するウインドウサイズを調整するアルゴリズムはいくつかあり、オリジナルは TCP Reno、Linux のデフォルトは TCP CUBIC である。

TCP のパフォーマンス

主に Web ブラウジングのために考慮すべきパフォーマンス事項と Linux での設定。

ウインドウサイズ

スロースタート (initcwnd) の緩和

  • RFC 793: 1 セグメント (MSS; Ethernet だと 1500 Byte)
  • RFC 2581: 最高 4 セグメント
  • RFC 6928: 最高 10 セグメント (Linux 3.0.0)

ウインドウスケーリング (RFC 1323)

TCP の最初の仕様では、ウインドウサイズは 2^16 = 65535 Byte が最大だった。 ウインドウスケーリングオプションにより、1 GB まで引き上げることが可能になった。

sysctl net.ipv4.tcp_window_scaling

帯域幅遅延積

ウインドウサイズを考慮しない場合、最初に送信した TCP セグメントの ACK が帰ってくるまでに別の TCP セグメントを詰め込められるだけ詰め込んだ場合、ACK 待ちの時間が発生せず、理論上の最大スループットとなる。このスループットはリンク容量 [bps] と RTT [s] の積で表され、帯域幅遅延積と呼ばれる。すなわち、帯域幅遅延積よりも小さいウインドウサイズの場合、データフローは途切れることになり、パフォーマンスは悪化する。

TCP Fast Open (RFC 7413)

Three-way handshake は、TCP で必ず存在し、短い通信が大量に必要になることがある Web ブラウジングにおいてはレイテンシの大きな要因になる。TCP Fast Open は、Fast Open Cookie を用いてクライアントを識別し、2回目以降は SYN にリクエスト・レスポンスを同梱する方式である。

sysctl net.ipv4.tcp_fastopen

Slow Start Restart

Slow Start Restart は、アイドル状態のコネクションの輻輳ウインドウサイズをリセットするメカニズム。HTTP の Keep-Alive などに悪影響なので無効にした方が良い

sysctl net.ipv4.tcp_slow_start_after_idle

TCP Selective Acknowledgement

TCP は元々 Go-Back-N ARQ をベースとしたプロトコルであるが、ARQ の動作を Selective Repeat に変更できる。Selective Repeat は Go-Back-N と似ているが、途中でパケットが失われた場合、送信側は失われたパケットだけ再送する。

sysctl net.ipv4.tcp_sack

参考文献


Back to posts


comments powered by Disqus