傳輸層:UDP/TCP協議

網絡協議圖

一.UDP?

特點:

無連接,不可靠,面向數據報,全雙工(前面網絡編程中介紹過)

?格式:

?

?服務器的端口號一般都是程序員指定的(這樣你才能訪問到),客戶端的端口號是系統自動分配的(如果提前指定好, 可能會與其他程序沖突)

UDP的長度問題

也許你也會有一個問題:在當今的世界, UDP的報文最大長度為64kb,是否夠用?

顯然是不夠用的,這也是UDP的最大痛點,也是被邊緣化的主要原因

為什么設計UDP的大佬不做出改變,將UDP報頭的表示長度的屬性不設計更大一點4字節?6字節?

不是技術問題,是zz問題↓

要傳輸一個超過64kb的數據該怎么辦?

有兩個方案

?校驗和

?

?上述的比特翻轉本來就是小概率事件, 敲好兩個反轉能抵消的概率小之又小, 工程上可以忽略

UDP發現數據校驗不對時,只能丟棄不會重發, 也是不可靠傳輸的體現,想要重發要么使用TCP,要么在應用層代碼中自己實現

二.TCP

特點:

有連接, 可靠傳輸,面向字節流,全雙工

格式

?像上面的32位序號和確認序號16位窗口大小和緊急指針,還有那六個標志位后面會介紹到

三.TCP的十大核心機制

核心機制一:確認應答(可靠性機制)

TCP的可靠傳輸是內核實現的,寫代碼的時候是感知不到的
可靠傳輸的實現機制是 確認應答(我給對方發消息,對方收到之后給我一個應答說確認收到了),確認應答是保證可靠傳輸的最核心的機制

再說一下確認應答的后發先至
比如我給女神發消息
本來是

結果是可能是

當連續發多條數據的時候,可能就會出現后發先至的情況(一個數據報是先發的,反而后到了)
怎么產生的呢?

?如何解決?

針對數據編號,就要用到報頭中的32位序號了

?

?

應答報文可能攜帶載荷也可能不攜帶

引入序號之后接收方就可以根據序號順序排序來依次讀取數據了

核心機制二:超時重傳(可靠性機制)

在傳輸數據的過程中,還可能發生“丟包”,也就是發送一個數據在傳輸的過程中丟了,沒有到達對方


在兩個主機之間,網絡的結構是非常復雜的,中間要經過很多路由器和交換機,這些路由器和交換機同時也連接著其他的路由器和交換機,這些結果錯綜復雜,傳輸的數據量也是不確定,有時候傳輸的數據可能會多點,有時候可能會少點
如果設備太繁忙,這些數據包就需要等待,如果等太久了,就可能被丟棄了,網絡負載越高,線路就越繁忙,就越容易丟包

某段路線出現強烈信號干擾也會丟包

真的出現丟包怎么辦呢??

重傳!設置一個時間,在規定的時間里面沒有收到回應,就重新傳輸這個數據,這個就叫做超時重傳

?兩種丟包的情況

以下兩種情況接收無法分辨, 都會觸發重傳

第一種情況(要傳輸的數據包丟了)

?這種情況發送的數據丟了再重新傳一次就好了 主要還是第二種情況

第二種情況(返回的ACK應答數據包丟了)

接收緩沖區在操作系統內核中會分配一個專門緩沖區存儲數據等待TCP協議棧處理,類似于生產者消費者模型

確認應答是tcp保證可靠性的最核心機制;超時重傳是TCP可靠性機制的有效補充,這兩個機制保證了tcp的可靠性傳輸,并不是三次握手

核心機制三:連接管理 [網絡這個模塊最常考的部分]

1.建立連接(三次握手)

tcp是有連接的 客戶端與服務器是通過三次握手來建立連接的

?這個時候就有疑問了:明明三次握手上面確實是四次握手?

這里的中間兩次握手可以合并為一次↓

?

為什么能合并?

其實syn和ack打包是在操作系統內核中完成的 時間上可以說是同步的,tcp也允許在報頭中設置多個標志位(ACK和SYN都為1) 同時合并也能減少開銷提升效率

三次握手傳輸的是什么?

傳輸的數據的序號從幾開始,往往兩次連接的初始序號差別很大(這里就為了防止前朝的劍斬本朝的官問題后面會介紹到) 還會告訴對端的IP和端口號并且互相保存(有連接的體現)這是網絡層IP協議要做的(每次網絡傳輸都會涉及最開頭那張圖的封裝分用)

三次握手TCP層的狀態

上述只是簡單描述了一下三次握手,實際的三次握手比這個更加復雜,如下圖框出的地方(再下面是傳輸數據和四次揮手的過程)

?各狀態的介紹

上述狀態常見的就是listen和establish

?為啥tcp要三次握手,有啥用,解決了啥問題?

