【linux】網絡基礎(3)——tcp協議

文章目錄

  • TCP協議概括
  • TCP頭部格式
  • TCP連接管理
  • 建立連接(三次握手)
  • 數據傳輸
    • 確認應答機制
      • 捎帶應答
    • 滑動窗口
      • 丟包問題
    • 擁塞控制
    • 延時應達
  • 終止連接(四次揮手)

TCP協議概括

TCP是一個面向連接的協議,在傳輸數據之前需要建立連接,確保通信雙方的準備工作。它提供可靠的數據傳輸服務,通過確認、重傳、流量控制和擁塞控制機制,保證數據準確且按順序地到達目的地。

TCP頭部格式

在這里插入圖片描述
源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去。
32位序號: 數據段的序列號,用于重組數據流和檢測丟失數據
32位確認號:確認收到的數據段的序列號(當收到確認序列號時,可以保證的是,此序列號之前的序列號都已經處理完成,即使沒有收到對應的序列號)。
如下圖:(1-100)是客戶端發給服務器的數據段序號,101則是服務端對客戶端發送過來數據的確認(確認應答機制)。
在這里插入圖片描述
4位TCP報頭長度: 表示該TCP頭部有多少個32位bit(有多少個4字節); 所以TCP頭部最大長度是15 (1111)* 4 = 60(注意乘4)
6位標志位:
URG: 緊急指針是否有效
ACK: 確認號是否有效
PSH: 提示接收端應用程序立刻從TCP緩沖區把數據讀走
RST: 對方要求重新建立連接; 我們把攜帶RST標識的稱為復位報文段
SYN: 請求建立連接; 我們把攜帶SYN標識的稱為同步報文段
FIN: 通知對方, 本端要關閉了, 我們稱攜帶FIN標識的為結束報文段

在每次發送報文以及應答報文時,對于以上六中的請求,會分別對對應請求的標志位的值標志位1,來表示此數據的意義!
16位窗口大小:流量控制窗口大小,接收方可以接受的最大數據量。(每次進行報文通信時,都會將自己的接受緩沖區的具體大小告訴對方,好讓對方發送我們所能接受的字節流,以防于數據過大,導致丟包問題!)
16位校驗和: 發送端填充, CRC校驗. 接收端校驗不通過, 則認為數據有問題. 此處的檢驗和不光包含TCP首部, 也包含TCP數據部分
16位緊急指針: 標識哪部分數據是緊急數據(配合標志位的URG使用)。
選項:可選字段,用于擴展TCP協議的功能
數據:實際傳輸的數據。

TCP連接管理

TCP是面向連接的協議,通信雙方在傳輸數據之前必須先建立連接。連接管理包括連接建立、數據傳輸和連接終止三個階段。

建立連接(三次握手)

在這里插入圖片描述
TCP使用三次握手機制建立連接,確保雙方同步并準備好數據傳輸。
SYN:客戶端發送一個SYN(同步)報文段,表示請求建立連接,同時發送初始序列號。
SYN+ACK:服務器接收到SYN報文段后,發送一個SYN-ACK報文段,確認收到SYN,并發送自己的初始序列號。
ACK:客戶端接收到SYN-ACK報文段后,發送一個ACK(確認)報文段,確認收到服務器的SYN。
通過三次握手,客戶端和服務器確認彼此的存在,并交換初始序列號,準備傳輸數據。

為什么要進行三次握手?
解決SYN洪流問題!因為如果是一次或者兩次握手,一些惡意的客戶端,對服務器進行多次連接攻擊,只要服務端收到來自客戶端的連接,不論是一次還是兩次,都會直接建立連接快速消耗內存,導致服務器掛掉,而三次握手需要客戶端的再次確認返回,才會進行建立連接,雖然也會有SYN洪流問題,但要比之前的方式減少些許負擔,同時還可以最小成本的驗證全雙工,客戶端可以驗證發送以及接受正常通信,服務端也可以驗證發送以及接受的正常通信。

數據傳輸

確認應答機制

每收到一個數據段,接收方都會發送一個確認報文段(ACK),確認收到的數據段序列號。發送方如果在一定時間內沒有收到確認,則會重傳該數據段。
在這里插入圖片描述
如上圖是一種串行發送消息,效率可見是非常慢。所以有下圖的多行發送消息,特別注意這里每次發送數據都是報頭攜帶數據的。而返回的應答ACK則只有報頭,在報頭內將ACK標志位置為1
在這里插入圖片描述
而這樣收到的報文可能是亂序的這樣就可以靠TCP報頭的序列號進行排序,處理。

