網絡原理-四

一、續

當窗口大小為0,意味著緩沖區滿了,此時發送方,就因該暫停發送,發送方會周期性的除法 " 窗口探測包 " ,并不攜帶載荷,這樣的包對于業務不產生影響,只是為了觸發ACK,一旦查詢出來的結果是非0,緩沖區右有空間了,發送方就可以繼續發送.

二、擁塞控制

要限制發送方發送數據的速率

如果當前接收方處理數據的速度非常快,但是中間路徑出現了問題,發送速度再快也沒有用.

木桶效用 : 能裝多殺水,取決于最短的板

針對這種情況,核心思路,把中間的路徑經過的所有設備看作一個整體,通過實驗的方式找到最快的方式.

如果按照某個窗口大小發送數據之后,出現丟包,就視為中間路徑存在擁堵,就減小窗口大小,

沒出現丟包,視為中間路徑不存才擁堵,就增大窗口大小.

這種方案,一方面簡化了問題,另一方面也能很好地適應,當前網絡環境的復雜性.

中間這些節點,什么時候出現擁堵,什么時候不擁堵,都是隨機的

此時按照以上策略,就可以讓發送速率,.動態變化.

總的原則是,流量控制和擁塞控制,誰產生的窗口大小更小,誰說的算.

擁塞控制具體是怎么把窗口大小給試出來的?

1. 慢啟動.剛開始傳輸的數據,速率是比較小的,采用的窗口 (擁塞窗口) 大小也就比較小.此時,網絡的擁堵情況未知,如果上來就很大,可能會出問題.

2. 此時上述傳輸的數據,沒有出現丟包,說明網絡還是通暢的,就要增大窗口大小,此時,增大的方式是按照指數來增長的.

由于慢啟動,.開始的時候,窗口大小非常小,也有可能網絡上就是很暢通,通過指數可以讓上述窗口快速增長,這樣就可以保證效率了.

3. 指數增長,不會一直保持的,可能會增長太快,一下子導致網絡擁堵.

這里引入了一個 "閾值",當擁塞窗口達到閾值后,此時指數增長就變成線性的了.

