28
2016.10.06 社社社社社 LT 社社社 社社社社社社社社社社 社社社 社

再入門、サーバープッシュ技術

Embed Size (px)

Citation preview

Page 1: 再入門、サーバープッシュ技術

2016.10.06 社内勉強会 LT

再入門、サーバープッシュ技術

世嘉良 紳

Page 2: 再入門、サーバープッシュ技術

• WebSocket は、クライアントとサーバー間の双方向通信を目的として策定された通信規格• HTTP とは別の TCP に基づく独立したプロトコル• 2011.12.11 に RFC6455 で Proposed Standard ( 標準化提案 ) され Socket.IO, WS など多数の実装がある

WebSocket について再入門

Page 3: 再入門、サーバープッシュ技術

WebSocket の接続手順

HTML5 WebSocket Server and Client with GlassFish ~ Yasassri's Bloghttp://yasassriratnayake.blogspot.jp/2014/06/html5-websocket-server-and-client-with.html

Page 4: 再入門、サーバープッシュ技術

WebSocket の接続手順 (1)GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin: http://example.comSec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13

HTML5 WebSocket Server and Client with GlassFish ~ Yasassri's Bloghttp://yasassriratnayake.blogspot.jp/2014/06/html5-websocket-server-and-client-with.html

Page 5: 再入門、サーバープッシュ技術

WebSocket の接続手順 (2)HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Protocol: chatSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

HTML5 WebSocket Server and Client with GlassFish ~ Yasassri's Bloghttp://yasassriratnayake.blogspot.jp/2014/06/html5-websocket-server-and-client-with.html

Page 6: 再入門、サーバープッシュ技術

WebSocket の接続手順 (3)

HTML5 WebSocket Server and Client with GlassFish ~ Yasassri's Bloghttp://yasassriratnayake.blogspot.jp/2014/06/html5-websocket-server-and-client-with.html

Page 7: 再入門、サーバープッシュ技術

WebSocket の接続が確立するとUTF-8 形式のテキスト , バイナリのメッセージを自由に送受信できるようになる

Page 8: 再入門、サーバープッシュ技術

ハンドシェイクに着目する

• HTTP に基づくサーバ側ソフトウェアや中継点との互換性が保たれることが意図されている。• その目的のため WebSocket クライアントのハンドシェイクは HTTP Upgrade リクエストになる

RFC 6455 - The WebSocket Protocol (日本語訳) : https://triple-underscore.github.io/RFC6455-ja.html#section-1.3

Page 9: 再入門、サーバープッシュ技術

本来 HTTP はステートレスなプロトコルでクライアントの接続情報などは持たないはず…

Page 10: 再入門、サーバープッシュ技術

インターネット層IP アドレス アプリケーション層

HTTP スキームの URL

トランスポート層TCP WebSocket

メッセージを利用したなにかアプリケーション層HTTP

TCP/IP の階層モデル WebSocket の階層モデル ?

TCP/IP の再実装では…?高

低レイヤー

Page 11: 再入門、サーバープッシュ技術

• 「 Socket.IO は必要か ? 」または「 WebSocket は通るのか ? 」

 問題について 2016 年版https://blog.jxck.io/entries/2016-08-22/websocket-connectivity.html

• WebSocket には注意が必要 | プログラミング | POSThttp://postd.cc/websockets-caution-required/

• 2016 年現在、 WebSocket はおすすめできないhttp://qiita.com/yuba/items/00fc1892b296fb7b8de9

WebSocket を取り巻く環境

Page 12: 再入門、サーバープッシュ技術

インフラ方面の方々が苦しんでいる様子…

Page 13: 再入門、サーバープッシュ技術

あなたに WebSocket は必要ないかも | 未分類 | POSTDhttp://postd.cc/you-might-not-need-a-websocket/

Page 14: 再入門、サーバープッシュ技術

• W3C によって策定が進められている (2015.2.3 に W3C Recommendation)

• サーバーからのプッシュ通知を取得する EventSource インターフェースと通信に利用する EventStream データフォーマットを提供• メッセージの配信は HTTP 接続上で行われる

Server-Sent Events (SSE)

Page 15: 再入門、サーバープッシュ技術

Server-Sent Events の接続手順

EentStream/OPEN

Even

tSou

rce

EentStream/CLOSE

Push Message

