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
ws
Search
Masahiro
May 24, 2026
Programming
32
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ws
情報科学実験A第1部のスライド担当部分
Masahiro
May 24, 2026
More Decks by Masahiro
See All by Masahiro
part2_slides_public.pdf
satomasahiro2005
0
39
Other Decks in Programming
See All in Programming
Deep dive into the select statement (GopherCon UK)
jespino
0
160
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
250
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
130
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.8k
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
490
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
660
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
580
[DroidKaigi 26] How We Moved from Android Studio to Slack
thisaay
0
120
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
600
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
220
Press start. Python's next generation.
willingc
PRO
3
290
Featured
See All Featured
Balancing Empowerment & Direction
lara
6
1.3k
Amusing Abliteration
ianozsvald
1
280
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Invisible Side of Design
smashingmag
301
52k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Navigating Team Friction
lara
192
16k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
180
Technical Leadership for Architectural Decision Making
baasie
3
550
Faster Mobile Websites
deanohume
310
32k
Transcript
機能拡張:WebSocket (WebScoketはWSと略記します)
WSとは •ブラウザとサーバの間でリアルタイムな 双方向通信を行うためのプロトコル •チャットやゲームでよく採用されている •Discord, Mattermost •Slither.io, Krunker.io
HTTPとの関係 •Devtoolsで ふつうに見れる • HTTPから プロトコルを 切り替える
HTTPとの関係 •Devtoolsで ふつうに見れる • HTTPから プロトコルを 切り替える
WSにアップグレードする •GETリクエストをClient •Connection: Upgrade付きのリクエスト がくる GET / HTTP/1.1 Host: 169.254.157.182:10001
Connection: Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36 Upgrade: websocket Origin: http://169.254.157.182:10001 Sec-WebSocket-Version: 13
WSにアップグレードする •WSハンドシェイク •Sec-Websocket-Keyから Sec-Websocket-Acceptを 作って検証する Request Header Response Header Sec-WebSocket-Accept
の計算 1. クライアントから Sec-WebSocket-Key を受け取る 2. その文字列の後ろに、固定のGUIDを連結する 3. 連結した文字列を SHA-1 でハッシュする 4. SHA-1の結果を Base64 エンコードする 5. それを Sec-WebSocket-Accept として返す
•WSハンドシェイク •Sec-Websocket-Keyから Sec-Websocket-Acceptを 作って検証する Request Header Response Header WSにアップグレードする
•WSハンドシェイク •Sec-Websocket-Keyから Sec-Websocket-Acceptを 作って検証する Request Header Response Header HTTPdaemonは 計算しない
WSにアップグレードする
HTTPdaemonは何をするんだ WSdaemonがあるのか? ない
HTTPdaemonは何をするんだ WSdaemonがあるのか? •HTTPサーバとWSサーバの役割は 全然違う •WSはアプリケーション •Connection: Upgrade付きの リクエストが来たらHTTPdaemonは バックエンドにProxyするだけでいい (apache/httpdやnignx/nignxはちゃんとWSフレームを読んで色々やってる)
WSのことは WSサーバ(バックエンド)に任せよう •Sec-Websocket-Acceptの計算とか •WSフレームの解析とか •WSのサーバーはNodeとかRailsとかで 簡単に用意する •より詳しく知りたいならMDNの記事を 見るといい↓ https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
WSのことは WSサーバ(バックエンド)に任せよう •Sec-Websocket-Acceptの計算とか •WSフレームの解析とか •WSのサーバーはNodeとかRailsとかで 簡単に用意する •より詳しく知りたいならMDNの記事を 見るといい↓ https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API/Writing_WebSocket_servers HTTPサーバー
の授業だし
すること •ヘッダー解析・WebSocketの判定 •リバースプロキシの実装 •Javascript 対応(フロントエンド) •簡易チャットアプリの用意 (バックエンドWSサーバ含む)
ヘッダー解析 •ヘッダーを最初の1行だけでなく すべて(\r\n\r\nまで)読む •ヘッダーを1行ずつ見てWebSocketに 必要な値を保存する
WebSocketの判定 •メソッドがGET •Upgradeがwebsocket •Connectionにupgradeが含まれる •Sec-WebSocket-Keyが存在する •Sec-WebSocket-Versionが13 →リバースプロキシに分岐
リバースプロキシの実装 •exp1_tcp_connectで転送先サーバーに TCP接続する •ブラウザから受け取ったUpgrade リクエストを転送先へそのまま送る •selectで両方のソケットを監視し 受信したデータを反対側へsendする
JS対応 •これを足すだけ }else if(pext != NULL && strcmp(pext, ".js") ==
0){ strcpy(info->type, "application/javascript"); }
簡易チャットアプリの用意をして…… •動く
注意点 •2048byteの固定長バッファを使ってい るので大きいヘッダーに対応していない •WebSocketが開き続けるので複数接続 に対応しておく必要がある など
将来の展望? •WebSocketの実装やその他の実装が不 十分で実現することはできなかったが Mattermostのような複雑なWebアプリ をセルフホストできたらいい •というかそもそもPOSTリクエストに 対応していない