傳輸層協議UDP/TCP

目錄

UDP協議

UDP協議段格式

UDP緩沖區?

TCP協議

TCP協議段格式

確認應答機制

超時重傳機制

連接管理機制

連接建立(三次握手)

連接關閉(四次揮手)

滑動窗口

流量控制

擁塞控制

延遲應答

捎帶應答


UDP協議

UDP協議段格式

16位UDP長度:UDP數據報的總長度,包括頭部和數據部分。最小值為8字節(僅頭部)

16位UDP校驗和:用于檢測UDP數據報在傳輸過程中是否發生錯誤。如果校驗和計算結果為0,則表示數據正確

如果校驗和出錯,就會直接丟棄

UDP的特點

  • 無連接:知道對端的IP和端口號就直接進行傳輸,不需要建立連接
  • 不可靠:沒有確認機制,也沒有重傳機制,若是出錯無法發到對方UDP協議層也不會給應用層返回任何錯誤信息
  • 面向數據報:不能夠靈活的控制讀寫數據的次數和數量?

UDP緩沖區?

UDP沒有真正意義上的發送緩沖區,調用sendto會直接交給內核,由內核將數據傳給網絡層協議進行后續的傳輸動作

UDP具有接受緩沖區,但是這個緩沖區不能保證UDP報的順序和發送UDP報的順序一致。如果緩沖區滿再到達的UDP數據就會被丟棄?

TCP協議

TCP協議段格式

?

序列號:用于標識TCP數據段的順序。發送方為每個字節分配一個序列號,接收方通過序列號來重組數據。

確認序列號:接收方期望收到的下一個數據段的序列號。只有在ACK標志位為1時,確認號才有效。(若接收方收到1000-1999所有字節,那么會發送確認號為2000,代表期望收到序列號為2000的下一個字節)

首部長度:表示TCP頭部的長度,以32位字為單位。最小值為5(20字節),最大值為15(60字節)。

保留:保留字段,必須為0。

標志位:

  • URG(緊急指針有效):如果為1,表示緊急指針字段有效。

  • ACK(確認號有效):如果為1,表示確認號字段有效。

  • PSH(推送):如果為1,表示接收方應盡快將數據推送給上層應用。

  • RST(重置連接):如果為1,表示連接出現嚴重錯誤,需要重置。

  • SYN(同步序列號):用于建立連接,表示請求建立連接。

  • FIN(結束連接):用于關閉連接,表示請求關閉連接。

窗口大小:接收方的接收窗口大小,用于流量控制。表示接收方能夠接收的最大字節數。(為了防止對方發送超過接收方能夠接受的數據大小)

校驗和:用于檢測TCP頭部和數據部分在傳輸過程中是否發生錯誤。

緊急指針:指向緊急數據的指針,只有在URG標志位為1時才有效。

選項:用于擴展TCP的功能,提供額外的控制信息。選項字段的長度是可變的,通常用于協商連接參數、優化性能或實現其他高級功能。

確認應答機制

TCP的確認應答機制是TCP實現可靠傳輸的核心機制之一,通過確認號和序列號來確保數據的完整性和順序性。

具體步驟:

(1)發送方發送數據

  • 發送方將數據封裝成TCP數據段,并為每個字節分配一個序列號。

  • 發送方將數據段發送到網絡中。

(2)接收方接收數據

  • 接收方收到數據段后,檢查數據段的序列號是否連續。

  • 如果數據段的序列號是連續的,接收方將數據段中的數據存儲到接收緩沖區中。

  • 如果數據段的序列號不連續,接收方會發送一個確認號,告訴發送方它期望收到的下一個數據段的序列號。

?(3)接收方發送確認應答

  • 接收方發送一個確認應答報文,其中包含確認號。

  • 確認號是接收方期望收到的下一個字節的序列號。

(4)發送方接收確認應答

  • 發送方收到確認應答后,根據確認號判斷數據是否被成功接收。

  • 如果確認號表明數據已被成功接收,發送方可以繼續發送后續的數據段。

  • 如果發送方在超時時間內沒有收到確認應答,或者確認號表明某些數據段丟失,發送方會重新發送丟失的數據段。