Page 16: 再入門、サーバープッシュ技術

EentStream/OPEN

Even

tSou

rce

EentStream/CLOSE

Push Message

Server-Sent Events の接続手順 (1)

GET /stream HTTP/1.1Host: server.example.comAccept: text.event-stream

Page 17: 再入門、サーバープッシュ技術

EentStream/OPEN

Even

tSou

rce

EentStream/CLOSE

Push Message

Server-Sent Events の接続手順 (2)

HTTP/1.1 200 OKConnection: keep-aliveContent-Type: text:event-streamTransfer-Encoding: chunked

Page 18: 再入門、サーバープッシュ技術

Server-Sent Events の接続手順 (3)

EentStream/OPEN

Even

tSou

rce

EentStream/CLOSE

Push Message

event: event_type

data: { “message”: “JSON payload” }

Page 19: 再入門、サーバープッシュ技術

Server-Sent Events の接続手順

EentStream/OPEN

Even

tSou

rce

EentStream/CLOSE

Push Message

Page 20: 再入門、サーバープッシュ技術

メッセージの配信は単一の HTTP 接続上で行いコネクションの管理やメッセージの解析はブラウザに任せることができる

Page 21: 再入門、サーバープッシュ技術

• WebSocket とは違い HTTP ベースのため、メタデータのサイズがどうしても大きくなってしまう 例 ) User-Agent, cookie など• SSE がサポートするのは UTF-8 形式のテキストのみ• ロングポーリング ( クライアントがサーバーに対して繰り返しリクエストを送信する ) が技術のベースとなっている

なぜ流行らなかったか ?

Page 22: 再入門、サーバープッシュ技術

• 2015.5.15 に RFC7540 として proposed standard

• バイナリベースのプロトコル• HTTP/1.1 の課題を解決するための新機能

- ストリームの多重化- ストリームの優先度- ヘッダー圧縮- フロー制御

HTTP/2

Page 23: 再入門、サーバープッシュ技術

• HTTP/2 ではリクエスト / レスポンスで共通のデータは送信せずに、差分のみをやりとりする。• ヘッダーに変更がない場合はオーバーヘッドは 0 バイト• 詳細はこちら https://summerwind.jp/docs/rfc7540/#section4-3

ヘッダー圧縮

Page 24: 再入門、サーバープッシュ技術

へっだー圧縮の図?

Page 25: 再入門、サーバープッシュ技術

HTTP/2 の登場によってこれまで廃れていた (?) 技術に光が当たるかも… ?

Page 26: 再入門、サーバープッシュ技術

• WebSocket は本当にチャットのような高速なリクエスト / レスポンスが発生する場所に利用する• クライアント間での座標やイベントの同期などには   Server-Sent Event を利用する

こうなったらいいなあ的な

Page 27: 再入門、サーバープッシュ技術

• WebSocket に興味を持ちそれを取り巻く環境を調べた• サーバー / クライアント間でのメッセージの通知に  Server-Sent Event という技術があることを学んだ• HTTP/2 の登場によって Web の通信に変化が起きようとしている

まとめ

Page 28: 再入門、サーバープッシュ技術

•書籍 : ハイパフォーマンス ブラウザネットワーキング ネットワークアプリケーションのためのパフォーマンス最適化•RFC7540 日本語訳http://summerwind.jp/docs/rfc7540/

•RFC 6455 - The WebSocket Protocol ( 日本語訳 )https://triple-underscore.github.io/RFC6455-ja.html

•「 Socket.IO は必要か ? 」または「 WebSocket は通るのか ? 」問題について 2016 年版https://blog.jxck.io/entries/2016-08-22/websocket-connectivity.html

•WebSocket には注意が必要 | プログラミング | POSThttp://postd.cc/websockets-caution-required/

•2016 年現在、 WebSocket はおすすめできないhttp://qiita.com/yuba/items/00fc1892b296fb7b8de9

•あなたに WebSocket は必要ないかも | 未分類 | POSTDhttp://postd.cc/you-might-not-need-a-websocket/

•SPDY 対 WebSockets?https://www.infoq.com/jp/news/2012/06/spdy-websockets

• SPDY と WebSocket の基礎と SPDY の Push - Block Rockin’ Codeshttp://jxck.hatenablog.com/entry/20120703/1341334244

参考