minqを弄って memcached over quic を簡単に実装してみる

IETF QUIC

QUICの標準化がIETFで進められています。

QUICといえば既にChromeGoogleのサービスで使用されていますが、そちらはGoogle QUICであり、IETFで標準化されているものとは微妙に異なっています。

IETF QUICの方は仕様の策定の議論が重ねられるとともに、7月に行われたIETF99で幾つかの実装が持ち寄られ相互接続テストが行われている状況です。しかし、「First Implementation」に書かれている通り1-RTTのハンドシェイクにフォーカスした相互接続テストであり、HTTPマッピング, 0-RTT, Key Updateなどといった多くの機能は今回のテストの対象外でした。

現在は引き続き仕様の議論を続けるとともに、10月に行われるQUIC WGの中間会議で行われるであろう次回の接続テストに向けてテスト項目( Second Implementation Draft)の議論が行われています。

相互通信テストでは上に乗っけるプロトコルがまだ決定しておりません。
QUIC WGの一旦の目標はHTTP over QUICが目標ですが、相互通信テストではもっと簡単なプロトコルが選ばれるかもしれません。
また、DNS over QUICなども別途仕様の方は議論されています。

既存実装

既存の実装としては、QUIC WGのWikiにまとめれています。

versionにdraftと書かれているものがIETF版 QUICで、Q035などのバージョンのものはGoogle QUICの実装になります。

IETF QUICの実装の実装状況は、まだまだマチマチな状況ですが概ね「First Implementation」相当のものかと思われます。

minqを弄ってみる

IETF QUICのGo実装の一つに ekr 氏の minqがあります (ekr氏は、TLS1.3の仕様のauthorでもあります)
github.com

今回は、minqのbin以下のclient/main.go と server/main.goを弄って雑に memcached over quic ぽいものを作ってみました
(意味があるかは別として)

github.com
(中身は本当に簡易です)

minq側のREADME.mdの通り一旦セットアップして、
serverを起動してから、clientで接続しに行くと、telnetと同じ要領でsetとgetを叩くとこんな感じです
(stream 1で通信されます。同一ストリームなので順番は保証されます)

$go run ./server.go > null &

$ go run ./client.go
State changed to  3
State changed to  5
Connection established
set hoge 0 0 4
test
STORED

$ go run ./client.go
State changed to  3
State changed to  5
Connection established
get hoge
VALUE hoge 0 4
test
END

今回はお遊びですが実装が進んだらまた何かプロトコルを乗っけてみたいなと思いました。