計算機網絡 - TCP協議

通過一些問題來討論 TCP 協議

  • 什么是 TCP ?舉幾個應用了 TCP 協議的例子
  • TCP協議如何保證可靠性?
  • tcp如何保證不會接受重復的報文?
  • Tcp粘包拆包問題了解嗎?介紹一下,如何解決?
  • TCP擁塞控制與流量控制區別?
  • 現在我們視頻面試用到哪些協議

1.?什么是 TCP ?舉幾個應用了 TCP 協議的例子

TCP 就是連接控制協議,是面向連接的,可靠的,基于字節流的傳輸層通信協議。

其中面向連接一定是一對一的連接。可靠性指無論網絡鏈路中出現了什么狀況,TCP 都會盡力保證一個報文能夠無損壞,無冗余,按序到達。基于字節流是指用戶消息通過 TCP 協議傳輸時,會被操作系統分組成多個 TCP 報文,并且這些報文之間是有序的

像我們平時用到的最多的網頁中的 HTTP 協議,傳輸層協議就是 TCP。類似用到 TCP 的應用層還有 FTP 文件傳輸協議,SMTP 簡單郵件傳輸協議和 SSH,它們的傳輸層都需要 TCP 來做可靠性保證

2.?TCP協議如何保證可靠性?

首先 TCP 每次建立連接都需要三次握手,釋放連接需要四次揮手來確保建立的傳輸通道是可靠的

其次,TCP 采用了連續 ARQ 協議來保證數據傳輸的正確性,同時還使用了滑動窗口機制來控制發送方的發送速率,保證接收方一定能接受到發送的數據,也就是流量控制機制

還有,TCP 利用序列號和校驗和,來分別確保數據傳輸的有序性和完整性

最后在整個網絡層面上,TCP 還使用慢啟動,擁塞避免,快速重傳和快速恢復來進行擁塞控制,避免網絡阻塞帶來的數據接好問題

3.?tcp如何保證不會接受重復的報文?

這個是由 TCP 報文中的“序列號”字段保證的,TCP 在建立連接時,客戶端和服務端都會將一個內核生成的隨機數作為自己的初始序列號。在建立連接完成后,開始發送數據時,發送的一端會將“上次發送的序列號”加上“上次發送的數據長度”作為“本次報文的序列號”發送給對端。對端在收到數據包時,會根據序列號來確定接收到數據的順序和是否重復,如果重復收到某個序列號的報文,則只會接收一次,其他的都丟棄

需要注意的是,在三次握手和四次揮手階段,發送端序列號的值就不是“上次發送的序列號”加上“上次發送的數據長度”的值,而是“上次發送的序列號”加上 “1”

還有,序列號除了確保數據接收的“有序性”,還有用于 TCP 的流量控制中。具體的,TCP 連接的兩端都會維護一個發送窗口和接受窗口。發送方根據 TCP 報文的序列號和發送窗口的大小來確定可以發送的數據量。接收方使用序列號和接收窗口大小來確定可以接收的數據量,并通知發送方來控制發送速率,以此來確保雙方數據都能夠被順利接收。

4.?Tcp粘包拆包問題了解嗎?介紹一下,如何解決?

首先 TCP 是處在傳輸層的面向流的協議的協議,它本身不會按照應用開發者的期望,保持每次發送時都帶有一個數據的邊界,這可能導致接收端一次收到了多個應用層報文,需要應用開發者自己分開,也就是需要自己去實現“流”到“數據報”的功能。具體的解決,可以用“特殊字符作為邊界”,也就是我們對于應用層的每個信息后面都加上一些特殊字符用來代表信息結束。當讀到了這些特殊字符,就意味著已經讀完了一個完整的消息。比如 HTTP 通過設置回車符和一個換行符來作為 HTTP 報文協議的邊界。但需要注意的是,如果信息內容中剛好出現了這些字符,可能會導致信息提前結束和數據錯亂,這時我們可以對這些個字符進行轉義,避免這種情況。

其實還有一種“粘包”的含義:就是 TCP 在實現的時候,為了解決大量小報文場景下,包頭比數據還大,導致傳輸的性價比太低的情況,采用了一種叫 Nagle 的算法。這個算法的效果就是將開發者多次發送的小數據,粘在同一個 TCP 報文中發出。這樣可能就會導致先被發送的數據可能需要等待一段時間,才能跟后面才被發送的數據一起組成報文發送出去。但在實際中這種算法帶來的延遲幾乎可以忽略不計,絕大多數情況都是無感知的。只有在頻繁進行超短信息的交互,比如只有幾個字節的場景,禁用 Nagle 算法才能顯著降低延遲。

5.?TCP擁塞控制與流量控制區別?

兩者誕生的原因就不同:

