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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Masahiro
May 24, 2026
Programming
44
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
EffectDeck_KC3_2026.pdf
satomasahiro2005
0
260
part2_slides_public.pdf
satomasahiro2005
0
47
Other Decks in Programming
See All in Programming
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
9.7k
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
340
setup-vp GitLab対応の裏側
naokihaba
0
150
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
20
20k
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
170
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
100
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
410
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
120
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
260
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.1k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
530
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
340
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
480
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
390
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
550
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
The untapped power of vector embeddings
frankvandijk
2
1.9k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
290
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リクエストに 対応していない