Slide 1

Slide 1 text

Goで作って学ぶWebSocket 渡部⿓⼀ Open Source Conference 2025 Tokyo/Spring

Slide 2

Slide 2 text

● 渡部⿓⼀ ● 仙台在住 ● 障害対応、EOL対応 ● 初OSC LT ⾃⼰紹介

Slide 3

Slide 3 text

WebSocketやってますか?

Slide 4

Slide 4 text

● お仕事でIVRのサービスをやってる ● IVRとは? ○ ⾃動⾳声応答システムのこと ○ 着信時にオペレーターの代わりに⾃動⾳声で案内を提供 ■ レストランとかの⾃動予約とかそういうサービス ○ ⾳声のやり取りをするためにWebSocketを使ったりします

Slide 5

Slide 5 text

WebSocketの特徴

Slide 6

Slide 6 text

WebSocketの特徴 ● 双⽅向通信‧全⼆重通信 ○ クライアントとサーバーの両⽅が同時にデータを送受信可能 ○ HTTPとは異なり、リクエスト‧レスポンスの概念がない ● 持続的な接続を⼀度確⽴したあとは、明⽰的に切断されるまで維持される ○ HTTPのように毎回接続を確⽴するオーバーヘッドがない ● チャットアプリとかで使われている ○ GitHub Actionsのログをリアルタイムでみれたり株価の表⽰とか

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

HTTPと全然違う!

Slide 9

Slide 9 text

⾃作しよう!

Slide 10

Slide 10 text

WebSocketを⾃作する ● RFC6445 で定義されている ● WebSocketのプロトコル概要 ○ Step1: ハンドシェイク処理 ○ Step2: フレームの解析 ○ Step3: フレームの送受信 ● OpenTelemetryでトレースとかログを最初から仕込んでいく

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

1. HandShake ● クライアントからのリクエストを受け取る ● Upgradeヘッダーを確認 ● Sec-WebSocket-Keyを取得 ○ WebSocketハンドシェイクで使⽤されるランダムな⽂字列 ● Sec-WebSocket-Acceptを⽣成 ● HTTP 101 Switching Protocols をレスポンス ● WebSocket接続を確⽴

Slide 13

Slide 13 text

1. HandShake

Slide 14

Slide 14 text

Step2: フレームの解析 ● ヘッダー解析 ○ 最初の 2バイト を読み込み、FIN フラグと Opcode を取得 ■ Opcode(オペコード)は、WebSocketフレームにおける「操作コード」のことを指す ○ Mask ビットをチェックし、ペイロード⻑を取得 ● ペイロード⻑の処理 ○ 126 の場合 → 追加の2バイト(16ビット)を読み込む ○ 127 の場合 → 追加の8バイト(64ビット)を読み込む ● マスク処理 ○ クライアントからのデータは必ずマスクされる ○ 4バイトのマスクキーを取得し、ペイロードデータを XOR でデコード ● ペイロードの読み取り ○ 取得した⻑さ分のデータを読み込む ○ マスクがある場合、復号処理を⾏う

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Step3: フレームの送受信 ● データ送信 ○ 送信者は、データをWebSocketフレームにエンコードして送信します ○ フレームは常にテキストまたはバイナリのメッセージとして送られます ○ メッセージが⻑い場合、複数のフレームに分割して送信されます ● データ受信 ○ 受信者はフレームを解析し、データを取り出します ○ WebSocketでは、各フレームの終わりが「フラグ」で⽰されるため、フレー ムが完全に送られたかを確認できます ○ 受信側はフレームを組み⽴て、完全なメッセージを取得します

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

今後の展望

Slide 21

Slide 21 text

今後の展望 ● サブプロトコルとかも実装したい ● プロトコルの中⾝まで解釈するProxyみたいなのを作ってみたい ○ NginxでもProxyはできるがTCPの通信として流すくらいでアップストリーム の間に⼊るわけではなさそう

Slide 22

Slide 22 text

まとめ

Slide 23

Slide 23 text

まとめ ● 全⼆重通信(フルデュプレックス)楽しい ● 全部で1500⾏くらいで割とシンプル ● 情報が結構豊富。WebSocketだけの本もオライリーから出ている ● Copilotとかでいい感じに先に実装されてしまっているのでスクラッチ感は薄め

Slide 24

Slide 24 text

よき双⽅向通信ライフを!

Slide 25

Slide 25 text

参考書籍 ● Websocket: Lightweight Client-Server Communications / O'Reilly Media ● Real World HTTP 第3版 / オライリー‧ジャパン ● ハイパフォーマンス ブラウザネットワーキング / オライリー‧ジャパン