(線性增長能使當下窗口保持在一個很快的效率,并且不容易丟包.

4. 線性增長也是一直在增長,積累一段時間之后,傳輸速度可能太快,此時還是會引起丟包,一旦出現丟包,就把擁塞窗口重置成最小的值,回到最初的慢啟動的過程(再次指數增長),并且這里也會根據剛才丟包的窗口大小,重新設置指數增長到線性增長的閾值.

三、延時應答

也是基于滑動窗口,是要盡可能在提高一點效率.

結合滑動窗口及流量控制,能夠通過延時應答ACK的方式,把反饋窗口的大小變得更大一點.

核心就在于在允許范圍內,使,窗口盡可能的變大.

接收方收到數據之后,不會立即返回ACK,而是稍等一下,等一下再返回ACK.

等了一會兒,相當于給接收方的應用程序這里,騰出來更多的時間,來消費這里的數據.

也就是等一會兒,讓接受讓先處理一下數據,就會讓緩沖區空余空間變大,然后再發送更多的數據.

延時應答是按照ACK丟了的方式來處理,因為滑動窗口中ACK丟了也不會產生什么影響.

正常每個數據都有ACK,此時就可以隔幾個數據返回一次ACK,

四、捎帶應答

基于延時應答,引入的機制,能夠提升傳輸效率.

修改窗口大小,確實是提高效率的有效途徑.

捎帶應答,就是走另一條路,盡可能的把能合并的數據包進行合并,從而起到提高效率的效果.

正常情況下,服務器返回的ACK和response之間,有一定的時間間隔,此時就得分兩個包發送了.

由于有了延時應答, 服務器收到請求后,要執行業務邏輯,根據請求計算響應.

ACK延時這段時間里,響應數據剛好準備好了,此時就可以把AKC和響應數據合并成一個TCP數據報

本身ACK也不帶載荷,只是把報頭中的ACK標志位設為1,并且設置確認序號以及窗口.

這幾個屬性不會沖突.

五、面向字節流

"粘包問題"

此處的包是 " TCP載荷中的應用數據包"

TCP傳輸的數據到了接收方后,接收方要根據socket api 來?read 出來,read出來的結果就是應用層數據包.

由于整個read過程非常靈活,可能會使代碼中無法區分出當前的數據是從哪到哪是一個完整的應用數據包,

如上圖,就無法確定從哪到哪是一個數據.

解決問題的關鍵,就是"明確包與包之間的邊界"

1. 通過特殊符號,作為分隔符,見到分隔符,就視為一個包結束了

2. 指定出包的長度,比如在包開始的位置,加上一個特殊的空間來表示整個數據的長度.

上述這樣的問題,都應該是在設計應用層協議的時候就設計好了的.

六、異常問題

考慮比丟包更嚴重的情況,甚至說網絡直接出現故障等情況

1. 其中有一方出現了進程崩潰

進程無論是正常結束,還是異常崩潰,都會觸發到回收文件資源,關閉文件這樣的效果(系統自動完成的),就會觸發四次揮手

TCP的生命周期.可以比進程更長一點,雖然進程已經退出了,但是TCP連接還在,仍然可以繼續進行四次揮手.

2. 其中有一方關機了(正常流程)

關機會強制終止所有進程,此時四次揮手不一定能完成

如果夠快,此時,本段和對端都能正確刪除保存的連接信息.

如果不夠快,至少也把第一個FIN發給對方,告訴對方我這里要結束了.

對端收到FIN后,對端也要進入釋放連接的流程了,返回ACK,并且也發FIN,這里發的FIN不會再有ACK了.

FIN沒有收到ACK之后,會進行重傳,達到指定次數后,就單方面釋放連接了.

3. 其中一方出現斷電.

? ?3.1 斷電的是接收方,發送方會突然發現沒有ACK了,就要重傳.

? ? ? ? 重試幾次后還是不行,TCP就會嘗試復位連接.(相當于清楚原來的TCP中的各種臨時數據,重新開始.)

這就需要用到TCP中的一個復位報文段.

通過此處的RST,報文直接復位.

? ? ? ? 3.2 斷電的是發送方

接收方本來在阻塞等待發送方的消息,結果一直沒來.

這是就要區分,發送方是掛了還是沒準備好.

TCP中,接收方一段時間后,沒有收到消息,就會觸發 " 心跳包 " 來詢問對方的情況.

心跳包:不攜帶應用層數據包的特殊數據包,1. 周期的? ?2. 沒有心跳,視為是對端掛了.

如果對端沒有心跳了,此時本端也會嘗試復位并且單方面釋放連接了.

? ?4. 網線斷開.

這種情況本質上就是3的3.1 和 3.2 的結合了.

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

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

相關文章

一步一步寫線程之十三隊列間的消息通知

一、線程和分布式的通信 隨著技術的不斷發展,多線程和分布式通信愈發的普及。那么在這種場景下的如何進行數據的通信,便成為了一個非常典型的問題。無論是多線程還是分布式,其實其抽象出來的通信機制都是類似的。或者說換句話,多…

java檢測字符串是否包含數字和字母

在Java中,要檢測一個字符串是否同時包含數字和字母,我們可以使用正則表達式(regex)或者通過遍歷字符串并檢查每個字符來實現。以下是兩種方法的詳細代碼示例: 1.方法一:使用正則表達式 import java.util.…

【AI+知識庫問答】沉浸式體驗了解 AI知識庫問答fastGPT

之前寫過一篇文章 【AI本地知識庫】個人整理的幾種常見本地知識庫技術方案 , 由于當時主要是針對AI本地知識庫, 所以沒列fastGPT。 最近經常刷到fastGPT,這里單獨水一篇。 FastGPT 是一個基于 LLM 大語言模型的知識庫問答系統,…

Github 2024-06-01 開源項目日報Top10

根據Github Trendings的統計,今日(2024-06-01統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目5Jupyter Notebook項目2TypeScript項目1Go項目1Shell項目1Lua項目1Kong:云原生API網關與AI能力 創建周期:3482 天開發語言:Lua協議…

如何確保績效目標執行到位?

很多企業在實施績效過程中,盡管制定好了績效目標,但是沒有執行下去,管理者將原因歸咎于“員工低效”、“體制機制”等問題,那么在人力資源管理方面,企業應該如何確保制定的績效目標執行到位?如何提高低效能…

云原生架構相關技術_4.服務網格

1.技術特點 服務網格(ServiceMesh)是分布式應用在微服務軟件架構之上發展起來的新技術,旨在將那些微服務間的連接、安全、流量控制和可觀測等通用功能下沉為平臺基礎設施,實現應用與平臺基礎設施的解耦。這個解耦意味著開發者無需…

React@16.x(14)context 舉例 - Form 表單

目錄 1,目標2,實現2.1,index.js2.2,context.js2.2,Form.Input2.3,Form.Button 3,使用 1,目標 上篇文章說到,context 上下文一般用于第3方組件庫,因為使用場景…

Chisel入門——在windows下vscode搭建|部署Scala2.13.3開發環境|用Chisel點亮FPGA小燈等實驗

文章目錄 前言一、vscode搭建scala開發環境1.1 安裝Scala官方插件1.2 創建hello_world.scala文件1.3 確認java的版本(博主使用的是1.8)1.4 下載Scala Windows版本的二進制文件1.5 配置環境變量1.6 交互模式測試一下1.7 vscode運行scala 二、windows安裝sbt2.1 下載sbt2.2 設置環…

函數遞歸及具體例子(持續更新)

遞歸就是函數自己調用自己 求n的階乘 n! n * (n - 1)! 直到n為1或者0的時候為止 舉個例子 int Fun(int n) {if (n < 0){return 1;}else{return n * Fun(n - 1);} }int main() {int n 0;scanf("%d", &n);int ret Fun(n);printf("%d\n", ret…

安裝Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…

springboot中抽象類無法注入到ioc容器

1、背景 在寫代碼時&#xff0c;發現service接口有兩個實現類&#xff0c;并且兩個實現類中沒有對類名重命名&#xff0c;屬性注入的時候也沒有使用byName或Qualifier&#xff0c;正確情況下會發生多實現報錯的問題&#xff0c;以前對這個問題進行解析過。 2、調試過程 我想…

【設計模式】創建型-建造者模式

前言 在面向對象的軟件開發中&#xff0c;構建復雜對象時經常會遇到許多挑戰。一種常見的解決方案是使用設計模式&#xff0c;其中建造者模式是一個強大而靈活的選擇。本文將深入探討建造者模式的原理、結構、優點以及如何在實際項目中應用它。 一、復雜的對象 public class…

飛凌嵌入式FET3568/3568J-C核心板現已適配OpenHarmony4.1

近日&#xff0c;飛凌嵌入式為FET3568/3568J-C核心板適配了OpenHarmony4.1系統&#xff0c;新系統的加持使核心板在兼容性、穩定性與安全性等方面都得到進一步提升&#xff0c;不僅為FET3568/3568J-C核心板賦予了更強大的功能&#xff0c;也為開發者們提供了更加廣闊的創新空間…

每日一練編程題:今天是【接口,多態】

設計程序 : 電腦類的屬性USB接口數組 : 有3個usb插口電腦類的功能 : 通過接口插入外設 (u盤,麥克風,鍵盤等) addUSB(USB usb) { }開機 要求: 電腦開機前,先啟動外設關機 要求: 電腦關機前,先關閉外設 外設類(u盤,麥克風,鍵盤等) 功能 : 啟動 關閉 USB接口 定義usb設備的統一…

python多種方式 保留小數點位數(附Demo)

目錄 前言1. 字符串格式2. round函數3. Decimal模塊4. numpy庫5. Demo 前言 在Python中&#xff0c;保留小數點后特定位數可以通過多種方式實現 以下是幾種常見的方法&#xff0c;并附上相應的代碼示例&#xff1a; 使用字符串格式化&#xff08;String Formatting&#xff…

IDE集成開發環境

IDE集成開發環境&#xff0c;全稱“Integrated Development Environment” 介紹 定義&#xff1a; IDE是用于提供程序開發環境的應用程序&#xff0c;它集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟件服務套。 組成部分&#xff1a; IDE通常包括代碼編…

Ubuntu20.04 Mysql基本操作知識

#Mysql基本知識 運行環境Ubuntu20.04 1.開啟mysql服務 sytemctl start mysql不然&#xff0c;命令行進入myql交互行提交命令后&#xff0c;就會出現4200錯誤。 2.顯示所有數據庫 SHOW DATABASES;注意復數s&#xff0c;畢竟很多數據庫 3.新建數據庫test CREATE DATABASE …

【學習筆記】計算機組成原理(九+十)

控制單元的功能 文章目錄 控制單元的功能9.1 微操作命令的分析9.1.1 取指周期9.1.2 間址周期9.1.3 執行周期9.1.4 中斷周期 9.2 控制單元的功能9.2.1 控制單元的外特性9.2.2 控制信號舉例9.2.3 多級時序系統9.2.4 控制方式 控制單元的設計10.1 組合邏輯設計10.1.1 組合邏輯控制…

LabVIEW與Simulink的通信及調用方式

LabVIEW和Simulink可以通過多種方式進行通信和集成&#xff0c;實現數據交互和功能調用。常見的通信方式包括TCP/IP、UDP、共享內存等&#xff0c;此外還可以利用MATLAB Script Node和S-Function等直接調用對方的功能。這些方法使得LabVIEW和Simulink能夠協同工作&#xff0c;充…

[Algorithm][動態規劃][子序列問題][最長遞增子序列的個數][最長數對鏈]詳細講解

目錄 1.最長遞增子序列的個數1.題目鏈接2.算法原理詳解3.代碼實現 2.最長數對鏈1.題目鏈接2.算法原理詳解3.代碼實現 1.最長遞增子序列的個數 1.題目鏈接 最長遞增子序列的個數 2.算法原理詳解 注意&#xff1a;本題思路和思維方式及用到的方法很值得考究&#xff0c;個人感…