捎帶應答

對于上面的ACK應答報文,也可以被攜帶在返回數據中,例如你向服務器發問1+1等于多少?服務器會給你回應2同時報頭中ACK的標志位置為1,表示對你1+1的信息收到了。這樣就可以將兩個通信合并為一條。大大提高效率。

滑動窗口

針對確認應答機制中的多行并發消息的解決。滑動窗口的初始大小是根據接收方返回報頭數據中自己的的接受緩沖區的大小來決定的,同時也達到流量控制的目的當然對于網絡中進行通信有多個路由器等硬件設施,具體的滑動窗口的大小會根據這些硬件設施所能接受的大小與對方接受緩沖區的大小取最小值來設定!!
TCP使用滑動窗口機制進行流量控制,接收方根據自己的接收能力設置窗口大小,告訴發送方可以發送的最大數據量
在這里插入圖片描述
如下圖一次性發送一個窗口內所有的內容。倘若接受到2001的確認信號,那么窗口的左坐標就會移動到2001的位置,右坐標也會相應的增加到6001
在這里插入圖片描述
把窗口的前坐標比作win_start,結尾坐標比作win_end,具體滑動就是根據下面的公式進行更變。
在這里插入圖片描述

丟包問題

在這里插入圖片描述
在這里插入圖片描述
因為有應答序號,保證次序號之前的消息都已經收到,所以1001——2000丟包,后面數據即使收到,也只會返回1001這個確認序號,經過多次重復應答,主機A就知道,1001——2001丟了,對方沒有收到,則會再次發送此數據。
這種機制被稱為 “高速重發控制”(也叫 “快重傳”)

擁塞控制

控制滑動窗口大小的另一個決定因素
TCP通過慢啟動、擁塞避免、快重傳和快恢復等算法進行擁塞控制,防止網絡過載。

慢啟動:在連接初始階段,發送方以指數增長方式增加發送窗口大小,快速探測網絡容量。

擁塞避免:當慢啟動閾值達到一定值時,發送方以線性增長方式增加發送窗口大小,避免網絡擁塞。

快重傳和快恢復:當發送方收到重復確認(ACK)時,快速重傳丟失的數據段,并進行快速恢復,減少網絡等待時間。
在這里插入圖片描述

發送開始的時候, 定義擁塞窗口大小為1;
每次收到一個ACK應答, 擁塞窗口加1;
每次發送數據包的時候, 將擁塞窗口和接收端主機反饋的窗口大小做比較, 取較小的值作為實際發送的窗口;
像上面這樣的擁塞窗口增長速度, 是指數級別的. “慢啟動” 只是指初使時慢, 但是增長速度非常快.
為了不增長的那么快, 因此不能使擁塞窗口單純的加倍.
此處引入一個叫做慢啟動的閾值
當擁塞窗口超過這個閾值的時候, 不再按照指數方式增長, 而是按照線性方式增長

在這里插入圖片描述
少量的丟包, 我們僅僅是觸發超時重傳; 大量的丟包, 我們就認為網絡擁塞;
當TCP通信開始后, 網絡吞吐量會逐漸上升; 隨著網絡發生擁堵, 吞吐量會立刻下降;
擁塞控制, 歸根結底是TCP協議想盡可能快的把數據傳輸給對方, 但是又要避免給網絡造成太大壓力的折中方案

延時應達

