{"id":4387,"date":"2008-03-24T16:52:53","date_gmt":"2008-03-24T23:52:53","guid":{"rendered":"http:\/\/bennett.com\/blog\/index.php\/archives\/2008\/03\/24\/nagles-answer\/"},"modified":"2008-03-24T16:52:53","modified_gmt":"2008-03-24T23:52:53","slug":"nagles-answer","status":"publish","type":"post","link":"https:\/\/bennett.com\/blog\/2008\/03\/24\/nagles-answer\/","title":{"rendered":"Nagle&#8217;s Answer"},"content":{"rendered":"<p>\t\t\t\tSlashdot picked up George Ou&#8217;s latest piece on the problems with TCP and Peer-to-Peer congestion that I&#8217;ve been writing about lo these many months, attracting <a href=\"http:\/\/tech.slashdot.org\/comments.pl?sid=497516&#038;cid=22847764\">one interesting comment in a sea of chaff:<\/a><\/p>\n<blockquote><p>\nAs the one who devised much of this congestion control strategy (see my <a href=\"http:\/\/www.faqs.org\/rfcs\/rfc896.html\">RFC 896<\/a> and <a href=\"http:\/\/www.faqs.org\/rfcs\/rfc970.html\">RFC 970<\/a>, years before Van Jacobson), I suppose should say something.<\/p>\n<p>The way this was supposed to work is that TCP needs to be well-behaved because it is to the advantage of the endpoint to be well-behaved. What makes this work is enforcement of fair queuing at the first router entering the network. Fair queuing balances load by IP address, not TCP connection, and &#8220;weighted fair queueing&#8221; allows quality of service controls to be imposed at the entry router.<\/p>\n<p>The problem now is that the DOCSIS approach to cable modems, at least in its earlier versions, doesn&#8217;t impose fair queuing at entry to the network from the subscriber side. So congestion occurs further upstream, near the cable headend, in the &#8220;middle&#8221; of the network. By then, there are too many flows through the routers to do anything intelligent on a per-flow basis.<\/p>\n<p>We still don&#8217;t know how to handle congestion in the middle of an IP network. The best we have is &#8220;random early drop&#8221;, but that&#8217;s a hack. The whole Internet depends on stopping congestion near the entry point of the network. The cable guys didn&#8217;t get this right in the upstream direction, and now they&#8217;re hurting.<\/p>\n<p>I&#8217;d argue for weighted fair queuing and QOS in the cable box. Try hard to push the congestion control out to the first router. DOCSIS 3 is a step in the right direction, if configured properly. But DOCSIS 3 is a huge collection of tuning parameters in search of a policy, and is likely to be grossly misconfigured.<\/p>\n<p>The trick with quality of service is to offer either high-bandwidth or low latency service, but not both together. If you request low latency, your packets go into a per-IP queue with a high priority but a low queue length. Send too much and you lose packets. Send a little, and they get through fast. If you request high bandwidth, you get lower priority but a longer queue length, so you can fill up the pipe and wait for an ACK.<\/p>\n<p>But I have no idea what to do about streaming video on demand, other than heavy buffering. Multicast works for broadcast (non-on-demand) video, but other than for sports fans who want to watch in real time, it doesn&#8217;t help much. (I&#8217;ve previously suggested, sort of as a joke, that when a stream runs low on buffered content, the player should insert a pre-stored commercial while allowing the stream to catch up. Someone will probably try that.)<\/p>\n<p>John Nagle<\/p><\/blockquote>\n<p>.<br \/>\nI actually suggested the technique John proposes directly to Comcast engineering: drop packets before the first hop. They didn&#8217;t appear to have considered it before, but it actually is the answer. Unfortunately, the cable modem is not an IP device so it doesn&#8217;t understand when and how to do this presently, so it becomes a piece of housekeeping for the DOCSIS 3.0 upgrade.\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Slashdot picked up George Ou&#8217;s latest piece on the problems with TCP and Peer-to-Peer congestion that I&#8217;ve been writing about lo these many months, attracting one interesting comment in a sea of chaff: As the one who devised much of this congestion control strategy (see my RFC 896 and RFC 970, years before Van Jacobson), &hellip; <a href=\"https:\/\/bennett.com\/blog\/2008\/03\/24\/nagles-answer\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Nagle&#8217;s Answer&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[38],"tags":[],"class_list":["post-4387","post","type-post","status-publish","format-standard","hentry","category-net-neutrality"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pbifyw-18L","_links":{"self":[{"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/posts\/4387","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/comments?post=4387"}],"version-history":[{"count":0,"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/posts\/4387\/revisions"}],"wp:attachment":[{"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/media?parent=4387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/categories?post=4387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bennett.com\/blog\/wp-json\/wp\/v2\/tags?post=4387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}