1.投石問路,先初步探一探網絡通信鏈路是否通暢(網絡通常是可靠傳輸的前提條件)

2.驗證通信雙方的發送能力和接收能力是否正常

討論:兩次握手是否可行?

不行,兩次握手少了一步給服務器發ack,這會讓服務器不知道服務端的接收能力是否正常和服務器的發送功能是否正常

四次握手是否可行?

可以,但是沒必要,浪費資源,效率較低

3.可以協商一些關鍵信息

也如前面所說防止出現前朝劍斬本朝官?

2.斷開連接(四次揮手)?

過程

問題:四次揮手的中間兩次能否合并變成三次揮手?

有時候能有時候不能

不能:ack和fin的交互時機不一樣ack是在操作系統內核中就完成了,fin需要應用層應應用程序調用close方法,時機不同所以就不能合并,而三次握手之所以能是因為ack和syn都是在內核中完成的交互時機可以說瞬發,就可以合并

能:tcp有延遲應答機制,可以延遲發送ack,這樣就可以和fin同步了

雖然有時候能有時候不能,但是大多數情況下還是不能

四次揮手TCP層的狀態

如圖圈出來的

?重點就關注close_wait和time_wait狀態

close_wait狀態介紹?

?time_wait狀態介紹

time_wait要等多久才合適呢?

2*MSL(網絡上任何兩個節點傳輸所要消耗的最大時間)?通常會配置成60s ,2*MSL也就是兩分鐘

MSL每個系統配置的都不一樣,也能修改

異常情況


再談TCP式如何實現可靠傳輸的?


確認應答
超時重傳
連接管理(三次握手,四次揮手)(握手揮手的過程也是依靠確認應答和超時重傳實現可靠傳輸的)
這些機制都起到了作用,在三次握手中,一旦路探完了,后續就沒它事了,網絡環境事多變的,可能這會暢通,過會就堵塞了,而確認應答,是保證每次傳輸的這些數據都是可靠的,因此真正起到決定性作用的還是確認應答!

核心機制四:滑動窗口(提高提高傳輸效率)

更準確地說,是讓TCP在可靠傳輸的前提下,效率別太拉跨,因為可靠傳輸效率已經降低了(可靠和效率不可兼得)
使用滑動窗口,不能讓TCP變得比UDP快,但是可以縮小差距

下一組是怎么發的?

1.等待所有ack都收到再發下一組

2.收到一個發一個

很明顯是第二種,第一種并不能節省多少時間,甚至會等待更長時間?

如果2001比1001的ack先收到會怎么樣?

如果這樣的情況窗口直接往后走兩個就行了, ack確認序號的含義是該序號之前的數據都已經收到了,比如數據1-50收到了 71-100收到了51-70沒收到,返回的ack確認序號也是51不會是101,等到后續收到51-70才會發送確認序號為101的應答報文

丟包問題

?情況一:數據包已經抵達,ack卻丟了

這種情況不要緊,因為可以通過后續的ACK進?確認;?也就是上面所說的確認序號的作用

情況二:數據包直接就丟了

重傳采用的是快速重傳機制(滑動窗口下的,超時重傳的變種操作)

快速重傳就是只要誰丟了就重傳誰,其他的數據(都已經在接收緩沖區里呆著)不用重傳,整個過程速度很快

接收方的緩沖區情況↓

超時重傳和快速重傳并不沖突而是相輔相成

核心機制五:流量控制(作為滑動窗口補充)

滑動窗口的窗口越大,傳輸效率越高
但是窗口也不能無限大,如果窗口太大了,就可能使接收方處理不過來了(和你代碼有關系),或者是使傳輸的中間鏈路處理不過來,這樣就會出現丟包,就得重傳了,這時候窗口大并沒有提高效率,反而降低效率了
流量控制就是給滑動窗口睬踩剎車,避免窗口太大,導致接收方處理不過來?

?*滑動窗口的窗口大小是實時變化的

?具體流程

?光考慮接收方,還是不夠的,還需要考慮中間鏈路的處理能力(也就是擁塞控制)

核心機制六:擁塞控制

總的傳輸速率是一個木桶效應,取決于最短板

具體怎樣衡量中間設備的轉發能力呢?
此處并不會對中間設備的轉發能力進行量化,因為中間設備那么多也不好逐個進行量化,更何況網絡環境還是動態變化的,而是把中間的設備都看成一個整體,采取“做實驗”的方式,動態調整,產出一個合適的窗口大小

這樣做也可以非常好的適應網絡環境的動態變化?

方案↓

?

實際發送方的窗口 取決于擁塞窗口,流量控制窗口的最小值
擁塞控制喝流量控制共同限制了滑動窗口機制,可以讓滑動窗口能夠在保證可靠性的前提下,提高傳輸效率了
也就是說擁塞控制和流量控制也是保證可靠性的機制?

