Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
HTTP/2.0 101 Introduction
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Bastian Hofmann
October 03, 2015
Programming
440
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HTTP/2.0 101 Introduction
Bastian Hofmann
October 03, 2015
Transcript
186 slides
HTTP/2.0 101 Introduction @BastianHofmann
HTTP/2.0 101 Introduction 101 Switching Protocols @BastianHofmann
https://www.flickr.com/photos/duncan/3171592427/
https://commons.wikimedia.org/wiki/File:Internet1.jpg#/media/File:Internet1.jpg
https://www.flickr.com/photos/neilsingapore/3567378586/
HTTP/0.9 http://www.w3.org/Protocols/HTTP/AsImplemented.html 1991
HTTP/1.0 https://tools.ietf.org/html/rfc1945 1996
HTTP/1.1 http://tools.ietf.org/html/rfc2616 1999
HTTP/1.1 http://tools.ietf.org/html/rfc2616 http://tools.ietf.org/html/rfc7230 http://tools.ietf.org/html/rfc7231 http://tools.ietf.org/html/rfc7232 http://tools.ietf.org/html/rfc7235 http://tools.ietf.org/html/rfc7234 http://tools.ietf.org/html/rfc7233 2014
https://www.flickr.com/photos/offshore/1433329174/
None
http://www.impressivewebs.com/importance-of-website- performance-sources/
Average page size
Average asset count
http://www.soasta.com/blog/page-bloat-average-web-page-2-mb/
http://httparchive.org/trends.php
The internet gets slower and slower
https://www.flickr.com/photos/91026431@N05/8497636527/
Slow connections
High latency
https://flic.kr/p/KpBcj
It’s hard work to keep a page fast
Lots of hacks around HTTP needed
It needs to get better
SPDY
HTTP/2 http://tools.ietf.org/html/rfc7540 http://tools.ietf.org/html/rfc7541 2015
New possibilities for web applications
Increased performance
Old truths may not be valid anymore
Before we start
A few words about me
None
None
None
None
Questions? Ask
http://speakerdeck.com/u/bastianhofmann
HTTP in detail
The anatomy of a page load
None
Every request one TCP connection
None
User enters URL
DNS lookup
TCP connection
TLS handshake
This already takes time
Optimizations
DNS caching
Connection Keep Alive
TLS optimizations
https://istlsfastyet.com/
None
Finally: HTTP
GET / HTTP/1.1 Host: www.researchgate.net HTTP/1.1 200 OK Content-Type: text/plain
Content
HTTP request
GET /home HTTP/1.1 Host: www.researchgate.net pragma: no-cache dnt: 1 accept-encoding:
gzip, deflate, sdch accept-language: de-DE,de;q=0.8,en- US;q=0.6,en;q=0.4 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2478.0 Safari/537.36 accept: text/html,application/xhtml +xml,application/xml;q=0.9,image/webp,*/*;q=0.8 cache-control: no-cache cookie: …
https://www.flickr.com/photos/40987321@N02/5580348753/
HTTP response
HTTP/1.1 200 OK Date: Sun, 16 Aug 2015 11:21:31 GMT
Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Cache-Control: must-revalidate, no-cache, no-store, post-check=0, pre-check=0, private X-Correlation-Id:... expires: Thu, 19 Nov 1981 08:52:00 GMT pragma: no-cache X-UA-Compatible: IE=Edge X-Frame-Options: SAMEORIGIN P3P: CP="..." X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=7200 Content-Security-Policy: … Content-Encoding: gzip
HTTP/2
For the user it works the same
No changes in Headers, Semantics etc
GET / HTTP/2.0 Host: www.researchgate.net HTTP/2.0 200 OK Content-Type: text/plain
Content
Changes on transport level
TLS only
Binary instead of textual
Header compression
Smaller requests and responses
Less roundtrips
Headers are received early (1st packet)
Response body
HTML response
DOM parsing
Rendering
Asset fetching
Applying CSS
Executing JS
https://www.flickr.com/photos/hangdog/10991275/
Blocking HTML rendering
CSS
JS
CSS triggers repaints
JS can manipulate the DOM
JS can access attributes set by CSS
HTTP/1.1 200 OK Content-Type: text/html <html> <head> <link href="main.css" >
<link href="profile.css" > <script src="library.js" /> <script src="app.js" /> <script> // some JS </script> </head> <body>
<script src="demo_async.js" async></script>
Every request one TCP connection
Concurrent connection limits
Network congestion
http://www.browserscope.org/?category=network
Domain sharding
http://c5.rgstatic.net/profile.css http://c4.rgstatic.net/icon.png
Shards should be persistent
Additional handshakes and connections
Network congestion
TCP Slow Start
https://de.wikipedia.org/wiki/Transmission_Control_Protocol#/media/File:TCPSlowStartundCongestionAvoidance.svg
Ideal number of shards
https://codeascraft.com/2014/02/19/reducing-domain- sharding/
Page sizes
Less content
GZIP
Image compression
Minification
JS
CSS
HTML
Debugging problems
None
Sourcemaps
Less requests
Concatenation
https://c5.rgstatic.net/c/a9b943a25d126865806885d2fd94b5f9/javascript/combo/lib/yui3/ array-extras/array-extras-min.js&lib/yui3/oop/oop-min.js&lib/yui3/attribute-core/attribute- core-min.js&lib/yui3/event-custom-base/event-custom-base-min.js&lib/yui3/event-custom- complex/event-custom-complex-min.js&lib/yui3/attribute-observable/attribute-observable- min.js&lib/yui3/attribute-extras/attribute-extras-min.js&lib/yui3/attribute-base/attribute-base- min.js&lib/yui3/attribute-complex/attribute-complex-min.js&lib/yui3/base-core/base-core- min.js&lib/yui3/base-observable/base-observable-min.js&lib/yui3/base-base/base-base- min.js&lib/yui3/pluginhost-base/pluginhost-base-min.js&lib/yui3/pluginhost-config/pluginhost- config-min.js&lib/yui3/base-pluginhost/base-pluginhost-min.js&lib/yui3/classnamemanager/ classnamemanager-min.js&lib/yui3/dom-core/dom-core-min.js&lib/yui3/dom-base/dom-base-
min.js&lib/yui3/selector-native/selector-native-min.js&lib/yui3/selector/selector-min.js&lib/ yui3/node-core/node-core-min.js
https://c5.rgstatic.net/c/a9b943a25d126865806885d2fd94b5f9/mainbundle.js
Spritemaps
None
How to bundle
Over fetching
90% CSS unused
Cache invalidation
HTTP/2
Only 1 connection
Fully multiplexed
No domain sharding needed
Low overhead for a request
No concatenation needed
Better cache hit ratio
More granular loading
Less development overhead
None
https://www.flickr.com/photos/ksayer/5614813296/
Critical rendering path
None
None
What is visible?
What is critical?
Inline critical assets
Either inline always
Caching?
First request
HTTP/1.1 200 OK Content-Type: text/html <html> <head> <styles> … your
critical css </styles> </head> <body> <div>content</div> load main.css async set cookie that other css was loaded </body> </html>
Subsequent request (if Cookie set)
HTTP/1.1 200 OK Content-Type: text/html <html> <head> <link href="main.css" >
// loaded from cache </head> <body> <div>content</div> </body> </html>
Flushing critical stuff early
Traditional approach
Browser Server GET css & js HTTP/1.1 200 OK Content-Type:
text/html <html> <head><link ..><script ..> GET /foo.html </head><body></body></html>
HTTP supports streaming
Browser Server GET /foo.html <body></body> </html> HTTP/1.1 200 OK Content-Type:
text/html <html> <head><link ..><script ..></head> GET css & js
None
https://developer.mozilla.org/en-US/docs/Web/HTTP/ Controlling_DNS_prefetching
https://developer.mozilla.org/en-US/docs/Web/HTTP/ Link_prefetching_FAQ
Problems
Headers are already sent
Redirects
None
Proxies, servers, load balancers may buffer content
Browsers may wait before starting to render HTML
AJAX?
JSON/XML
None
Caching what assets are needed
GET /literature.AddPublicationsDialog HTTP/1.1 200 OK Content-Type: application/json { "data": {...},
"css": ["AddPublicationsDialog.css"], "js": ["AddPublicationsDialogView.js"], "html": ["addConferencePaperSelection.html"] }
localStorage.setItem( "literature.AddPublicationsDialog", { "css": ["AddPublicationsDialog.css"], "js": ["AddPublicationsDialogView.js"], "html": ["addConferencePaperSelection.html"] }
);
None
None
HTTP/2
Server push
Prioritize critical assets
Browser Server Push CSS & JS HTTP/1.1 200 OK Content-Type:
text/html <html> <head><link ..><script ..> </head><body></body></html> GET /foo.html
spdy.createServer(options, function(req, res) { // push JavaScript asset (/main.js) to
the client res.push( '/main.js', {'content-type': ‚application/javascript'}, function(err, stream) { stream.end('alert("hello from push stream!")'); } ); // write main response body and terminate stream res.end( 'Hello World! <script src=„/main.js"></script>' ); }).listen(443); https://www.igvita.com/2013/06/12/innovating-with-http-2.0-server-push/
Headers X-Associated-Content
Automated learning
Great
When can I use it?
Browser support
http://caniuse.com/#feat=http2
http://caniuse.com/#search=spdy
Server support
Nginx http://nginx.org/en/docs/http/ngx_http_v2_module.html
https://github.com/icing/mod_h2 Apache httpd
Performance best practices will evolve
Stay up to date
Expect more frequent HTTP protocol iterations
https://joind.in/15435
http://twitter.com/BastianHofmann http://lanyrd.com/people/BastianHofmann http://speakerdeck.com/u/bastianhofmann
[email protected]
More Decks by Bastian Hofmann
See All by Bastian Hofmann
Monitoring in Kubernetes with Prometheus and Grafana
bastianhofmann
0
390
Creating a fast Kubernetes Development Workflow
bastianhofmann
0
160
Highly available cross-region deployments with Kubernetes
bastianhofmann
1
190
From source to Kubernetes in 30 minutes
bastianhofmann
0
210
Introduction to Kubernetes
bastianhofmann
1
140
CI/CD with Kubernetes
bastianhofmann
0
260
Creating a fast Kubernetes Development Workflow
bastianhofmann
1
300
Deploying your first Micro-Service application to Kubernetes
bastianhofmann
2
220
Creating a fast Kubernetes Development Workflow
bastianhofmann
0
290
Other Decks in Programming
See All in Programming
AI Augmentation Techniques with Liberty
ivargrimstad
1
460
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
370
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
180
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.9k
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
170
仕様駆動開発入門 (何を作るかを先に決めて渡す) | 目指せ Kiro マスター 05
inariku
PRO
2
130
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
300
AI-Powered Domain-Driven Design
ziobrando
0
440
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
310
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
4.2k
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
We Have a Design System, Now What?
morganepeng
55
8.4k
Docker and Python
trallard
47
4.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1.1k
Building Adaptive Systems
keathley
44
3.3k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Thoughts on Productivity
jonyablonski
76
5.5k
Writing Fast Ruby
sferik
630
63k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
520
Faster Mobile Websites
deanohume
310
32k