10. | p. 10
Persistent connectie / Keep-alive
Hergebruik TCP connectie + vermijden TCP slow start
Pipelining
Sturen serie requests zonder response af te wachten
=> nuttig voor webpagina's met veel img, js, css...
Chunked transfer
Server kan meteen beginnen sturen
=> nuttig voor dynamische gegenereerde pagina's
Transfer-Encoding ipv Content-Length header
HTTP 1.1: verbetering performantie
11. | p. 11
Meerdere requests, maar 1 response tegelijk
Connectie “bezet” tijdens laden grote (multimedia) files
=> Meerdere TCP connecties tegelijk
Typisch 4 à 8 per domein
Vb: Google Maps, 1 connectie per blok van de kaart
Zwaardere belasting servers en NAT
=> Andere oplossingen (server)
Samenvoegen meerdere CSS files (of JS) tot 1 file
Verdelen content =/= domeinen (domain sharding)
Beperking: 1 response tegelijk
12. | p. 12
Snelheid neemt nog altijd toe maar...
… round-trip time (latency) is onvermijdelijk
Signaal kan niet sneller dan lichtsnelheid
Overhead bij starten nieuwe TCP connectie
Overhead sturen bijna identieke HTTP headers
AJAX-calls, mobile...
Verminderen round-trips, overhead
14. | p. 14
Ontwikkeld door Google
2009: v1.0
2009-2014: v2, v3.x, v4-alpha
2015-2016: uitfasering naar HTTP/2
Wijzigt HTTP niet, wel manier van verzenden
Werkt als “tunnel”
(Bijna) altijd via TLS
Om door HTTP-firewalls te raken
Overzicht
18. | p. 18
Ontwikkeld door IETF
2007: httpbis working group
2012: eerste draft gebaseerd op SPDY
2015: RFC 7540
Overzicht
19. | p. 19
Binaire streams
Control / Data frames
Compressie Headers
Multiplexing
Minder TCP connecties
Request Prioritization
Server-side initiated streams
Verschil met HTTP 1.x
20. | p. 20
TLS niet verplicht
In theorie
ALPN ipv NPN
HPACK compressie ipv zlib
Minder gevoelig voor aanvallen (zoals CRIME)
Betere multiplexing
Verschil met SPDY
21. | p. 21
Ontwikkeld door Google
2011: Next Protocol Negotiation
2014: Application-Layer Protocol Negotiation (RFC 7301)
Welk protocol gebruikt TLS poort 443 ?
Protocol al gekend tijdens TLS-handshake
Bespaart roundtrip
Laat ook toe om =/= certificaat te kiezen per protocol
TLS extensie NPN / ALPN
22. | p. 22
Control / Data Frames
POST /form1 HTTP/1.1
Host: server.com
User-Agent: Mozilla/5.0
Content-Length: 100
...
FirstName=John&
LastName=Doe&
...
Control Frame
Data Frame
Version Type
Flags Length
1
(Stream ID) Data
Stream ID
Flags Length
0
Data
23. | p. 23
Index tables
Vervangen veelgebruikte headers door byte
Vb: 0x02 = method GET
Bijkomende Huffman codering
Header tables: Hpack compressie
24. | p. 24
Multiplexing
Stream 3
Header
Stream 2
Data
Stream 1
Header
Stream 2
Header
Stream 1
Header
Stream 3
Header
Stream 1
Header
Stream 1
Data
25. | p. 25
Bijhouden reeds verstuurde header info
User-Agent, Accept...
Geen vervanging voor cookies, session id…
Compatibel blijven met HTTP 1.1
Kan afgezet worden
SETTINGS frame met state size 0
Stateful header tables
26. | p. 26
Stateful header tables (2)
GET /page1 HTTP/1.1
Host: server.com
Accept: text/html
User-Agent: Mozilla/5.0
GET /page2 HTTP/1.1
Host: server.com
Accept: text/html
User-Agent: Mozilla/5.0
Control Frame
:method GET
:scheme HTTPS
:path /page1
host server.com
accept: text/html
user-agent: Mozilla/5.0
Control Frame 2
:path /page2
27. | p. 27
Geen (vervanging van) Javascript API
Bespaart roundtrip
Server hint
X-Subresources header
Suggestie van de server
Server push
X-Associated-Content header
Server stuurt content al direct mee
Vb: CSS al meesturen met HTML
Server-initiated streams
29. | p. 29
Werkelijk sneller ?
Bron: http://commons.wikimedia.org/wiki/File:Speedometer_(kmh).JPG
30. | p. 30
Header compressie maakt wel verschil
Vb: compressie cookies
Best TCP_NODELAY gebruiken
Maar domain sharding werkt nu tegen
Extra DNS lookup, TCP slow start...
Ja, maar...