Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Goで作って学ぶWebSocket
Search
ryuichi1208
February 22, 2025
Technology
4.4k
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
そのasync、止まってない? ”鉄板”イベントループ ブロッキング処理検出術
ryuichi1208
1
2.2k
AIでサービス運用はどう変わるのか
ryuichi1208
0
210
入門 再発防止策
ryuichi1208
17
7.8k
SREの組織構造と実践.
ryuichi1208
0
320
信頼性・システムの観測・障害対応.pdf
ryuichi1208
1
4
障害対応からの学びと体制づくり
ryuichi1208
0
1.2k
金曜日デプロイ、するかしないか.pdf
ryuichi1208
1
490
会話で作る信頼性
ryuichi1208
0
200
シグナル(Unix)と仲良くなる
ryuichi1208
1
210
Other Decks in Technology
See All in Technology
購入ドメインでの課題と取り組み
ykagano
0
150
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
450
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
210
3つのアプローチで目指す チームを強くするAI駆動開発
thkt
0
120
予測不能な実行エージェントを安全にサクッと試せるサンドボックス環境の話
sansantech
PRO
0
130
The seven pitfalls of AI (revised version)
ufried
0
280
More Freedom on the Same Shared GPU Cluster: A Small Team’s Experience with vCluster
nttcom
0
140
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
550
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
520
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
510
Codex概要
ymiya55
0
440
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.2k
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
720
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Ruling the World: When Life Gets Gamed
codingconduct
0
390
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
The agentic SEO stack - context over prompts
schlessera
0
970
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
570
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
210
KATA
mclloyd
PRO
35
16k
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版 / オライリー‧ジャパン • ハイパフォーマンス ブラウザネットワーキング / オライリー‧ジャパン