【linux網絡(5)】傳輸層協議詳解(下)

目錄

  • 前言
  • 1. TCP的超時重傳機制
  • 2. TCP的流量控制機制
  • 3. TCP的滑動窗口機制
  • 4. TCP的擁塞控制機制
  • 5. TCP的延遲應答機制
  • 6. TCP的捎帶應答機制
  • 7. 總結以及思考

前言

強烈建議先看傳輸層協議詳解(上)后再看這篇文章. 上一篇文章講到TCP協議為了保證可靠性而做的一些策略, 這篇文章會深度解析剩下的策略.

1. TCP的超時重傳機制

主機 A 發送數據給 B 之后,可能因為網絡擁堵等原因,數據無法到達主機 B;如果主機 A 在一個特定時間間隔內沒有收到 B 發來的確認應答,就會進行重發。這種操作叫做 超時重傳
在這里插入圖片描述

就是我收到ACK,對方收到數據,但是,我沒有收到ACK,對方沒有收到數據.
不管是數據丟了,還是應答丟了,發送方的策略都是超時之后進行補發.

那么就有下面兩個問題:

1.應答丟包后,發送方進行補發,那接收方就有兩個一樣的報文了,怎么去重呢?

一樣的報文,說明32位序號是一樣的,所以序號也有去重的功能!
并且,如果有不同的多個報文,序號也可以用來排序,使之按序到達.

2.那么,超時的時間如何確定?

這個時間的長短,隨著網絡環境的不同,是有差異的.
如果超時時間設的太長,會影響整體的重傳效率;
如果超時時間設的太短,有可能會頻繁發送重復的包。

2. TCP的流量控制機制

接收端處理數據的速度是有限的.如果發送端發的太快,導致接收端的緩沖區被打滿,
這個時候如果發送端繼續發送,就會造成丟包,繼而引起丟包重傳等等一系列連鎖反應。

因此TCP支持根據接收端的接收能力,來決定發送端的發送速度,這個機制就叫做流量控制.

通過下面的若干個問題進行講解:

  1. 接收方的接受能力是什么?

可以認為是: 接受緩沖區中剩余空間的大小!

  1. 發送方怎么知道對方的接受能力是多少?

發送方每次發送報文給接收方,接收方都會返回ACK應答,就是一個報頭,此時接收方會把自己的剩余空間填入 16位窗口大小 這一字段,再返回給發送方!

  1. 那雙方第一次發送信息的時候呢,又沒有ACK應答,怎么控制?

三次握手期間,已經協商交換過了雙方的接受能力!

  1. 16位窗口大小表示的數字最大是65535,那么 TCP 窗口最大就是 65535 字節么?

實際上,TCP首部40字節選項中還包含了一個窗口擴大因子M,實際窗口大小是窗口字段的值左移 M 位。

  1. 接收方的剩余空間為0了,發送方會等待,那過后接收方又有空間了,發送發送方怎么及時知道?

接收方會給發送方傳遞"窗口更新通知",其實就是一個報文,或是發送方間隔進行"窗口探測",也是一個報文。這兩種方式一般是同時使用的。

  1. 那如果對方一直不進行窗口更新呢?

就要用到報頭里的另一個標記位:PSH.就是告訴對方把緩沖區里的數據趕快取走.
當然,如果我們想讓對方盡快處理數據,都可以設置PSH,不一定非要是0的時候.

這里再來講一下最后一個標記位URG和16位緊急指針這個字段:

URG: 緊急指針標記位.URG置為0時,報頭里的 16位緊急指針 這一字段無意義,置1時,才有意義.
16位緊急指針: 標識哪部分數據是緊急數據.

所以在流量控制機制中,我們學習了以下幾個字段:

  • 16位窗口大小
  • PSH標記位
  • URG標記位
  • 16位進階指針

3. TCP的滑動窗口機制

