SPDYhttp reloaded
GOOGLE PROPRIETARY PROTOCOL(WILL BE) PART OF HTTP/2.0
HTTP Problems•   Single request per connection. Because HTTP can only fetch one resource at a time    (HTTP pipelining hel...
Web Requests Are Simple•   Open a connection•   Send a request•   Receive a response•   Done
Transfer per Page
Many Requests are a Pain• Caching• Domain Sharding  – Browser Limits• Keep Alive  – Dedicated Connections  – Waste Ressour...
TCP Handshake0ms 1) Host A sends a TCP SYNchronize packet to Host B50ms 2) Host B receives As SYN50ms 3) Host B sends a SY...
Initial window• Congestion Control Mechanism• Avoid overloading clients• Each ACK of the client increases window• RFC 3390...
Pushing over http• Push === Long Polling• Consumes one connection on clients• On server  – Used to be expensive to hold  –...
Headers         http://blog.codecentric.de/                                text/html,application/xhtml+xml,application/xmA...
Headers             http://www.codecentric.de/files/2012/02/adlite.pngAccept                              image/png,image/...
Content Compression• Gzip is optional• But generally best practiceLoadModule deflate_module /usr/lib/httpd/modules/mod_def...
SPDY TO THE RESCUE
SPDY Solutions• Allow many concurrent HTTP requests to run across a single  TCP session.• Reduce the bandwidth currently u...
Connection Multiplexing• Single TCP Connection transports all requests• TCP Handshake still exists• Inital cwnd should be 16
Compression• All data is compressed• Includes headers• Redundand data is removed  – User Agent of second request is known ...
SSL• Not said to be a problem with HTTP• SSL should be default  – But actually expensive• SSL hides SPDY traffic, so that ...
Pushing• Long Lasting Connection By Design• Send does not close the "request"• Two flavors  – Server push  – Server hint
Compatibility• SPDY is backwards compatible• Uses Next Protocol Negotiation  – tools.ietf.org/html/draft-agl-tls-nextproto...
SPDY SupportClients                    Server• Chrome                   • Apache mod_spdy   – On since 11           • erla...
DEMO: MIGRATING PHP ONAPACHE TO SUPPORT SPDY
PHP is not Threadsafe• The way SPDY works is incompatible with non  threadsafe implementations  – one connection one httpd...
mod_php to mod_fcgid + php• yum install mod_fcgid• vi /etc/httpd/conf/httpd.conf <Directory "/var/www/html">     Options I...
DirectoryIndex index.phpAddHandler fcgid-script .fcgi .phpDefaultInitEnv PHPRC      "/etc/"MaxRequestsPerProcess     1000M...
mod_prefork to mod_worker• Needs recompilation• Luckily we have both already   – httpd -V | grep MPM  – httpd.worker -V |...
mod_ssl• We need mod_ssl patched with NPN• yum install subversion curl gcc-c++  patch binutils make• mkdir modssl; cd mods...
[root@centos57 modssl]# ./build_modssl_with_npn.shUsing buildroot: /tmp/tmp.CooHIy8770Downloading http://www.openssl.org/s...
mod_spdy• Built from source•   mkdir mod_spdy; cd mod_spdy•   svn co    http://src.chromium.org/svn/trunk/tools/depot_tool...
chrome://net-internals/#spdy
Is it spdy?• www.devthought.com/2012/03/10/chrome-  spdy-indicator/• ckon.wordpress.com/2012/03/11/spdy-  indicator-for-fi...
HTTP  2.07seconds
HTTPS  4.94seconds
SPDY  2.65seconds
real HTTP 17.83seconds
real SPDY 11.70seconds
LETS MAKE THE WEB FASTER
The SPDY Protocol
The SPDY Protocol
Upcoming SlideShare
Loading in...5
×

The SPDY Protocol

13,574

Published on

The SPDY Protocol is likely going to be the successor of http. This short talk summarizes the most important points and includes a demo on how to migrate a Wordpress blog on httpd.

Published in: Technology
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total Views
13,574
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
188
Comments
1
Likes
11
Embeds 0
No embeds

No notes for slide

