http2 最速実装 v2

37
HTTP/2 最速実装 v2 @y_iwanaga_

Upload: yoshihiro-iwanaga

Post on 28-May-2015

3.983 views

Category:

Technology


0 download

DESCRIPTION

http2 ハッカソン#2 の資料です

TRANSCRIPT

  • 1. HTTP/2 v2 @y_iwanaga_

2. HTTP/2 1. HTTP/2 2. 3. HTTP/2 1. HTTP/1.0, 1.1 HTTP/2 2. 4. 30 HTTP/2 5. HTTP/1.1 5 client server 1 TCP 1 6 Keep-Alive 3-way handshake 6. HTTP/2 1TCP Client Server request response server push 7. HTTP/1.1 8. HTTP/2 CPU 9. 10. TCP 1 HTTP/2 Frame Client Server req1req2 res1 res2 res1 TCP 11. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ http2-spec 4.1. Frame Format 12. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ Frame Payload 64bit Frame Header 13. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ R: Reserved. 0 14. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ Length: Frame Payload Frame Header J 15. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ Type: Frame Type 16. Frame Type ID 0x0 DATA HTTP/1 Body 0x1 HEADERS HTTP/1 Header 0x2 PRIORITY 0x3 RST_STREAM 0x4 SETTINGS 0x5 PUSH_PROMISE 0x6 PING 0x7 GOAWAY 0x8 WINDOW_UPDATE 0x9 CONTINUATION HEADERS, PUSH_PROMISE 0xa ALTSVC 0xb BLOCKED (draft-12) 17. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ Flags: bit On/O 18. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ Stream ID: ID 19. Stream ID Frame Stream ID Client Serverres2 res1 res1 20. stream ID Client Server 1 2 3 5 4 6 client server server client 0 21. Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | R | Length (14) | Type (8) | Flags (8) | +-+-+-----------+---------------+-------------------------------+ |R| Stream Identifier (31) | +-+-------------------------------------------------------------+ | Frame Payload (0...) ... +---------------------------------------------------------------+ Frame Payload: Frame Type 22. Client Server req1req3 req2 res1 res2 res1 res3 23. ServerClient 0. 1. Magic Octet 2. SETTINGS Frame 3. SETTINGS Frame ACK 4. SETTINGS Frame ACK 5. HEADERS Frame GET / 6. HEADERS Frame 7. DATA Frame HTTP/2 HTML 24. 1. Magic Octet 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a PRI * HTTP/2.0rnrnSMrnrn HTTP/2 HTTP/2 ALPN HTTP/2 HTTP/1.1 PRI 25. ServerClient 0. 1. Magic Octet 2. SETTINGS Frame 3. SETTINGS Frame ACK 4. SETTINGS Frame ACK 5. HEADERS Frame GET / 6. HEADERS Frame 7. DATA Frame HTTP/2 HTML 26. 24. SETTINGS Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier (8)| +---------------+-----------------------------------------------+ | Value (32) | +---------------------------------------------------------------+ 0 Payload Length payload Step 2: Server Stream ID = 0, payload Step 3: Server Stream ID =0, flags = 0x1 (ACK), payload Step 4: Client Stream ID = 0, flags = 0x1 (ACK), payload 27. ServerClient 0. 1. Magic Octet 2. SETTINGS Frame 3. SETTINGS Frame ACK 4. SETTINGS Frame ACK 5. HEADERS Frame GET / 6. HEADERS Frame 7. DATA Frame HTTP/2 HTML 28. 5. HEADERS Frame 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pad High? (8) | Pad Low? (8) | +-+-------------+---------------+-------------------------------+ |E| Stream Dependency? (31) | +-+-------------+-----------------------------------------------+ | Weight? (8) | +-+-------------+-----------------------------------------------+ | Header Block Fragment (*) ... +---------------------------------------------------------------+ | Padding (*) ... +---------------------------------------------------------------+ ags = END_HEADERS | END_STREAM stream ID = 1 Header Block Fragment: Payload HPACK-07 29. HPACK http://example.com/ GET 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 1 | 0 | +---+---+-----------------------+ | 0 | Name Length (7+) | +---+---------------------------+ | Name String (Length octets) | +---+---------------------------+ | 0 | Value Length (7+) | +---+---------------------------+ | Value String (Length octets) | +-------------------------------+ Name Value :scheme http :authority example.com :path / :method GET Header Block (Literal Header Field never Indexed & ASCII Encoding ) Header Block HPACK :scheme 7 :scheme ASCII 0x3a736368656d65 http 4 http ASCII 0x68747470 30. ServerClient 0. 1. Magic Octet 2. SETTINGS Frame 3. SETTINGS Frame ACK 4. SETTINGS Frame ACK 5. HEADERS Frame GET / 6. HEADERS Frame 7. DATA Frame HTTP/2 HTML 31. 67. Data Frame payload J Indexed Huffman Encoding 7. DATA Frame 6. HEADERS Frame payload HTML DATA Frame 32. HTTP/2-12 http://tools.ietf.org/html/draft-ietf-httpbis- http2-12 HPACK-07 http://tools.ietf.org/html/draft-ietf-httpbis- header-compression-07 Public Test Server nghttp2 (h12c, upgrade/direct) http://nghttp2.org/ 33. Docker file nghttp2 Direct (ALPN ) https://gist.github.com/tsahara/ 7332972d057370d2e686 ALPN https://gist.github.com/tsahara/ e6831656d7e2ff99ce7e tsahara 34. backup slides 35. Huffman bit ASCII 36. index Header Name Header Value 1 :authority 2 :method GET 3 :method POST 4 :path / 5 :path /index.html 6 :scheme http 7 :scheme https 8 :status 200 9 :status 204 () http://tools.ietf.org/html/ draft-ietf-httpbis-header-compression-07#appendix-B 37.