上篇文章中講到, 服務器每收到一次數據都會回一個ACK確認應答. 但是這樣是不是效率有點低下了?由其是數據往返時間比較長的時候. 有沒有什么方法可以一次性發送多條數據呢? 當然TCP協議也考慮到了這一點:

滑動窗口:

可以將發送緩沖區想象成一個數組, 滑動窗口的本質就是此數組中的兩個元素下標, 這兩個下標會維護一段數據, 我們就可以將這份維護的數據一次性發給對方, 能大大的提高效率.

在這里插入圖片描述

  • 窗口大小指的是無需等待確認應答而可以繼續發送數據的最大值. 上圖的窗口大小就是4000個字節(四個段).
  • 發送前四個段的時候, 不需要等待任何ACK, 直接發送;
  • 收到第一個ACK后, 滑動窗口向后移動, 繼續發送第五個段的數據; 依次類推;
  • 操作系統內核為了維護這個滑動窗口, 需要開辟 發送緩沖區 來記錄當前還有哪些數據沒有應答; 只有確認應答過的數據, 才能從緩沖區刪掉;
  • 窗口越大, 則網絡的吞吐率就越高;

所以下面兩個問題就有了答案:
(1)根據流量控制機制發送方已經知道了對方的接收能力,那具體該如何發送?

流量控制,就是通過滑動窗口實現的!

(2)在超時重傳時,超時時間以內,已經發送的報文不能被丟棄,而是要保存起來!保存在哪里?

保存在滑動窗口中!

4. TCP的擁塞控制機制

雖然是TCP有滑動窗口這一大殺器來提高效率和可靠性, 但是我們始終在關心的是, 對端怎么怎么樣, 對端的接受能力怎么樣, 對端是否收到了信息. 我們從來沒有考慮過網絡本身的情況, 萬一網絡本身就不好, 還一次性發送了大量數據, 丟包了怎么辦? . 當然這一切都在TCP協議的預料之中.

擁塞控制:

因為網絡上有很多的計算機, 可能當前的網絡狀態就已經比較擁堵. 在不清楚當前網絡狀態下, 貿然發送大量的數據,是很有可能引起雪上加霜的. TCP引入 慢啟動 機制, 先發少量的數據, 探探路, 摸清當前的網絡擁堵狀態, 再決定按照多大的速度傳輸數據.

在這里插入圖片描述

其實你只用知道, TCP的擁塞控制是用來關心當前網絡狀態的, 并且它采用的慢啟動機制, 雖然這其中還有很多細節可以挖掘, 但是作為從事后端開發的大學生而言, 學到這個地方已經是有點東西了.

(有興趣的同學可以看看下面對"慢啟動"的的圖像以及一點理解)
在這里插入圖片描述

5. TCP的延遲應答機制

若接收數據后立刻返回ACK應答, 返回窗口會比較小.

  • 假設接收端緩沖區為1M. 一次收到了500K的數據; 如果立刻應答, 返回的窗口就是500K;
  • 但實際上可能處理端處理的速度很快, 10ms之內就把500K數據從緩沖區消費掉了;
  • 在這種情況下, 接收端處理還遠沒有達到自己的極限, 即使窗口再放大一些, 也能處理過來;
  • 如果接收端稍微等一會再應答, 比如等待200ms再應答, 那么這個時候返回的窗口大小就是1M;
    在這里插入圖片描述

一定要記得, 窗口越大, 網絡吞吐量就越大, 傳輸效率就越高. 我們的目標是在保證網絡不擁塞的情況下盡量提高傳輸效率;

在這里插入圖片描述

說白了, 有時候立刻應答并不是一種高效率的體現.

6. TCP的捎帶應答機制

捎帶應答機制其實就是: ACK應答+數據 一起返回去.

要注意的是: 三次握手里的前兩次握手是不能捎帶應答的,因為此時連接還沒有建立好,只有建立成功了才可以通信.但是第三層握手ACK可以捎帶數據了.

至此,TCP協議報頭里的所有重要字段及其它們的作用機制都講解完畢!

7. 總結以及思考