超時重傳機制

當發送方發送一個數據段后,如果在規定的時間內沒有收到接收方的確認應答,發送方會認為該數據段可能丟失或在網絡中延遲過久,從而重新發送該數據段。

具體步驟:

(1)發送數據段

  • 發送方發送一個數據段,并啟動一個定時器,等待接收方的確認應答。

超時時間的設定:

1. Linux中(Unix和Windows),超時以500ms為一個單位進行控制,每次判定超時重發的超時時間都是500ms的整數倍

2. 如果重發一次后仍然得不到應答,等待2*500ms后再進行重傳,如果仍然得不到應答,則 等待4*500ms,以指數形式遞增

3. 累計到一定的重傳次數,TCP認為網絡或者對端主機出現異常,強制關閉連接

(2)等待確認應答

  • 發送方等待接收方的確認應答。

  • 如果在超時時間內沒有收到確認應答,發送方認為數據段可能丟失或延遲過久,進入下一步。

(3)重傳數據段

  • 發送方重新發送丟失的數據段,并重新啟動定時器。

  • 每次重傳時,超時時間會根據一定的策略增加,以避免頻繁重傳對網絡造成過大壓力。?

連接管理機制

在正常情況下,TCP要經過三次握手建立連接,四次揮手斷開連接

連接建立(三次握手)

1. 第一次握手:SYN(同步序列號)

客戶端:客戶端向服務器發送一個帶有SYN標志的數據段,表示請求建立。數據段中的序列號字段設置為一個隨機值,稱為初始序列號,連接確認號字段為0。

2. 第二次握手:SYN-ACK(同步序列號 + 確認號)

服務器:服務器收到客戶端的SYN請求后,會發送一個帶有SYN和ACK標志的數據段作為響應,服務器在響應中設置自己的初始序列號,并確認客戶端的序列號,確認號字段設置為客戶端的初始序列號加1。

3. 第三次握手:ACK(確認號)

客戶端:客戶端收到服務器的SYN-ACK響應后,發送一個帶有ACK標志的數據段,確認服務器的序列號,確認號字段設置為服務器的初始序列號加1。

此時,連接建立完成,雙方可以開始數據傳輸

連接關閉(四次揮手)

1. 第一次揮手:FIN(結束連接)

客戶端:客戶端完成數據發送后,發送一個帶有FIN標志的數據段,表示請求關閉連接。客戶端進入FIN_WAIT_1狀態,等待服務器的確認。

2. 第二次揮手:ACK(確認號)

服務器:服務器收到客戶端的FIN請求后,發送一個帶有ACK標志的數據段作為響應,確認號字段設置為客戶端的序列號加1。服務器進入CLOSE_WAIT狀態,等待應用程序關閉連接,客戶端則進入FIN_WAIT_2狀態。

3. 第三次揮手:FIN(結束連接)?

服務器:服務器完成數據發送后,發送一個帶有FIN標志的數據段,表示請求關閉連接。隨后進入LAST_ACK狀態,等待客戶端的確認。

4. 第四次揮手:ACK(確認號)

客戶端:客戶端收到服務器的FIN請求后,發送一個帶有ACK標志的數據段作為響應,確認號字段設置為服務器的序列號加1。客戶端進入TIME_WAIT狀態,等待2倍的報文段最大生存時間(2MSL),以確保最后一個ACK被服務器接收

MSL在RFC1122中規定為兩分鐘,但是各操作系統的實現不同,在Centos7上默認配置的值是60s

之后,客戶端關閉連接

滑動窗口

滑動窗口是一種用于控制數據傳輸量的機制。它通過一個“窗口”來表示接收方能夠接收但尚未確認的數據量。

發送窗口:

發送方維護一個窗口,表示它可以發送但尚未收到確認的數據量,發送窗口的大小決定了發送方可以連續發送多少數據而無需等待確認。

接收窗口:

接收方維護一個窗口,表示它可以接收但尚未處理的數據量,接收窗口的大小由接收方根據其緩沖區的可用空間動態調整,并通過確認應答報文中的窗口字段通知發送方。

工作原理:

1. 接收方:接收方在收到數據后,會發送一個確認應答,其中包含確認號和窗口大小,窗口大小表示接收方當前能夠接收的數據量。

2. 發送方:發送方根據接收方的ACK中的窗口大小調整自己的發送窗口,如果接收方的窗口大小增加,發送方可以發送更多的數據,如果窗口大小減少,發送方需要減少未確認數據的量。

3. 動態調整:滑動窗口是動態的,隨著數據的發送和確認,窗口會向前滑動,每當發送方收到一個ACK,它會根據ACK中的窗口大小調整自己的發送窗口,并繼續發送數據。

?

流量控制

流量控制用于確保發送方不會發送超過接收方處理能力的數據量。主要目的是防止接收方緩沖區溢出,從而避免數據丟失。

工作原理:

1. 接收方:接收方將自己可以接收的緩沖區大小放入TCP首部的“窗口大小”字段,通過ACK端通知發送端,窗口大小字段越大, 說明網絡的吞吐量越高。一旦發現自己的緩沖區快滿了,?就會將窗口大小設置成一個更小的值通知給發送端。

2. 發送方:發送方接受到這個窗口之后, 就會減慢自己的發送速度

如果接收端緩沖區滿了, 就會將窗口置為0,這時發送方不再發送數據,但是需要定期發送一個窗口探測數據段, 使接收端把窗口大小告訴發送端

擁塞控制

擁塞控制是用于避免網絡擁塞并提高數據傳輸效率的關鍵機制。通過動態調整發送方的發送速率,確保網絡不會因為過多的數據流量而過載。

工作原理:

擁塞控制的核心是通過擁塞窗口來控制發送方可以發送的數據量。擁塞窗口的大小會根據網絡的擁塞情況動態調整。

(1)慢啟動(快速增加發送速率,直到檢測到網絡擁塞)

  • 在連接建立初期,擁塞窗口以指數速度增長。

  • 當擁塞窗口達到一個閾值(ssthresh)時,進入擁塞避免階段

(2)擁塞避免(緩慢增加發送速率,避免網絡擁塞)

  • 擁塞窗口以線性速度增長。

  • 每經過一個往返時間(RTT),擁塞窗口增加1個MSS。

(3)快速重傳(快速檢測丟包并重傳丟失的數據段)

  • 如果發送方收到三個重復的ACK(即三個相同的確認號),它會認為某個數據段可能丟失。

  • 發送方立即重傳丟失的數據段。

(4)快速恢復(在重傳后調整擁塞窗口,恢復發送速率)

  • 當發送方觸發快速重傳后,進入快速恢復階段。

  • 設置閾值(ssthresh)為當前擁塞窗口的一半。

  • 將擁塞窗口設置為閾值大小,并進入擁塞避免階段。

延遲應答

延遲應答是一種優化機制,用于減少確認應答報文的數量,從而提高網絡效率。

延遲應答允許接收方在一定時間內延遲發送ACK,而不是立即對每個接收到的數據段發送確認。這種機制在某些情況下可以顯著減少網絡流量,尤其是在接收方頻繁接收數據時。

具體實現:

(1)等待時間

  • 接收方在收到數據段后,會等待一個固定的時間(通常為200毫秒)再發送ACK。

  • 如果在這段時間內接收到更多的數據段,接收方可以將多個ACK合并為一個。

(2)數據量閾值

  • 如果接收方在等待時間內接收到足夠多的數據,它會立即發送ACK,而不是等待固定時間。(這種機制確保了即使在高流量情況下,ACK也不會延遲過久)?

(3)最大延遲時間

  • 為了防止ACK延遲過久,TCP協議規定了最大延遲時間(通常為500毫秒)。

  • 如果接收方在最大延遲時間內沒有發送ACK,它必須發送一個ACK,即使沒有收到更多的數據段。

捎帶應答

捎帶應答是一種優化機制,用于減少網絡中的報文數量,提高通信效率。

捎帶應答的核心思想是將確認應答與數據段一起發送,而不是單獨發送一個ACK報文。這樣可以減少網絡流量,同時提高協議的效率。?

工作原理:

1. 接收方:接收方收到發送方發送的數據段,檢查數據段的序列號,確認數據的完整性和順序。并準備好發送自己的數據段,在發送數據段時在TCP頭部中包含一個ACK字段,確認之前接收到的數據。

2. 發送方:發送方收到接收方發送的數據段,檢查TCP頭部中的ACK字段,確認接收方已經收到的數據,根據ACK字段更新自己的發送窗口,繼續發送后續數據。


完?

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

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

相關文章

華為OD-2024年E卷-找終點[100分] -- python

問題描述&#xff1a; 給定一個正整數數組&#xff0c;設為nums&#xff0c;最大為100個成員&#xff0c;求從第一個成員開始&#xff0c;正好走到數組最后一個成員&#xff0c;所使用的最少步驟數。要求: 第一步必須從第一元素開始&#xff0c;且1<第一步的步長<len/2…

ARINC653分區調度算法的研究與改進

# ARINC653分區調度算法的研究與優化&#xff1a;從單核到多核的實時性保障 ## 1 研究背景與意義 航空電子系統經歷了從**聯合式架構**到**綜合模塊化航空電子**&#xff08;Integrated Modular Avionics, IMA&#xff09;架構的重大演變。在這一演變過程中&#xff0c;ARINC…

Vue-8-前端框架Vue之應用基礎響應式數據和計算屬性

文章目錄 1 響應式數據1.1 ref創建基本類型的響應式數據1.2 reactive創建對象類型的響應式數據1.2.1 汽車示例(對象{})1.2.2 游戲示例(數組[])1.2.3 深層示例1.3 ref創建對象類型的響應式數據1.4 ref對比reactive1.4.1 區別和使用原則1.4.2 reactive重新分配新對象1.4.3 ref重新…

Kotlin - 邊界控制 coerceIn、coerceAtLeast、coerceAtMost

一、概念 當需要對數值進行范圍限制時&#xff0c;通常會用 if() else if() else&#xff0c;這樣會寫很多判斷&#xff0c;使用 coerceXXX() 函數來簡化&#xff0c;適用于實現了 Comparable 接口的對象。 coerceIn() public fun <T : Comparable<T>> T.coerceIn(…

Day02_數據結構(手寫)

01.畫圖 02.按位置查找返回元素的值 //11.按位置查找后返回元素的值 int find_pos(node_p H,int pos) { if(HNULL){return -1;} if(pos<0){ …

1.2 人工智能的分類

人工智能的類型 ANI 無需明確設計即可構建或訓練&#xff0c;以執行特定任務或解決特定問題的智能系統。也被稱為弱人工智能&#xff0c;因為它不具備全面的通用智能能力。 典型應用&#xff1a; 語音助手&#xff0c;圖像識別系統、自動駕駛、機器人等。 大語言模型ChatGPT …

熱點Key拆分方案實現

熱點Key拆分方案實現 一、核心拆分策略 熱點Key拆分的核心思想是將單個高頻訪問Key分解為多個子Key&#xff0c;分散存儲到不同Redis節點&#xff0c;降低單節點壓力。以下是具體實現方案&#xff1a; 二、實現方式 1. 業務層哈希分片實現 創建Key分片工具類&#xff0c;通…

程序人生,人生如戲

程序員的出路在哪里 很多計算機科班出身&#xff08;也有轉行的&#xff09;同學&#xff0c;第一份工作都是研發&#xff0c;測試&#xff0c;項目管理之類的工作&#xff0c;這里面最多的應該就是從事研發相關的崗位。那我們就以研發崗來舉例&#xff0c;聊聊我職業生涯從業…

傳感器:基于STM32F103/407系AHT20溫濕度傳感器數據采集

一、IIC總線 1、IIC總線概念 I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;總線是由PHILIPS公司開發的兩線式串行總線&#xff0c;用于連接微控制器及其外圍設備。是微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式&#xff0c;具有…

很好,搞搞期末

我要開始啦&#xff01;bulabulabulabulabula. 例題 物理地址DS*16有效地址 1.直接尋址 2.直接尋址&#xff08;允許符號代替數值&#xff0c;變量存的地址&#xff09; 3.基址尋址&#xff08;16位&#xff1a;用寄存器SI、DI、BX、BP存的有效地址&#xff09; 下面是寄存器…

