2019年6月21日金曜日

goquic 超入門

概要

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 件のコメント:

コメントを投稿