<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mike&#039;s Lookout &#187; Technology</title>
	<atom:link href="http://www.belshe.com/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.belshe.com</link>
	<description></description>
	<lastBuildDate>Sat, 04 Feb 2012 19:04:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Rethinking SSL for Mobile Apps</title>
		<link>http://www.belshe.com/2012/02/04/rethinking-ssl-for-mobile-apps/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rethinking-ssl-for-mobile-apps</link>
		<comments>http://www.belshe.com/2012/02/04/rethinking-ssl-for-mobile-apps/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 19:04:20 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/?p=1040</guid>
		<description><![CDATA[TweetTweetMobile Apps use HTTP.  But they usually don&#8217;t use it to transfer HyperText &#8211; rather they are using it to transfer JSON, XML, or other data formats.  Just like their web counterparts, secure transmission is desirable.
But, if you ever trace a fresh SSL connection, you know that its a nasty process:

DNS
 TCP handshake
 [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2012/02/04/rethinking-ssl-for-mobile-apps/&via=mikebelshe&text=Rethinking SSL for Mobile Apps&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2012/02/04/rethinking-ssl-for-mobile-apps/&via=mikebelshe&text=Rethinking SSL for Mobile Apps&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2012/02/04/rethinking-ssl-for-mobile-apps/"></g:plusone></div><p>Mobile Apps use HTTP.  But they usually don&#8217;t use it to transfer HyperText &#8211; rather they are using it to transfer JSON, XML, or other data formats.  Just like their web counterparts, secure transmission is desirable.</p>
<p>But, if you ever trace a fresh SSL connection, you know that its a nasty process:</p>
<ul>
<li>DNS
<li> TCP handshake
<li> SSL handshake
<li> Server sends certificate
<li> DNS to CA
<li> TCP to CA
<li> OCSP to CA
<li> Finish SSL handshake
<li> Finally do what you wanted to do….
</ul>
<p>SSL is designed so that you can pick up some random certificate and check it dynamically.  This is a good thing for the web, where the user coasts from site to site, happily discovering new content which needs new validation.</p>
<p>But this process is pretty costly, especially on mobile networks.  For my own service, I just did a quick trace over 3G:</p>
<ul>
<li> DNS (1334ms)
<li> TCP handshake (240ms)
<li> SSL handshake (376ms)
<li> Follow certificate chain (1011ms)  &#8212; server should have bundled this.
<li> DNS to CA  (300ms)
<li> TCP to CA (407ms)
<li> OCSP to CA #1 (598ms)   &#8212; StartSSL CA uses connection close on each!
<li> TCP to CA #2 (317ms)
<li> OCSP to CA #2 (444ms)
<li> Finish SSL handshake (1270ms)
</ul>
<p>With the web, this verification process makes some sense &#8211; you ask the CA to be your trust point and verify that he trusts the certificate provided.</p>
<p>But why do this with a mobile app?  Your mobile app has a lot of trust with it &#8211; they downloaded it from you, its signed by Apple, and if the code has been compromised, well, heck, your app isn&#8217;t really running anyway.</p>
<p>What we really want for mobile apps is to bake the server&#8217;s certificate into the app.  If the server&#8217;s certificate needs to change, you can auto-update your app.   In the example above, doing so would have shaved about 3000ms off application startup time. </p>
<p>The downside of this is that if your certificate changes, your app won&#8217;t verify.  Then what to do?  Simple &#8211; force an auto update.  </p>
<p>There is another advantage to this approach.  If you can verify your own certs, you don&#8217;t need a CA provided certificate anyway.  These silly 1-2 year expirations are no longer necessary.  Sign your own cert, and verify it yourself.  Since our CAs have been getting hacked left and right in 2011, this is probably even more secure.</p>
<p>PS:  SSL is hard.  In this one trace, I can spot at *least* 3 low-hanging-fruit optimizations.  I haven&#8217;t mentioned them, because they are pervasive everywhere on the net.  There are errors here at every level &#8211; the client is missing opportunities, the server is missing opportunities, and the CA is missing opportunities!   It&#8217;s no wonder that SSL is slow.  The chance that your combination of client + server + CA will have some dumb performance bug is ~99%.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2012/02/04/rethinking-ssl-for-mobile-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SPDY configuration:  tcp_slow_start_after_idle</title>
		<link>http://www.belshe.com/2011/12/03/spdy-configuration-tcp_slow_start_after_idle/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=spdy-configuration-tcp_slow_start_after_idle</link>
		<comments>http://www.belshe.com/2011/12/03/spdy-configuration-tcp_slow_start_after_idle/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 20:14:37 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/?p=1010</guid>
		<description><![CDATA[TweetTweetIf you&#8217;re a SPDY server implementor, you&#8217;ve likely already read about the impact of CWND.  Fortunately, the TCP implementors now largely agree that we can now safely increase CWND, and the standard will likely change soon.  The default linux kernel implementation already has.
But, there is a second cwnd-related kernel flag which is not [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/12/03/spdy-configuration-tcp_slow_start_after_idle/&via=mikebelshe&text=SPDY configuration:  tcp_slow_start_after_idle&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/12/03/spdy-configuration-tcp_slow_start_after_idle/&via=mikebelshe&text=SPDY configuration:  tcp_slow_start_after_idle&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/12/03/spdy-configuration-tcp_slow_start_after_idle/"></g:plusone></div><p>If you&#8217;re a SPDY server implementor, you&#8217;ve likely already read <a href="http://code.google.com/speed/articles/tcp_initcwnd_paper.pdf">about the impact of CWND</a>.  Fortunately, the TCP implementors now largely agree that we can now safely increase CWND, and the <a href="http://code.google.com/speed/protocols/tcpm-IW10.html">standard will likely change soon</a>.  The default linux kernel implementation already has.</p>
<p>But, there is a second cwnd-related kernel flag which is not often mentioned.  It&#8217;s important in all cases, but particularly important if you&#8217;re trying to establish long-lived connections.  It&#8217;s not just important to SPDY &#8211; it&#8217;s important for HTTP keepalives or pipelines too.  And many of the large web service providers are already tuning it:</p>
<ul>
<pre>
> sysctl -a | grep tcp_slow_start_after_idle
net.ipv4.tcp_slow_start_after_idle = 1
</pre>
</ul>
<p>At casual glance, you probably think &#8220;this sounds good, after a minute or so, it will go back into slow start mode&#8221;.   That is fine, right? </p>
<p>Not quite. &#8220;Idle&#8221; in this case doesn&#8217;t mean a &#8216;minute or so&#8217;.  In fact, it doesn&#8217;t even mean a second.  This flag comes from <a href="http://www.ietf.org/rfc/rfc2861.txt">RFC2861</a>&#8217;s recommendation, which states that cwnd be cut in half with each RTT of idleness.  That means that a persistently held open connection soon degrades back to the performance of an un-warmed connection very quickly.</p>
<p>So why does this matter?  If you&#8217;re attempting to use a long-lived SPDY connection and think that the initial CWND won&#8217;t affect you because you&#8217;re only opening one connection anyway, you&#8217;re wrong.   The slow-start-after-idle will still get you. </p>
<p>While there has been a tremendous amount of investigation and discussion about the initial cwnd value, I&#8217;m not aware of any recent debate about the slow-start-after-idle.  I know that many websites are already disabling this flag to make HTTP keepalive connections perform more reasonably.  Sadly, I can&#8217;t find any research which actually measured the effects of this behavior in the real world, so I can&#8217;t fall back on any real data.  Given how aggressive TCP already is at backing off should network congestion change, I see no reason to enable this flag.  Further, if you&#8217;re helping the net by dropping from N connections to 1, there is no reason you should be further penalized for your good deeds!  Turn this one off.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/12/03/spdy-configuration-tcp_slow_start_after_idle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IPv6 DNS Lookup Times</title>
		<link>http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ipv6-dns-lookup-times</link>
		<comments>http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 17:19:46 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/</guid>
		<description><![CDATA[TweetTweetA couple of weeks ago, I posted an article about slow IPv6 DNS query performance.&#160; Several readers suggested in the comments that my observations were isolated to a few bad implementations and that perhaps Mac and Linux systems were not prone to this.&#160; I hoped they were right, but I now have data to show [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/&via=mikebelshe&text=IPv6 DNS Lookup Times&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/&via=mikebelshe&text=IPv6 DNS Lookup Times&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/"></g:plusone></div><p>A couple of weeks ago, I posted an article about <a href="http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/">slow IPv6 DNS query performance</a>.&#160; Several readers suggested in the comments that my observations were isolated to a few bad implementations and that perhaps Mac and Linux systems were not prone to this.&#160; I hoped they were right, but I now have data to show theyâ€™re wrong.</p>
<p>Measuring performance is routine in Chrome, so a couple of days ago I was able to add a simple test to measure the speed of pure IPv4 lookups (A record) vs IPv6 lookups (A + AAAA records).&#160; Today, with hundreds of millions of measurements in hand, we know the impact of IPv6 on DNS.</p>
<p><a href="http://www.belshe.com/wp-content/uploads/2011/06/ipv6dns.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ipv6dns" border="0" alt="ipv6dns" src="http://www.belshe.com/wp-content/uploads/2011/06/ipv6dns_thumb.png" width="595" height="326" /></a> </p>
<p>Windows users face a ~43% DNS latency increase and Mac users face a 146% DNS latency increase when they install an IPv6 client-side address on their machines.&#160; </p>
<p>Today, there are two basic approaches to the IPv6 lookup problem:&#160; you can issues the requests in serial or in parallel.&#160; Obviously, issuing in serial will be more latency impacting than doing them in parallel.&#160; But, even issuing them in parallel will be slower, as the maximum latency of two samples along a normal curve will be lower than the average latency of a single sample along the same curve.</p>
<p>Some readers may argue that these are dominated by older implementations.&#160; Further investigation into the data does not confirm this.&#160; Even comparing the fastest 10% of Mac or Windows users (which should hopefully be using the best DNS resolver algorithms available) are seeing greater than 100% DNS lookup latency increases with IPv6.&#160; Of course, we have conflation here, as DNS server response times may be slower in addition to the DNS client double-lookup being slower.&#160; A deeper study about <em>why</em> these results are so bad is warranted.</p>
<p><strong>Summary</strong></p>
<p>Performance-sensitive users should be cautious about assigning a global IPv6 address on their clients.&#160; As soon as they do, the browser will switch into IPv6 lookup mode, and take on a 40-100% increase in DNS latency.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/06/15/ipv6-dns-lookup-times/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Firefox Idle Connection Reuse</title>
		<link>http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=firefox-idle-connection-reuse</link>
		<comments>http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 22:42:05 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/</guid>
		<description><![CDATA[TweetTweethttpwatch does some anecdotal testing to conclude that Firefoxâ€™s new algorithm for selecting which idle connection to reuse has some strong benefits.
This is great stuff, and in general it should definitely help.&#160; This is part of why getting to one-connection-per-domain is an important goal.&#160; HTTPâ€™s use of 6 or more connections per domain make it [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/&via=mikebelshe&text=Firefox Idle Connection Reuse&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/&via=mikebelshe&text=Firefox Idle Connection Reuse&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/"></g:plusone></div><p><a href="http://blog.httpwatch.com/2011/06/10/investigating-the-network-performance-of-firefox-5/">httpwatch does some anecdotal testing</a> to conclude that Firefoxâ€™s new algorithm for selecting which idle connection to reuse has some strong benefits.</p>
<p>This is great stuff, and in general it should definitely help.&#160; This is part of why getting to one-connection-per-domain is an important goal.&#160; HTTPâ€™s use of 6 or more connections per domain make it so that each connection must â€œwarm upâ€ independently.&#160; A similar algorithm should land in Chrome soon too.</p>
<p>Fortunately, there is a <a href="http://dev.chromium.org/spdy">protocol for this stuff too <img src='http://www.belshe.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </a>&#160; Hopefully firefox will pick that up soon too.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/06/11/firefox-idle-connection-reuse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Codeflattery (n)</title>
		<link>http://www.belshe.com/2011/05/25/codeflattery-n/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=codeflattery-n</link>
		<comments>http://www.belshe.com/2011/05/25/codeflattery-n/#comments</comments>
		<pubDate>Wed, 25 May 2011 20:14:36 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/05/25/codeflattery-n/</guid>
		<description><![CDATA[TweetTweet
codeflattery     [kohd-flat-uh-ree] noun     1.&#160; when journalists write about your half-done, partial work as though it is news.
My employer (Google), my project (Chrome), and my team (SPDY) make such amazing products that the press even pays attention to my tiny hacks.&#160; That makes me proud.&#160; Codeflattery.
http://www.conceivablytech.com/7582/products/google-adds-possible-tcp-replacement-to-chrome
]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/25/codeflattery-n/&via=mikebelshe&text=Codeflattery (n)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/25/codeflattery-n/&via=mikebelshe&text=Codeflattery (n)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/05/25/codeflattery-n/"></g:plusone></div><p><strong></strong></p>
<p><strong>codeflattery     <br /></strong>[kohd-flat-uh-ree] <strong>noun     <br /></strong>1.&#160; when journalists write about your half-done, partial work as though it is news.</p>
<p>My employer (<a href="http://www.google.com/">Google</a>), my project (<a href="http://www.google.com/chrome">Chrome</a>), and my team (<a href="http://dev.chromium.org/spdy">SPDY</a>) make such amazing products that the press even pays attention to <a href="http://src.chromium.org/viewvc/chrome?view=rev&amp;revision=85753">my tiny hacks</a>.&#160; That makes me proud.&#160; Codeflattery.</p>
<p><a href="http://www.conceivablytech.com/7582/products/google-adds-possible-tcp-replacement-to-chrome">http://www.conceivablytech.com/7582/products/google-adds-possible-tcp-replacement-to-chrome</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/05/25/codeflattery-n/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SSL FalseStart Performance Results</title>
		<link>http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ssl-falsestart-performance-results</link>
		<comments>http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/#comments</comments>
		<pubDate>Thu, 19 May 2011 07:19:30 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/</guid>
		<description><![CDATA[TweetTweetFrom the Chromium Blog:
Last year, Googleâ€™s Adam Langley, Nagendra Modadugu, and Bodo Moeller proposed SSL False Start, a client-side only change to reduce one round-trip from the SSL handshake.
We implemented SSL False Start in Chrome 9, and the results are stunning, yielding a significant decrease in overall SSL connection setup times. SSL False Start reduces [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/&via=mikebelshe&text=SSL FalseStart Performance Results&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/&via=mikebelshe&text=SSL FalseStart Performance Results&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/"></g:plusone></div><p>From the <a href="http://blog.chromium.org/2011/05/ssl-falsestart-performance-results.html">Chromium Blog</a>:</p>
<p>Last year, Googleâ€™s Adam Langley, Nagendra Modadugu, and Bodo Moeller proposed <a href="https://tools.ietf.org/html/draft-bmoeller-tls-falsestart-00">SSL False Start</a>, a client-side only change to reduce one round-trip from the <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">SSL</a> handshake.</p>
<p>We implemented SSL False Start in Chrome 9, and the results are stunning, yielding a significant decrease in overall SSL connection setup times. SSL False Start reduces the latency of a SSL handshake by 30%<sup>1</sup>. That is a big number. And reducing the cost of a SSL handshake is critical as<a href="https://blog.facebook.com/blog.php?post=486790652130">more</a> and <a href="http://blog.twitter.com/2011/03/making-twitter-more-secure-https.html">more</a> content providers move to SSL.</p>
<p><a href="http://1.bp.blogspot.com/-HEDDbzyoGJ8/TdS6mewxD9I/AAAAAAAAAEQ/hY4K6C97wBE/s1600/false%2Bstart%2Bgraph.png"><img border="0" alt="" src="http://1.bp.blogspot.com/-HEDDbzyoGJ8/TdS6mewxD9I/AAAAAAAAAEQ/hY4K6C97wBE/s400/false%2Bstart%2Bgraph.png" /></a></p>
<p>Our biggest concern with implementing SSL False Start was backward compatibility. Although nothing in the SSL specification (also known as TLS) explicitly prohibits FalseStart, there was no easy way to know whether it would work with all sites. Speed is great, but if it breaks user experience for even a small fraction of users, the optimization is non-deployable.</p>
<p>To answer this question, we compiled a list of all known https websites from the Google index, and tested SSL FalseStart with all of them. The result of that test was encouraging: 94.6% succeeded, 5% timed out, and 0.4% failed. The sites that timed out were verified to be sites that are no longer running, so we could ignore them.</p>
<p>To investigate the failing sites, we implemented a more robust check to understand how the failures occurred. We disregarded those sites that failed due to certificate failures or problems unrelated to FalseStart. Finally, we discovered that the sites which didnâ€™t support FalseStart were using only a handful of SSL vendors. We reported the problem to the vendors, and most have fixed it already, while the others have fixes in progress. The result is that today, we have a manageable, small list of domains where SSL FalseStart doesnâ€™t work, and weâ€™ve added them to a list within Chrome where we simply wonâ€™t use FalseStart. This list is public and posted in the chromium source code. We are actively working to shrink the list and ultimately remove it.</p>
<p>All of this represents a tremendous amount of work with a material gain for Chrome SSL users. We hope that the data will be confirmed by other browser vendors and adopted more widely.</p>
<hr /><sup>1</sup>Measured as the time between the initial TCP SYN packet and the end of the TLS handshake.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/05/19/ssl-falsestart-performance-results/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IPv6 Will Slow You Down (DNS)</title>
		<link>http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ipv6-will-slow-you-down-dns</link>
		<comments>http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/#comments</comments>
		<pubDate>Wed, 18 May 2011 17:40:00 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/</guid>
		<description><![CDATA[TweetTweet When you turn on IPv6 in your operating system, the web is going to get slower for you.&#160; There are several reasons for this, but today Iâ€™m talking about DNS.&#160; Every DNS lookup is 2-3x slower with IPv6.
What is the Problem?    The problem is that the current implementations of DNS will [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/&via=mikebelshe&text=IPv6 Will Slow You Down (DNS)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/&via=mikebelshe&text=IPv6 Will Slow You Down (DNS)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/"></g:plusone></div><p><a href="http://www.belshe.com/wp-content/uploads/2011/05/ipv6logo.jpg"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 15px; display: inline; border-top: 0px; border-right: 0px" title="ipv6-logo" border="0" alt="ipv6-logo" align="right" src="http://www.belshe.com/wp-content/uploads/2011/05/ipv6logo_thumb.jpg" width="200" height="138" /></a> When you turn on <a href="http://en.wikipedia.org/wiki/IPv6">IPv6</a> in your operating system, the web is going to get slower for you.&#160; There are several reasons for this, but today Iâ€™m talking about DNS.&#160; Every DNS lookup is 2-3x slower with IPv6.</p>
<p><strong>What is the Problem?</strong>    <br />The problem is that the current implementations of DNS will do both an IPv4 and an IPv6 lookup in serial rather than parallel.&#160; This is operating as-per the specification.</p>
<p>We can see this on Windows:</p>
<p><font face="Courier New">&#160;&#160;&#160;&#160; TIME&#160;&#160; EVENT     <br />&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160; DNS Request A </font><a href="http://www.amazon.com"><font face="Courier New">www.amazon.com</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 39&#160;&#160;&#160; DNS Response </font><a href="http://www.amazon.com"><font face="Courier New">www.amazon.com</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 39&#160;&#160;&#160; DNS Request AAAA </font><a href="http://www.amazon.com"><font face="Courier New">www.amazon.com</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 79&#160;&#160;&#160; DNS Response </font><a href="http://www.amazon.com"><font face="Courier New">www.amazon.com</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160; &lt;the browser cannot continue until here&gt;</font></p>
<p>The â€œAâ€ request there was the IPv4 lookup, and it took 39ms.&#160; The â€œAAAAâ€ request is the IPv6 lookup, and it took 40ms.&#160;&#160; So, prior to turning IPv6 on, your DNS resolution finished in 39ms.&#160; Thanks to your IPv6 address, it will now take 79ms, even if the server does not support IPv6!&#160; Amazon does not advertise an IPv6 result, so this is purely wasted time.</p>
<p>Now you might think that 40ms doesnâ€™t seem too bad, right?&#160; But remember that this happens for every host you lookup.&#160; And of course, Amazonâ€™s webpage uses many sub-domain hosts.&#160; In the web page above, I saw more of these shenanigans, like this:</p>
<p><font face="Courier New">&#160;&#160;&#160;&#160; TIME&#160;&#160; EVENT     <br />&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160; DNS Request A </font><a href="http://www.amazon.com"><font face="Courier New">g-ecx.images-amazon.com</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 43&#160;&#160;&#160; DNS Response <a href="http://www.amazon.com"><font face="Courier New">g-ecx.images-amazon.com</font></a></font><font face="Courier New">     <br />&#160;&#160;&#160;&#160;&#160; 43&#160;&#160;&#160; DNS Request AAAA <a href="http://www.amazon.com"><font face="Courier New">g-ecx.images-amazon.com</font></a>      <br /></font><font face="Courier New">&#160;&#160;&#160;&#160; 287&#160;&#160;&#160; DNS Response </font><a href="http://www.amazon.com"><font face="Courier New"><a href="http://www.amazon.com"><font face="Courier New">g-ecx.images-amazon.com</font></a></font></a></p>
<p>Ouch â€“ that extra request cost us 244ms.</p>
<p>But thereâ€™s more.&#160; In this trace we also had a lookup for the OCSP server (an Amazonâ€™s behalf, for SSL):</p>
<p><font face="Courier New">&#160;&#160;&#160;&#160; TIME&#160;&#160; EVENT     <br />&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160; DNS Request A </font><a href="http://www.amazon.com"><font face="Courier New">ocsp.versign.com</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160; 116&#160;&#160;&#160; DNS Response </font><a href="http://www.amazon.com"><font face="Courier New">ocsp.versign.com</font></a><font face="Courier New">     <br />&#160;&#160;&#160;&#160; 116&#160;&#160;&#160; DNS Request AAAA </font><a href="http://www.amazon.com"><font face="Courier New">ocsp.versign.com</font></a><font face="Courier New">     <br /></font><font face="Courier New">&#160;&#160;&#160;&#160; 203&#160;&#160;&#160; DNS Response </font><a href="http://www.amazon.com"><font face="Courier New">ocsp.versign.com</font></a></p>
<p>Ouch â€“ another 87ms down the drain.</p>
<p>The average website spans 8 domains.&#160; A few milliseconds here, and a few milliseconds there, and pretty soon weâ€™re talking about seconds.</p>
<p>The point is that DNS performance is key to web performance!&#160; And in these 3 examples, weâ€™ve slowed down DNS by 102%, 567%, and 75% respectively.&#160; Iâ€™m not picking out isolated cases.&#160; Try it yourself, <em>this is â€œnormalâ€</em> with IPv6.</p>
<p><strong>What About Linux?     <br /></strong>Basically all of the operating systems do the same thing.&#160; The common API for doing these lookups is getaddrinfo(), and it is used by all major browsers.&#160; It does both the IPv4 and IPv6 lookups, sorts the results, and returns them to the application.</p>
<p>So on Linux, the behavior ends up being like this:</p>
<p><font face="Courier New">&#160;&#160;&#160;&#160; TIME&#160;&#160; EVENT     <br />&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160; DNS Request AAAA <a href="http://www.calpoly.edu">www.calpoly.edu</a>      <br /></font><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 75&#160;&#160;&#160; DNS Response <a href="http://www.calpoly.edu">www.calpoly.edu</a>      <br /></font><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 75&#160;&#160;&#160; DNS Request A <a href="http://www.calpoly.edu">www.calpoly.edu</a>      <br /></font><font face="Courier New">&#160;&#160;&#160;&#160;&#160; 93&#160;&#160;&#160; DNS Response <a href="http://www.calpoly.edu">www.calpoly.edu</a></font></p>
<p><font face="Courier New">In this particular case, we only wasted 75ms, when the actual request would have completed in 18ms (416% slower).</font></p>
<p><strong>But Itâ€™s Even Worse</strong>    <br />I wish I could say that DNS latencies were just twice as slow.&#160; But itâ€™s actually worse than that.&#160; Because IPv6 is not commonly used, the results of IPv6 lookups are not heavily cached at the DNS servers like IPv4 addresses are. This means that it is more likely that an IPv6 lookup will need to jump through multiple DNS hops to complete a resolution.&#160; </p>
<p>As a result, itâ€™s not just that weâ€™re doing two lookups instead of one.&#160; Itâ€™s that weâ€™re doing two lookups <em>and</em> the second lookup is fundamentally slower than the first.</p>
<p><strong>Surely Someone Noticed This Before?</strong>    <br />This has been noticed before.&#160; Unfortunately, with nobody using IPv6, the current slowness was an acceptable risk.&#160; Application vendors (namely browser vendors) have said, â€œthis isnâ€™t our problem, host resolution is the OSâ€™s jobâ€.</p>
<p>The net result is that everyone knows about this flaw.&#160; But nobody fixed it.&#160; (Thank goodness for <a href="http://blog.chromium.org/2008/09/dns-prefetching-or-pre-resolving.html">DNS Prefetching</a>!)</p>
<p>Just last year, the <a href="http://tools.ietf.org/html/draft-wing-v6ops-happy-eyeballs-ipv6-01">â€œHappy Eyeballsâ€ RFC</a> was introduced which proposes a work around to this problem by racing connections against each other.&#160; This is an obvious idea, of course.&#160; I donâ€™t know of anyone implementing this yet, but it is certainly something weâ€™re talking about on the Chrome team.</p>
<p><strong>What is The Operating Systemâ€™s Job?</strong>    <br />All browsers, be it Chrome or Firefox or IE, use the operating system to do DNS lookups.&#160; Observers often ask, â€œwhy doesnâ€™t Chrome (or Firefox, or IE) have its own asynchronous DNS resolver?â€&#160; The problem is that every operating system, from Windows to Linux to Mac has multiple name-resolution techniques, and resolving hostnames in the browser requires using them all, based on the userâ€™s operating configuration.&#160; Examples of non-DNS resolvers include:&#160; NetBIOS/WINS, /etc/hosts files, and Yellow Pages.&#160; If the browser simply bypassed all of these an exclusively used DNS, some users would be completely broken.</p>
<p>If these DNS problems had been fixed at the OS layer, I wouldnâ€™t be writing this blog post right now.&#160; But I donâ€™t really blame Windows or Linux â€“ nobody was turning this stuff on.&#160; Why should they shine a part of their product that nobody uses?</p>
<p><strong>Lesson Learned:&#160; Only The Apps Can â€˜Pullâ€™ Protocol Changes     <br /></strong><a href="http://en.wikipedia.org/wiki/IPv6_deployment">IPv6 deployment</a> has been going on for over 10 years now, and there is no end in sight.&#160; The current plan (<a href="http://isoc.org/wp/worldipv6day/">like IPv6â€™s break the internet day</a>) is the same plan weâ€™ve been doing for 10 years.&#160; <em>When do we admit that the current plan to deploy IPv6 is simply never going to work</em>?</p>
<p>A lesson learned from SPDY is that only the applications can drive protocol changes.&#160; The OSâ€™s, bless their hearts, can only do so much and move too slowly to push new protocols.&#160; There is an inevitable chicken-and-egg problem where applications wonâ€™t use it because OS support is not there and OSes wonâ€™t optimize it because applications arenâ€™t there.</p>
<p>The only solution is at the Application Layer â€“ the browser.&#160; But that may be the best news of all, because it means that we can fix this!&#160; More to comeâ€¦</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/05/18/ipv6-will-slow-you-down-dns/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>IPv6 latency analysis coming&#8230;.</title>
		<link>http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ipv6-latency-analysis-coming</link>
		<comments>http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/#comments</comments>
		<pubDate>Fri, 13 May 2011 18:13:39 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/</guid>
		<description><![CDATA[TweetTweetOver the next few days, Iâ€™m going to be posting some blogs about IPv6 performance.
The results are pretty grim â€“ but my aim is not to make everyone despair.
There is a solution, and I think I can see light at the end of the tunnel.&#160; My theory is that weâ€™ve been approaching IPv6 deployment incorrectly [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/&via=mikebelshe&text=IPv6 latency analysis coming&hellip;.&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/&via=mikebelshe&text=IPv6 latency analysis coming&hellip;.&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/"></g:plusone></div><p>Over the next few days, Iâ€™m going to be posting some blogs about IPv6 performance.</p>
<p>The results are pretty grim â€“ but my aim is not to make everyone despair.</p>
<p>There is a solution, and I think I can see light at the end of the tunnel.&#160; My theory is that weâ€™ve been approaching IPv6 deployment incorrectly for the last 10 years.&#160; It seems obvious now, but it wasnâ€™t obvious 10 years ago, and things have certainly changed which enable this new mechanism.&#160; </p>
<p><a href="http://isoc.org/wp/worldipv6day/">IPv6 break-the-world-day</a> is approaching quickly.&#160; If you havenâ€™t started thinking about this, you should.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/05/13/ipv6-latency-analysis-coming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Get a Small Cert Chain</title>
		<link>http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-get-a-small-cert-chain</link>
		<comments>http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 22:13:18 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/</guid>
		<description><![CDATA[TweetTweet After my last article illustrated the length of our Certificate Chains, many people asked me â€œok â€“ well how do I get a small one?â€.&#160; 
The obvious answer is to get your certificate signed as close to the root of a well-rooted Certificate Authority (CA) as possible.&#160; But that isnâ€™t very helpful.&#160; To answer [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/&via=mikebelshe&text=How to Get a Small Cert Chain&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/&via=mikebelshe&text=How to Get a Small Cert Chain&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/"></g:plusone></div><p><a href="http://www.belshe.com/wp-content/uploads/2011/04/chain.jpg"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="chain" border="0" alt="chain" align="right" src="http://www.belshe.com/wp-content/uploads/2011/04/chain_thumb.jpg" width="65" height="240" /></a> After my last <a href="http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/">article illustrated the length of our Certificate Chains</a>, many people asked me â€œok â€“ well how do I get a small one?â€.&#160; </p>
<p>The obvious answer is to get your certificate signed as close to the root of a well-rooted Certificate Authority (CA) as possible.&#160; But that isnâ€™t very helpful.&#160; To answer the question, lets look at a few of the problems and tradeoffs.</p>
<p><strong>Problem #1:&#160; Most CAâ€™s Wonâ€™t Sign At The Root</strong></p>
<p>Most CAâ€™s wonâ€™t sign from the root.&#160; Root CAs are key to our overall trust on the web, so simply having them online is a security risk.&#160; If the roots are hacked, it can send a shockwave through our circle of trust.&#160; As such, most CAs keep their root servers offline most of the time, and only bring them online occasionally&#160; (every few months) to sign for a subordinate CA in the chain.&#160; The real signing is most often done from the subordinate.</p>
<p>While this is already considered a â€˜best practiceâ€™ for CAs, Microsoftâ€™s Windows Root CA Program Requirements were just updated last month to require that leaf certificates are not signed directly at the root.&#160; From <a href="http://social.technet.microsoft.com/wiki/contents/articles/windows-root-certificate-program-technical-requirements.aspx">section F-2</a>:</p>
<blockquote><p>All root certificates distributed by the Program must be maintained in an offline state â€“ that is, root certificates may not issue end-entity certificates of any kind, except as explicitly approved from Microsoft.</p>
</blockquote>
<p>Unfortunately for latency, this is probably the right thing to do.&#160; So expecting a leaf certificate directly from the root is unreasonable.&#160; The best we can hope for is one level down.</p>
<p><strong>Problem #2: â€œWorksâ€ is more important than â€œFastâ€</strong></p>
<p>Having your site be accessible to all of your customers is usually more important than being optimally fast.&#160; If you use a CA not trusted by 1% of your customers, are you willing to lose those customers because they canâ€™t reach your site?&#160; Probably not.</p>
<p>To solve this, we wish that we could serve multiple certificates, and always present a certificate to the client which we know that specific will trust.&#160; (e.g. if an old Motorola Phone from 2005 needs a different CA, we could use a different certificate just for that client.&#160; But alas, SSL does not expose a user-agent as part of the handshake, so the server canâ€™t do this.&#160; Again, hiding the user agent is important from a privacy and security point of view. </p>
<p>Because we want to reach all of our clients, and because we donâ€™t know which client is connecting to us, we simply have to use a certificate chain which we know all clients will trust.&#160; And that leads us to either presenting a very long certificate chain, or only purchasing certificates from the oldest CAs.</p>
<p>I am sad that our SSL protocol gives the incumbent CAs an advantage over new ones.&#160; It is hard enough for a CA to get accepted by all the modern browsers.&#160; But how can a CA be taken seriously if it isnâ€™t supported by 5-10% of the clients out there?&#160; Or if users are left with a higher-latency SSL handshake?</p>
<p><strong>Problem #3: Multi-Rooting of CAs</strong></p>
<p>We like to think of the CA trust list as well-formed tree where the roots are roots, and the non-roots are not roots.&#160; But, because the clients change their trust points over time, this is not the case.&#160; What is a root to one browser is not a root to another.</p>
<p>As an example, we can look at the certificate chain presented by <a href="http://www.skis.com">www.skis.com</a>.&#160; Poor skis.com has a certificate chain of 5733 bytes (4 pkts, 2 RTs), with the following certificates:</p>
<ol>
<li>skis.com: 2445 bytes</li>
<li>Go Daddy Secure Certification Authority 1250 bytes</li>
<li>Go Daddy Class 2 Certification Authority: 1279 bytes</li>
<li>ValiCert Class 2 Policy Validation Authority: 747 bytes</li>
</ol>
<p>In Firefox, Chrome and IE (see note below), the 3rd certificate in that chain (Go Daddy Class 2 Certification Authority) is already considered a trusted root.&#160; The server sent certificates 3 and 4, and the client didnâ€™t even need them.&#160; Why?&#160; This is likely due to Problem #2 above.&#160; Some older clients may not consider Go Daddy a trusted root yet, and therefore, for compatibility, it is better to send all 4 certificates.</p>
<p><strong>What Should Facebook Do?</strong></p>
<p>Obviously I donâ€™t know exactly what Facebook should do.&#160; Theyâ€™re smart and theyâ€™ll figure it out.&#160; But FBâ€™s large certificate chain suffers the same problem as the Skis.com site:&#160; they include a cert they usually donâ€™t need in order to ensure that all users can access Facebook.</p>
<p>Recall that FB sends 3 certificates.&#160; The 3rd is already a trusted root in the popular browsers (DigiCert), so sending it is superfluous for most users.&#160; The DigiCert cert is signed by Entrust.&#160; I presume they send the DigiCert certificate (1094 bytes) because some older clients donâ€™t have DigiCert as a trusted root, but they do have Entrust as a trusted root.&#160; I can only speculate.</p>
<p>Facebook might be better served to move to a more well-rooted vendor.&#160; This may not be cheap for them.</p>
<p><strong>Aside: Potential SSL Protocol Improvements</strong></p>
<p>If youâ€™re interested in protocol changes, this investigation has already uncovered some potential improvements for SSL:</p>
<ul>
<li>Exposing some sort of minimal user-agent would help servers ensure that they can select an optimal certificate chain to each customer.&#160; Or, exposing some sort of optional â€œI trust CA root list #1234â€, would allow the server to select a good certificate chain without knowing anything about the browser, other than its root list.&#160; Of course, even this small amount of information does sacrifice some amount of privacy.</li>
<li>The certificate chain is not compressed.&#160; It could be, and some of these certificates compress by 30-40%.</li>
<li>If SNI were required (sadly still not supported on Windows XP), sites could avoid lengthy lists of subject names in their certificates.&#160; Since many sites separate their desktop and mobile web apps (e.g. <a href="http://www.google.com">www.google.com</a> vs m.google.com), this may be a way to serve better certificates to mobile vs web clients.</li>
</ul>
<p><strong>Who Does My Browser Trust, Anyway?</strong></p>
<p>All browsers use a â€œcertificate storeâ€ which contains the list of trusted root CAs. </p>
<p>The certificate store can either be provided by the OS, or by the browser.</p>
<p>On Windows, Chrome and IE use the operating-system provided certificate store.&#160; So they have the same points of trust.&#160; However, this means that the trust list is governed by the OS vendor, not the browser.&#160; Iâ€™m not sure how often this list is updated for Windows XP, which is still used by 50% of the worldâ€™s internet users.</p>
<p>On Mac, Chrome and Safari use the operating system provided store.</p>
<p>On Linux, there is no operating system provided certificate store, so each browser maintains its own certificate store, with its own set of roots.</p>
<p>Firefox, on all platforms (I believe, I might be wrong on this) uses its own certificate store, independent of the operating system store.</p>
<p>Finally, on mobile devices, everyone has their own certificate store.&#160; Iâ€™d hate to guess at how many there are or how often they are updated.</p>
<p>Complicated, isnâ€™t it?</p>
<p><strong>Yeah Yeah, but Where Do I Get The Best Certificate?</strong></p>
<p>If you read this far, you probably realize I canâ€™t really tell you.&#160; It depends on who your target customers are, and how many obscure, older devices you need to support. </p>
<p>From talking to others who are far more knowledgeable on this topic than I, it seems like you might have the best luck with either <strong>Equifax</strong> or <strong>Verisign</strong>.&#160; Using the most common CAs will have the side benefit that the browser may have cached the OCSP responses for any intermediate CAs in the chain already.&#160; This is probably a small point, though.</p>
<p>Some of the readers of this thread pointed me at what appears to be the smallest, well-rooted certificate chain Iâ€™ve seen.&#160; <a href="https://api-secure.recaptcha.net">https://api-secure.recaptcha.net</a> has a certificate signed directly at the root by Equifax.&#160; The total size is 871 bytes.&#160; I donâ€™t know how or if you can get this yourself.&#160; You probably canâ€™t.</p>
<p><strong>Finally, Does This Really Matter?</strong></p>
<p>SSL has two forms of handshakes:</p>
<ul>
<li>Full Handshake</li>
<li>Session Resumption Handshake</li>
</ul>
<p>All of this certificate transfer, OCSP and CRL verification only applies to the Full Handshake.&#160; Further, OCSP and CRL responses are cacheable, and are persisted to disk (at least with the Windows Certificate Store they are).&#160; </p>
<p>So, how often do clients do a full handshake, receiving the entire certificate chain from the server?&#160; I donâ€™t have perfect numbers to cite here, and it will vary depending on how frequently your customers return to your site.&#160; But there is evidence that this is as high as 40-50% of the time.&#160; Of course, the browser bug mentioned in the prior article affects these statistics (6 concurrent connections, each doing full handshakes).</p>
<p>And how often do clients need to verify the full certificate chain?&#160; This appears to be substantially less, thanks to the disk caching.&#160; Our current estimates are less than 5% of SSL handshakes do OCSP checks, but weâ€™re working to gather more precise measurements.</p>
<p>In all honesty, there are probably more important things for your site to optimize.&#160; This is a lot of protocol gobbledygook.</p>
<p>Thank you to <a href="http://www.imperialviolet.org/">agl</a>, wtc, <a href="http://roskind.com/">jar</a>, and others who provided great insights into this topic.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/04/23/how-to-get-a-small-cert-chain/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Certificate Validation Example: Facebook</title>
		<link>http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=certificate-validation-example-facebook</link>
		<comments>http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 17:50:48 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/</guid>
		<description><![CDATA[TweetTweetMost people know the concepts of SSL, but not the gory details.&#160; By using Facebook as a walkthrough example, Iâ€™m going to discuss how it works from the browserâ€™s viewpoint, and how it impacts latency to your site.&#160; BTW, this is not intended as a criticism of Facebook &#8211; theyâ€™re doing all the right things [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/&via=mikebelshe&text=Certificate Validation Example: Facebook&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/&via=mikebelshe&text=Certificate Validation Example: Facebook&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/"></g:plusone></div><p>Most people know the concepts of <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">SSL</a>, but not the gory details.&#160; By using Facebook as a walkthrough example, Iâ€™m going to discuss how it works from the browserâ€™s viewpoint, and how it impacts latency to your site.&#160; BTW, this is not intended as a criticism of Facebook &#8211; theyâ€™re doing all the right things to make sure your data is encrypted and authenticated and fast.&#160; The failures highlighted here are failures of a system that wasnâ€™t designed for speed.</p>
<p><strong>Fetching the Certificate</strong>    <br />When you first connect to a SSL site, the client and server use the serverâ€™s <a href="http://en.wikipedia.org/wiki/Public_key">public key</a> to exchange a secret which will be used to encrypt the session.&#160; So the first thing the client needs to do is to get the serverâ€™s public key.&#160; The public key is sent as part of the SSL Server Hello message.&#160;&#160; When we look at the Server Hello Message from Facebook, we see that it sent us a Certificate which was 4325 bytes in size.&#160; This means that before your HTTP request even gets off your computer, the server had to send 4KB of data to the client.&#160; Thatâ€™s a pretty big bundle, considering that the entire Facebook login page is only 8.8KB.&#160; Now, if a public key is generally only 1024 or 2048 bits, with elliptic curve keys being much smaller than that, <em><strong>how did Facebookâ€™s certificate mushroom from 256 to 4325 bytes</strong></em>?&#160; Clearly there is a lot of overhead.&#160; More on this later.</p>
<p><strong>Trusting the Certificate</strong>    <br />Once the browser has the serverâ€™s certificate, it needs to validate that the certificate is authentic.&#160; After all, did we really get Facebookâ€™s key? Maybe someone is trying to trick us.&#160; To deal with this, public keys are always transferred as part of a certificate, and the certificate is signed by a source, which needs to be trusted.&#160; Your operating system shipped with a list of known and trusted signers (certificate authority roots).&#160; The browser will verify that the Facebook certificate was signed by one of these known, trusted signers.&#160; There are dozens of trusted parties already known to your browser.&#160; Do you trust them all? Well, you donâ€™t really get a choice.&#160; More on this later.</p>
<p>But very few, if any, certificates are actually signed by these CAâ€™s.&#160; Because the Root CAâ€™s are so important to the overall system, theyâ€™re usually kept offline to minimize chances of hackery.&#160; Instead, these CAs periodically delegate authority to intermediate CAs, when then validate Facebookâ€™s certificate.&#160; The browser doesnâ€™t care who signs the certificate, as long the chain of certificates ultimately flows to a trusted root CA.</p>
<p>And now we can see why Facebookâ€™s Certificate is so large.&#160; Itâ€™s actually not just one Certificate &#8211; it is 3 certificates rolled into one bundle:</p>
<ul>
<li><a href="http://www.facebook.com/">www.facebook.com</a> (1590 bytes)</li>
<li><a href="http://www.digicert.com/">www.digicert.com</a> (1625 bytes)</li>
<li><a href="http://www.digicert.com/">www.digicert.com</a> EV Root (1094 bytes)</li>
</ul>
<p>The browser must verify each link of the chain in order to authenticate that this is really Facebook.com.</p>
<p>Facebook, being as large as they are, would be well served by finding a way to reduce the size of this certificate, and by removing one level from their chain.&#160; <em>They should talk to DigiSign about this immediately.</em></p>
<p><strong>Verifying The Certificate     <br /></strong>With the Facebook Certificate in hand, the browser can almost verify the site is really Facebook.&#160; There is one catch &#8211; the designers of Certificates put in an emergency safety valve.&#160; What happens if someone does get a fraudulent certificate (<a href="http://www.eweek.com/c/a/Security/Comodo-Hacker-Exploited-Insecure-Passwords-to-Generate-SSL-Certs-736334/">like what happened last month with Comodo</a>) or steal your private key?&#160; There are two mechanisms built into the browser to deal with this.</p>
<p>Most people are familiar with the concept of the <a href="http://en.wikipedia.org/wiki/Certificate_revocation_list">â€œCertificate Revocation Listâ€ (CRL).</a>&#160; Inside the certificate, the signer puts a link to where the CRL for this certificate would be found.&#160; If this certificate were ever compromised, the signer could add the serial number for this certificate to the list, and then the browser would refuse to accept the certificate. CRLs can be cached by the operating system, for a duration specified by the CA.</p>
<p>The second type of check is to use the <a href="http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol">Online Certificate Status Protocol (OCSP)</a>.&#160; With OCSP, instead of the browser having to download a potentially very large list (CRL), the browser simply checks this one certificate to see if it has been revoked.&#160; Of course it must do this for each certificate in the chain.&#160; Like with CRLs, these are cacheable, for durations specified in the OCSP response.</p>
<p>In the Facebook.com example, the DigiCert certificates specify an OCSP server.&#160; So as soon as the browser received the Server Hello message, it took a timeout with Facebook and instead issued a series of OCSP requests to verify the certificates havenâ€™t been revoked. </p>
<p>In my trace, this process was quick, with a 17ms RTT, and spanning 4 round-trips (DNS, TCP, OCSP Request 1, OCSP Request 2), this process took 116ms.&#160; Thatâ€™s a pretty fast case.&#160; Most users have 100+ms RTTs and would have experienced approximately a Â½ second delay.&#160; And again, this all happens before weâ€™ve transmitted a single byte of actual Facebook content.&#160; And by the way, the two OCSP responses were 417 bytes and 1100 bytes, respectively. </p>
<p><strong>Oh but the CDN!</strong>    <br />All major sites today employ Content Delivery Networks to speed the site, and Facebook is no exception.&#160; For Facebook, the CDN site is â€œstatic.ak.facebook.comâ€, and it is hosted through Akamai. Unfortunately, the browser has no way of knowing that <a href="http://static.ak.facebook.com/">static.ak.facebook.com</a> is related to <a href="http://facebook.com/">facebook.com</a>, and so it must repeat the exact same certificate verification process that we walked through before.</p>
<p>For Facebookâ€™s CDN, the Certificate is 1717 bytes, comprised of 2 certificates:</p>
<ul>
<li><a href="http://static.ak.facebook.com/">static.ak.facebook.com</a> (737 bytes)</li>
<li>Akamai Subordinate CA (971 bytes)</li>
</ul>
<p>Unlike the certificate for facebook.com, these certificates specify a CRL instead of an OCSP server.&#160; By manually fetching the CRL from the Facebook certificate, I can see that the CRL is small &#8211; only 886 bytes. But I didnâ€™t see the browser fetch it in my trace.&#160; Why not?&#160; Because the CRL in this case specifies an expiration date of July 12, 2011, so my browser already had it cached.&#160; Further, my browser wonâ€™t re-check this CRL until July, 4 months from now.&#160; This is interesting, for reasons Iâ€™ll discuss later.</p>
<p><strong>Oh but the Browser Bug!     <br /></strong>But for poor Facebook, there is a browser bug (present in all major browsers, including IE, FF, and Chrome) which is horribly sad.&#160; The main content from Facebook comes from www.facebook.com, but as soon as that page is fetched, it references 6 items from static.ak.facebook.com.&#160; The browser, being so smart, will open 6 parallel SSL connections to the <a href="http://static.ak.facebook.com/">static.ak.facebook.com</a> domain. Unfortunately, each connection will resend the same SSL certificate (1717 bytes).&#160; That means that weâ€™ll be sending over 10KB of data to the browser for redundant certificate information.</p>
<p>The reason this is a bug is because, when the browser doesnâ€™t have certificate information cached for facebook.com, it should have completed the first handshake first (downloading the certificate information once), and then used the faster, SSL session resumption for each of the other 5 connections.</p>
<p><strong>Putting It All Together     <br /></strong>So, for Facebook, the overall impact of SSL on the initial user is pretty large.&#160; On the first connection, weâ€™ve got:</p>
<ul>
<li>2 round trips for the SSL handshake</li>
<li>4325 bytes of Certificate information</li>
<li>4 round trips of OCSP validation</li>
<li>1500 bytes of OCSP response data</li>
</ul>
<p> Then, for the CDN connections weâ€™ve got:
<ul>
<li>2 round trips for the SSL handshake</li>
<li>10302 bytes of Certificate information (1717 duplicated 6 times)</li>
</ul>
<p>The one blessing is that SSL is designed with a fast-path to re-establish connectivity.&#160; So subsequent page loads from Facebook do get to cut out most of this work, at least until tomorrow, when the browser probably forgot most of it and has to start over again.</p>
<p><strong><font size="3">Making it Better</font></strong></p>
<p><strong>OCSP &amp; CRLs are broken     <br /></strong>In the above example, if the <a href="http://static.ak.facebook.com/">static.ak.facebook.com</a> keys are ever compromised, browsers around the planet will not notice for 4 months. In my opinion, that is too long.&#160; For the OCSP checks, we cache the result for usually ~7 days.&#160; Having users exposed to broken sites for 7 days is also a long time.&#160; And when Comodo was hacked a month ago, the browser vendors elected to immediately patch every browser user on the planet rather than wait for the OCSP caches to expire in a week.&#160; Clearly the industry believes the revocation checking is broken when it is easier to patch than rely on the built-in infrastructure.</p>
<p>But it is worse than that.&#160; What does a browser do when if the OCSP check fails?&#160; Of course, it proceeds, usually without even letting the user know that it has done so (heck, users wouldnâ€™t know what to do about this anyway)!&#160;&#160; <a href="http://www.imperialviolet.org/2011/03/18/revocation.html">Adam Langley points this out in great detail</a>, but the browsers really donâ€™t have an option.&#160; Imagine if DigiCert were down for an hour, and because of that users couldnâ€™t access Facebook?&#160; Itâ€™s far more likely that DigiCert had downtime than that the certificate has been revoked.</p>
<p>But why are we delaying our users so radically to do checks that weâ€™re just going to ignore the result of if they fail anyway?&#160; Having a single-point-of-failure for revocation checking makes it impossible to do anything else.</p>
<p><strong>Certificates are Too Wordy     <br /></strong>I feel really sorry for Facebook with itâ€™s 4KB certificate.&#160; I wish I could say theirs was somehow larger than average.&#160; They are so diligent about keeping their site efficient and small, and then they get screwed by the Certificate.&#160; Keep in mind that their public key is only 2048bits. We could transmit that with 256B of data.&#160; Surely we can find ways to use fewer intermediate signers and also reduce the size of these certificates?</p>
<p><strong>Certificate Authorities are Difficult to Trust     <br /></strong>Verisign and others might claim that most of this overhead is necessary to provide integrity and all the features of SSL.&#160; But is the integrity that we get really that much better than a leaner PGP-like system?&#160; The browser today has dozens of root trust points, with those delegating trust authority to hundreds more.&#160; Chinaâ€™s government is trusted by browsers today to sign certificates for google.com, or even facebook.com.&#160; <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476766">Do we trust them all?</a></p>
<p>A PGP model could reduce the size of the Certificates, provide decentralization so that we could enforce revocation lists, and eliminate worries about trusting China, the Iranian government, the US government, or any dubious entities that have signature authority today.</p>
<p><strong>Better Browser Implementations     <br /></strong>I mentioned above about the flaw where the browser will simultaneously open multiple connections to a single site when it knows it doesnâ€™t have the serverâ€™s certificate, and thus redundantly download potentially large certs.&#160; All browsers need to be smarter.    <br />Although I expressed my grievances against the OCSP model above, it is used today.&#160; If browsers continue to use OCSP, they need to fully implement OCSP caching on the client, they need to support <a href="http://en.wikipedia.org/wiki/OCSP_stapling">OCSP stapling</a>, and they need to help push the OCSP multi-stapling forward.</p>
<p><strong>SSL Handshake Round Trips</strong>    <br />The round trips in the handshake are tragic.&#160; Fortunately, we can remove one, and Chrome users get this for free thanks to <a href="http://tools.ietf.org/search/draft-bmoeller-tls-falsestart-00">SSL False Start</a>.&#160; False Start is a relatively new, client-side only change.&#160; Weâ€™ve measured that it is effective at removing one round trip from the handshake, and that it can reduce page load times by more than 5%.</p>
<p>Hopefully I got all that right, if you read this far, you deserve a medal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/04/20/certificate-validation-example-facebook/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Mary Meeker&#8217;s USA Evaluation</title>
		<link>http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mary-meekers-usa-evaluation</link>
		<comments>http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 20:20:34 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Editorial]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/</guid>
		<description><![CDATA[TweetTweetThis is awesome.&#160; Worth reading every slide!
USA Inc. &#8211; A Basic Summary of America&#8217;s Financial Statements 
]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/&via=mikebelshe&text=Mary Meeker&rsquo;s USA Evaluation&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/&via=mikebelshe&text=Mary Meeker&rsquo;s USA Evaluation&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/"></g:plusone></div><p>This is awesome.&#160; Worth reading every slide!</p>
<p><a style="margin: 12px auto 6px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline; font-size-adjust: none; font-stretch: normal; -x-system-font: none" title="View USA Inc. - A Basic Summary of America&#39;s Financial Statements on Scribd" href="http://www.scribd.com/doc/49434520/USA-Inc-A-Basic-Summary-of-America-s-Financial-Statements">USA Inc. &#8211; A Basic Summary of America&#8217;s Financial Statements</a> <object id="doc_679099684368437" name="doc_679099684368437" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" ><param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"><param name="wmode" value="opaque"><param name="bgcolor" value="#ffffff"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><param name="FlashVars" value="document_id=49434520&amp;access_key=key-1b3979gdksobgccp25et&amp;page=1&amp;viewMode=book"><embed id="doc_679099684368437" name="doc_679099684368437" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=49434520&amp;access_key=key-1b3979gdksobgccp25et&amp;page=1&amp;viewMode=book" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/02/24/mary-meekers-usa-evaluation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Era of Browser Preconnect</title>
		<link>http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-era-of-browser-preconnect</link>
		<comments>http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 03:49:54 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/</guid>
		<description><![CDATA[TweetTweetI was playing around on WebSiteTest today â€“ trying out it new IE9 test feature, and I noticed something new that IE9 does: preconnect.
What is preconnect?&#160; Preconnect is making a connection to a site before you have a request to use that connection for.&#160; The browser may have an inkling that it will need the [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/&via=mikebelshe&text=The Era of Browser Preconnect&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/&via=mikebelshe&text=The Era of Browser Preconnect&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/"></g:plusone></div><p>I was playing around on <a href="http://www.webpagetest.org">WebSiteTest</a> today â€“ trying out it new IE9 test feature, and I noticed something new that IE9 does: <em>preconnect</em>.</p>
<p>What is preconnect?&#160; Preconnect is making a connection to a site before you have a request to use that connection for.&#160; The browser may have an inkling that it will need the connection, but if you donâ€™t have a request in hand yet, it is a speculative request, and therefore a preconnect.</p>
<p>IE9 isnâ€™t the first to use preconnect, of course. Chrome has been doing preconnect since ~Chrome7.&#160; So it is nice to see other browsers validating our work.&#160; But, IE9 is the first browser I know of which appears to preconnect right out of the gate, without any data about a site.&#160; Chrome, on the other hand, will only preconnect based on data it has learned by observing network activity through repeat visits to a site.&#160; As such, Chrome usually is issuing the same number of connects and network traffic, just with less delay.&#160; </p>
<p><strong>Observations</strong></p>
<p>Here is the trace where I first noticed this behavior on WebPageTest.&#160; Notice that WebPageTest did not record any connect-time delay on the second request to dev.chromium.org.&#160; How can this be?&#160; Because the socket was already connected.</p>
<p><a href="http://www.belshe.com/wp-content/uploads/2011/02/ie.preconnect.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ie.preconnect" border="0" alt="ie.preconnect" src="http://www.belshe.com/wp-content/uploads/2011/02/ie.preconnect_thumb.png" width="640" height="278" /></a> </p>
<p>To understand this better, I then opened up <a href="http://www.wireshark.org/">WireShark</a> and watched the packets.&#160; The packet trace clearly shows that IE9 simply opens 2 connections, back to back, for every domain the browser connects to.&#160; This isnâ€™t a horrible assumption for the browser to make â€“ since many sites will indeed require more than one connection per domain already.</p>
<p><strong>Some Wastefulness</strong></p>
<p>But it also wasnâ€™t hard to notice cases where it connects wastefully.&#160; On belshe.com, for instance, there is a single link to a <a href="http://www.youtube.com/">YouTube</a> video requiring only one resource.&#160; IE9 opens two connections to YouTube anyway (WebPageTest doesnâ€™t show the unused connection in its trace, by the way, but it is in the trace!).&#160; One connection loads the image, the other connection is wasted.&#160; YouTube diligently kept that connection open for 4 minutes too!&#160; There are also a couple of 408 error responses from Akamai &#8211; it appears that the Akamai server will send a graceful 408 error response to an empty connection after some period of time.</p>
<p><strong>But is this a problem?</strong></p>
<p>As long as the level of accidental connects is minimal, probably not.&#160; And much of the time, 2 connections are useful. It would be great to hear from the IE9 team about their exact algorithm and to see if they have data as to how much extra resources they are using?&#160; </p>
<p>WebPageTest already offers some clues.&#160; For belshe.com, for example, I can see that <a href="http://www.webpagetest.org/result/110211_NV_4337/1/details/">IE8 uses 20 connections</a>, while <a href="http://www.webpagetest.org/result/110211_ZC_4338/1/details/">IE9 is now using 23 connections</a> to render the page.&#160; 10% overhead is probably not the end of the world.</p>
<p><strong>What about SSL?</strong></p>
<p>I love SSL, so of course this got me wondering about what IE9 does for preconnecting https sites too.&#160; Sure enough, IE9 happily preconnects SSL too.&#160; [Sadly â€“ it even forces the server to do two full SSL handshakes- wastefully generating 2 session-ids.&#160; This is a bit more annoying, because that means the main site was just put through double the number of PKI operations.&#160; Fortunately, PKI operations are relatively cheap these days.&#160; Iâ€™d complain more, but, tragically, Chrome is not much better yet.&#160; Did I mention that SSL is the unoptimized frontier?]</p>
<p><strong>What Would <strike>Brian Boitano </strike>Chrome Do?</strong></p>
<p>As I mentioned, Chrome has been doing preconnect for some time.&#160; But, Chrome doesnâ€™t preconnect right out of the gate.&#160; We were so worried about this over-connecting business that we added gloms of <strike>more complicated code</strike> highly sophisticated, artificial intelligence before turning it on at all <img src='http://www.belshe.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Specifically, Chrome learns the network topology as you use it.&#160; It learns that when you connect to <a href="http://www.cnn.com">www.cnn.com</a>, you need 33 resources from i2.cdn.turner.com, 71 resources from i.cdn.turner.com, 5 resources from s0.2mdn.net, etc etc.&#160; Over time, if these patterns remain true, Chrome will use that data to initiate connections as soon as you start a page load.&#160; Because it is based on data, we hope and expect that it will much less often connect incorrectly.&#160; In fact, it should be making the same number of connections, just a little earlier than it otherwise would.&#160; But all of this is an area that is under active research and development.&#160; (By the way, if you want to see how Chrome works, check out the ultra-chic-but-uber-geek â€œabout:dnsâ€ page in your Chrome browser)</p>
<p><strong>So does all this fancy stuff make my Internet faster?</strong></p>
<p>Fortunately, we have pretty good evidence that it does.&#160; Weâ€™re monitoring this all the time, and Iâ€™d say this work is still in its infancy.&#160; But here is some data from Chromeâ€™s testing in 2010.</p>
<p>Our Chrome networking test lab has a fleet of client machines (running Linux), a simulated network using dummynet (see Web-Page-Replay for more information), and some fast, in-memory servers.&#160; We record content from the top-35 websites, and can play it back repeatedly with high fidelity.&#160; Then we can change the network configuration and browser configuration and see how it all works out.&#160; </p>
<p>In my test, I picked 4 different network configurations.&#160; I then varied the RTT on each connection from 0 to 200ms. </p>
<p>Here is a graph of page load time (PLT) improvements in this test.</p>
<p><a href="http://www.belshe.com/wp-content/uploads/2011/02/preconnect.improvement.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="preconnect.improvement" border="0" alt="preconnect.improvement" src="http://www.belshe.com/wp-content/uploads/2011/02/preconnect.improvement_thumb.png" width="640" height="396" /></a> </p>
<p>Overall, weâ€™re pretty happy with this result.&#160; When the RTT is zero, preconnect doesnâ€™t really help, because the connections are basically free (from a latency perspective).&#160; But for connections with RTTs greater than ~50ms, we see a solid 7-9% improvement across the board.&#160; (typical RTTs are 80-120ms)</p>
<p><strong>The Larger Question</strong></p>
<p>While this is great for performance now, I am worried about the wastefulness of HTTP on the Internet.&#160; We used to only have one domain per site, now we have 7.&#160; We used to have only 2 connections per domain, but now we have 6.&#160; And on top of that, now weâ€™re preconnecting when we donâ€™t even need to?</p>
<p>With itâ€™s proliferation of TCP connections, HTTP has been systematically sidestepping all of TCPâ€™s slow start and congestion controls.&#160; Sooner or later will the internet break?&#160; Throwing inefficiency at the problem canâ€™t go on forever.</p>
<p><strong>So one last note â€“ a blatant plug for SPDY</strong></p>
<p>The downside of preconnect is a big part of why weâ€™re working on <a href="http://dev.chromium.org/spdy">SPDY</a>.&#160; HTTP has been nothing short of a heroic protocol and made the Internet as we know it possible.&#160; But as we look to the next generation of rich media sites with low latencies, it is clear that todayâ€™s <a href="http://docs.google.com/a/chromium.org/viewer?a=v&amp;pid=sites&amp;srcid=Y2hyb21pdW0ub3JnfGRldnxneDoxMzcyOWI1N2I4YzI3NzE2">HTTP canâ€™t perform at that level</a>.</p>
<p>SPDY hopes to solve much of HTTPâ€™s connection problems while also providing better performance and better security.&#160; </p>
<p>With that, I guess I need to get back to workâ€¦</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>H.264 &#8211; Who Holds the Patents?</title>
		<link>http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=h-264-who-holds-the-patents</link>
		<comments>http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 18:26:00 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Lawyers]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/</guid>
		<description><![CDATA[TweetTweetH.264 is in the news because Google Chrome wonâ€™t support it natively and instead will use WebM, an allegedly open and free video alternative.
Who gets paid when you license H.264?&#160; Itâ€™s managed by MPEG-LA.&#160; They have a 70-page list of patents which allegedly contribute to H.264.&#160; If you hear a complaint about Google, Mozilla, and [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/&via=mikebelshe&text=H.264 &ndash; Who Holds the Patents?&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/&via=mikebelshe&text=H.264 &ndash; Who Holds the Patents?&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/"></g:plusone></div><p>H.264 is in the news because Google Chrome wonâ€™t support it natively and instead will use <a href="http://www.webmproject.org/">WebM</a>, an allegedly open and free video alternative.</p>
<p>Who gets paid when you license H.264?&#160; Itâ€™s managed by MPEG-LA.&#160; They have a <a href="http://www.mpegla.com/main/programs/avc/Documents/avc-att1.pdf">70-page list of patents</a> which allegedly contribute to H.264.&#160; If you hear a complaint about Google, Mozilla, and Operaâ€™s stance on not supporting H.264, consult this list to see if the complainer has a conflict of interest.</p>
<p align="center"><strong>H.264 Patent Holders</strong></p>
<p align="center">Apple Inc.   <br />Cisco Systems Canada IP Holdings Companyâ€     <br />The Trustees of Columbia University in the City of New York    <br />DAEWOO Electronics Corporation    <br />Dolby Laboratories Licensing Corporation    <br />Electronics and Telecommunications Research Institute    <br />France TÃ©lÃ©com, sociÃ©tÃ© anonyme    <br />Fraunhoferâ€Gesellschaft zur Foerderung der angewandten Forschung e.V.    <br />Fujitsu Limited    <br />Hewlettâ€Packard Company    <br />Hitachi, Ltd.    <br />Koninklijke Philips Electronics N.V.    <br />LG Electronics Inc.    <br />Microsoft Corporation    <br />Mitsubishi Electric Corporation    <br />Nippon Telegraph and Telephone Corporation    <br />NTT DOCOMO, INC.    <br />Panasonic Corporationâ€     <br />Polycom, Inc.    <br />Robert Bosch GmbH    <br />Samsung Electronics Co., Ltd.    <br />Sedna Patent Services, LLC    <br />Sharp Corporation    <br />Siemens AG    <br />Sony Corporation    <br />Tandberg Telecom AS    <br />Telefonaktiebolaget LM Ericsson    <br />Toshiba Corporation    <br />Victor Company of Japan, Limited</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2011/01/17/h-264-who-holds-the-patents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Will Rue The Day It Invited the Gov&#8217;t to Net Neutrality</title>
		<link>http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-will-rue-the-day-it-invited-the-govt-to-net-neutrality</link>
		<comments>http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 06:58:40 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Editorial]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/</guid>
		<description><![CDATA[TweetTweetA few years ago, Google started poking the government to act on Net Neutrality.&#160; The motive behind Googleâ€™s goal is well intentioned.&#160; But practically, it is foolish.&#160; Weâ€™re inviting a beast into our industry that is more devastating than any beast weâ€™ve yet imagined.&#160; Eventually, Google will come to oppose the very legislation that it [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/&via=mikebelshe&text=Google Will Rue The Day It Invited the Gov&rsquo;t to Net Neutrality&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/&via=mikebelshe&text=Google Will Rue The Day It Invited the Gov&rsquo;t to Net Neutrality&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/"></g:plusone></div><p>A few years ago, <a href="http://www.google.com/help/netneutrality_letter.html">Google started poking the government</a> to act on <a href="http://en.wikipedia.org/wiki/Network_neutrality">Net Neutrality</a>.&#160; The motive behind Googleâ€™s goal is well intentioned.&#160; But practically, it is foolish.&#160; Weâ€™re inviting a beast into our industry that is more devastating than any beast weâ€™ve yet imagined.&#160; Eventually, Google will come to oppose the very legislation that it helped create.</p>
<p>The main problem with Net Neutrality is that we donâ€™t need it.&#160; The market works.&#160; There are many choices for network access today, and you can access your favorite sites from Amazon to Wikileaks from almost anywhere in America.&#160; We have access to the internet at home, in libraries, in schools and at work.&#160; Who is not getting access again?</p>
<p>For individuals, the real debate is that some people want more bandwidth to more remote areas and they want someone else to pay for it.&#160; <a href="http://en.wikipedia.org/wiki/Steve_Wozniak">Steve Wozniak</a>, the eccentric co-founder of Apple, <a href="http://www.theatlantic.com/technology/archive/2010/12/an-open-letter-to-the-fcc-regarding-net-neutrality/68294/">was very clear about this</a>.&#160; He wants to live on a remote hill, pay $29/mo, and have everyone else be required to pay to run the cables to his secluded hide away for fast internet access.&#160; Steveâ€™s argument is not new.&#160; Many people have made the same argument far more elegantly.&#160; They claim it â€œcosts too muchâ€ for the high speed links and that dialup is unreasonably slow, or that â€œthere is only one provider in my areaâ€, etc.&#160; None of those arguments hold.&#160; These very same people still have access through wireless, through dialup, at work, at school, at the library, and at about a half million Starbucks or McDonalds across the planet.&#160; And their access grows every single day!&#160; They just want it <em>cheaper</em>.</p>
<p>Finally, the most important part of net neutrality is ensuring that content is available to everyone.&#160; (No, this doesnâ€™t mean you should get to watch your â€œFamily Guyâ€ or your favorite TV show for free)&#160; Most of us hold at least some fear that eventually a big company (Comcast, AT&amp;T, or Verizon, or Google) will screw the little guy by using their monopoly to restrict content and maximize profits.&#160; This fear is reasonable,&#160; because censorship on a grand scale would be a horrible thing for all of us.&#160; But itâ€™s not happening, and there is no evidence of it happening any time soon.&#160; Further, if it ever did happen, customers can and would revolt.&#160; Competition provides us everything we need. </p>
<p>But our fears of corporations are grossly misplaced.&#160; There is someone far more scary, with vastly greater power that we should fear â€“ the US government.&#160; There is simply no company that can wreck devastation at the scale of the US government. Whoâ€™s rules are more scary â€“ Comcastâ€™s rules (sorry to pick on you, Comcast!), which would only apply to those that pay Comcast money?&#160; Or Uncle Samâ€™s rules?&#160; And every 4 years we elect a new set of politicians.&#160; Even if we trust the politicians today, what happens when we get into a war, or have a 9/11-type event, and suddenly a â€œtemporaryâ€ cease of terrorist communications is required?&#160; (Did we forget about <a href="http://abcnews.go.com/Travel/thanksgiving-airport-security-avoid-tsa-pat-groping/story?id=12215251&amp;tqkw=Thanksgiving&amp;tqshow=GMA">the TSA already</a>?)&#160; Whoâ€™s the terrorist?&#160; Is Wikileaks a terrorist?&#160; Is Wikipedia?&#160; What if you have a science blog about particle physics?&#160; Can you be shut down too?&#160; The government is what you should fear.&#160; Not a piddly little Microsoft, Google, or Comcast.&#160; </p>
<p>Ok, but why will Google rue this?</p>
<p>With continued prodding from Google and others, legislation will be passed, and <a href="http://www.electronista.com/articles/10/12/21/fcc.approves.net.neturality.rules.despite.gop/">today was a starting point</a>.&#160; Whatever they pass will be&#160; costly to companies and will cause that cost burden to be passed on to customers like you and me.&#160; Further, it will put America at a disadvantage in our global marketplace.&#160; All to solve a problem that doesnâ€™t exist.</p>
<p>The first problem theyâ€™ll create is that of cost.&#160; Every law has enforcement, and that means we pay people to define the specific rules, monitor compliance with those rules, and enforce punishments for those that do not obey.&#160; This will cost billions of dollars and be spread into the margins of every content provider and ISP in America.&#160; Of course, those companies will pass the cost onto their customers.&#160; This means the price of DSL, Cable, AOL, and Netflix will all rise.&#160; (<em>I still think costs are heading down overall, but they could decrease faster without net-neutrality</em>)</p>
<p>Second, it will snowball from â€œfair accessâ€ into content filters (aka censorship).&#160; Initially, it might include banning certain forms of pornography.&#160; It might even seem like something you agree with.&#160; But with each new regulation, our freedoms are diminished.&#160; Then, we might enter into a particular international conflict â€œrequiringâ€ a ban on certain types of communications to keep us safe.&#160; With the content filters in place, the variety and types of information we can publish and read diminishes, and it is all out of our control.&#160;&#160; You canâ€™t switch providers to escape the unfairness of it all.</p>
<p>Finally, remember that America is in a global marketplace.&#160; If our legislators legislate too much, Internet companies will simply move out of the country, taking the jobs, the profits, and the tax revenues with them.&#160; This has already happened â€“ gambling is alive and well on the internet &#8211; it just runs out of Costa Rica, Antigua, and other disputable places &#8211; leaving consumers at risk while simultaneously sticking America with a bill to ensure that gambling doesnâ€™t happen here.&#160; How silly!&#160; Now the government will need to block outside access, or credit card payments to certain areas in order to keep Americans safe from information.</p>
<p>Googleâ€™s mission is â€œto organize the worldâ€™s information and make it universally accessible and useful.â€&#160; But with our own Government censors and the massive costs created to enforce â€œnet neutralityâ€, Google will find this mission impossible to accomplish.&#160; And that is when Google will rue the dayâ€¦</p>
<p>&#160;</p>
<p>Note: This article solely represents the views of a far-too-opinionated software engineer, and does not represent the views of his employer in any way.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2010/12/21/google-will-rue-the-day-it-invited-the-govt-to-net-neutrality/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Performance and the TLS Record Size</title>
		<link>http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=performance-and-the-tls-record-size</link>
		<comments>http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 18:16:17 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/</guid>
		<description><![CDATA[TweetTweetToday I ran into a problem with TLS (SSL) Record Sizes causing the performance of my site to be sluggish and slow.&#160; The server was doing a good job of sending large messages down the client, and I am using a late-model version of the OpenSSL library, why would this happen?    
HTTP [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/&via=mikebelshe&text=Performance and the TLS Record Size&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/&via=mikebelshe&text=Performance and the TLS Record Size&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="plusone" style="float: right"><g:plusone size="tall" href="http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/"></g:plusone></div><p>Today I ran into a problem with <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> (SSL) Record Sizes causing the performance of my site to be sluggish and slow.&#160; The server was doing a good job of sending large messages down the client, and I am using a late-model version of the <a href="http://www.openssl.org/">OpenSSL</a> library, why would this happen?    </p>
<p>HTTP and TLS both seem like streaming protocols.&#160; But with HTTP, the smallest sized â€œchunkâ€ you can send is a single byte.&#160; With TLS, the smallest chunk you can send is a TLS record.&#160; As the the TLS record arrives on the client, it cannot be passed to the application layer until the full record is received and the checksum is verified.&#160; So, if you send large SSL records, all packets that make up that record must be received before any of the data can be used by the browser.    </p>
<p>In my case, the HTTP-to-SPDY proxy in front of my webserver was reading chunks of 40KB from the HTTP server, and then calling SSL_Write() for as much of that data over <a href="http://dev.chromium.org/spdy">SPDY</a> (which uses SSL for now).&#160; This meant that the client couldnâ€™t use any of the 40KB until all of the 40KB was received.&#160; And since 40KB of data will often incur round-trips, this is a very bad thing.    </p>
<p>It turns out this problem surfaces more with time-to-first-paint than with overall page-load-time (PLT), because it has to do with the browser seeing data incrementally rather than in a big batch.&#160; But it still can impact PLT because it can cause multi-hundred-millisecond delays before discovering sub-resources.    </p>
<p>The solution is easy &#8211; on your server, donâ€™t call SSL_Write() in big chunks.&#160; Chop it down to something smallish &#8211; 1500-3000 bytes.&#160; Here is a graph comparing the time-to-first paint for my site with just this change.&#160; Shaved off over 100ms on the time-to-first-paint.    </p>
<p><a href="http://www.belshe.com/wp-content/uploads/2010/12/smallbuf.ttfp_.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="smallbuf.ttfp" border="0" alt="smallbuf.ttfp" src="http://www.belshe.com/wp-content/uploads/2010/12/smallbuf.ttfp_thumb.png" width="465" height="246" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.belshe.com/2010/12/17/performance-and-the-tls-record-size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