需要流量控制的原因是,端到端在通信時,發送方的速率與接收方的速率不一致,如果發送方發的速率太快,會導致接收方處理不過來;而如果發送方發送的太慢,數據就會有一定的延遲。那么此時就需要通過一種方法來控制發送方的速率,這個方法就叫“流量控制”

而擁塞控制不同于流量控制,它主要強調的是網絡的擁塞,導致發送方發的數據包被堵在了半路,而接收方遲遲沒收到數據包并返回接收到的最后一個包的確認報文,會讓發送方誤以為這個包丟了并重新發送,這不僅會浪費信道資源,還會使原來擁塞的網絡雪上加霜。

6.?現在我們視頻面試用到哪些協議

考慮到視頻時對于延遲很敏感,所以應該具有 UDP 傳輸速度快的特性,但又能允許一定程度的丟包。但又不能丟包率太高,還應具備 TCP 有關數據傳輸可靠性的保證,確保不會視頻著視頻著突然畫面就沒有了的情況。所以我覺得應該是同時結合了 TCP 可靠性和 UDP 速度快的優點,這類協議我了解的是谷歌提出的 QUIC 協議。

QUIC 協議全稱是“快速 UDP 互聯網”連接,相比與當前應用多的 http2 + tcp + tls,它的優勢主要在減少了 TCP 三次握手以及 TLS 握手的時間,擁有改進后的擁塞控制,以及擁有避免隊頭阻塞的多路復用。

首先由于 UDP 本身沒有連接的概念,不需要三次握手,QUIC 在此基礎上實現了 0 RTT 的安全握手,并且在大部分情況下也只需 0 RTT 就能實現數據發送。

為了保證可靠性傳輸,QUIC 在 TCP 關于擁塞控制方面的四個算法,包括慢啟動,擁塞避免,快速重傳,快速回復都做了相應的改進。比較突出的特點就是,QUIC 使用 packet number 代替了 TCP 的 sequence number,且每個 packet number 都嚴格遞增。加上同樣是 QUIC 提出的 Stream Offset,確保數據的順序性和可靠性。

除此之外,QUIC 還在 Connection 和 Stream 兩個級別都提供了流量控制。Stream 可以理解為一條 http 請求,Connection 可以類比一條 TCP 連接。QUIC 的多路復用就是指在一條 Connection 上同時存在多條 Stream,且多條 Stream 之間沒有順序依賴,也就消除了 TCP 中隊頭阻塞的問題。

大致只了解這么多。


誠懇歡迎大家提出意見

