tcp/quic 的滑動窗口

一、滑動窗口
rwnd:
接收端窗口,接收方在每次發送ACK確認報文時,會包含一個 rwnd (Receive Window Size) 字段,指明自己當前剩余的接收緩沖區大小(即可用窗口),這里是否是socket的接收緩沖區,如果未被即時會被覆蓋,那么何來緩沖區大小剩余一說。還是說它是系統的緩沖區,還沒提交給socket緩沖區的那個緩沖區。

cwnd:
發送方的擁塞控制窗口,它根據reno,cubic,bbr等算法來確認cwnd的窗口大小。
慢啟動
擁塞避免

其中快重傳:它是對超時重傳的優化,等到超時已經很晚了。它是收到三次重復ACK,則啟動RTO,即擁塞窗口減半。當發送端發送了5個tcp段時,1,2,3,4,5。接收端收到了1后,發送了對2的期望ACK-2,依次收到3 4 5后,分別依次發送ACK-2。這樣就有了四個ACK-2,后面三個稱為對第一個的重復ACK。
MTU(Maximum Transmission Unit):網絡層傳輸的最大單元,通常以太網為1500字節。
MSS=MTU - IP頭部(20字節) - TCP頭部(20字節)。 //MSS 通常為 1460 字節
tcp段與序列號:tcp把要傳輸的數據當成字節流,從第一個字節開始,給一個一開始商量號的序號number,往后每個字節的序號都累加1。一個MSS為1460字節。那么一個tcp段序號范圍可以為1~1460。

例如,發送端發送 5000 字節數據,MSS 為 1000 字節,數據可能被分割成 5 個 TCP 段:
段 1:序列號 1-1000(1000 字節)
段 2:序列號 1001-2000
段 3:序列號 2001-3000
段 4:序列號 3001-4000
段 5:序列號 4001-5000

超時重傳:也稱為RTO,超時重傳說明網絡已經很嚴重了,它是最后一到保險,因為快重傳階段,服務器返回的三次重復ACK也可能丟失。

1.發送端發送一個 TCP 段后,啟動一個重傳定時器。
2.如果在 RTO 時間內未收到該段的 ACK,發送端重傳該段。
3.重傳后,TCP 通常將擁塞窗口(cwnd)重置為最小值(例如,1 MSS),進入慢啟動階段。

