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
ws
Search
Masahiro
May 24, 2026
Programming
59
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
AI駆動で「他アプリの音を加工できる」アプリを作った
satomasahiro2005
0
210
EffectDeck_KC3_2026.pdf
satomasahiro2005
0
320
part2_slides_public.pdf
satomasahiro2005
0
57
Other Decks in Programming
See All in Programming
Seven New Principles of Software Engineering
yegor256
0
460
Getting Started with Vibe Coding
miccheng
0
190
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.7k
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
360
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
140
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.2k
Distance field of Julia set
kinakomoti321
0
290
GraphQL の onError と Nullability のこれから
quramy
0
210
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
280
Moscow Python Meetup №112. Как поселить ИИ агентов в event driven архитектуре
moscowdjango
PRO
0
110
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
300
Featured
See All Featured
Done Done
chrislema
187
17k
Navigating Weather and Climate Data
rabernat
0
580
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
320
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.5k
My Coaching Mixtape
mlcsv
0
380
エンジニアに許された特別な時間の終わり
watany
109
250k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
330
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
570
A designer walks into a library…
pauljervisheath
211
25k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Everyday Curiosity
cassininazir
0
390
Code Review Best Practice
trishagee
74
20k
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リクエストに 対応していない