......(待續未完

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

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

相關文章

Fiddler 進行斷點測試:調試網絡請求

目錄 一、什么是斷點測試? 二、Fiddler 的斷點功能 三、如何在 Fiddler 中設置斷點? 步驟 1:啟動 Fiddler 步驟 2:啟用斷點 步驟 3:捕獲請求 步驟 4:修改請求或響應 四、案例:模擬登錄失…

OpenCv高階(三)——圖像的直方圖、圖像直方圖的均衡化

目錄 一、直方圖 1、計算并顯示直方圖 2、使用matplotlib方法繪制直方圖(不劃分小的子區間) 3、使用opencv的方法繪制直方圖 (劃分16個小的子亮度區間) 4、繪制彩色圖像的直方圖,將各個通道的直方圖值都畫出來 二、…

Flutter 與原生通信

Flutter 與原生之間的通信主要基于通道機制,包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel:用于 Flutter 與原生之間的方法調用,實現雙向通信,適合一次性的方法調用并獲取返回值,如 Flut…

前端面試-Vue篇

核心概念 Vue 3的響應式原理與Vue 2有何本質區別?Vue中虛擬DOM的diff算法優化策略有哪些?Vue組件間通信方式有哪些?適用場景分別是什么?Vue的生命周期鉤子在Composition API中如何替代?Vue的模板編譯過程是怎樣的&…

光刻機研發與市場現狀分析報告

1. 引言 光刻機(Lithography Machine)是半導體制造的核心設備,其技術水平和市場供應能力直接影響全球芯片產業的發展。隨著人工智能(AI)、5G、高性能計算(HPC)和自動駕駛等技術的興起&#xff0…

Missashe考研日記-day21

Missashe考研日記-day21 1 專業課408 學習時間:4h學習內容: 今天先把昨天學的內容的課后習題做了,整整75道啊,然后學了OS第二章關于CPU調度部分的內容,這第二章太重要了,以至于每一小節的內容都比較多&am…

【玩轉全棧】—— Django+vue3+訊飛星火API 實現前端頁面實時AI答復

技術棧:vue3 element-plus axios pinia router Django5 websocket 訊飛星火API 本文將實現一個 AI 聊天對話功能,將前端用戶輸入問題以及之前對話發送給后端,通過 api 訪問大模型,返回前端實時對話數據。 調用 訊飛星火API…

廣東廣州一家IPO資產重組疑點重重,信息披露真實性存疑

作者:Eric 來源:IPO魔女 4月18日,廣州瑞立科密汽車電子股份有限公司(簡稱“瑞立科密”)將接受深交所主板IPO上會審核。公司保薦機構為中信證券,擬募集資金為15.2162億元。 瑞立科密過往資產重組疑點重重&a…

銀河麒麟(Kylin) - V10 SP1桌面操作系統ARM64編譯QT-5.15.12版本

銀河麒麟(Kylin) - V10 SP1桌面操作系統ARM64編譯QT-5.15.12版本 原因 測試Kylin-Desktop-V10-SP1-General-Release-2303-arm64系統下,編譯QT-5.15.12版本已做測試。 測試環境 測試板配置 型號:LM-D2000-NONE-1w-V01-pc_A2150 CPU:飛騰D20…

查看前端項目依賴樹型結構關系圖的詳細方法,涵蓋 命令行工具 和 可視化工

以下是查看前端項目依賴樹型結構關系圖的詳細方法&#xff0c;涵蓋 命令行工具 和 可視化工具&#xff1a; 一、命令行工具生成依賴樹 1. npm # 查看項目依賴樹&#xff08;文本形式&#xff09; npm ls# 查看指定包的依賴樹 npm ls <package-name># 生成JSON格式的依…

Ollama高并發測試

本文主要來測試一下ollama的高并發能力。 具體配置如下&#xff1a; 一、Ollama默認參數執行 我們打開4個窗口&#xff0c;然后分別讓DeepSeek “給我講一個笑話” &#xff0c;看下不同窗口的答題順序。 通過答題順序可以看到&#xff0c;在不進行參數設置時&#xff0c;模…

資源管理與HPA:讓Kubernetes應用自動伸縮

引言&#xff1a;從“手動擋”到“自動駕駛” 想象我們駕駛一輛汽車&#xff0c;手動調節油門和換擋不僅費力&#xff0c;還難以應對突發狀況。我們的應用服務也一樣&#xff0c;在面對突然的流量增長&#xff0c;內存使用暴漲該如何應對。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安裝指南

在開發和生產環境中&#xff0c;MongoDB 是一種非常流行的 NoSQL 數據庫&#xff0c;以其靈活性和高性能而受到開發者的青睞。對于 Windows 用戶來說&#xff0c;MongoDB 提供了多種安裝方式&#xff0c;其中 ZIP 版本因其靈活性和輕量級的特點&#xff0c;成為很多開發者的首選…

【Linux網絡與網絡編程】11.數據鏈路層mac幀協議ARP協議

前面在介紹網絡層時我們提出來過一個問題&#xff1a;主機是怎么把數據交給路由器的&#xff1f;那里我們說這是由數據鏈路層來做的。 網絡上的報文在物理結構上是以mac幀的形式流動的&#xff0c;但在邏輯上是以IP流動的&#xff0c;IP的流動是需要mac幀支持的。 數據鏈路層解…

多模態思維鏈AI醫療編程:從計算可持續性到開放域推理的系統性解決方案

多模態思維鏈AI醫療編程:從計算可持續性到開放域推理的系統性解決方案 醫療AI領域的多模態思維鏈技術正在重塑臨床決策支持、醫學影像分析和醫療流程優化的范式。本指南從計算可持續性、錯誤傳播控制、倫理安全防護和通用性擴展四大維度,系統解析醫療大模型落地落地的關鍵要…

代理模式深度解析

目錄 一 靜態代理 1.1 優點 1.2 缺點 1.3 適用場景 二 JDK動態代理 1 JDK動態代理的工作原理 1.1 創建代理類 1.2 加載代理類 1.3 實現方法調用 2. Proxy.newProxyInstance() 的核心工作流程 方法簽名 工作步驟 3. 代理類的生成與加載 3.1 代理類生成的關鍵方法 …

Spring Cache與Redis集成原理

一、核心架構圖解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

編程技能:調試02,設置斷點與刪除斷點

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;調試01&#xff0c;調試介紹 回到目錄 下…

flink寫doris時的優化

1.概念 doris并不擅長高頻、小量數據的導入&#xff1b; 因為doris每一次數據導入都會在be節點上生成數據文件&#xff1b;如果高頻導入小量數據&#xff0c;就會在存儲層產生大量的小文件&#xff08;必然會影響到后續的查詢效率&#xff0c;也會對系統產生更多的compaction…

ElementNotInteractableException原因及解決辦法

在自動化測試中,ElementNotInteractableException是一個常見的異常,它通常發生在嘗試與網頁上的某個元素進行交互(例如點擊、輸入等操作)時,但由于該元素當前不可交互。這可能由多種原因引起,以下是一些常見的原因及其解決方法: 元素未完全加載 如果嘗試與頁面上的元素交…