Google Cloud Platform の Https Load Balancer のQUICプロトコルを試してみた

#QUICプロトコルを試したい
2018年6月13日の Google Cloud Platform （ GCP ）の[ブログ](https://cloudplatform.googleblog.com/2018/06/Introducing-QUIC-support-for-HTTPS-load-balancing.html)で、HTTPS LORD BALANCING の**QUICプロトコル**のサポートが紹介されました。
GCPのHTTPS LOAD BALANCING を利用している場合、**QUICプロトコル**に対応している Chrome ブラウザを使えば、速度UPを見込めるはずです。
そこで本記事では、GCP HTTPS LORD BALANCING + Google Compute Engine ( GCE )＋ Chrome ブラウザを使って、プロトコルによるWEBブラウジング速度を比較しました。

##本記事の目的
**HTTP/1.1**、**HTTP/2**、**QUICプロトコル**のWEBブラウジング速度を比較し、**QUICプロトコルの有用性**を確認する。

##検証環境
以下の検証環境を使用しました。
◎WEBサーバ
　・ Google Compute Engine ( GCE ) 
　　- ゾーン：us-east1-b
　　- マシンタイプ：f1-micro（vCPU x 1、メモリ 0.6 GB）
　　- ディスク：標準の永続ディスク 10GB
　　- OS・ソフトウェア：CentOS7 + Apache 2.4.6 + OpenSSL 1.0.2
◎WEBブラウザ
　・ Google Chrome v67.0.3396.87
◎インターネット回線
　・so-net光（参考速度 下り:448Mbps、上り:359Mbps）
◎測定曜日・時刻
　・土曜日 21時30分前後

##お断り
本記事では[GCP](https://cloud.google.com/?hl=ja)の[GCE インスタンス作成手順](https://cloud.google.com/compute/docs/instances/create-start-instance?hl=ja)、[HTTP(S) LOAD BALANCING の作成手順](https://cloud.google.com/compute/docs/load-balancing/http/?hl=ja)は省略します。
また、CentOS7にApache 2.4.6、OpenSSL 1.0.2のインストール、検証のための設定手順も省略します。


##確認方法
###WEBブラウザに表示するファイル
WEBサーバに以下のサイズの画像ファイルと、画像ファイルをリンクしたindex.htmlファイルを置きました。
　・index.html (サイズ：174B)
　・test.png (サイズ：9KB × 1 ファイル をリンク)
　・jpegtest.jpg (サイズ：237KB × 5 ファイルをリンク = 1,185KB) 

###プロトコル設定
**HTTP/1.1**、**HTTP/2**、**QUICプロトコル**を、以下のように設定しました。

◎**HTTP/1.1**
　・**HTTP/1.1**は、HTTPS LOAD BALANCING では利用できないため、**直接WEBサーバにHTTPSでアクセスする**。

◎**HTTP/2**
　・**HTTPS LOAD BALANCING** の**QUICネゴシエーション**を**無効**とする。
　・**HTTPS LOAD BALANCING** の**バックエンドサービス**は**HTTP**とする。

◎**QUICプロトコル**
　・**HTTPS LOAD BALANCING** の**QUICネゴシエーション**を**有効**とする。
　・**HTTPS LOAD BALANCING** の**バックエンドサービス**は**HTTP**とする。


Chrome ブラウザから**"https://"**で接続し、上記３プロトコルを**５回**ずつ計測しました。WEBブラウザのキャッシュは計測前にクリアしています。

##HTTP/1.1のWEBブラウジング速度
HTTPS LOAD BALANCING では、**HTTP/1.1**の設定ができないため、**WEBサーバに直接HTTPS接続して測定**しました。

###測定結果
Chrome DevTools を使って測定します。
ネットワークタブの**protocol欄**に**"HTTP/1.1"**と表示されています。（画像は1回目のみ載せます。）

|![result_https11.png](https://qiita-image-store.s3.amazonaws.com/0/237667/7870720c-c969-ba64-025d-a1220aafa13c.png)|
|:-:|

実際の計測結果です。

| 計測 | 結果 |
|:-:|:-:|
| 1回目 | 1.92 s  |
| 2回目 | 1.71 s  |
| 3回目 | 1.70 s  |
| 4回目 | 2.37 s  |
| 5回目 | 3.60 s  |
| 平均 | 2.26 s  |


##HTTP/2のWEBブラウジング速度
###HTTPS LOAD BALANCING の設定
フロントエンドの**QUICネゴシエーション**を**"無効"**に設定して、Chrome ブラウザからhttpsで接続し測定します。

|![http2_lb_front.png](https://qiita-image-store.s3.amazonaws.com/0/237667/8c25541b-9df8-2689-0369-e7b31b295120.png)|
|:-:|

###測定結果
ネットワークタブの**protocol欄**に**"h2"**（HTTP/2）と表示されています。右下にブラウジング速度が表示されています。（画像は1回目のみ載せます。）

|![result_http2.png](https://qiita-image-store.s3.amazonaws.com/0/237667/51af1357-6195-f46d-5123-6f35ec800be2.png)|
|:-:|

実際の測定結果です。

| 計測 | 結果 |
|:-:|:-:|
| 1回目 | 945 ms  |
| 2回目 | 1.03 s  |
| 3回目 | 793 ms  |
| 4回目 | 620 ms  |
| 5回目 | 889 ms  |
| 平均 | 855.4 ms  |


##QUICプロトコルのWEBブラウジング速度
###HTTPS LOAD BALANCING の設定
フロントエンドの**QUICネゴシエーション**を**"有効"**に設定して、Chrome ブラウザからhttpsで接続し測定します。

|![QUIC_lb_front.png](https://qiita-image-store.s3.amazonaws.com/0/237667/f40ec819-7e10-0885-f0d6-8c0703d43523.png)|
|:-:|

###測定結果
ネットワークタブの**protocol欄**に**"http/2+QUIC/39"**と表示されて**QUIC プロトコル**が使用されていることがわかります。右下にブラウジング速度が表示されています。（画像は1回目のみ載せます。）

|![result_QUIC.png](https://qiita-image-store.s3.amazonaws.com/0/237667/58107e1c-ed8c-55d6-7a56-8e2021be29ff.png)|
|:-:|

実際の測定結果です。

| 計測 | 結果 |
|:-:|:-:|
| 1回目 | 907 ms  |
| 2回目 | 796 ms  |
| 3回目 | 983 ms  |
| 4回目 | 728 ms  |
| 5回目 | 798 ms  |
| 平均 | 842.4 ms  |


#結果
今回の３プロトコルの速度比較は想定通り、以下の順になりました。
　　**QUICプロトコル**(842.4 ms) ＜ **HTTP/2**(855.4 ms) ＜ **HTTP/1.1**(2.26 s)

現在、GCP の **HTTPS LOAD BALANCING** を利用しているWEBサービス・システムは、**QUICプロトコル**に対応した**Chrome ブラウザ**を使用するだけで、より高速なWEBブラウジングが期待できると考えます。（GCPの設定変更等は各自の責任において行ってください。）

#おわりに
期待通りの結果ではありましたが、**QUICプロトコル**と**HTTP/2**は微妙な差でした。しかし、**QUICプロトコル**は**UDPベース**であることから、本記事の検証より更に大量かつサイズが大きい画像をリンクしているファイルのWEBブラウジングやトラフィックが混んでいる時にその特性を活かし、有用性は更に高まると考えます。（時間ができたら検証します）