HTTP2 分享记录

这个是一个自己工作中小组内的一个简单分享,关于HTTP2各种内容。以HTTP2作为标题,结合了一些工作里的业务场景,内容主要还是要靠讲的,并且在语速比较快的情况下也说了约40分钟,所以只能偷懒上些ppt的内容了。当然作为国际部门,现在内部要求都要英文交流,所以ppt也是英文的...

HTTP History

  • Concept Hypertext (1963)
  • HTTP 0.9 (before 1995)
    • Only get, no header, 1 page
  • HTTP 1.0 (1996)
    • Header, response code, redirect, post. Etc, 60 pages
  • HTTP 1.1 (1999)
    • Options, upgrade, cache header extends
  • SPDY (2009 google)
  • HTTP2 (2012, 2015/5/14 published)

HTTP2 related

  • Server (google)
  • Proxy (akamai)
  • Client (google firefox)

HTTP2 Features

  • One Connection
    • use one connection for parallelism (ares oversea)
  • Header Compression
    • uses header compression to reduce overhead
  • Server Push
    • allows servers to “push” responses proactively into client caches

HTTP2 Requirement

  • Stage 1 (NPN)
    • Web server supported H2 (nginx 1.9.5+)
    • TLS certificate (Let' s Encrypt)
    • Chrome 41, Firefox 36, Edge 12, Safari 9, Opera 28
  • Stage 2 (ALPN)
    • OpenSSL 1.0.2g
    • Chrome 51

Site: HTTP1.1 vs HTTP2

sample demo parse

Questions about connection

  • How many connections browser can open, and why?
  • How many connections system can maintain?
  • What’s the ideal delay between Shanghai and New York?

Windows connections

ref: http://smallvoid.com/article/winnt-tcpip-max-limit.html

  • TCP connection allow: TcpNumConnections = 16M
  • Max dynamic ports: MaxUserPort = 5000 (1024 to 5000)
  • TCP control block: MaxFreeTcbs = 1000 (srv = 2000)
    • 0.5k for pagepool and 0.5k for non-pagepool
  • TCB HashTable: MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
    • Pagepool
  • allocated a 1000 TCBs == 1000 connection, close connection occupy port 4min: TcpTimedWaitDelay = 240 sec
  • Without closing the connection properly: KeepAliveTime = 2 h

result: < 1000

Http1 problems

  • Head of line blocking
  • Inefficient of TCP usage rate
    • Slow start
    • Congestion window
  • Etc...

Http1.1 Optimization

  • Sprite Image
  • Domain sharding
  • Disable cookie
  • File concat

Then use http2

Http1.1 Optimization in H2

  • Sprite Image
    • It depends, heigh cost, bg image load when visible
  • Domain sharding
    • wrong
  • Disable cookie
    • wrong
  • File concat
    • It depends, unnecessary almost

Client Support detect

  • Upgrade header
  • TLS
    • NPN (Next Protocol Negotiation)
    • ALPN (Application Layer Protocol Negotiation)
  • HTTP Alternative services

Upgrade header

GET ws://example.com/ HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Origin: http://swordair.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: xxx
HTTP/1.1 101 Switching Protocols 
Connection: Upgrade 
Upgrade: websocket 
Sec-WebSocket-Accept: xxxxx
GET / HTTP/1.1 Host: example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
Unsupport:
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html
Unsupport:
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html

but, just exist in RFC actually

ALPN

TLS connection ‘Client Hello’

Client double confirm

Connection preface

PRI * HTTP/ 2. 0\ r\ n\ r\ nSM\ r\ n\ r\ n
  • SETTINGS client
  • SETTINGS ack server

HTTP2 basics

  • TCP socket
    • Steam
      • Frame

HTTP2 Steam

  • Steam is H2 independent, two-way frame change
  • A new request will rise a new steam
  • Steam id

H2 Frame

  • HTTP based on ‘Text splite’
  • HTTP2 based on Frame (key of one connection for parallelism)

Frame Type

NAME ID DESC
DATA 0x0 Steam data
HEADERS 0x1 http header
PRIORTY 0x2 Priority of steam
RST_STEAM 0x3 Stop steam (error)
SETTINGS 0x4 Set connection param
PUSH_PROMISE 0x5 Server push tips
PING 0x6 Test connection and rtt
GOAWAY 0x7 Steam end
WINDOW_UPDATE 0x8 Flow control
CONTINUATION 0x9 Extends HEADERS frame

Header Compression

  • deflate & CRIME (Compression Ratio Info-leak Made Easy)
  • Gzip is unsafe
  • HPACK
    • Header infos are similar
    • Index specific header and value

HPACK sample

Header1: All work and no play
Header2: makes Steven
Header3: a dull boy

Client generate this index and send to server, server will also create one

Index Header name Value
55 Header1 All work and no play
56 Header2 makes Steven
57 Header3 a dull boy

Next item send: 55 56 57

Every connection maintain it’s index status.

Server Push

  • Reasonable push decrease 20% - 50% render time
  • Push will waste bandwidth (resource cached already)
  • Best Timing:
    • Server busy
    • Client idle
  • Frame Type “PUSH_RPOMISE”
  • Client can reject use “RST_STEAM”

FTTB in H2

H2 Extra work:

  • Window size adjust
  • Dependency tree
  • Index header
  • Header compression
  • Priority change
  • Server pre push

Performance:
H2 <= H1

Experience
H2 > H1

HTTP2 debug

  • chrome://net-internals/ (early version)
  • Chrome debug tool -> network tab
  • Session key logging (env SSLKEYLOGFILE=~/key.log) wireshark
  • Firefox command mode record HTTP session log

TCP and UDP

  • TCP is not fast portocal but it is reliable
  • But we need more fast net

core problen is:

  • TCP/IP is integrated in system core
  • TCP is in core space
  • UDP is in user space

QUIC

  • Quick UDP Internet Connection
  • Google
  • Based on UDP which in user space
  • Provide equivalent HTTP2 new features

HTTP3 ?

FIN


评论加载中...

Disqus提供评论支持,如果评论长时间未加载,请飞跃长城。