核心機制七:延遲應答(提高傳輸效率的機制).

(延遲應答也是圍繞滑動窗口來展開的)
是否有辦法在條件允許的基礎上,盡可能地提高窗口大小呢?
需要在返回ack的時候,拖延一點時間,利用拖延的這個時間,就可以給應用程序騰出來更多的消費數據的時間,這樣接受緩沖區的剩余空間就更大了!

?

此處通過延時應答到底能提高多少速率,還是取決于接收方應用程序實際的處理能力(也不是百分百提升效率還是看應用程序消費的快不快,也有可能延時的時候又收到了其他數據)

?核心機制八:捎帶應答

在延遲應答的基礎上,引入的第一個進一步提高效率的方式
延遲應答使讓ack傳輸的時機更慢
捎帶應答使基于延遲應答,讓數據進行合并

核心機制九:面向字節流(粘包問題)?

這里主要討論粘包問題至于這個粘讀zhan和nian的都有

有以下情況?

解決辦法

?已經有成熟的方案例如json和protobuf已經解決粘包問題,但是自定義應用層協議的時候就要考慮到這個問題

核心機制十:TCP異常情況的處理(經典面試題)

?網絡本身就會存在一些變數,導致tcp連接不能繼續正常工作了
比如
1.進程崩潰


進程崩潰=>進程沒了=>PCB沒了=>文件描述符表也就被釋放了=>相當于調用socket.close()(socket在系統內核中也是一個文件,也會被放到文件描述符表中)=>崩潰的這一方就會發出FIN,進一步的觸發四次揮手,此時連接就正常釋放了,此時tcp的處理和進程的正常退出沒啥區別

?2.主動關機

?3.主機掉電了

心跳包

?4.網線斷開了

?

以上就是TCP的十個主要特性,并不是只有這十個特性,還有很多特性在標準文檔中??

?補充:tcp報頭其他屬性

TCP和UDP對比

如何實現UDP的可靠傳輸,就往TCP上面靠

?

?

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

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

相關文章

A/B測試全解析:原理、流程與實戰案例

A/B測試(AB Testing)原理與實踐全解析 在數據驅動的時代,A/B測試幾乎是每一個互聯網公司都會使用的實驗方法。無論是電商平臺優化轉化率,還是內容平臺提升點擊率,抑或是游戲公司提升留存,A/B測試都是最常見…

循環神經網絡(三):小練習

RNN小練習 要求: 假設有 4 個字 吃 了 沒 ?,請使用 torch.nn.RNN 完成以下任務 將每個進行 one-hot 編碼請使用 吃 了 沒 作為輸入序列,了 沒 ? 作為輸出序列RNN 的 hidden_size 64請將 RNN 的輸出使用全連接轉換成 4…

ESPIDF官方文檔,啟用dhcp會禁用對應的STA或AP的靜態IP,我測試STA確實是,但是AP不是,為什么

1. STA 模式下的 DHCP(客戶端角色)ESP32 當 Station(STA) 時,它的行為就跟你的手機/筆記本連 Wi-Fi 一樣:DHCP 客戶端 → 去路由器(DHCP 服務器)要一個 IP。特點啟用 DHCP&#xff0…

cocos2d. 3.17.2 c++如何實現下載斷點續傳zip壓縮包帶進度條

新建類CurlDown #include “curl/curl.h” #include using namespace std; USING_NS_CC; /** 資源下載curl */ class CurlDown { public: CurlDown(); ~CurlDown(); void StartDownResZip(string downLoadUrl, int64_t totalSize); //下載控制 void downloadControler(); //下…

MySQL 整型數據類型:選對數字類型,讓存儲效率翻倍

MySQL 整型數據類型:選對數字類型,讓存儲效率翻倍 在 MySQL 中,整型(整數類型)是最常用的數據類型之一,從用戶 ID 到商品數量,幾乎所有涉及數字的場景都離不開它。但你知道嗎?選對整…

公司電腦監控軟件有哪些?公司電腦監控軟件應該怎么選擇

大家好呀,電競直播運營團隊常常面臨 “直播腳本被抄襲、用戶付費數據篡改、主播話術外泄” 的問題!尤其是獨家直播流程腳本、用戶充值記錄、主播互動話術庫、賽事解說手稿,一旦泄露可能導致競品跟風、用戶信任下降、直播競爭力減弱&#xff5…

ARM裸機開發:鏈接腳本、進階Makefile(bsp)、編譯過程、beep實驗

一、鏈接腳本的作用?各個段存放什么數據類型(一)鏈接腳本內容SECTIONS {. 0x87800000;.text : {obj/start.o*(.text)}.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4) : {*(.data)}__bss_start .;.bss ALIGN(4) : {*(.bss) *(COMMON)}__bs…

Linux驅動開發(1)概念、環境與代碼框架