SRTT = (1 - α) * SRTT + α * 樣本 RTT  //通常 α = 0.125(1/8)。
RTTVAR = (1 - β) * RTTVAR + β * |SRTT - 樣本 RTT|   //RTT 方差(RTTVAR)
RTO = SRTT + max(G, K * RTTVAR)
G:時鐘粒度(通常為 100ms 或更小)。
K:常數,通常為 4。
tcp中,RTO 至少為 1 秒(RFC 6298 建議),某些實現可能設置最小值(如 200ms)。
如果超時重傳失敗,RTO 會翻倍(例如,1s → 2s → 4s),直到達到最大值(通常 60 秒)
QUIC(RFC 9002)建議 RTO 最小值 100ms。
kGranularity = 1ms(符合 RFC 9002

二、吞吐量的計算
吞吐量又稱單位時間內有效傳輸數據量,是被ACK確認已經到達對方的數據量。帶寬是指實際的物理/硬件條件能提供的最高上限的吞吐量。因此吞吐量<=帶寬。

吞吐量 ≤ MSS / RTT * C / sqrt(p)
其中:MSS:最大段大小(Maximum Segment Size)RTT:往返時延p:丟包率C:常數(通常接近 1

在無丟包(p≈0)的情況下,簡化為:

吞吐量 ≈ 窗口大小 / RTT

這里這個窗口就是min(rwnd, cwnd)。
比如現在rtt為20ms,吞吐量為20M;如果現在突然執行以下命令

tc qdisc add dev eth0 root netem delay 200ms limit 10000

由于窗口大小不變,必定導致吞吐量減少為2M。這就像船載人過河,如果河變寬2倍,那么運輸效率就會減少為1/2。這個時后需要提升的是船每批運送的人的數量。
那么由于這個命令只是把時間增加了,并沒有減少帶寬,這個時候由于tcp的擁塞避免,會緩慢增加窗口大小,直到丟包或超時。恢復到之前的吞吐量大小。

附錄:

picoquic的picoquic_internal.h中,有如下定義:

PICOQUIC_INITIAL_RTT: 初始 RTT 設置為 250ms(250000 微秒)。
PICOQUIC_INITIAL_RETRANSMIT_TIMER: 初始 RTO 設置為 250ms(250000 微秒)。
PICOQUIC_INITIAL_MAX_RETRANSMIT_TIMER: 最大初始 RTO 為 1 秒(1000000 微秒)。
PICOQUIC_MIN_RETRANSMIT_TIMER: 最小 RTO 為 50ms(50000 微秒)。
PICOQUIC_LARGE_RETRANSMIT_TIMER: 大型重傳定時器為 2 秒(2000000 微秒)。
PICOQUIC_ACK_DELAY_MAX_DEFAULT: 默認最大 ACK 延遲為 25ms(25000 微秒,符合 RFC 9002)。
PICOQUIC_ACK_DELAY_MIN: 最小 ACK 延遲為 1ms(1000 微秒)。
PICOQUIC_ACK_DELAY_MAX: 最大 ACK 延遲為 10ms(10000 微秒,具體值可由對端協商)。

如果rtt為20ms,且有以下條件:
RTTVAR ≈ 0ms(網絡穩定,抖動極小,假設初始 RTTVAR 為 1ms)。
max_ack_delay = 25ms(使用 PICOQUIC_ACK_DELAY_MAX_DEFAULT)。
kGranularity = 1ms(符合 RFC 9002)。
計算quic的RTO為49ms。

RTO = SRTT + max(4 * RTTVAR, kGranularity) + max_ack_delay= 20ms + max(4 * 1ms, 1ms) + 25ms= 20ms + 4ms + 25ms= 49ms

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914495.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM監控及診斷工具-命令行篇

18.1. 概述 性能診斷是軟件工程師在日常工作中需要經常面對和解決的問題&#xff0c;在用戶體驗至上的今天&#xff0c;解決好應用的性能問題能帶來非常大的收益。 Java 作為最流行的編程語言之一&#xff0c;其應用性能診斷一直受到業界廣泛關注。可能造成 Java 應用出現性能…

Jenkins 版本升級與插件問題深度復盤:從 2.443 到 2.504.3 及功能恢復全解析

前言&#xff1a;問題溯源與升級必要性 在 Jenkins 持續集成體系中&#xff0c;插件生態是其強大功能的核心驅動力。然而&#xff0c;某次例行維護中&#xff0c;團隊對 Jenkins 2.443 環境的插件進行批量升級后&#xff0c;意外觸發連鎖反應 &#xff1a; SSH Server 插件功能…

Ribbon實戰

一、前置知識 1.1 負載均衡定義 負載均衡指的是將網絡請求通過不同的算法分配到不同的服務器上的技術&#xff0c;從而提升系統的性能。 1.2 負載均衡工具 負載均衡工具可以分分為客戶端負載均衡工具和服務端負載均衡工具&#xff0c;它們的區別如下。 表1-1 負載均衡工具…

cs285學習筆記(一):課程總覽

根據 Fall 2023 學期的官方課程日程&#xff0c;這里是 CS?285 全課程的 Lecture 大綱及內容摘要&#xff0c;詳細對應周次和主題&#xff0c;方便你快速定位每節課要點、相關作業與視頻資源 &#x1f3af; 官方課程地址 YouTobe 視頻地址 blibli視頻(帶中文字幕) &#x…

OkHttp SSE 完整總結(最終版)

1. SSE 基礎概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一種 Web 標準&#xff0c;允許服務器向客戶端推送實時數據。 核心特點 單向通信&#xff1a;服務器 → 客戶端 基于 HTTP 協議&#xff1a;使用 GET 請求 長連接&#xff1a;連…

聚寬sql數據庫傳遞

自建數據庫從聚寬到Q-MT自動化交易實戰 從接觸聚寬以來一直都是手動跟單&#xff0c;在網上看到許多大佬的自動交易文章&#xff0c;心里也不禁十分癢癢。百說不如一練&#xff0c;千講不如實干。經過一番努力&#xff0c;終于成功實盤了&#xff0c;效果還可以&#xff0c;幾…

es里為什么node和shard不是一對一的關系

提問&#xff1a; 既然多個shard會被分配到同一個node上&#xff0c;那么為什么不把多個shard合并成一個然后存在當前node上呢&#xff0c;簡而言之也就是讓node和shard形成一對一的關系呢 &#xff1f;非常好的問題&#xff0c;這正是理解Elasticsearch分片&#xff08;shard…

淺談npm,cnpm,pnpm,npx,nvm,yarn之間的區別

首先做一個基本的分類 名稱描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默認的包管理器&#xff0c;隨Node.js的安裝會一起安裝。使用npm可以安裝&#xff0c;發布&…

滑動窗口-76.最小覆蓋子串-力扣(LeetCode)

一、題目解析1.不符合要求則返回空串("")2.子串中重復字符的數量要不少于t中該字符的數量二、算法原理解法1&#xff1a;暴力枚舉哈希表這里的暴力枚舉也可以優化&#xff0c;即在包含t中元素處枚舉&#xff0c;如在A、B和C處開始枚舉&#xff0c;減少不必要的枚舉 解…

從零構建搜索引擎 build demo search engine from scratch

從零構建搜索引擎 build demo search engine from scratch 我們每天都會使用搜索引擎&#xff1a;打開google等搜索引擎&#xff0c;輸入關鍵詞&#xff0c;檢索出結果&#xff0c;這是一次搜索&#xff1b;當打開歷史記錄旁邊的&#x1f50d;按鈕&#xff0c;輸入關鍵詞&#…

pytorch小記(二十九):深入解析 PyTorch 中的 `torch.clip`(及其別名 `torch.clamp`)

pytorch小記&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;一、函數簽名二、簡單示例三、廣播支持四、與 Autograd…

快速分頁wpf

/*沒有在xaml設置上下文window.context是因為 命名空間一直對應不上 所以在xaml.cs 里面綁定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何徹底禁用 Chrome 自動更新

如何徹底禁用 Chrome 自動更新 隨著谷歌將 Chrome 瀏覽器版本升級至 138&#xff0c;它即將徹底拋棄對 Manifest V2 擴展的支持。許多用戶希望將瀏覽器版本鎖定在 138&#xff0c;以繼續使用 uBlock Origin、Tampermonkey 等常用擴展。 本文總結了四種有效方法&#xff0c;幫助…

流批一體的“奧卡姆剃刀”:Apache Cloudberry 增量物化視圖應用解析

引言&#xff1a;流批一體&#xff0c;理想與現實的鴻溝 在數據驅動的今天&#xff0c;“實時”二字仿佛擁有魔力&#xff0c;驅使著無數企業投身于流批一體架構的建設浪潮中。我們渴望實時洞察業務變化&#xff0c;實時響應用戶需求。以 Apache Flink 為代表的流處理引擎&…

C# 入門教程(三):詳解字段、屬性、索引器及各類參數與擴展方法

文章目錄一、字段、屬性、索引器、常量1.字段2.屬性2.1 什么是屬性2.2 屬性的聲明2.3 屬性與字段的關系3 索引器4. 常量二、傳值 輸出 引用 數組 具名 可選參數&#xff0c;擴展方法2.1 傳值參數2.1.1 值類型 傳參2.1.2 引用類型 傳參2.2 引用參數2.2.1 引用參數-值類型 傳參2.…

《美術教育研究》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答&#xff1a;問&#xff1a;《美術教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。問&#xff1a;《美術教育研究》級別&#xff1f;答&#xff1a;省級。主管單位&#xff1a; 安徽出版集團有限責任公司 主辦…

每日算法刷題Day47:7.13:leetcode 復習完滑動窗口一章,用時2h30min

思考: 遇到子數組/子字符串可以考慮能不能用滑動窗口&#xff0c; 定長:逆向思維,答案不定 最大長度/最小長度:一般求長度 越長越合法/越短越合法/恰好:一般求數量 主要思考窗口條件成立&#xff0c; 判斷條件是符合窗口條件(最小長度/越長越合法還是不符合(最大長度/越短越合法…

電流驅動和電壓驅動的區別

理解電流驅動和電壓驅動的區別對電路設計至關重要&#xff0c;尤其在高速、高抗噪要求的場景&#xff08;如LVDS&#xff09;。以下是兩者的核心對比&#xff1a;一、電壓驅動 (Voltage Drive) 核心原理&#xff1a; 驅動器輸出一個受控的電壓&#xff08;與負載阻抗無關&#…

宿舍電費查詢——以ZUA為例

宿舍電費查詢——以ZUA為例0. 安裝抓包環境手機端桌面端1. 登錄1.1 開啟抓包后進入繳費頁面&#xff1a;1.2 分析請求1.3 編寫登錄代碼2. 獲取樓棟及房間ID2.1 獲取樓棟ID2.2 編寫獲取樓棟ID代碼2.3 獲取房間ID2.4 編寫獲取房間ID代碼3. 獲取剩余電費&#xff1a;3.1 選擇房間號…

vue中計算屬性的介紹

Vue.js 中的計算屬性是基于它的響應式系統來實現的&#xff0c;它可以根據 Vue 實例的數據狀態來動態計算出新的屬性值。在 Vue 組件中&#xff0c;計算屬性常用于對數據進行處理和轉換&#xff0c;以及動態生成一些需要的數據。一、使用方式1.定義計算屬性&#xff1a; 在Vue組…