概要
QUIC (Quick UDP Internet Connections) は UDP 上で TCP のデータのやり取りをする高速かつ安全なプロトコルです
現在も開発が進められていますが golang でとりあえず触れる環境があったので試してみました
環境
- Ubuntu 16.04 LTS (vagrant)
- cmake 3.5.1
- ninja-build 1.5.1
- gcc 5.4
- golang 1.12.6
- goquic (rev: 1e49c0fcf10725575edc12e5834bc7d003da1581)
golang インストール
wget 'https://releases.hashicorp.com/vault/1.1.3/vault_1.1.3_linux_amd64.zip'
sudo tar -C /usr/local -xzf go1.12.6.linux-amd64.tar.gz
vim ~/.bashrc
export GOPATH="/home/vagrant/go"
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
一度ログアウトして再度ログインしましょう
ビルドに必要なパッケージのインストール
sudo apt -y install cmake
sudo apt -y install ninja-build
これ以外に g++ or gcc などの C/C++ のコンパイラが必要になります
自分はすでにインストールされていたので省略しています
各種バージョンは環境のところに記載しています
ソース取得
go get -u -d github.com/devsisters/goquic
goquic はソースからビルドして動作させます
go get
で取得しましょう
ビルド
cd $GOPATH/src/github.com/devsisters/goquic
./build_libs.sh
でビルドが始まります
失敗する場合はエラー内容を見てトラブルシューティングするしかありません
自分は一発でいけたので同じ環境 (vagrant + ubuntu/xenial) なら問題なくビルドできると思います
完了すると libgoquic.a
が作成されます
ls -l lib/linux_amd64/libgoquic.a
server と client のサンプルをビルドする
実際に libgoquic.a
を使ったサンプルのサーバとクライアントがあるのでそれをビルドして使ってみます
go build $GOPATH/src/github.com/devsisters/goquic/example/server.go
go build $GOPATH/src/github.com/devsisters/goquic/example/client.go
他に reverse_proxy.go
もありますが特に使いませんでした
サーバを起動する
サーバの起動には証明書と鍵ファイルが必要になります
自分は Let’sEncrypt で取得した証明書 を使いましたが openssl や Mac であればキーチェインアクセスでも OK です
作成した証明書と鍵を指定してバイナリを実行しましょう
./server -cert fullchain.pem -key privkey.pem
これで 8080 で LISTEN したサーバが起動します
動作確認
確認方法はコマンドとブラウザでもできます
コマンドの場合は以下のように実行すれば結果が取得できます
./client -url "http://localhost:8080/numbers"
0 から 9999 までの数字が返ってくると思います
Chrome で https://192.168.99.200
にアクセスしても確認できます
証明書の警告が出ますが無視で OK です
トップページには動作確認ようのリンクが用意されています
「Numbers test」にアクセスすると先程コマンドで実行した結果と同じものがブラウザでも確認できます
「Files」はおそらくファイルの確認やダウンロードを確認するページかと思われます
デフォルトだと /tmp
の内容を表示しているのでここにファイルなどをおけばリストやダウンロードの確認ができます
flag.StringVar(&serveRoot, "root", "/tmp", "Root of path to serve under https://127.0.0.1/files/")
おまけ: curl もやってみた
ヘッダ情報を確認しやすいので curl
も実行してみました
QUIC を使っている場合ヘッダにいろいろと情報が付与されるようです
結果を貼っておきます
curl -k -sSL -D - https://localhost:8080
HTTP/1.1 200 OK
Alt-Svc: quic=":8080"; ma=86400; v="36,35,34,33,32,31,30"
Alternate-Protocol: 8080:quic
Content-Type: text/html; charset=utf-8
Trailer: AtEnd1, AtEnd2
Trailer: AtEnd3
Date: Thu, 20 Jun 2019 05:03:28 GMT
Transfer-Encoding: chunked
This HTTP response has both headers before this text and trailers at the end.<br/><a href='/numbers'>Numbers test (0~9999)</a><br/><a href='/files'>Files</a><br/>127.0.0.1:40472
Atend1: value 1
Atend2: value 2
Atend3: value 3
最後に
goquic で QUIC を使ったアプリにとりあえず触ってみました
これだけだと効果を実感することはできないので実際は QUIC を使っていない HTTP 環境と使ってる HTTP 環境で速度検証などをしたほうが良いかなと思います
golang だけではありますがサーバアプリの実装も難しそうではないので試しにチャレンジしてみるのも良いのかなと思います
0 件のコメント:
コメントを投稿