Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goで作って学ぶWebSocket
Search
ryuichi1208
February 22, 2025
Technology
4.3k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goで作って学ぶWebSocket
ryuichi1208
February 22, 2025
More Decks by ryuichi1208
See All by ryuichi1208
AIでサービス運用はどう変わるのか
ryuichi1208
0
170
入門 再発防止策
ryuichi1208
17
7.5k
金曜日デプロイ、するかしないか.pdf
ryuichi1208
1
78
会話で作る信頼性
ryuichi1208
0
190
シグナル(Unix)と仲良くなる
ryuichi1208
1
54
AI前提のサービス運用について再考する
ryuichi1208
6
1.5k
A Shallow Dive into the World of TCP
ryuichi1208
1
680
入門リトライ
ryuichi1208
20
8.4k
超入門SRE 2025
ryuichi1208
4
1.6k
Other Decks in Technology
See All in Technology
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
200
JavaScript 研修 (2026)
recruitengineers
PRO
0
280
タクシーアプリ『GO』の実践的データ活用〜位置情報データの収集とStreamlitでの可視化〜
mot_techtalk
2
200
Retriever と Reranker、結局どうする?
kazuaki
2
670
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
8
7.6k
Goでデータパイプラインを作ろう
sansantech
PRO
0
240
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
190
最高のシステムプロンプトを作るためにフィードバック機能を導入した話
alchemy1115
1
330
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
470
Digitization部 紹介資料
sansan33
PRO
2
7.7k
Cursor Meetup Sapporo - Cursor物語 続編
cocacola917
0
120
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
200
Java REST API Framework Comparison - PWX 2021
mraible
34
9.6k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
460
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
480
Abbi's Birthday
coloredviolet
3
9.1k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
190
Navigating Weather and Climate Data
rabernat
0
440
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Transcript
Goで作って学ぶWebSocket 渡部⿓⼀ Open Source Conference 2025 Tokyo/Spring
• 渡部⿓⼀ • 仙台在住 • 障害対応、EOL対応 • 初OSC LT ⾃⼰紹介
WebSocketやってますか?
• お仕事でIVRのサービスをやってる • IVRとは? ◦ ⾃動⾳声応答システムのこと ◦ 着信時にオペレーターの代わりに⾃動⾳声で案内を提供 ▪ レストランとかの⾃動予約とかそういうサービス
◦ ⾳声のやり取りをするためにWebSocketを使ったりします
WebSocketの特徴
WebSocketの特徴 • 双⽅向通信‧全⼆重通信 ◦ クライアントとサーバーの両⽅が同時にデータを送受信可能 ◦ HTTPとは異なり、リクエスト‧レスポンスの概念がない • 持続的な接続を⼀度確⽴したあとは、明⽰的に切断されるまで維持される ◦
HTTPのように毎回接続を確⽴するオーバーヘッドがない • チャットアプリとかで使われている ◦ GitHub Actionsのログをリアルタイムでみれたり株価の表⽰とか
None
HTTPと全然違う!
⾃作しよう!
WebSocketを⾃作する • RFC6445 で定義されている • WebSocketのプロトコル概要 ◦ Step1: ハンドシェイク処理 ◦
Step2: フレームの解析 ◦ Step3: フレームの送受信 • OpenTelemetryでトレースとかログを最初から仕込んでいく
None
1. HandShake • クライアントからのリクエストを受け取る • Upgradeヘッダーを確認 • Sec-WebSocket-Keyを取得 ◦ WebSocketハンドシェイクで使⽤されるランダムな⽂字列
• Sec-WebSocket-Acceptを⽣成 • HTTP 101 Switching Protocols をレスポンス • WebSocket接続を確⽴
1. HandShake
Step2: フレームの解析 • ヘッダー解析 ◦ 最初の 2バイト を読み込み、FIN フラグと Opcode
を取得 ▪ Opcode(オペコード)は、WebSocketフレームにおける「操作コード」のことを指す ◦ Mask ビットをチェックし、ペイロード⻑を取得 • ペイロード⻑の処理 ◦ 126 の場合 → 追加の2バイト(16ビット)を読み込む ◦ 127 の場合 → 追加の8バイト(64ビット)を読み込む • マスク処理 ◦ クライアントからのデータは必ずマスクされる ◦ 4バイトのマスクキーを取得し、ペイロードデータを XOR でデコード • ペイロードの読み取り ◦ 取得した⻑さ分のデータを読み込む ◦ マスクがある場合、復号処理を⾏う
None
None
Step3: フレームの送受信 • データ送信 ◦ 送信者は、データをWebSocketフレームにエンコードして送信します ◦ フレームは常にテキストまたはバイナリのメッセージとして送られます ◦ メッセージが⻑い場合、複数のフレームに分割して送信されます
• データ受信 ◦ 受信者はフレームを解析し、データを取り出します ◦ WebSocketでは、各フレームの終わりが「フラグ」で⽰されるため、フレー ムが完全に送られたかを確認できます ◦ 受信側はフレームを組み⽴て、完全なメッセージを取得します
None
None
今後の展望
今後の展望 • サブプロトコルとかも実装したい • プロトコルの中⾝まで解釈するProxyみたいなのを作ってみたい ◦ NginxでもProxyはできるがTCPの通信として流すくらいでアップストリーム の間に⼊るわけではなさそう
まとめ
まとめ • 全⼆重通信(フルデュプレックス)楽しい • 全部で1500⾏くらいで割とシンプル • 情報が結構豊富。WebSocketだけの本もオライリーから出ている • Copilotとかでいい感じに先に実装されてしまっているのでスクラッチ感は薄め
よき双⽅向通信ライフを!
参考書籍 • Websocket: Lightweight Client-Server Communications / O'Reilly Media •
Real World HTTP 第3版 / オライリー‧ジャパン • ハイパフォーマンス ブラウザネットワーキング / オライリー‧ジャパン