一、驅動概念驅動與底層硬件直接打交道,充當了硬件與應用軟件中間的橋梁。1、具體任務(1)讀寫設備寄存器(實現控制的方式)(2)完成設備的輪詢、中斷處理、DMA通信(CPU與外設通信的方式…

計算機視覺(十):ROI

什么是感興趣區域(ROI)? 在計算機視覺中,**感興趣區域(ROI)**指的是圖像中包含我們想要分析、處理或識別的目標或特征的特定子集。就像我們在閱讀一本書時會聚焦于某個重要的段落,計算機視覺系統…

Jenkins 構建 Node 項目報錯解析與解決——pnpm lockfile 問題實戰

在使用 Jenkins 自動化構建 Node.js 項目時,經常會遇到類似報錯: ERR_PNPM_OUTDATED_LOCKFILE? Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json Error: Cannot find module node_module…

Kafka在多環境中安全管理敏感

1. 配置提供者是什么? 配置提供者(ConfigProvider)是一類按需“拉取配置”的組件:應用讀取配置時,按約定的占位符語法去外部來源(目錄、環境變量、單一 properties 文件、你自定義的來源……)取…

編程工具的演進邏輯:從Python IDLE到Arduino IDE的深度剖析

引言:工具進化的本質 在編程學習與開發的道路上,我們總會與各種各樣的工具相遇。一個有趣的現象是,無論是初學者的第一款工具Python IDLE,還是硬件愛好者常用的Thonny和Arduino IDE,它們都自稱“集成開發環境”(IDE)。這背后隱藏著怎樣的邏輯? 本文將帶你深入分析這三…

p10k configure執行報錯: ~/powerlevel10k/config/p10k-lean.zsh is not readable

[ERROR] p10k configure: ~/powerlevel10k/config/p10k-lean.zsh is not readable 背景 我移動了Powerlevel10k文件夾的位置,導致p10k configure命令找不到powerlevel10k文件夾的位置。 原來Powerlevel10k的位置:~/powerlevel10k 移動后Powerlevel10k的位…

Java 學習筆記(進階篇3)

1. 美化界面關鍵邏輯 1:// 相對路徑:直接從項目的 src 目錄開始寫,不包含 D:\ 和個人名字 ImageIcon bg new ImageIcon("src/image/background.png"); JLabel background new JLabel(bg);這兩行代碼是 Swing 中加載并顯示圖片的經…

BFD 概述

BFD簡介1.BFD:Bidirectional Forwarding Detection,雙向轉發檢查概述:毫秒級鏈路故障檢查,通常結合三層協議(如靜態路由、vrrp、 ospf、 BGP等)實現鏈路故障快速切換。作用:① 檢測二層非直連故障② 加快三層協議收斂底…

【嵌入式DIY實例-ESP32篇】-Flappy Bird游戲

Flappy Bird游戲 文章目錄 Flappy Bird游戲 1、游戲介紹 2、硬件準備與接線 3、代碼實現 《Flappy Bird》游戲以其引人入勝的玩法和簡約的設計風靡全球。本文將探討如何使用 OLED SSD1306 顯示屏和 ESP32 微控制器重現這款經典游戲。這個 DIY 項目不僅充滿樂趣,也是學習編程和…

[數據結構——lesson2.順序表]

目錄 學習目標 引言 1.什么是線性表? 2.什么是順序表? 2.1概念及結構 2.2 接口實現 2.2.1順序表的功能 1.順序表的初始化 2.打印數據 3.尾插數據 (1)檢查空間 (2)插入數據 4.尾刪數據 5.頭插數據 6.頭刪數據 7.數據查找 8.指定位置數據…

ChatGPT大模型訓練指南:如何借助動態代理IP提高訓練效率

隨著人工智能技術的飛速發展,ChatGPT等大型語言模型(LLM)已成為科技界和產業界關注的焦點。模型的訓練過程耗時、耗資源且對網絡環境要求極高。尤其是在需要模擬真實用戶行為、進行大規模數據爬取或分布式訓練的場景下,單一IP地址…

Docker 學習筆記(六):多容器管理與集群部署實踐

Docker Docker-compose 單個 Dockerfile 可定義單容器應用,但日常工作中,Web 項目等常需 Web 服務、數據庫、負載均衡等多容器配合,手動按序啟停容器會導致維護量大、效率低。 Docker Compose 是高效的多容器管理工具,通過單個 do…

C++類和對象初識

面向過程 1.1 面向過程特點 1.2 通俗解釋:煮方便面 1.3 面向過程實現代碼 1.4 特點總結面向對象 2.1 面向對象特點 2.2 通俗解釋:對象協作思維 2.3 面向對象實現代碼 2.4 特點總結面向對象和面向過程總結C 面向對象介紹 4.1 面向對象三大基本特征封裝&am…