<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 擁塞控制概述 * 擁塞控制是用來提高網絡利用率,降低丟包率,并保證網絡資源對每條數據流的公平性。 * 擁塞控制的四個部分:**慢啟動**,**擁塞避免**、快速重傳和快速恢復 * 擁塞控制算法在Linux下的實現有:reno算法、vegas算法和cubic算法 ## 最終控制變量 擁塞控制最終受控變量是向發送端向網絡一次連續寫入(收到其中第一個數據的確認之前)的數據量,我們稱為SWND(send window,發送窗口)。不過,發送端最終以TCP報文段來發送數據,所以SWND限定來發送端能連續發送的TCP報文段數量。這些TCP報文段的最大長度(僅指數據 部分)稱為SMSS(Sender Maximum Segment Size,發送著最大段大小),其值一般等于MSS。 * 發送端需要合理選擇SWND大小,SWND太小,會引起網絡延遲,反之如果SWND太大,則容易導致網絡擁塞。 * 可以通過接收通告窗口(RWND)來控制發送端的SWND。 * RWND控制發送端的SWND顯然不夠,發送端引入了一個稱為擁塞窗口(Congestion Window,CWND)的狀態變量。實際的SWND值是RWND和CWND中的較小者。 ## 慢啟動和擁塞避免 TCP建立好之后,CWND將被設置成初始值IW(Initial Window),其大小為2——4惡搞SMSS。 ### 什么是慢啟動 發送端最多能發送IW字節的數據,此后發送端每收到接收端的一個確認,其CWND就按照如下方式增加: ``` CWND += min(N, SMSS); ``` 其中N是此次確認中包含的之前違背確認的字節數,這樣一來,CWND將按照指數形式擴大,這就是所謂的慢啟動。 >慢啟動算法的理由是,TCP模塊剛開始發送數據時并不知道網絡的實際情況,需要用一種試探的方式平滑地增加CWND的大小。 ### 什么是擁塞避免 * 如果不施加其他手段,慢啟動必然使得CWND很快膨脹(可見慢啟動其實不慢)并最終導致網絡擁塞。 * TCP擁塞控制中定義了另一個重要的狀態變量:慢啟動門限(slow start threshold size, ssthresh)。當CWND的大小超過該值時,TCP擁塞控制將進入擁塞避免階段。 * 擁塞避免算法是的CWND按照線性方式增加,從而減緩其擴大。 * 每個RTT時間內按照`CWND += min(N, SMSS);`計算新的CWND,而不討論該RTT時間內發送端接收到多少個確認。 * 每收到一個對新數據的確認報文段,就按照`CWND += SMSS*SMSS/CWND`來更新CWND ### 判斷擁塞發生的依據 發送端判斷擁塞發送的依據有兩個 * 傳輸超時,或者說TCP重傳定時器溢出 * 接收到重復的確認報文段。 對第一種使用慢啟動和擁塞避免,對第二種情況則采用快速重傳和快速恢復。 >第二種情況如果發生在重傳定時器溢出之后,則也被擁塞控制當成第一種情況來對待。 如果發送端檢測到擁塞發生是由于傳輸超時,即上述第一種情況,那么它將執行重傳并做如下調整 `ssthresh=max(FlightSize/2, 2*SMSS) CWND<=SMSS`,其中FlightSIze是已經發送但未收到確認的字節數,這樣調整之后,CWND將小雨SMSS,那么也必然小于新的慢啟動門限值ssthresh。它一定不小于SMSS的2倍),故而擁塞控制再次進入慢啟動階段。 ## 快速重傳和快速恢復 擁塞控制算法需要判斷當收到重復的確認報文段時,網絡是否真的發生來擁塞,活著說TCP報文段是否真的丟失了,具體做法是:發送端如果連續收到3個重復報文段,就認為是擁塞發生了。然后它啟動快速重傳和快速算法來處理擁塞。 * 當收到第三個重復的確認報文段時,按照`ssthresh=max(FlightSize/2, 2*SMSS) CWND<=SMSS`計算ssthresh,然后立即重傳丟失的報文段,并按照`CWND=ssthresh+3*SMSS`設置CWND * 每次收到1一個重復的確認時,設置CWND=CWND+SMSS。此時發送端可以發送新的TCP報文段(如果新的CWND允許的話) * 當收到新數據的確認時,設置CWND=ssthresh(ssthresh是新的慢啟動門限值,由第一步計算得到) 快速重傳和快速恢復完成之后,擁塞控制將恢復到擁塞避免階段,這一點由第三步操作可得知。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看