當收到多個數據請求時,接收方的接收緩沖區就會變小,此時如果對多個數據請求先來的做出應答,那么對于應答攜帶的報頭中發送給對方的可接受緩沖區的大小是非常小,會降低下一次發送的效率,所以我們引入延時應達,我們可以等一次性收到的全部數據都處理完,通過序列號的排序,僅僅應答最后一個序列號即可(因為確認序列號可以保證攜帶之前序列號的數據已經收到并處理
具體的延時應答策略:
數量限制: 每隔N個包就應答一次;
時間限制: 超過最大延遲時間就應答一次

具體的數量和超時時間, 依操作系統不同也有差異; 一般N取2, 超時時間取200ms
在這里插入圖片描述

終止連接(四次揮手)

TCP使用四次揮手機制終止連接,確保雙方都能夠正常結束數據傳輸。

FIN:一方(通常是客戶端)發送一個FIN(終止)報文段,表示不再發送數據,但仍然可以接收數據。
ACK:另一方(服務器)接收到FIN報文段后,發送一個ACK報文段,確認收到FIN。
FIN:服務器發送自己的FIN報文段,表示不再發送數據。
ACK:客戶端接收到FIN報文段后,發送一個ACK報文段,確認收到服務器的FIN。

在這里插入圖片描述

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

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

相關文章

醫療器械進銷存軟件 專業合規的醫療公司器械出入庫管理軟件

財務管理:財務檔案統一管理,有利于科學管理企業資金 財務管理:發票關聯業務單據,業財融合,加速財務數字化轉型 財務管理:提供收付款功能,加快企業應收賬款的回收,降低付款的資金浮…

小白輕松使用maven

一、maven 下載 下載地址 maven 下載官方地址 https://maven.apache.org/download.cgi,黃色壓縮包。 2. 下載解壓 cmd 解壓命令 tar -zxvf apache-maven-3.9.8-bin.tar.gz二、maven 配置 settings.xml 文件配置 鏡像配置: 國內鏡像配置用于下載資源…

《操作系統真象還原》學習筆記:第1章 部署工作環境

**提示:**這篇文章是根據學長提供的教程《操作系統真象還原》第一章 部署工作環境來完成的,我按照學長給的教程一步一步做下來,再結合《操作系統真象還原》這本書,對實驗環境進行了配置。以下是我按照教程進行搭建的記錄&#xff…

[Vue3 + TS + Vite] CSS穿透

以 Element-Plus UI 中的 <el-drawer> 為例 方法一 Template中 <el-drawer>CSS中 <style lang"scss" scoped> :deep(.el-drawer__header) {margin: 0px 0px 0px 0px; /*上 右 下 左*/box-sizing: border-box;padding: 0px 0px 0px 0px; /*上 右…

【Ubuntu】詳細說說Parallels DeskTop安裝和使用Ubuntu系統

希望文章能給到你啟發和靈感~ 如果覺得文章對你有幫助的話,點贊 + 關注+ 收藏 支持一下博主吧~ 閱讀指南 開篇說明一、基礎環境說明1.1 硬件環境1.2 軟件環境二、Ubuntu系統的使用2.1 系統的下載2.2 系統的安裝2.3 安裝桌面版(可選)2.3.1 安裝/更新apt2.3.2 安裝桌面版2.3…

【JNDI注入利用工具】JNDIExploit v1.1

# 簡介 JNDIExploit一款用于 JNDI注入 利用的工具&#xff0c;大量參考/引用了 Rogue JNDI 項目的代碼&#xff0c;集成了JDNI注入格式&#xff0c;能夠更加方便的開啟服務端后直接利用&#xff0c;支持反彈Shell、命令執行、直接植入內存shell等&#xff0c;并集成了常見的by…

7.4、空指針和野指針

空指針 #include <iostream> using namespace std;int main() {//空指針//1、空指針用于給變量進行初始化int * p NULL;//2、空指針是不可以進行訪問的//0-255之間的內存編號是系統占用的&#xff0c;因此不可以訪問//cout<<*p<<endl;system("pause&q…

算法訓練 | 圖論Part3 | 101.孤島的總面積、102.沉沒孤島、103.水流問題、104.建造最大島嶼

目錄 101.孤島的總面積 圖論法 102.沉沒孤島 圖論法 103.水流問題 圖論法 104.建造最大島嶼 圖論法 101.孤島的總面積 題目鏈接&#xff1a;101. 孤島的總面積 文章講解&#xff1a;代碼隨想錄 圖論法 代碼一&#xff1a;深搜 #include <iostream> #includ…

在Centos7上安裝PostgreSQL16的詳細步驟

文章目錄 環境一、準備二、postgresql下載方法一&#xff1a;wget下載方法二&#xff1a;下載壓縮包解壓 三、創建用戶組、用戶四、創建數據主目錄五、配置環境變量六、initdb初使化數據庫七、配置服務八、設置開機自啟動九、設置防火墻十、啟動數據庫服務 環境 CPU: 4 核心或以…

Python爬蟲系列-讓爬蟲自己寫爬蟲(半自動化,代替人工寫爬蟲)

現在的PC、手機客戶端等終端設備大量使用了網頁前后端技術&#xff0c;另外主流的網站也會經常會更新&#xff0c;導致以前一個月更新一次爬蟲代碼&#xff0c;變成了天天需要更新代碼&#xff0c;所以自動化爬蟲技術在當前就顯得特別重要&#xff0c;最近我也是在多次更新某個…

養老院生活管理系統

摘要 隨著全球范圍內人口老齡化趨勢的日益加劇&#xff0c;養老院作為老年人生活的重要場所&#xff0c;其生活管理問題也顯得愈發突出和重要。為了滿足養老院在日常生活管理、老人健康監護、服務人員管理等多方面的需求&#xff0c;提高管理效率和服務質量。決定設計并實現了…

用一百場線下講座科普充電樁 能效電氣做到了

在新能源汽車產業蓬勃發展的今天,充電樁作為產業鏈的重要環節,其建設與發展成為推動行業進步的關鍵。在這一背景下,能效電氣憑借其卓越的技術實力和前瞻性的市場布局,成為了新能源充電樁行業的佼佼者。 為了進一步推動新能源產業的發展,普及充電樁知識,能效電氣精心策劃并舉辦…

C語言數據類型和變量(二)

目錄 1.數據類型的取值范圍 2.變量 2.1 變量的創建 2.2 變量的分類 2.3全局變量和局部變量在內存中的存儲?編輯 3. 算術操作符&#xff1a; 、 - 、* 、/ 、% 3.1 和 - 3.2 * 3.3 / 3.4 % 1.數據類型的取值范圍 每一種數據類型有自己的取值范圍&#xff0c;也就是存…

mapper.xml 文件對應的 Dao 接口原理

在 Java 框架如 MyBatis 中&#xff0c;Mapper.xml 文件是用于定義 SQL 查詢的配置文件&#xff0c;而對應的 Dao 接口&#xff08;Mapper 接口&#xff09;則提供了與 XML 文件中的 SQL 查詢相對應的方法。這種設計模式使得 Java 代碼與 SQL 語句解耦&#xff0c;提高了代碼的…

盤點亞馬遜5大實用選品思路(圖文講解+選品案例)

一、7天藍海選品法 市場上很多工具一般都是近30天的跨境商品數據&#xff0c;而店雷達亞馬遜選品&#xff0c;可以篩選出上架近7天的亞馬遜產品&#xff0c;避免在已經市場相對飽和的賽道&#xff0c;中小賣家還要擠破頭去搶蛋糕。我們更應該學會在市場反饋好的新品中找到出單…

Git刪除了文件拉取時失敗

本地刪除了一些文件&#xff0c;遠端的另一個提交修改了被刪除的文件&#xff0c;vs里拉取時提示未處理的提交&#xff0c;無法繼續操作&#xff0c;git gui里顯示很多unstaged change的項 解決辦法&#xff1a; 1、用git bash的git rm --cached filename或 git rm -r --cached…

GBASE8S如何使用dbexport實現單表的還原和實現數據庫的復制

(一) 通過dbexport實現單表數據還原 1. 測試前的信息查看 本次以test庫的表test21為例 [gbasedbtiZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test - Your evaluation license will expire on 2025-05-26 00:00:00Database selected.> select * from test21;id name1 a2 b3 c3…

探索Vue.js的無限可能 —— vuejs-challenges

vuejs-challenges&#xff1a;挑戰自我&#xff0c;共同成長&#xff0c;Vue.js挑戰等你來戰&#xff01;- 精選真開源&#xff0c;釋放新價值。 概覽 vuejs-challenges是一個專為Vue.js學習者和開發者設計的開源項目。它通過提供一系列精心設計的挑戰&#xff0c;幫助參與者深…

使用 JavaScriptCore 進行跨語言調用

使用 JavaScriptCore 進行跨語言調用時&#xff0c;既可以在 Native 代碼中執行 JavaScript 代碼&#xff0c;也可以在 JavaScript 中調用 Native 方法。以下是詳細的實現步驟和示例。 1. 在 Native 代碼中執行 JavaScript 代碼 使用 JavaScriptCore 框架&#xff0c;可以在 …

手把手教你一步一步通過AI助手生成利潤表分析報告

AI助手之利潤表分析報告-操作篇 以下為文字整理部分&#xff1a; 如果要手工制作一份這樣的利潤分析報告大概要多久時間&#xff1f;從準備數據做成表格&#xff0c;到完成報告&#xff0c;至少需要1天的時間吧&#xff0c;特別是敲文字報告的時候&#xff0c;生怕把數字搞錯要…