欠かせない技術TCP/IP ……ネットワークのさらなる発展
近年、LTEなどの高速なネットワークの展開とスマートフォンや様々なクラウドサービスの普及により、インターネットを流れるデータ量は急激に増大しています。私たちもスマートフォンやパソコンを用いて、日常的に様々なインターネットサービスを利用しています。今後も、新たなスマートデバイスやIoT(Internet of Things )サービスの普及、5G(第五世代移動通信システム)の商用展開などに従い、私たちの暮らしを支えていく上で、インターネットへの接続はますます欠かせないものとなっていくと考えられます。そして、そのインターネットにおいて広く利用されているのがTCP/IP (Transmission Control Protocol/Internet Protocol )と呼ばれるプロトコルです。
TCP/IPは1980年頃にその基本形が完成して以来、インターネットの普及とともに広まり、発展を続けてきました。TCP/IPが普及した要因の一つとして、ネットワークの機能を必要最小限に低減するというコンセプトが挙げられます。つまりネットワークを高機能化すると、一般的にコストが高くなる、相互接続が難しくなる、構築や保守が困難になる、といった弊害があります。このような問題を避け、シンプルなネットワークを指向したことが、TCP/IPの特長であると言えます。とは言え、時代の推移に従い利用されるアプリケーションや通信環境が変化するに従って、これらのプロトコルにも様々な改良が重ねられ、初学者にとって難しい技術となってきたこともまた事実です。
そこで本記事では、インターネットの広まりとともに急増してきたデータ量と、それに対応するために特に多くの改良が重ねられてきたTCP の輻輳( ふくそう ) 制御 について、取り上げます。
データ量増大と輻輳の発生(!) ……道路の混雑や渋滞と似た面がある
輻輳 とはネットワークの混雑を指します。つまり、インターネットなどのネットワークは多数のルータ等のネットワーク機器から構成されます。これらの機器は、有線 (光ファイバケーブル等)あるいは無線 で物理的に接続されていますが、それらの通信媒体 が単位時間当たりに伝送可能なデータ量には限りがあります。また機器自体が単位時間当たりに処理可能なデータ量にも上限があります。限界を超える量のデータがネットワークに流入すれば、ネットワーク機器のバッファ (メモリ)に蓄積するデータが増え、その容量を超えたデータは消失してしまいます。
少し分かりにくいような話ですが、ここで、パケットを車、通信経路を道路、ルータを道路標識と考えると、かなりイメージしやすくなります。車は標識に従って道路上を走っていきますが、車の数がどんどん増えていけば当然、道路は混雑していき、渋滞が発生します。車線数が増えるほど、道路のキャパシティが大きくなって混雑しにくくなりますが、それでも流入可能な交通量には限界があります。渋滞が悪化しすぎれば、車の移動時間(遅延)が大きくなり、産業や生活に大きな影響が出てしまうため、交通に制限を設けるとか、ドライバにオフピークでの移動をお願いするとか、何らかの対策が必要になります。通信ネットワークでの輻輳もこれとほとんど同じことで、すぐに輻輳の発生した箇所やその原因を特定して対策を講じることができれば話は早いのですが、特にインターネットのような多種多様な主体が関わるネットワークでは、それは現実的には不可能です。
TCP/IPが開発された頃のコンピュータネットワークでは、まだデータトラフィック量が少なかったため、輻輳といったような事象は広く認識されておらず、問題となっていませんでした。そのため、TCP/IPを含めた当時のネットワークプロトコルには特に輻輳制御機能、すなわち輻輳を抑制したり回避したりするための機能は備わっていませんでした。ですが、1980年代に入ると、ネットワーク上を流れるトラフィック量が増加してきたこともあり、「 輻輳」という課題が顕在化してきました。
そして特にTCPを用いた場合には、一旦輻輳状態に陥ると、何らかの輻輳制御を行わないことには、その状態から脱することが難しくなります。TCPでは、送出したパケットが失われた場合には、送信側端末で再送を行います。輻輳時にはデータが失われやすくなり、再送が頻発するようになります。そのため、輻輳が強まり失われるパケットが多くなるほど、さらに再送が多くなり輻輳が悪化する、という悪循環に陥ることになります。その状態が継続すれば、最悪ネットワークがダウンする輻輳崩壊 と呼ばれる事態となります(図1 ) 。
図1 輻輳崩壊
TCPによる輻輳制御 ……数々の輻輳制御アルゴリズムが生まれた
TCP/IPの進化の中でも、特に今日にいたるまで様々な手法が提案、実装されてきた重要な機能が、TCPの輻輳制御アルゴリズムです。TCPは通信の信頼性を担保するための様々な機能を備えていますが、特にネットワークの状況に応じて効率的にデータを転送する役割を担っているのが輻輳制御アルゴリズム です。輻輳制御アルゴリズムとは、その名の通り輻輳を制御するための手法です。いかに輻輳を避けつつ効率的にデータ送信量を制御するか、古くから研究が進められ、これまでに非常に多くのアルゴリズムが提案されてきました。
これまでに開発された代表的な輻輳制御アルゴリズムとその関係性を、図2 を用いて紹介します。図中では、四角い囲みが各輻輳制御アルゴリズムの名称と提案年を表します。横軸は時間軸で、右に位置するものほど新しい輻輳制御アルゴリズムであることを表します。塗りつぶしの色はフィードバック形式の違いを表し、緑色がLoss-based 、青色がDelay-based 、そして黄色がHybridを表します。Loss-based はパケットロスを、Delay-basedは遅延を、Hybridはその両方を基準に、データ送信量を更新する輻輳制御アルゴリズムです。また矢印は、データ送信量更新式の流用関係を表します。NewReno は、BBR以外のすべての輻輳制御アルゴリズムで部分的に流用されていることがわかります。CUBICはBICの改良版ですので、BICからCUBICに矢印が引かれています。YeAHは、NewRenoと、その他のアグレッシブな輻輳制御アルゴリズム(CUBIC、HighSpeed、Scalable、H-TCP )を状況に応じて使い分けます。Venoは、名前のとおりNewRenoとVegasを融合した輻輳制御アルゴリズムです。
図2 様々な輻輳制御アルゴリズム
近年提案・実装された輻輳制御アルゴリズムの中でも、CUBICおよびBBR は特に重要です。すなわち、長らく標準的に利用されていたのはReno/NewRenoでしたが、近年のネットワーク環境の変化、すなわち転送レート高速化やクラウドサービス普及などにより、ロングファットパイプと呼ばれる広帯域・高遅延環境が一般化すると、帯域利用効率が悪いという課題が出てきました。それに対してスケーラビリティ、公平性、既存アルゴリズムとの親和性といった性能を、簡単なアルゴリズムで実現するために開発されたのがCUBICであり、現在Linuxで標準搭載されるなど、主流の輻輳制御アルゴリズムの一つとなっています。
また、メモリの低価格化と通信速度向上によりスイッチやルータ等のネットワーク機器に搭載されるバッファメモリのサイズが増加し、Loss-based輻輳制御では、バッファ遅延増大によるスループット低下という新たな課題が顕在化しました。
その課題に対して新たに開発された、Delay-based輻輳制御アルゴリズムがBBRです。BBRは、Googleが2016年9月に発表して以降、Linuxカーネル4.9以降で利用可能となり、Google Cloud PlatformやYouTube等でも用いられています。
このように、輻輳制御アルゴリズムは現在でも改良が続けられている技術です。今後も、5G、IoT、自動運転など、様々な技術やサービスが普及していくことが見込まれます。そしてTCPはその様々な局面で使われる、今後も非常に重要な通信プロトコルの一つなのです。