The SPDY Protocol

  1. 1. SPDYhttp reloaded
  2. 2. GOOGLE PROPRIETARY PROTOCOL(WILL BE) PART OF HTTP/2.0
  3. 3. HTTP Problems• Single request per connection. Because HTTP can only fetch one resource at a time (HTTP pipelining helps, but still enforces only a FIFO queue), a server delay of 500 ms prevents reuse of the TCP channel for additional requests. Browsers work around this problem by using multiple connections. Since 2008, most browsers have finally moved from 2 connections per domain to 6.• Exclusively client-initiated requests. In HTTP, only the client can initiate a request. Even if the server knows the client needs a resource, it has no mechanism to inform the client and must instead wait to receive a request for the resource from the client.• Uncompressed request and response headers. Request headers today vary in size from ~200 bytes to over 2KB. As applications use more cookies and user agents expand features, typical header sizes of 700-800 bytes is common. For modems or ADSL connections, in which the uplink bandwidth is fairly low, this latency can be significant. Reducing the data in headers could directly improve the serialization latency to send requests.• Redundant headers. In addition, several headers are repeatedly sent across requests on the same channel. However, headers such as the User-Agent, Host, and Accept* are generally static and do not need to be resent.• Optional data compression. HTTP uses optional compression encodings for data. Content should always be sent in a compressed format. Source: http://dev.chromium.org/spdy/spdy-whitepaper
  4. 4. Web Requests Are Simple• Open a connection• Send a request• Receive a response• Done
  5. 5. Transfer per Page
  6. 6. Many Requests are a Pain• Caching• Domain Sharding – Browser Limits• Keep Alive – Dedicated Connections – Waste Ressources• Pipelining
  7. 7. TCP Handshake0ms 1) Host A sends a TCP SYNchronize packet to Host B50ms 2) Host B receives As SYN50ms 3) Host B sends a SYNchronize-ACKnowledgement100ms 4) Host A receives Bs SYN-ACK100ms 5) Host A sends ACKnowledge150ms 6) Host B receives ACK.• With a Ping of just 50ms, this takes us 150ms
  8. 8. Initial window• Congestion Control Mechanism• Avoid overloading clients• Each ACK of the client increases window• RFC 3390 – Increasing icwnd – Small Resonses are complete without ACK – Avoid the ACK RTT
  9. 9. Pushing over http• Push === Long Polling• Consumes one connection on clients• On server – Used to be expensive to hold – Modern servers have evented I/O• WebSockets
  10. 10. Headers http://blog.codecentric.de/ text/html,application/xhtml+xml,application/xmAccept l;q=0.9,*/*;q=0.8Accept-Encoding gzip, deflateAccept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3Connection keep-alive __utma=40497137.1800912468.1315901303.13 28525769.1328537171.234; __utmz=40497137.1326462670.198.110.utmcsr =twitterfeed|utmccn=blogfeed_de|utmcmd=twi tter; wp-settings- 3=editor%3Dhtml%26m0%3Do%26m1%3Do%26 m2%3Do%26m3%3Dc%26m4%3Do%26m5%3Do %26m6%3Do%26m7%3Do%26m8%3Do%26m9 %3Do%26m10%3Do%26m11%3Do%26align%3DCookie center%26imgsize%3Dfull%26urlbutton%3Dnon e%26hidetb%3D0; wp-settings-time- 3=1328519940; __utma=162617902.1417890302.1315914276.1 328537194.1328541774.63; __utmz=162617902.1328537194.62.41.utmcsr= blog.codecentric.de|utmccn=(referral)|utmcmd =referral|utmcct=/; wp-settings-time- 81=1321966374Host blog.codecentric.de Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0)User-Agent Gecko/20100101 Firefox/10.0
  11. 11. Headers http://www.codecentric.de/files/2012/02/adlite.pngAccept image/png,image/*;q=0.8,*/*;q=0.5Accept-Encoding gzip, deflateAccept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3Connection keep-alive __utma=162617902.1417890302.13159 14276.1328537194.1328541774.63; __utmz=162617902.1328537194.62.41.u tmcsr=blog.codecentric.de|utmccn=(refe rral)|utmcmd=referral|utmcct=/; wp-Cookie settings- 3=m0%3Do%26m1%3Do%26m5%3Do%2 6m4%3Do%26editor%3Dhtml%26wplink %3D1%26align%3Dcenter%26imgsize%3 Dfull%26hidetb%3D1%26m7%3Do%26m 9%3Do; wp-settings-time-3=1326290899Host www.codecentric.deReferer http://blog.codecentric.de/ Mozilla/5.0 (Windows NT 6.1; WOW64;User-Agent rv:10.0) Gecko/20100101 Firefox/10.0
  12. 12. Content Compression• Gzip is optional• But generally best practiceLoadModule deflate_module /usr/lib/httpd/modules/mod_deflate.so
  13. 13. SPDY TO THE RESCUE
  14. 14. SPDY Solutions• Allow many concurrent HTTP requests to run across a single TCP session.• Reduce the bandwidth currently used by HTTP by compressing headers and eliminating unnecessary headers.• Make SSL the underlying transport protocol, for better security and compatibility with existing network infrastructure. Although SSL does introduce a latency penalty, we believe that the long-term future of the web depends on a secure network connection. In addition, the use of SSL is necessary to ensure that communication across existing proxies is not broken.• Enable the server to initiate communications with the client and push data to the client whenever possible. Source: http://dev.chromium.org/spdy/spdy-whitepaper
  15. 15. Connection Multiplexing• Single TCP Connection transports all requests• TCP Handshake still exists• Inital cwnd should be 16
  16. 16. Compression• All data is compressed• Includes headers• Redundand data is removed – User Agent of second request is known to be same as on first
  17. 17. SSL• Not said to be a problem with HTTP• SSL should be default – But actually expensive• SSL hides SPDY traffic, so that proxies dont break it 
  18. 18. Pushing• Long Lasting Connection By Design• Send does not close the "request"• Two flavors – Server push – Server hint
  19. 19. Compatibility• SPDY is backwards compatible• Uses Next Protocol Negotiation – tools.ietf.org/html/draft-agl-tls-nextprotoneg-02
  20. 20. SPDY SupportClients Server• Chrome • Apache mod_spdy – On since 11 • erlang-spdy – Ice Cream Sandwich • node-spdy• Amazon Silk • Netty 3.3.1 – Kindle Fire – Means JBoss• Firefox • Jetty 7.6.2 – experimental in 11 – On in 12/13 • Tomcat SPDY Connector
  21. 21. DEMO: MIGRATING PHP ONAPACHE TO SUPPORT SPDY
  22. 22. PHP is not Threadsafe• The way SPDY works is incompatible with non threadsafe implementations – one connection one httpd worker – But multiple requests• Zend Threadsafe does not support some features (mysql!)• Need to externalize it with cgi
  23. 23. mod_php to mod_fcgid + php• yum install mod_fcgid• vi /etc/httpd/conf/httpd.conf <Directory "/var/www/html"> Options Indexes FollowSymLinks ExecCGI </Directory>• mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.bak• vi /etc/httpd/conf.d/fcgid.conf
  24. 24. DirectoryIndex index.phpAddHandler fcgid-script .fcgi .phpDefaultInitEnv PHPRC "/etc/"MaxRequestsPerProcess 1000MaxProcessCount 10MaxRequestLen 209715200IPCCommTimeout 240IdleTimeout 240FCGIWrapper /usr/bin/php-cgi .php
  25. 25. mod_prefork to mod_worker• Needs recompilation• Luckily we have both already  – httpd -V | grep MPM – httpd.worker -V | grep MPM• sudo vi /etc/init.d/httpdhttpd=${HTTPD-/usr/sbin/httpd.worker}prog=httpd.worker
  26. 26. mod_ssl• We need mod_ssl patched with NPN• yum install subversion curl gcc-c++ patch binutils make• mkdir modssl; cd modssl• svn export http://mod- spdy.googlecode.com/svn/trunk/src/bu ild_modssl_with_npn.sh• ./build_modssl_with_npn.sh• cp /root/modssl/mod_ssl.so /etc/httpd/modules/mod_ssl.so
  27. 27. [root@centos57 modssl]# ./build_modssl_with_npn.shUsing buildroot: /tmp/tmp.CooHIy8770Downloading http://www.openssl.org/source/openssl-1.0.1-beta2.tar.gz######################################################################## 100.0%Downloading http://www.apache.org/dist/httpd/httpd-2.2.21.tar.gz######################################################################## 100.0%Downloading https://issues.apache.org/bugzilla/attachment.cgi?id=27969context=patch######################################################################## 100.0%Uncompressing openssl-1.0.1-beta2.tar.gz ... doneUncompressing httpd-2.2.21.tar.gz ... doneApplying Apache mod_ssl NPN patch ...patching file modules/ssl/ssl_private.hpatching file modules/ssl/ssl_engine_init.cpatching file modules/ssl/ssl_engine_io.cpatching file modules/ssl/ssl_engine_kernel.cpatching file modules/ssl/mod_ssl.cpatching file modules/ssl/mod_ssl.hdoneConfiguring OpenSSL ... doneBuilding OpenSSL (this may take a while) ... doneConfiguring Apache mod_ssl ... doneBuilding Apache mod_ssl (this may take a while) ... doneGenerated mod_ssl.so at /root/modssl/mod_ssl.so.
  28. 28. mod_spdy• Built from source• mkdir mod_spdy; cd mod_spdy• svn co http://src.chromium.org/svn/trunk/tools/depot_tools• export PATH="$PATH":`pwd`/depot_tools• gclient config http://mod- spdy.googlecode.com/svn/trunk/src• gclient sync --force• cd src; make BUILDTYPE=Release• sudo cp out/Release/libmod_spdy.so /etc/httpd/modules/mod_spdy.so• vi /etc/httpd/conf.d/spdy.confLoadModule spdy_module /etc/httpd/modules/mod_spdy.soSpdyEnabled on
  29. 29. chrome://net-internals/#spdy
  30. 30. Is it spdy?• www.devthought.com/2012/03/10/chrome- spdy-indicator/• ckon.wordpress.com/2012/03/11/spdy- indicator-for-firefox/
  31. 31. HTTP 2.07seconds
  32. 32. HTTPS 4.94seconds
  33. 33. SPDY 2.65seconds
  34. 34. real HTTP 17.83seconds
  35. 35. real SPDY 11.70seconds
  36. 36. LETS MAKE THE WEB FASTER
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×