Upgrade to Pro — share decks privately, control downloads, hide ads and more …

net/httpからnet.Connを掘り起こす

Hiroya Onoe
November 29, 2023

 net/httpからnet.Connを掘り起こす

Go Conference mini 2023 Winter IN KYOTO

HTTP 通信を提供する標準ライブラリ net/http は トランスポート層(L4)以下のプロトコルを意識する必要がないように設計されています。これにより、コネクションの再利用やプールのような複雑な処理を深く考えることなく Go で HTTP 通信を利用することができます。
しかし一方で、 TCP コネクションを表す net.Conn を http.Client, Server 構造体から取り出して直接操作することが難しくなっています。例えば、リバースプロキシなどで利用される PROXY Protocol というプロトコルは、 トランスポート層(L4)プロトコルのペイロードの先頭、つまりアプリケーション層(L7)プロトコルのデータの直前で追加のデータを読み書きします。そのためこのプロトコルを Go で実装する際には、 http.Client, Server 構造体の持つ net.Conn に直接読み書きする必要があります。
こういった方法の解説はウェブ上に乏しく、 net/http や net のコードをかなり詳しく読まないと分からないのが現状です。
今回のLTでは、 net/http や net.Conn について簡単に解説しながら、HTTP の Client, Server それぞれにおいて net.Conn を取得する方法とその実用例を紹介します。

Hiroya Onoe

November 29, 2023
Tweet

More Decks by Hiroya Onoe

Other Decks in Programming

Transcript

  1. net/httpからnet.Connを 掘り起こす Go Conference mini 2023 Winter IN KYOTO 尾上

    寛弥 / Onoe Hiroya X: @hiroyanoe Slide: https://onoe.dev/gokyoto2023 1
  2. ⾃⼰紹介 尾上 寛弥 / Onoe Hiroya 京⼤情報学研究科M1 クラウド技術とかネットワークの研究してます Go歴は3年 X:

    @hiroyanoe GitHub: hiroyaonoe Website: https://onoe.dev X: @hiroyanoe Slide: https://onoe.dev/gokyoto2023 2 ↓京都なアイコン
  3. http.Client DialContextを使う func(ctx context.Context, network, addr string) (net.Conn, error) net.Connの作成⽅法を指定できるメソッド

    デフォルトではnet.Dialer{}.DialContext() X: @hiroyanoe Slide: https://onoe.dev/gokyoto2023 11 コード例: https://onoe.dev/gokyoto2023-example
  4. まとめ http.Client, Serverが持つnet.Connにアクセスする⽅法 →DialContext, ConnContextを使う context.Contextで値をやり取りする 実⽤例: HTTP通信の解析, PROXY Protocol,

    PiCoP (ちなみに)HTTP以外でもContextに詰める⽅法が使える gRPC, MySQL, MongoDB, Memcachedなど https://onoe.dev/blog/go-net-conn でHTTP, MySQLを紹介 https://github.com/picop-rd/picop-go に実装例あり X: @hiroyanoe Slide: https://onoe.dev/gokyoto2023 24