はじめに
こんにちは。京都大学大学院情報学研究科修士1年の上田蒼一朗と申します。
私はCloud Infrastructure本部NetDev部というところで、6週間のインターンシップに参加しました。本レポートでは、私のインターンシップでの取り組みである、L4ロードバランサのQUICサポートについて紹介します。
背景
LINEヤフーのプライベートクラウドはLBaaS、つまりロードバランサをサービスとして社内に提供しています。L4ロードバランサはLBaaSの中の1つで、TCPやUDPなどのトランスポート層までの情報を元にパケットを複数のサーバーに振り分けるものです。
L4ロードバランサの一部はLinuxのXDPと いう機能で実装されています。XDPとはLinuxカーネル内に実装されたパケット処理機構で、ユーザーが独自に実装したパケット処理のプログラムをカーネル内に組み込むことができます。また、XDPで組み込まれたコードは、カーネルによるパケット処理より前に実行されるため、非常に高速に動作することが特徴です。
L4ロードバランサはXDPによって図1のように動作します。まずクライアントはVIP(ロードバランサに紐付く仮想IPアドレス)宛にパケットを送信します。それをロードバランサが受け取り、5tuple(送信元と送信先のそれぞれのIPアドレス・ポート番号とプロトコル番号という5つの値)からハッシュ値を計算し、それを元に転送先サーバーを決定します。このように転送先サーバーを5tupleから決定することで、同一コネクションのパケットが同じサーバーに転送されるため、クライアント・サーバー間のコネクションを維持しています。そしてロードバランサは転送先サーバーのIPアドレスに宛てたIPヘッダを付加し(IPIP)パケットを転送します。これを受け取ったサーバーは、付加されたIPヘッダを外すことでクライアントから送られたパケットを受け取り、レスポンスとして送信元IPアドレスをVIP、送信先IPアドレスをクライアントのIPアドレスとしたパケットを返します。そのため、サーバーからクライアントへ向かうパケットは、ロードバランサを介さずに直接クライアントへ届きます(これをDirect Server Returnといいます)。
LBaaSの詳細については過去のLINE DevDayの資料でも解説されているので、ぜひご覧ください。
QUICとL4ロードバランサ
QUICとはコネクション指向のトランスポート層ネットワークプロトコルの1つです。従来使われてきたTCPと異なる点として、QUICはUDP上で通信を行い、カーネル内ではなくユーザープログラムとして実装されています。QUICはHTTPの最新のバージョンであるHTTP/3で使われており、これによりHoL(Head of Line)ブロッキングの解消や接続確立時のオーバーヘッドの低減といった効果が出ています。HTTP/3はすでにGoogleやYouTube、Instagramといったサービスで利用されており、LINEヤフーでも将来的にHTTP/3への対応を行う可能性があります(参考:LINEのAndroidアプリがSPDYからHTTP/2へ移行した話)。
QUICの大きな特徴の1つがコネクションをIDベースで管理することです。TCPではコネクションを自分と相手それぞれのIPアドレス・ポート番号、そしてプロトコル番号という計5つの値(これを5tupleと呼びます)を用いて管理します。ところがこれではコネクションの途中でクライアントのIPアドレスやポート番号が変化したときにコネクションを維持できないという問題があり ます。例えばクライアントがスマートフォンでWi-Fiからモバイル回線に切り替わったときや、コネクションの途中でしばらく通信がなかったときにNATの対応ポートが変更されたときなどにこのような事態が発生します。これに対応するため、QUICはコネクション確立時にコネクションに対してIDを発行し、これを用いてコネクションを管理します。そのため、クライアント側のIPアドレスやポートが変化しても、発行されたコネクションIDを使って通信することでコネクションを維持し続けることができます。このようにIPアドレスやポートの変更後にコネクションを維持することをコネクションマイグレーションと呼びます。
ところが現状のL4ロードバランサのアルゴリズムではQUICのコネクションマイグレーションに対応できません。なぜかというとクライアント・サーバー間でコネクションIDでコネクションを識別していても、ロードバランサはそれを考慮することなく5tupleで転送先を決定してしまうので、コネクションマイグレーション後のパケットがロードバランサによって別のサーバーに送られるようになり、コネクションが維持できなくなるという問題があります。これを解決するためにはL4ロードバランサがQUICを意識してサーバーへの転送先を決定することで、コネクションマイグレーションが起こった後でも元の転送先と同じサーバーに転送し続けることが必要です。
本インターンシップでは、将来的なL4ロードバランサのQUICのコネクションマイグレーション機能への対応のために何が必要かを調査し、実際に実装を行ってそれを実証することを目的として取り組みました。