Enviar pesquisa
Carregar
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
•
8 gostaram
•
5,333 visualizações
S
shigeki_ohtsu
Seguir
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 24
Baixar agora
Baixar para ler offline
Recomendados
HTTP/2の現状とこれから
HTTP/2の現状とこれから
shigeki_ohtsu
HTTP/2.0と標準化
HTTP/2.0と標準化
Taketo Takashima
httpbis interim@チューリッヒ レポート
httpbis interim@チューリッヒ レポート
shigeki_ohtsu
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
shigeki_ohtsu
HTTP/2.0がもたらすWebサービスの進化(後半)
HTTP/2.0がもたらすWebサービスの進化(後半)
shigeki_ohtsu
HTTP/2でも初めてみます?
HTTP/2でも初めてみます?
Kento Kawakami
httpbis interim とhttp2.0相互接続試験の話
httpbis interim とhttp2.0相互接続試験の話
shigeki_ohtsu
第43回HTML5とか勉強会 SPDY/QUICデモ
第43回HTML5とか勉強会 SPDY/QUICデモ
shigeki_ohtsu
Mais conteúdo relacionado
Mais procurados
HTTP/2: ぼくたちのWebはどう変わるのか
HTTP/2: ぼくたちのWebはどう変わるのか
Kaoru Maeda
HTTP 2.0のヘッダ圧縮(HPACK)
HTTP 2.0のヘッダ圧縮(HPACK)
Jun Fujisawa
HTTP/2 入門
HTTP/2 入門
Yahoo!デベロッパーネットワーク
HTTP2 時代の Web - web over http2
HTTP2 時代の Web - web over http2
Jxck Jxck
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
Naotoshi Seo
IETF93 Prague報告Web関連+QUIC
IETF93 Prague報告Web関連+QUIC
Kaoru Maeda
HTTP2 RFC 発行記念祝賀会
HTTP2 RFC 発行記念祝賀会
Jxck Jxck
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2
Tomofumi Yagi
最新Webプロトコル傾向と対策
最新Webプロトコル傾向と対策
Kensaku Komatsu
LibreOfficeをWindows上でビルドする
LibreOfficeをWindows上でビルドする
Tomofumi Yagi
LibreOfficeをビルドしてみよう(Windows)
LibreOfficeをビルドしてみよう(Windows)
Masataka Kondo
http2study 20160423 IETF95 Report
http2study 20160423 IETF95 Report
Kaoru Maeda
HTTP2入門
HTTP2入門
Sota Sugiura
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Gitのよく使うコマンド
Gitのよく使うコマンド
YUKI Kaoru
Git & GitHub を使いこなしてハッピーになろう! - WordBench 名古屋 & concrete5 名古屋 合同勉強会
Git & GitHub を使いこなしてハッピーになろう! - WordBench 名古屋 & concrete5 名古屋 合同勉強会
Katz Ueno
LibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATE
Tomofumi Yagi
node.js koとhtml5とwebsocketsと
node.js koとhtml5とwebsocketsと
scdn
The Basic of How to build LibreOffice / LibreOffice開発版ビルドの基礎 for Windows
The Basic of How to build LibreOffice / LibreOffice開発版ビルドの基礎 for Windows
Naruhiko Ogasawara
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
Takashi Uemura
Mais procurados
(20)
HTTP/2: ぼくたちのWebはどう変わるのか
HTTP/2: ぼくたちのWebはどう変わるのか
HTTP 2.0のヘッダ圧縮(HPACK)
HTTP 2.0のヘッダ圧縮(HPACK)
HTTP/2 入門
HTTP/2 入門
HTTP2 時代の Web - web over http2
HTTP2 時代の Web - web over http2
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
IETF93 Prague報告Web関連+QUIC
IETF93 Prague報告Web関連+QUIC
HTTP2 RFC 発行記念祝賀会
HTTP2 RFC 発行記念祝賀会
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2
最新Webプロトコル傾向と対策
最新Webプロトコル傾向と対策
LibreOfficeをWindows上でビルドする
LibreOfficeをWindows上でビルドする
LibreOfficeをビルドしてみよう(Windows)
LibreOfficeをビルドしてみよう(Windows)
http2study 20160423 IETF95 Report
http2study 20160423 IETF95 Report
HTTP2入門
HTTP2入門
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Gitのよく使うコマンド
Gitのよく使うコマンド
Git & GitHub を使いこなしてハッピーになろう! - WordBench 名古屋 & concrete5 名古屋 合同勉強会
Git & GitHub を使いこなしてハッピーになろう! - WordBench 名古屋 & concrete5 名古屋 合同勉強会
LibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATE
node.js koとhtml5とwebsocketsと
node.js koとhtml5とwebsocketsと
The Basic of How to build LibreOffice / LibreOffice開発版ビルドの基礎 for Windows
The Basic of How to build LibreOffice / LibreOffice開発版ビルドの基礎 for Windows
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
Destaque
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
shigeki_ohtsu
Node.js で SPDYのベンチマーク体験サイトを作りました
Node.js で SPDYのベンチマーク体験サイトを作りました
shigeki_ohtsu
SPDYの中身を見てみよう
SPDYの中身を見てみよう
shigeki_ohtsu
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
shigeki_ohtsu
Bidirektionale Verbindungen für Webanwendungen
Bidirektionale Verbindungen für Webanwendungen
Marco Rico Gomez
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法
shigeki_ohtsu
Node-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
Node最新トピックス
Node最新トピックス
shigeki_ohtsu
サーバPUSHざっくりまとめ
サーバPUSHざっくりまとめ
Yasuhiro Mawarimichi
Stream2の基本
Stream2の基本
shigeki_ohtsu
ピッチをする前に知っておきたかったこと スタートアップの資金調達
ピッチをする前に知っておきたかったこと スタートアップの資金調達
Takaaki Umada
資金調達入門“以前” スタートアップが資金調達の前に考えること
資金調達入門“以前” スタートアップが資金調達の前に考えること
Takaaki Umada
Node js 入門
Node js 入門
Satoshi Takami
Destaque
(13)
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
Node.js で SPDYのベンチマーク体験サイトを作りました
Node.js で SPDYのベンチマーク体験サイトを作りました
SPDYの中身を見てみよう
SPDYの中身を見てみよう
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
Bidirektionale Verbindungen für Webanwendungen
Bidirektionale Verbindungen für Webanwendungen
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12の新機能について
Node-v0.12の新機能について
Node最新トピックス
Node最新トピックス
サーバPUSHざっくりまとめ
サーバPUSHざっくりまとめ
Stream2の基本
Stream2の基本
ピッチをする前に知っておきたかったこと スタートアップの資金調達
ピッチをする前に知っておきたかったこと スタートアップの資金調達
資金調達入門“以前” スタートアップが資金調達の前に考えること
資金調達入門“以前” スタートアップが資金調達の前に考えること
Node js 入門
Node js 入門
Semelhante a Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何か
ShigekiYamada
HTTPとサーブレット
HTTPとサーブレット
Takashi Makino
20161017 みんてくapacheでhttp/2
20161017 みんてくapacheでhttp/2
Tomohide Murata
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumilab
後期02
後期02
Takenori Nakagawa
hubotで快適BOT生活
hubotで快適BOT生活
Kazufumi Otani
IETF91 Honolulu httpbis WG Report
IETF91 Honolulu httpbis WG Report
Kaoru Maeda
Html5, Web Applications 2
Html5, Web Applications 2
totty jp
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
hagino 3000
Rtshell入門
Rtshell入門
openrtm
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
Cms on SELinux
Cms on SELinux
Hiroki Ishikawa
Struts2を始めよう!
Struts2を始めよう!
Shinpei Ohtani
Hive undocumented feature
Hive undocumented feature
tamtam180
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux
Takayoshi Tanaka
HTTPを理解する
HTTPを理解する
IIJ
第9回rest勉強会 ダウンロード・アップロード編
第9回rest勉強会 ダウンロード・アップロード編
ksimoji
HTTP/2, QUIC入門
HTTP/2, QUIC入門
shigeki_ohtsu
Semelhante a Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
(20)
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何か
HTTPとサーブレット
HTTPとサーブレット
20161017 みんてくapacheでhttp/2
20161017 みんてくapacheでhttp/2
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
後期02
後期02
hubotで快適BOT生活
hubotで快適BOT生活
IETF91 Honolulu httpbis WG Report
IETF91 Honolulu httpbis WG Report
Html5, Web Applications 2
Html5, Web Applications 2
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
Rtshell入門
Rtshell入門
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Cms on SELinux
Cms on SELinux
Struts2を始めよう!
Struts2を始めよう!
Hive undocumented feature
Hive undocumented feature
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux
HTTPを理解する
HTTPを理解する
第9回rest勉強会 ダウンロード・アップロード編
第9回rest勉強会 ダウンロード・アップロード編
HTTP/2, QUIC入門
HTTP/2, QUIC入門
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
1.
Node の HTTP/2.0
モジュール iij-http2 の実装苦労話 IIJ 大津 繁樹 2013年8月21日 第10回東京Node学園
2.
自己紹介 • 株式会社インターネットイニシアティブ(IIJ) プロダクト本部 戦略的開発部所属 •
twitter: @jovi0608 • github: https://github.com/shigeki/ • ブログ: http://d.hatena.ne.jp/jovi0608/ • Node とか、HTML5とか、HTTP/2.0とか、流行そうな 技術の評価検証してます。 • 最近、HTTP/2.0仕様修正やNode.js のHTTP/2.0モ ジュールの開発をしています。
3.
ちょっとNodeの最新トピックス(PR5464) var EventEmitter =
require("events") ; var emitter = new EventEmitter(); と書けるようになりました!(ただしv0.11.6~)
4.
あと、ストリームについては、3か月前 こうでした。 http://www.slideshare.net/shigeki_ohtsu/stream2-kihon
5.
もう時代は先に (v0.11.5~) • old
mode/new mode はなくなり flowing mode/paused mode に、 • stream1 + stream2 = streams3 • data イベント復活 • ただし以前のAPIと互換性はありますのでご安心を 今回のiij-http2は Streams3 を利用
6.
さて本題へ、 Nodeを使って新しいプロトコル(HTTP/2.0)を実 装したというお話です。 (コードはまだ未公開です。テスト追加やらドキュメント整備やらリファクタやら・・・)
7.
SPDY、HTTP/2.0について http://www.iij.ad.jp/company/development/tech/activities/spdy/ これ読んでください。 テキストベースのプロトコルからバイナリープロトコルへ
8.
年 月 トピック 2012年1月
IETF httpbis WGでHTTP/2.0の仕様検討開始することを決定 2012年11月 3つの候補案からSPDY仕様をベースにすることを決定 draft-00(SPDY/3仕様をそのまま)リリース 2013年1月 第1回中間会議(東京) draft-01リリース(HTTPからのUpgrade方法を追加) 2013年4月 draft-02リリース(フレームフォーマット・タイプの大幅な変更) 2013年5月 draft-03リリース(中間会議に向けて修正点の整理・まとめ) 2013年6月 第2回中間会議(サンフランシスコ) 2候補案を合わせたヘッダ圧縮仕様の採用を決定 2013年7月 draft-04リリース(最初の実装仕様) 2013年8月 第3回中間会議(ハンブルグ) 最初のHTTP/2.0相互接続試験を実施 draft-05リリース(接続試験結果を反映) これまでの HTTP/2.0 仕様策定作業の主な歩み 今ここ、 iij-http2 を持ち込んだ 2014年春に仕様化完了を目指す
9.
相互試験の細かい話は、 http://www.slideshare.net/shigeki_ohtsu/httpbis-interim-http20-25197160 あと、今朝 「HTTP/2.0 Draft
04 日本語訳」も公開されました。GJ! http://summerwind.jp/docs/draft-ietf-httpbis-http2-04/
10.
0 1 2
3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 Length(16) Type(8) Flags(8) R Stream Identifier(31) Frame Payload HTTP/2.0 Frame Format Type Name 役割 0x0 DATA リクエスト・レスポンスボディ 0x1 HEADERS リクエスト・レスポンスヘッダ 0x2 PRIORITY レスポンスの優先度設定 0x3 RST_STREAM ストリームのリセット 0x4 SETTINGS 設定情報 0x5 PUSH_PROMISE サーバプッシュの予約 0x6 PING 生死確認 0x7 GOAWAY 終了宣言 0x9 WINDOW_UPDATE フロー制御ウィンドウの更新 0x8は欠番 重要なのは この二つ 最初の8バイト分を 見れば大丈夫 HTTP/2.0のフレー ムヘッダは8バイト
11.
iij-http2の設計方針 • 7/8に draft-04がリリース。実装期間は約4週間弱。 •
node-spdyはクライアントがない。spdy/3フレーム フォーマットに大きく依存した実装なのでヤメ。 • Chromeのspdyスタック(Visitorパターン)を参考 – コネクション生成→フレーム解析→コールバック→ストリー ム処理 • Nodeのhttpモジュールを最大限に流用 (Outgoing/Incomingクラスを利用、後で後悔) • HTTP/2.0サーバの初期ハンドシェイク(後述) は、とりあえずTLS+NPNとDirectの2種だけに。
12.
iij-http2 の基本構成 (HTTPバインディング部分は除く) Connection (TCP接続) OnDATA(frame) OnHEADERS(frame) ・・・・ onWINDOW_UPDATE(frame) Frame HEADERSDATA WINDOW_UPDATE・・・・ Stream (多重化) stream_id priority _state ストリー ム生成 ソケットデータを フレーム解析& コールバック ストリーム状態 遷移を管理 WritableStreamを 利用
13.
HTTP Server のおさらい(v0.11) TCP
socket サーバに HTTP/HTTPS サーバが ぶらさがっているのよ
14.
HTTP Serverのコア lib/_http_server.js (v0.11) function
Server(requestListener) { (中略) this.addListener('connection', connectionListener); } util.inherits(Server, net.Server); function connectionListener(socket) { // とんでもない処理 // (おそらくNode.jsコアの中で最難関の一つ) } HTTP/2.0向けにconnectionListener をどう書くかがキモ HTTPSサーバと共通化しているのでSSL化は楽
15.
Hello World! with
HTTP/1.1 var http = require(‘http’); var server = http.createServer(function(req, res) { res.writeHead(200, {‘content-type’: ‘text/plain’}); res.end(‘Hello World!’); }); server.listen(8080); 目標:HTTP/2.0でこれと同じ処理ができるようにしよう
16.
HTTP/2.0の接続方法(第1段階目) パターンは3種類 あらかじめサーバがHTTP/2.0対応とわかって いる場合、直接第2段階の接続方法を行う。 HTTP/1.1の接続後 Upgradeヘッダを使って、 HTTP/2.0 に接続をアップグレードする。 TLS接続時にALPN拡張フィールドを利用して HTTP/2.0に接続を行う。(1)
TLS + ALPN (2) HTTP Upgrade (3) Direct接続 opensslが当時非 対応だったので NPNを利用 WebSocketと一緒 今回は未実装 DNSやAlternate-Protocolを想定 実装が一番簡単 iij-http2は、サーバは 1 と 3 、クライアントは 1,2,3 を実装
17.
HTTP/2.0の接続方法(第2段階目) 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a PRI * HTTP/2.0¥r¥n ¥r¥n SM¥r¥n ¥r¥n クライアントから謎の24byteのマジックコードをサー バに送り、最終チェックする。 SETTINGS(初期設定値の交換) HEADERS(HTTPレスポンス) HEADERS(HTTPリクエスト)
18.
iij-http2コネクションリスナ実装概要 function connectionListener(socket) { var
self = this; var connection = new Connection(socket, 'http_server', {}); socket.pipe(connection); connection.on('Incoming', function(req) { var res = new ServerResponse(req, req._stream); res.assignSocket(connection); self.emit('request', req, res); }); } pipeでソケットデータを渡す リクエストヘッダの処理完了 Hello Worldのコールバックを emit レスポンスオブジェクト生成
19.
Connectionクラス function Connection(socket, endpoint_type,
opts) { node_stream.Writable.call(this, opts); (中略) this.on('ConnectionHeader', OnConnectionHeader); this.on('FrameHeader', OnFrameHeader); this.on('FramePayload', OnFramePayload); this.on('DATA', OnDATA); this.on('HEADERS', OnHEADERS); this.on('PRIORITY', OnPRIORITY); this.on('RST_STREAM', OnRST_STREAM); this.on('SETTINGS', OnSETTINGS); this.on('PUSH_PROMISE', OnPUSH_PROMISE); this.on('PING', OnPING); this.on('GOAWAY', OnGOAWAY); this.on('WINDOW_UPDATE', OnWINDOW_UPDATE); } 結局バカでかいクラスに。 Chrome も同じでした。
20.
初期接続処理 Connection.prototype._write = function(chunk,
encoding, cb) { this._buf_list.push(chunk); if(!this._recv_connection_header) { if(this._buf_list.total >= connection_header.length) { var b = Buffer.concat(this._buf_list); this.emit('ConnectionHeader', b.slice(0, connection_header.length)); back = b.slice(connection_header.length); backBuffer(this, back); } else { cb(); return; } } (いろいろ後略) }; マジックコード長だけ 切り出し、コールバッ ク内でHTTP/2.0の文 字列チェック 初期接続済フラグ WritableStream
21.
HTTP/2.0フレームヘッダのパース (バイナリーデータの解析) function parseFrameHeader(buf) { var
offset = 0; var length = buf.readUInt16BE(offset); offset += 2; var type = buf.readUInt8(offset); offset++; var flags = buf.readUInt8(offset); offset++; var stream_id = buf.readUInt32BE(offset) & kUInt31; return {'length': length, 'type': type, 'flags': flags, 'stream_id': stream_id}; } バイナリーフレームのデータ解析は Buffer API が必須 ペイロードをパースしたら各フレーム型に応じたコールバックを起動
22.
HTTPバインディング Nodeコアモジュールと連携 • 結局ほぼ書き直すことに・・・ – 既存のoutgoing/incoming
クラスの跡形もなく・・・ • 時間が足りなく dirty hack の嵐 (涙目) • ServerPush も実装したんだが・・・ • 海外出張直前のバタバタ、一番苦労したとこ ろ。でも一身上の都合で今回発表は見合わ せます。(全部作り直してやる)
23.
で、 Hello World!
with iij-http2 var http2 = require(‘./lib/http2.js’); var server = http2.createServer(function(req, res) { res.writeHead(200, {‘content-type’: ‘text/plain’}); res.end(‘Hello World!’); }); server.listen(8080); (SSLサーバでは、証明書とNPN関係のオプション指定を行う)
24.
iij-http2 <-> HTTP/2.0
Chrome 成功! (TLS+NPNの場合ですが)
Baixar agora