Upload
bart-hanssens
View
328
Download
0
Embed Size (px)
Citation preview
HTTP/2Fedict – Brussel – 1 oktober 2015
| p. 2
Introductie
HTTP 1.0 / 1.1
Google SPDY (verouderd)
HTTP 2
Agenda
| p. 3
HTTP(S) stack
IPv4 of IPv6
HTTP
SSL of TLS
TCP
HTML JSON ...
| p. 4
HTTP request en responseGET /index.php HTTP/1.1Host: www.belgif.beAccept: text/html, application/xhtml+xmlUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1..Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip, deflateCookie: PHPSESSID=bbf5de9mz18a8x66zlm33puh7
HTTP/1.x 200 OKDate: Thu, 17 Sep 2015 03:46:01 GMTServer: ApacheContent-Type: text/html; charset=UTF8Content-Encoding: gzip…<html>
HTTP 1.0 en 1.1
HyperText Transfer Protocol
| p. 6
Geschiedenis 1991: V0.9 1996: V1.0 (RFC 1945)
1 request / 1 response Elke keer TCP-connectie opzetten / afbreken => “Connection: Keep-Alive” (nog geen deel van spec)
HTTP 1.0
| p. 7
Typische PC Pentium 133 MHz, 8 MB RAM, 1 GB HD 28.8 kbps modem
Browsers: Netscape 2.0, IE 2.0 / 3.0 <FRAME>, Java JDK 1.0, Javascript
Kwamen net iets later: CSS 1.0, 802.11 (WiFi)
Intermezzo: 1996
| p. 8
Belgium.be in 1996
| p. 9
Geschiedenis 1997: RFC 2068 1999: RFC 2616 2014: RFC 7230-7235
Meer request methods OPTIONS, PUT, DELETE, CONNECT, TRACE
HTTP 1.1
| 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
| 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
| 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
Google SPDY
| 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
| p. 15
SPDY stack
TCP / IP
TLS
SPDY
HTTP
| p. 16
HTTP 1.1: enkel compressie content
SPDY Oorspronkelijk zlib Momenteel uitgeschakeld (CRIME-attack)
Header compressie
HTTP/2
| p. 18
Ontwikkeld door IETF 2007: httpbis working group 2012: eerste draft gebaseerd op SPDY 2015: RFC 7540
Overzicht
| p. 19
Binaire streams Control / Data frames Compressie Headers
Multiplexing Minder TCP connecties
Request Prioritization
Server-side initiated streams
Verschil met HTTP 1.x
| 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
| 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
| p. 22
Control / Data Frames
POST /form1 HTTP/1.1Host: server.comUser-Agent: Mozilla/5.0Content-Length: 100...
FirstName=John&LastName=Doe&...
Control Frame
Data Frame
Version Type
Flags Length
1
(Stream ID) Data
Stream ID
Flags Length
0
Data
| p. 23
Index tables
Vervangen veelgebruikte headers door byte Vb: 0x02 = method GET
Bijkomende Huffman codering
Header tables: Hpack compressie
| p. 24
Multiplexing
Stream 3Header
Stream 2Data
Stream 1Header
Stream 2Header
Stream 1Header
Stream 3Header
Stream 1Header
Stream 1Data
| 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
| p. 26
Stateful header tables (2)
GET /page1 HTTP/1.1Host: server.comAccept: text/htmlUser-Agent: Mozilla/5.0
GET /page2 HTTP/1.1Host: server.comAccept: text/htmlUser-Agent: Mozilla/5.0
Control Frame
:method GET :scheme HTTPS:path /page1host server.comaccept: text/htmluser-agent: Mozilla/5.0
Control Frame 2
:path /page2
| 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
| p. 28
Browsers Chrome 40, Firefox 36, Safari 9 iOS/OS X, IE 11 Win10
Servers Nginx 1.9.5, Apache 2.4.17, F5 BIG-IP, Win 2016
Sites Google, Twitter, Youtube, MaxCDN
Tools Curl, Wireshark (met NSS key logger)
HTTP/2 ondersteuning
| p. 29
Werkelijk sneller ?
Bron: http://commons.wikimedia.org/wiki/File:Speedometer_(kmh).JPG
| 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...
Vragen ?
| p. 32
http://daniel.haxx.se/http2/
https://http2.github.io
https://tools.ietf.org/html/rfc7540
https://insouciant.org/tech/http-slash-2-considerations-and-tradeoffs/
Enkele linken
Bedankt !Bart Hanssens / Fedict
WTC III, Simon Bolivarlaan 30
1000 Brussel, België
@BartHanssens
bart.hanssens [at] fedict.be | www.fedict.belgium.be