機器人如何實現智能化的自主定位與導航?

機器人實現智能化自主定位與導航&#xff0c;需融合多傳感器數據、高效算法及硬件支撐&#xff0c;以下從技術框架、核心技術、典型應用場景等方面詳細解析&#xff1a; 一、技術框架&#xff1a;定位與導航的核心環節 機器人自主定位導航通常包含三個關鍵步驟&#xff0c;形…

AI醫療行業全景圖

AI醫療是以互聯網為依托&#xff0c;通過基礎設施的搭建及數據的收集&#xff0c;將人工智能技術及大數據服務應用于醫療行業中&#xff0c;提升醫療行業的診斷效率及服務質量&#xff0c;更好的解決醫療資源短缺、人口老齡化的問題AI在醫療領域應用廣泛&#xff0c;覆蓋醫療服…

Meta-KDD2025-RPG-token級別并行生成式提高效率!

文章目錄 1. 背景2. 方法2.1 長語義id2.1.1 獲取 item embedding2.1.2 item embedding 離散化 2.2 并行生成語義 id2.2.1 訓練&#xff08;item串行&#xff0c;token并行&#xff09;2.2.2 高效 logit 打分暴力枚舉式打分&#xff1a;高效實現&#xff1a;復雜度分析&#xff…

快速搭建MySQL8.0本地數據庫,連接idea

1.打開終端&#xff0c;按順序輸入命令&#xff0c;在root用戶下&#xff0c;創建用戶和數據庫 1.進入數據庫 mysql -u root -p 2.創建專用數據庫 create database 數據庫名 character set utf8mb4 3.使用數據庫 use 數據庫名 4.設置此數據庫用戶 create user "用戶名&q…

Docker 常用運維命令

Docker 提供了一系列命令來幫助開發者和運維人員管理容器、鏡像以及其他 Docker 對象。以下是一些常用的 Docker 運維命令&#xff0c;這些命令可以幫助你更高效地進行日常操作&#xff1a; 容器相關命令 啟動容器&#xff1a; docker start <container_id_or_name>停止…

linux下MQTT訂閱發布驗證-mosquitto安裝測試流程

本文詳細介紹了&#xff0c;如何在linux環境搭建一個MQTT server, 并同時安裝 了客戶端 &#xff0c;進行了mqtt消息發布、訂閱驗證。 mosquitto 服務端安裝(ubuntu) #添加源 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppasudo apt update # install mosquitto su…

Source Insight 的簡單介紹

對 Source Insight 進行一次全面深入的介紹。這款軟件在特定開發者群體中&#xff08;尤其是嵌入式、驅動、系統級編程領域&#xff09;享有極高的聲譽&#xff0c;被譽為“源碼閱讀和分析的神器”。 一、 起源與歷史 誕生背景 (1990年代中后期)&#xff1a; 在1990年代中后期…

Linux 系統中,查詢 JDK 的安裝目錄

在 Linux 系統中&#xff0c;查詢 JDK 的安裝目錄可以通過以下幾種常用方法&#xff1a; 方法 1&#xff1a;通過 update-alternatives 查詢&#xff08;推薦&#xff09; 適用于通過包管理器&#xff08;如 apt/yum&#xff09;安裝的 JDK&#xff1a; sudo update-alternat…

簡單工廠、工廠、抽象工廠模式

簡單工廠、工廠、抽象工廠模式 1. **簡單工廠模式&#xff08;Simple Factory&#xff09;**2. **工廠方法模式&#xff08;Factory Method&#xff09;**3. **抽象工廠模式&#xff08;Abstract Factory&#xff09;**對比總結 以下是三種工廠模式在C#中的實現與對比分析&…

如何在Redis中實現緩存功能

Redis 是一種高性能的鍵值存儲系統&#xff0c;廣泛用于實現緩存功能。它通過將數據存儲在內存中&#xff0c;能夠快速讀寫數據&#xff0c;從而顯著提高應用程序的性能。在Redis中實現緩存功能需要結合數據讀寫策略、失效機制及性能優化方案。 一、Redis作為緩存的核心優勢 …