{"id":793,"date":"2021-12-17T23:44:00","date_gmt":"2021-12-17T15:44:00","guid":{"rendered":"https:\/\/blog.cauchyschwarz.com\/?p=793"},"modified":"2023-01-09T23:56:42","modified_gmt":"2023-01-09T15:56:42","slug":"793","status":"publish","type":"post","link":"https:\/\/blog.cauchyschwarz.com\/?p=793","title":{"rendered":"BBR RFC"},"content":{"rendered":"\n<p><strong>\u6587\u6863\u5730\u5740<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/tools.ietf.org\/id\/draft-cardwell-iccrg-bbr-congestion-control-00.html\">https:\/\/tools.ietf.org\/id\/draft-cardwell-iccrg-bbr-congestion-control-00.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/draft-cardwell-iccrg-bbr-congestion-control-00\">https:\/\/datatracker.ietf.org\/doc\/html\/draft-cardwell-iccrg-bbr-congestion-control-00<\/a><\/p>\n\n\n\n<p>\u867d\u8bf4\u8fd9\u53ea\u662f\u4e00\u4e2adraft\uff0c\u4f46\u662f\u603b\u4f53\u6ca1\u5dee(\u4e3b\u8981\u662f\u6587\u6863\u7f8e\u89c2\uff0c\u770b\u7740\u5fc3\u60c5\u597d)\u3002<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-right counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69fc5e2ee9675\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69fc5e2ee9675\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Introduction\" >Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Terminology\" >Terminology<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Desing_Overview\" >Desing Overview<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Network_Path_Model\" >Network Path Model<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Target_Operating_Point\" >Target Operating Point<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Control_Parameters\" >Control Parameters<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#State_Machine_Design_Overview\" >State Machine Design Overview<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#State_Transition_Diagram\" >State Transition Diagram<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Algorithm_Organization\" >Algorithm Organization<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Initialization\" >Initialization<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Per-ACK_Steps\" >Per-ACK Steps<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Per-Transmit_Steps\" >Per-Transmit Steps<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Environment_and_Usage\" >Environment and Usage<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Detailed_Algorithm\" >Detailed Algorithm<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Maintaining_the_Network_Path_Model\" >Maintaining the Network Path Model<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#BBRBtlBw\" >BBR.BtlBw<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Delivery_Rate_Samples_for_Estimating_BBRBtlBw\" >Delivery Rate Samples for Estimating BBR.BtlBw<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#BBRBtlBw_Max_Filter\" >BBR.BtlBw Max Filter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Tracking_Time_for_the_BBRBtlBw_Max_Filter\" >Tracking Time for the BBR.BtlBw Max Filter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#BBRBtlBw_and_Application-limited_Delivery_Rate_Samples\" >BBR.BtlBw and Application-limited Delivery Rate Samples<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Updating_the_BBRBtlBw_Max_Filter\" >Updating the BBR.BtlBw Max Filter<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#BBRRTprop\" >BBR.RTprop<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Round-Trip_Time_Samples_for_Estimating_BBRRTprop\" >Round-Trip Time Samples for Estimating BBR.RTprop<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#BBRRTprop_Min_Filter\" >BBR.RTprop Min Filter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Updating_the_BBRRTprop_Min_Filter\" >Updating the BBR.RTprop Min Filter<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#BBR_Control_Parameters\" >BBR Control Parameters<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Pacing_Rate\" >Pacing Rate<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Send_Quantum\" >Send Quantum<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Congestion_Window\" >Congestion Window<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Initial_Congestion_Window\" >Initial Congestion Window<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Target_cwnd\" >Target cwnd<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Minimum_cwnd_for_pipelining\" >Minimum cwnd for pipelining<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Modulating_cwnd_in_Loss_Recovery\" >Modulating cwnd in Loss Recovery<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Modulating_cwnd_in_ProbeRTT\" >Modulating cwnd in ProbeRTT<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Core_cwnd_Adjustment_Mechanism\" >Core cwnd Adjustment Mechanism<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#State_Machine\" >State Machine<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Initialization_Steps\" >Initialization Steps<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#STARTUP\" >STARTUP<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Startup_Dynamics\" >Startup Dynamics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Estimating_When_Startup_has_Filled_the_Pipe\" >Estimating When Startup has Filled the Pipe<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Drain\" >Drain<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#ProbeBW\" >ProbeBW<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Gain_Cycling_Dynamics\" >Gain Cycling Dynamics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Gain_Cycling_Randomization\" >Gain Cycling Randomization<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Gain_Cycling_Algorithm\" >Gain Cycling Algorithm<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#Restarting_From_Idle\" >Restarting From Idle<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=793\/#ProbeRTT\" >ProbeRTT<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Terminology\"><\/span>Terminology<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p><strong>BBR.send_quantum<\/strong>: The maximum size of a data aggregate scheduled and transmitted together.<\/p>\n\n\n\n<p><strong>\u5173\u4e8eround trip<\/strong>\uff1a<\/p>\n\n\n\n<p>BBR\u91cc\u8bf4\u5230\u6301\u7eed\u4e00\u4e2artt\u65f6\u95f4\u65f6\uff0c\u9700\u8981\u6ce8\u610f\u533a\u5206\u7a76\u7adf\u662f\u6301\u7eed\u4e00\u4e2apacket-timed round trip\u8fd8\u662f\u6301\u7eed\u4e00\u4e2awall clock time round trip\u3002\u524d\u8005\u662f\u6301\u7eed\u4e00\u4e2a\u81ea\u7136\u7684rtt\uff0c\u4e5f\u5c31\u662f\u6536\u5230\u53d1\u51fa\u53bb\u7684\u5305\u7684ack\uff0c\u540e\u8005\u5219\u662f\u8ba1\u65f6\u7ecf\u8fc7rtt\u8fd9\u4e48\u4e45\u3002<\/p>\n\n\n\n<p>\u5728PROBE_BW\u9636\u6bb5\uff0c\u53ea\u67096\u4e2apacing_gain\u4e3a1\u7684phase\u662f\u9700\u8981\u4fdd\u63011\u4e2awall clock time\u7684round trip\u3002<\/p>\n\n\n\n<p>\u5bf9\u4e8epacing_gain\u4e3a1.25\u7684\u5e26\u5bbd\u4e0a\u63a2\u9636\u6bb5\uff0c\u9000\u51fa\u6761\u4ef6\u4e3a\uff1a\u51fa\u73b0\u4e22\u5305\u6216\u8005inflight\u8fbe\u52301.25BDP\u3002<\/p>\n\n\n\n<p>\u5bf9\u4e8epacing_gain\u4e3a0.75\u7684\u6392\u7a7a\u9636\u6bb5\uff0c\u9000\u51fa\u6761\u4ef6\u4e3a\uff1a\u6301\u7eed\u65f6\u95f4\u8d85\u8fc7\u4e00\u4e2awall clock time\u7684rtt\u6216\u8005inflight\u5c0f\u4e8e\u7b49\u4e8eBDP\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Desing_Overview\"><\/span>Desing Overview<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Network_Path_Model\"><\/span>Network Path Model<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Target_Operating_Point\"><\/span>Target Operating Point<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Control_Parameters\"><\/span>Control Parameters<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"State_Machine_Design_Overview\"><\/span>State Machine Design Overview<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"State_Transition_Diagram\"><\/span>State Transition Diagram<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">             |\n             V\n    +---&gt; Startup  ----+\n    |        |         |\n    |        V         |\n    |      Drain   ----+\n    |        |         |\n    |        V         |\n    +---&gt; ProbeBW -----+\n    |      ^    |      |\n    |      |    |      |\n    |      +----+      |\n    |                  |\n    +---- ProbeRTT &lt;---+\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Algorithm_Organization\"><\/span>Algorithm Organization<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Initialization\"><\/span>Initialization<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBROnConnectionInit():\n    BBRInit()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Per-ACK_Steps\"><\/span>Per-ACK Steps<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRUpdateOnACK():\n    BBRUpdateModelAndState()\n    BBRUpdateControlParameters()\n\n  BBRUpdateModelAndState():\n    BBRUpdateBtlBw()\n    BBRCheckCyclePhase()\n    BBRCheckFullPipe()\n    BBRCheckDrain()\n    BBRUpdateRTprop()\n    BBRCheckProbeRTT()\n\n  BBRUpdateControlParameters()\n    BBRSetPacingRate()\n    BBRSetSendQuantum()\n    BBRSetCwnd()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Per-Transmit_Steps\"><\/span>Per-Transmit Steps<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBROnTransmit():\n    BBRHandleRestartFromIdle()\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Environment_and_Usage\"><\/span>Environment and Usage<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Detailed_Algorithm\"><\/span>Detailed Algorithm<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Maintaining_the_Network_Path_Model\"><\/span>Maintaining the Network Path Model<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"BBRBtlBw\"><\/span>BBR.BtlBw<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Delivery_Rate_Samples_for_Estimating_BBRBtlBw\"><\/span>Delivery Rate Samples for Estimating BBR.BtlBw<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u6709\u4e00\u7bc7\u4e13\u95e8\u8bb2\u8ba1\u7b97<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/draft-cheng-iccrg-delivery-rate-estimation-00\">Delivery Rate\u7684\u6587\u6863<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"BBRBtlBw_Max_Filter\"><\/span>BBR.BtlBw Max Filter<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>BBR\u7684\u74f6\u9888\u5e26\u5bbd\u8fc7\u671f\u65f6\u95f4\u662f\u7528\u7684packet timed round trip\uff0c\u74f6\u9888\u5e26\u5bbd\u8d85\u8fc710\u4e2around\u624d\u4f1a\u8fc7\u671f\uff1b<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tracking_Time_for_the_BBRBtlBw_Max_Filter\"><\/span>Tracking Time for the BBR.BtlBw Max Filter<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u8fde\u63a5\u521d\u59cb\u5316\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRInitRoundCounting():\n    BBR.next_round_delivered = 0\n    BBR.round_start = false\n    BBR.round_count = 0\n<\/code><\/pre>\n\n\n\n<p>\u6bcf\u53d1\u9001\u4e00\u4e2a\u5305\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> packet.delivered = BBR.delivered<\/code><\/pre>\n\n\n\n<p>\u6bcf\u63a5\u6536\u4e00\u4e2aACK\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRUpdateRound():\n    BBR.delivered += packet.size\n    if (packet.delivered &gt;= BBR.next_round_delivered)\n      BBR.next_round_delivered = BBR.delivered\n      BBR.round_count++\n      BBR.round_start = true\n    else\n      BBR.round_start = false\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"BBRBtlBw_and_Application-limited_Delivery_Rate_Samples\"><\/span>BBR.BtlBw and Application-limited Delivery Rate Samples<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Updating_the_BBRBtlBw_Max_Filter\"><\/span>Updating the BBR.BtlBw Max Filter<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRUpdateBtlBw()\n    BBRUpdateRound()\n    if (rs.delivery_rate &gt;= BBR.BtlBw || ! rs.is_app_limited) \n        BBR.BtlBw = update_windowed_max_filter(\n                      filter=BBR.BtlBwFilter,\n                      value=rs.delivery_rate,\n                      time=BBR.round_count,\n                      window_length=BtlBwFilterLen)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"BBRRTprop\"><\/span>BBR.RTprop<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Round-Trip_Time_Samples_for_Estimating_BBRRTprop\"><\/span>Round-Trip Time Samples for Estimating BBR.RTprop<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u5bf9\u4e8e\u4e00\u4e2aack\u786e\u8ba4\u591a\u4e2a\u5df2\u53d1\u9001\u6570\u636e\u5305\u7684\u60c5\u5f62\uff0cBBR\u53d6\u6700\u540e\u53d1\u9001\u7684\u90a3\u4e00\u4e2a\u5305\u7684\u53d1\u9001\u65f6\u95f4\u6765\u8ba1\u7b97RTT\uff0c\u4ee5\u6b64\u6765\u903c\u8fd1minRtt\u3002<\/p>\n\n\n\n<p><em>The only divergence from RTT estimation for retransmission timeouts is in the case where a given acknowledgment ACKs more than one data packet. In order to be conservative and schedule long timeouts to avoid spurious retransmissions, the maximum among such potential RTT samples is typically used for computing retransmission timeouts; i.e., SRTT is typically calculated using the data packet with the earliest transmission time. By contrast, in order for BBR to try to reach the minimum amount of data in flight to fill the pipe, BBR uses the minimum among such potential RTT samples; i.e., BBR calculates the RTT using the data packet with the latest transmission time.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"BBRRTprop_Min_Filter\"><\/span>BBR.RTprop Min Filter<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u4f7f\u752810s\u4f5c\u4e3aminRtt\u7684\u5931\u6548\u65f6\u95f4\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Updating_the_BBRRTprop_Min_Filter\"><\/span>Updating the BBR.RTprop Min Filter<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u8bb0\u5f55\u6bcf\u4e2a\u5df2\u53d1\u9001\u5305\u7684\u53d1\u9001\u65f6\u95f4\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">packet.send_time = Now()<\/code><\/pre>\n\n\n\n<p>\u6bcf\u6b21\u6536\u5230ACK\u65f6\u8bb0\u5f55\u63a5\u6536\u65f6\u95f4\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">packet.rtt = Now() - packet.send_time<\/code><\/pre>\n\n\n\n<p>\u66f4\u65b0minRtt\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRUpdateRTprop()\n    BBR.rtprop_expired =\n      Now() &gt; BBR.rtprop_stamp + RTpropFilterLen\n    if (packet.rtt &gt;= 0 and\n       (packet.rtt &lt;= BBR.RTprop or BBR.rtprop_expired))\n      BBR.RTprop = packet.rtt\n      BBR.rtprop_stamp = Now()\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"BBR_Control_Parameters\"><\/span>BBR Control Parameters<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Pacing_Rate\"><\/span>Pacing Rate<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u8ba1\u7b97\u6bcf\u4e2a\u5305\u7684\u53d1\u9001\u65f6\u95f4\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">next_send_time = Now() + packet.size \/ pacing_rate<\/code><\/pre>\n\n\n\n<p>\u8bbe\u7f6e\u521d\u59cb\u53d1\u9001\u901f\u7387\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRInitPacingRate():\n    nominal_bandwidth = InitialCwnd \/ (SRTT ? SRTT : 1ms)\n    BBR.pacing_rate =  BBR.pacing_gain * nominal_bandwidth\n<\/code><\/pre>\n\n\n\n<p>\u6bcf\u6b21\u6536\u5230ACK\u65f6\u66f4\u65b0pacing_rate\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRSetPacingRateWithGain(pacing_gain):\n    rate = pacing_gain * BBR.BtlBw\n    if (BBR.filled_pipe || rate &gt; BBR.pacing_rate)\n      BBR.pacing_rate = rate\n\n  BBRSetPacingRate():\n    BBRSetPacingRateWithGain(BBR.pacing_gain)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Send_Quantum\"><\/span>Send Quantum<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u9ad8\u5e26\u5bbd\u60c5\u51b5\u4e0b\u5b9e\u73b0\u7cbe\u51c6\u7684pacing\u53ef\u80fd\u4f1a\u589e\u52a0CPU\u7684\u6d88\u8017\uff0c\u56e0\u6b64\u53ef\u4ee5\u6839\u636e\u5e26\u5bbd\u8c03\u6574\u6bcf\u6b21\u53d1\u5305\u7684\u6570\u636e\u91cf\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRSetSendQuantum():\n    if (BBR.pacing_rate &lt; 1.2 Mbps)\n      BBR.send_quantum = 1 * MSS\n    else if (BBR.pacing_rate &lt; 24 Mbps)\n      BBR.send_quantum  = 2 * MSS\n    else\n      BBR.send_quantum  = min(BBR.pacing_rate * 1ms, 64KBytes)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Congestion_Window\"><\/span>Congestion Window<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Initial_Congestion_Window\"><\/span>Initial Congestion Window<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Target_cwnd\"><\/span>Target cwnd<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>inflight\u6570\u603b\u662f\u4e0d\u80fd\u8d85\u8fc7target_cwnd\u3002\u6bcf\u6b21\u6536\u5230ACK\u540e\u90fd\u9700\u8981\u66f4\u65b0target_cwnd\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRInflight(gain):\n    if (BBR.RTprop == Inf)\n      return InitialCwnd \/* no valid RTT samples yet *\/\n    quanta = 3*BBR.send_quantum\n    estimated_bdp = BBR.BtlBw * BBR.RTprop\n    return gain * estimated_bdp + quanta\n\n  BBRUpdateTargetCwnd():\n    BBR.target_cwnd = BBRInflight(BBR.cwnd_gain)\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Minimum_cwnd_for_pipelining\"><\/span>Minimum cwnd for pipelining<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u4e3a\u4e86\u4f7f\u5f97\u7ba1\u9053\u88ab\u5145\u5206\u5229\u7528\uff0cBBR\u63d0\u51fa\u8bbe\u7f6e4MSS\u7684cwnd\u4e0b\u9650\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Modulating_cwnd_in_Loss_Recovery\"><\/span>Modulating cwnd in Loss Recovery<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p><strong>\u51fa\u73b0\u91cd\u4f20\u5b9a\u65f6\u5668\u8d85\u65f6\u60c5\u51b5\u65f6<\/strong>\uff0cBBR\u9700\u8981\u8fdb\u5165loss recovery\u72b6\u6001\uff0c\u5148\u5c06cwnd\u8c03\u6574\u4e3a1\uff0c\u7136\u540e\u518d\u6309\u7167\u4e0b\u9762\u7684<strong>Core cwnd Adjustment Mechanism<\/strong>\u8fdb\u884c\u8c03\u6574\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBR.prior_cwnd = BBRSaveCwnd()\n  cwnd = 1\n<\/code><\/pre>\n\n\n\n<p><strong>\u8fdb\u5165Fast Recovery\u65f6<\/strong>\uff0c\u5728\u7b2c\u4e00\u4e2around\u5185\uff0c\u4fdd\u8bc1cwnd\u4e0e\u4e0d\u4e22\u5305\u7684\u53d1\u9001\u901f\u7387\u76f8\u5339\u914d\uff0c\u4ece\u7b2c\u4e8c\u4e2around\u5f00\u59cb\u5219\u4fdd\u8bc1cwnd\u4e0e2\u500d\u4e0d\u4e22\u5305\u7684\u53d1\u9001\u901f\u7387\u76f8\u5339\u914d\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBR.prior_cwnd = BBRSaveCwnd()\n  cwnd = packets_in_flight + max(packets_delivered, 1)\n  BBR.packet_conservation = true\n<\/code><\/pre>\n\n\n\n<p>\u5728Fast Recovery\u9636\u6bb5\uff0c\u6bcf\u6b21\u6536\u5230ACK\u65f6\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRModulateCwndForRecovery():\n    if (packets_lost &gt; 0)\n      cwnd = max(cwnd - packets_lost, 1)\n    if (BBR.packet_conservation)\n      cwnd = max(cwnd, packets_in_flight + packets_delivered)\n<\/code><\/pre>\n\n\n\n<p>\u4e0a\u9762\u7684packets_delivered\u8868\u793a\u6bcf\u6b21\u6536\u5230ACK\u65f6\u65b0\u786e\u8ba4\u6536\u5230\u7684\u5305\u6570\uff0cpackets_lost\u4e3a\u6bcf\u6b21\u6536\u5230ACKS\u65b0\u786e\u8ba4\u7684\u4e22\u5305\u6570\u3002<\/p>\n\n\n\n<p>Fast Recovery\u6301\u7eed\u4e00\u4e2around trip\u540e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBR.packet_conservation = false<\/code><\/pre>\n\n\n\n<p>\u9000\u51faLoss Recovery\u6216\u8005Fast Recovery\u65f6\uff0c\u9700\u8981\u6062\u590dcwnd\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBR.packet_conservation = false\n  BBRRestoreCwnd()\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRSaveCwnd():\n    if (not InLossRecovery() and BBR.state != ProbeRTT)\n      return cwnd\n    else\n      return max(BBR.prior_cwnd, cwnd)\n\n  BBRRestoreCwnd():\n    cwnd = max(cwnd, BBR.prior_cwnd)\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Modulating_cwnd_in_ProbeRTT\"><\/span>Modulating cwnd in ProbeRTT<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u8fdb\u5165ProbeRTT\u72b6\u6001\u65f6\u8c03\u6574cwnd\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRModulateCwndForProbeRTT():\n    if (BBR.state == ProbeRTT)\n      cwnd = min(cwnd, BBRMinPipeCwnd)\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Core_cwnd_Adjustment_Mechanism\"><\/span><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Core cwnd Adjustment Mechanism<\/mark><span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRSetCwnd():\n    BBRUpdateTargetCwnd()\n    BBRModulateCwndForRecovery()\n    if (not BBR.packet_conservation) {\n      if (BBR.filled_pipe)\n        cwnd = min(cwnd + packets_delivered, BBR.target_cwnd)\n      else if (cwnd &lt; BBR.target_cwnd || BBR.delivered &lt; InitialCwnd)\n        cwnd = cwnd + packets_delivered\n      cwnd = max(cwnd, BBRMinPipeCwnd)\n    }\n    BBRModulateCwndForProbeRTT()\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"State_Machine\"><\/span>State Machine<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Initialization_Steps\"><\/span>Initialization Steps<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u8fde\u63a5\u5efa\u7acb\u65f6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRInit():\n    init_windowed_max_filter(filter=BBR.BtlBwFilter, value=0, time=0)\n    BBR.rtprop = SRTT ? SRTT : Inf\n    BBR.rtprop_stamp = Now()\n    BBR.probe_rtt_done_stamp = 0\n    BBR.probe_rtt_round_done = false\n    BBR.packet_conservation = false\n    BBR.prior_cwnd = 0\n    BBR.idle_restart = false\n    BBRInitRoundCounting()\n    BBRInitFullPipe()\n    BBRInitPacingRate()\n    BBREnterStartup()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"STARTUP\"><\/span>STARTUP<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Startup_Dynamics\"><\/span>Startup Dynamics<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBREnterStartup():\n    BBR.state = Startup\n    BBR.pacing_gain = BBRHighGain\n    BBR.cwnd_gain = BBRHighGain\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Estimating_When_Startup_has_Filled_the_Pipe\"><\/span>Estimating When Startup has Filled the Pipe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u521d\u59cb\u5316\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRInitFullPipe():\n    BBR.filled_pipe = false\n    BBR.full_bw = 0\n    BBR.full_bw_count = 0\n<\/code><\/pre>\n\n\n\n<p>\u5728\u6bcf\u4e2around\u5f00\u59cb\u65f6\u68c0\u67e5\u662f\u5426\u5df2\u7ecf\u67093\u4e2around\u5e26\u5bbd\u6ca1\u6709\u4e0a\u534725%\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRCheckFullPipe():\n    if BBR.filled_pipe or\n       not BBR.round_start or rs.is_app_limited\n      return  \/\/ no need to check for a full pipe now\n    if (BBR.BtlBw &gt;= BBR.full_bw * 1.25)  \/\/ BBR.BtlBw still growing?\n      BBR.full_bw = BBR.BtlBw    \/\/ record new baseline level\n      BBR.full_bw_count = 0\n      return\n    BBR.full_bw_count++ \/\/ another round w\/o much growth\n    if (BBR.full_bw_count &gt;= 3)\n      BBR.filled_pipe = true\n<\/code><\/pre>\n\n\n\n<p>\u4e3a\u4ec0\u4e48\u662f3\u4e2around\uff1f\u8fd9\u4e2a\u548ctcp\u7684receive window autotuning\u673a\u5236\u6709\u5173\uff1a<\/p>\n\n\n\n<p><em>BBR waits three rounds in order to have solid evidence that the sender is not detecting a delivery-rate plateau that was temporarily imposed by the receive window. Allowing three rounds provides time for the receiver&#8217;s receive-window autotuning to open up the receive window and for the BBR sender to realize that BBR.BtlBw should be higher: in the first round the receive-window autotuning algorithm grows the receive window; in the second round the sender fills the higher receive window; in the third round the sender gets higher delivery-rate samples. This three-round threshold was validated by YouTube experimental data.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Drain\"><\/span>Drain<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u4e3a\u4e86\u51cf\u5c11STARTUP\u9636\u6bb5\u5f15\u8d77\u7684\u94fe\u8def\u5806\u79ef\uff0c\u9700\u8981\u8fdb\u5165Drain\u9636\u6bb5\uff0c\u5728\u6301\u7eed\u4e00\u4e2aRTT\u6216\u8005inflight\u5c0f\u4e8e\u7b49\u4e8eBDP\u65f6\u9000\u51faDRAIN\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBREnterDrain():\n    BBR.state = Drain\n    BBR.pacing_gain = 1\/BBRHighGain  \/\/ pace slowly\n    BBR.cwnd_gain = bbr_high_gain    \/\/ maintain cwnd\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRCheckDrain():\n    if (BBR.state == Startup and BBR.filled_pipe)\n      BBREnterDrain()\n    if (BBR.state == Drain and packets_in_flight &lt;= BBRInflight(1.0))\n      BBREnterProbeBW()  \/\/ we estimate queue is drained\n<\/code><\/pre>\n\n\n\n<p><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">\u95ee\u9898\uff0c\u4e3a\u4ec0\u4e48DRAIN\u9636\u6bb5\u7684pacing_gain\u662f1\/BBRHighGain\uff1f<\/mark><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"ProbeBW\"><\/span>ProbeBW<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Gain_Cycling_Dynamics\"><\/span>Gain Cycling Dynamics<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>pacing_gain\u6309\u7167[1.25,0.75,1,1,1,1,1,1]\u5faa\u73af\u3002cwnd_gain\u59cb\u7ec8\u4e3a2\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Gain_Cycling_Randomization\"><\/span>Gain Cycling Randomization<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u4e3a\u4e86\u516c\u5e73\u6027\uff0c\u8fdb\u5165ProbeBW\u65f6\uff0c\u4ece0,2,3,4,5,6,7\u91cc\u968f\u4fbf\u9009\u4e00\u4e2aphase\u5f00\u59cb\u3002\u4e0d\u9009pacing_gain\u4e3a0.75\u8fd9\u4e2aphase\u662f\u56e0\u4e3a\u8fd9\u4e2aphase\u662f\u4e3a\u4e86\u51cf\u5c11\u94fe\u8def\u5806\u79ef\u800c\u8bbe\u8ba1\u7684\uff0c\u5982\u679c\u8fdb\u5165ProbeBW\u65f6\u4ee50.75\u7684pacing_gain\u8fd9\u4e2aphase\u5f00\u59cb\uff0c\u90a3\u4e48\u53ea\u4f1a\u964d\u4f4e\u94fe\u8def\u7684\u5229\u7528\u7387\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Gain_Cycling_Algorithm\"><\/span>Gain Cycling Algorithm<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u8fdb\u5165ProbeBW\u65f6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBREnterProbeBW():\n    BBR.state = ProbeBW\n    BBR.pacing_gain = 1\n    BBR.cwnd_gain = 2\n    BBR.cycle_index = BBRGainCycleLen - 1 - random_int_in_range(0..6)\n    BBRAdvanceCyclePhase()\n<\/code><\/pre>\n\n\n\n<p>\u6bcf\u6b21\u6536\u5230ACK\u65f6\uff0c\u68c0\u67e5\u662f\u5426\u9700\u8981advance cycle phase\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRCheckCyclePhase():\n    if (BBR.sate == ProbeBW and BBRIsNextCyclePhase()\n      BBRAdvanceCyclePhase() \n\n  BBRAdvanceCyclePhase():\n    BBR.cycle_stamp = Now()\n    BBR.cycle_index = (BBR.cycle_index + 1) % BBRGainCycleLen\n    pacing_gain_cycle = [5\/4, 3\/4, 1, 1, 1, 1, 1, 1]\n    BBR.pacing_gain = pacing_gain_cycle[BBR.cycle_index]\n\n  BBRIsNextCyclePhase():\n    is_full_length = (Now() - BBR.cycle_stamp) &gt; BBR.RTprop\n    if (BBR.pacing_gain == 1)\n      return is_full_length\n    if (BBR.pacing_gain &gt; 1)\n      return is_full_length and\n                (packets_lost &gt; 0 or\n                 prior_inflight &gt;= BBRInflight(BBR.pacing_gain))\n    else  \/\/  (BBR.pacing_gain &lt; 1)\n      return is_full_length or\n                 prior_inflight &lt;= BBRInflight(1)\n<\/code><\/pre>\n\n\n\n<p><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">prior_in_flight\u548cin_flight\u7684\u533a\u522b\uff1aprior_in_flight\u662f\u5904\u7406ack\u4e4b\u524d\u7684in_flight\uff0c\u5373prior_in_flight\u6bd4in_flight\u8981\u5927\u4e00\u70b9\u3002<\/mark><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Restarting_From_Idle\"><\/span>Restarting From Idle<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u4eceIdle\u72b6\u6001\u6062\u590d\u65f6\uff0cBBR\u76f4\u63a5\u4ee5\u4f30\u8ba1\u5e26\u5bbd\u4e3apacing rate\u53d1\u9001\u6570\u636e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRHandleRestartFromIdle():\n    if (packets_in_flight == 0 and C.app_limited)\n      BBR.idle_start = true\n      if (BBR.state == ProbeBW)\n        BBRSetPacingRateWithGain(1)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"ProbeRTT\"><\/span>ProbeRTT<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u6bcf\u6b21\u6536\u5230ACK\uff0cBBR\u90fd\u9700\u8981\u68c0\u67e5\u662f\u5426\u8fdb\u5165ProbeRTT\u72b6\u6001\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> BBRCheckProbeRTT():\n    if (BBR.state != ProbeRTT and\n        BBR.rtprop_expired and\n        not BBR.idle_restart)\n      BBREnterProbeRTT()\n      BBRSaveCwnd()\n      BBR.probe_rtt_done_stamp = 0\n    if (BBR.state == ProbeRTT)\n      BBRHandleProbeRTT()\n    BBR.idle_restart = false\n\n  BBREnterProbeRTT():\n    BBR.state = ProbeRTT\n    BBR.pacing_gain = 1\n    BBR.cwnd_gain = 1\n\n  BBRHandleProbeRTT():\n    \/* Ignore low rate samples during ProbeRTT: *\/\n    C.app_limited =\n      (BW.delivered + packets_in_flight) ? : 1\n    if (BBR.probe_rtt_done_stamp == 0 and\n        packets_in_flight &lt;= BBRMinPipeCwnd)\n      BBR.probe_rtt_done_stamp =\n        Now() + ProbeRTTDuration\n      BBR.probe_rtt_round_done = false\n      BBR.next_round_delivered = BBR.delivered\n    else if (BBR.probe_rtt_done_stamp != 0)\n      if (BBR.round_start)\n        BBR.probe_rtt_round_done = true\n      if (BBR.probe_rtt_round_done and\n          Now() &gt; BBR.probe_rtt_done_stamp)\n        BBR.rtprop_stamp = Now()\n        BBRRestoreCwnd()\n        BBRExitProbeRTT()\n\n  BBRExitProbeRTT():\n    if (BBR.filled_pipe)\n      BBREnterProbeBW()\n    else\n      BBREnterStartup()\n<\/code><\/pre>\n\n\n\n<p>\u5982\u679c\u8fde\u63a5\u662f\u4eceidle\u72b6\u6001\u6062\u590d\u7684(BBR.idle_restart is true)\uff0c\u90a3\u4e48\u5373\u4f7fminRtt\u5df2\u7ecfexpire\u4e5f\u4e0d\u4f1a\u8fdb\u5165ProbeRTT\uff0c\u56e0\u4e3a\u8fde\u63a5\u5904\u4e8eidle\u72b6\u6001\u65f6\u5df2\u7ecf\u628a\u94fe\u8def\u6392\u7a7a\u4e86\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u6863\u5730\u5740 https:\/\/tools.ietf.org\/id\/draft-cardwell-iccrg-bbr-congestion-control-00.html https:\/\/datatrack&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[66],"class_list":["post-793","post","type-post","status-publish","format-standard","hentry","category-10","tag-bbr"],"_links":{"self":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=793"}],"version-history":[{"count":4,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/793\/revisions"}],"predecessor-version":[{"id":1790,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/793\/revisions\/1790"}],"wp:attachment":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}