現在再來看, TCP是面向字節流的就大概能理解了. TCP只管迅速的給對端發包, 不管一個數據要分幾次發, 一次性發多少, 總之它只管盡快將包發過去. 換句話說,就是站在TCP的角度,沒有報文的概念,所有的數據都是放在一個字符數組的緩沖區里,只是單純的把數據推送過去,但是到底有沒有推完一個,一個半…)都由網絡決定.
雖然這樣大大的提升了效率, 但是會帶來粘包問題. 也就是說對端收到數據后, 它并不知道這個數據是否是完整的一個, 還是半個, 甚至是兩個半都有可能.

TCP小結:
在這里插入圖片描述

TCP和UDP的對比:
我們說了TCP是可靠連接,那么是不是TCP一定就優于UDP呢?
當然不是! TCP和UDP之間的優點和缺點,不能簡單,絕對的進行比較。

(1)TCP 用于可靠傳輸的情況,應用于文件傳輸,重要狀態更新等場景;
(2)UDP 用于對高速傳輸和實時性要求較高的通信領域,例如,早期的 QQ,視頻傳輸等。另外 UDP 可以用于廣播;

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

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

相關文章

DeepSeek 遭 DDoS 攻擊背后:DDoS 攻擊的 “千層套路” 與安全防御 “金鐘罩”

當算力博弈升級為網絡戰爭:拆解DDoS攻擊背后的技術攻防戰——從DeepSeek遇襲看全球網絡安全新趨勢 在數字化浪潮席卷全球的當下,網絡已然成為人類社會運轉的關鍵基礎設施,深刻融入經濟、生活、政務等各個領域。從金融交易的實時清算&#xf…

二、CSS筆記

(一)css概述 1、定義 CSS是Cascading Style Sheets的簡稱,中文稱為層疊樣式表,用來控制網頁數據的表現,可以使網頁的表現與數據內容分離。 2、要點 怎么找到標簽怎么操作標簽對象(element) 3、css的四種引入方式 3.1 行內式 在標簽的style屬性中設定CSS樣式。這種方…

第三篇:模型壓縮與量化技術——DeepSeek如何在邊緣側突破“小而強”的算力困局

——從算法到芯片的全棧式優化實踐 隨著AI應用向移動終端與物聯網設備滲透,模型輕量化成為行業核心挑戰。DeepSeek通過自研的“算法-編譯-硬件”協同優化體系,在保持模型性能的前提下,實現參數量與能耗的指數級壓縮。本文從技術原理、工程實…

C++編程語言:抽象機制:泛型編程(Bjarne Stroustrup)

泛型編程(Generic Programming) 目錄 24.1 引言(Introduction) 24.2 算法和(通用性的)提升(Algorithms and Lifting) 24.3 概念(此指模板參數的插件)(Concepts) 24.3.1 發現插件集(Discovering a Concept) 24.3.2 概念與約束(Concepts and Constraints) 24.4 具體化…

DeepSeek-R1本地部署實踐

一、下載安裝 --Ollama Ollama是一個開源的 LLM(大型語言模型)服務工具,用于簡化在本地運行大語言模型,降低使用大語言模型的門檻,使得大模型的開發者、研究人員和愛好者能夠在本地環境快速實驗、管理和部署最新大語言…

AI技術路線(marked)

人工智能(AI)是一個非常廣泛且充滿潛力的領域,它涉及了讓計算機能夠執行通常需要人類智能的任務,比如感知、推理、學習、決策等。人工智能的應用已經滲透到各行各業,從自動駕駛到醫療診斷,再到推薦系統和自…

【leetcode詳解】T598 區間加法

598. 區間加法 II - 力扣(LeetCode) 思路分析 核心在于將問題轉化, 題目不是要求最大整數本身,而是要求解最大整數的個數 結合矩陣元素的增加原理,我們將抽象問題轉為可操作的方法,其實就是再找每組ops中…

【最后203篇系列】004 -Smarklink

