Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

Kanazawa.rb meetup #86 に参加しました #kzrb

最近涼しくなっていよいよ秋だなあと感じるこの頃、みなさまいかがお過ごしでしょうか?今回のkzrbは意識高いもくもく会 @ DMM Games でした。

kzrb.doorkeeper.jp

ちなみに、お昼はビリヤニ(ヤギ)。

HTTP/2の学習

分かるようでよく分からないHTTP/2について以下の資料を見ながら学習していました。

tools.ietf.org

summerwind.jp

8pockets.booth.pm

HTTP/1.1には無かった概念がいくつか出てきていたのでその辺をふむふむ言いながら読んでいました。特にフレームという単位でデータを送受信するというのが特徴的でなるほどと思った部分でした。実際に手元でも確認したいなと思い、クライアント-サーバー間の通信を見てみようと思いtcpdumpで取得したデータをWiresharkで開いて確認するというのを進めていました。クライアントはHTTP/2対応のcurl、サーバーはGoで実装したものを利用しました。server.crt server.key はローカル環境で作成したものです。

package main

import (
    "io"
    "net/http"

    "golang.org/x/net/http2"
)

func main() {
    var srv http.Server
    srv.Addr = ":8080"

    http2.ConfigureServer(&srv, nil)
    http.HandleFunc("/", index)

    srv.ListenAndServeTLS("server.crt", "server.key")
}

func index(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello World! by HTTP/2")
}

*1

先ほどのソースコードをdockerビルド時にビルドし、dockerコンテナで実行できるように。

FROM golang:1.13

WORKDIR /go/src/app
COPY . .

RUN go get -d -v .
RUN go install -v .

CMD ["app"]

これらを準備してひとまずcurlでリクエストできるか確認。

# サーバー起動
% docker run --rm -p 8080:8080 --name http2-server <image>:latest

# 別のターミナルウィンドウで
% curl -v --http2 https://localhost:8080 --insecure

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=JP
*  start date: Oct 19 05:07:49 2019 GMT
*  expire date: Oct 18 05:07:49 2020 GMT
*  issuer: C=JP
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7f8e6c806800)
> GET / HTTP/2
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
< HTTP/2 200
< content-type: text/plain; charset=utf-8
< content-length: 22
< date: Mon, 21 Oct 2019 07:44:23 GMT
<
* Connection #0 to host localhost left intact
Hello World! by HTTP/2* Closing connection 0

良さげですね。で、今度はtcpdumpしてみました。以下の記事を参考にしながら。

medium.com

% docker build -t tcpdump - <<EOF 
FROM ubuntu 
RUN apt-get update && apt-get install -y tcpdump 
CMD tcpdump -i eth0 
EOF

% docker network create demo-net
# --nameを指定
% docker run --network demo-net --rm -p 8080:8080 --name http2-server server:latest
# tcpdumpで出力されるファイル置き場
% mkdir tcpdump
# tcpdump実行
% docker run --net=container:http2-server -v $(pwd)/tcpdump:/var/dump-data tcpdump tcpdump -i eth0 -w /var/dump-data/eth0.pcap

この流れで eth0.pcap ファイル生成されて、wiresharkで開くことができました。が、https://wiki.wireshark.org/HTTP2のような形式では表示されずヘッダー情報などが確認できませんでした。この辺はもう少し調べてみたいと思います。

懇親会

tabelog.com

tabelog.com

今回は5人と少人数でしたがその分濃い話で盛り上がりました。信頼の昇龍、お腹一杯であまり食べられなかったのが悔やまれます。某交差点から離れるほど良い店に当たる確率が高くなるという話を聞いてなるほどなーと思いました😇

*1:『はじめてのHTTP/2』41ページより引用