說明 這個用來替代nginx。 最初是希望用nginx進行故障檢測和負載均衡,花了很多時間,大致的結論是:nginx可以實現,但是是在商業版里。非得要找替代肯定可以搞出來,但是太麻煩了(即使是nginx本身的配置也很煩…

完全卸載mysql server步驟

1. 在控制面板中卸載mysql 2. 打開注冊表,運行regedit, 刪除mysql信息 HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->EventLog->Application->Mysql HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->Mysql …

1. 【.NET Aspire 從入門到實戰】--理論入門與環境搭建--引言

在當前軟件開發領域,云原生和微服務架構已經成為主流趨勢,傳統的單體應用正逐步向分布式系統轉型。隨著業務需求的不斷變化與用戶規模的迅速擴大,如何在保證高可用、高擴展性的同時,還能提高開發效率與降低維護成本,成…

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群 簡介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系統安裝部署 Kubernetes v1.29.13 集群 1 環境準備1.1 集群IP規劃1.2 初始化步驟(各個節點都需執行)1.2.1 主機名與IP地址解析1.…

基于SpringBoot的新聞資訊系統的設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

每日一題——包含min函數的棧

包含min函數的棧 題目數據范圍:示例C語言代碼實現解釋1. push(value)2. pop()3. top()4. min() 總結大小堆 題目 定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的 min 函數,輸入操作時保證 pop、top 和 min 函數操作時&am…

RDP協議詳解

以下內容包含對 RDP(Remote Desktop Protocol,遠程桌面協議)及其開源實現 FreeRDP 的較為系統、深入的講解,涵蓋協議概要、歷史沿革、核心原理、安全機制、安裝與使用方法、擴展與未來發展趨勢等方面, --- ## 一、引…

【Linux系統】計算機世界的基石:馮諾依曼架構與操作系統設計

文章目錄 一.馮諾依曼體系結構1.1 為什么體系結構中要存在內存?1.2 馮諾依曼瓶頸 二.操作系統2.1 設計目的2.2 系統調用與庫函數 一.馮諾依曼體系結構 馮諾依曼體系結構(Von Neumann Architecture)是計算機的基本設計理念之一,由…

消息隊列應用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系統設計》P343-P347

消息隊列 使用信號量、事件標志組和線標志進行任務同步時,只能提供同步的時刻信息,無法在任務之間進行數據傳輸。要實現任務間的數據傳輸,一般使用兩種方式: 1. 全局變量 在 RTOS 中使用全局變量時,必須保證每個任務…

【NLP251】Transformer精講 殘差鏈接與層歸一化

精講部分,主要是對Transformer的深度理解方便日后從底層邏輯進行創新,對于僅應用需求的小伙伴可以跳過這一部分,不影響正常學習。 1. 殘差模塊 何凱明在2015年提出的殘差網絡(ResNet),Transformer在2016年…

Android學習制作app(ESP8266-01S連接-簡單制作)

一、理論 部分理論見arduino學習-CSDN博客和Android Studio安裝配置_android studio gradle 配置-CSDN博客 以下直接上代碼和效果視頻,esp01S的收發硬件代碼目前沒有分享,但是可以通過另一個手機網絡調試助手進行模擬。也可以直接根據我的代碼進行改動…

圖書管理系統 Axios 源碼__新增圖書

目錄 功能介紹 核心代碼解析 源碼:新增圖書功能 總結 本項目基于 HTML、Bootstrap、JavaScript 和 Axios 開發,實現了圖書的增刪改查功能。以下是新增圖書的功能實現,適合前端開發學習和項目實踐。 功能介紹 用戶可以通過 模態框&#xf…

DeepSeek Janus-Pro:多模態AI模型的突破與創新

近年來,人工智能領域取得了顯著的進展,尤其是在多模態模型(Multimodal Models)方面。多模態模型能夠同時處理和理解文本、圖像等多種類型的數據,極大地擴展了AI的應用場景。DeepSeek(DeepSeek-V3 深度剖析:…