TCP 協議十大相關特性總結

目錄

一、TCP特性

二、報文格式

?TCP十大核心特性?

1. 確認應答

2. 超時重傳

3.?連接管理(三次握手,四次揮手)

三次握手

四次揮手

4. 滑動窗口

情況一:接收方的ACK丟失

情況二:發送方的數據包丟失

5. 流量控制

6. 擁塞控制

7. 延遲應答

8. 捎帶應答

9. 字節流粘包問題

?10. TCP的異常處理

面試題:如何使用UDP來實現可靠傳輸?

一、TCP特性

1.有連接

2.可靠傳輸

3.面向字節流

4.全雙工

二、報文格式

這是各大教科書上的

?這個和UDP一樣,是為了排版方便,容易給我們造成誤解,其實真正的結構是這樣的

?TCP十大核心特性?

1. 確認應答

發送方在發送一條數據給接收方之后,接收方會立刻返回一個ACK作為回應,表示自己收到該條數據

這就是確認應答,能夠保證傳輸的數據一定能發送給對方

2. 超時重傳

如果發送方沒有接收到回來的ACK相應,等待一段時間后,發送方默認該數據已經丟失,會重新發送該條數據給對方,如果依然沒有接收到ACK回應,那么會再次發送 ,但是每次發送的時間間隔會越變越長 , 這就是超時重傳

3.?連接管理(三次握手,四次揮手)

三次握手

  1. 發送方給接收方發送一條信息(發送SYN);
  2. 接收方接受到信息后,發送兩個消息,一個是確認應答(ACK),另一個是回復消息(SYN)
  3. 對于接收方發回來的ACK和SYN應答,發送方再次回復一個ACK確認應答

四次揮手

  1. ?發送方發送FIN,請求和接收方斷開連接
  2. 接收方回應ACK收到斷開請求
  3. 接收方向發起方也發送FIN,請求斷開連接
  4. ACK回應,接收方斷開連接請求

4. 滑動窗口

滑動窗口的出現時為了提高TCP傳輸效率的,我們沒有引入滑動窗口之前,TCP的大量時間都浪費在了等待ack上面,這時候我們便想到了一個辦法? 一次傳輸多個數據,

?而為了保證接受方能夠承擔同時處理的最大數據,保證接受方不崩潰,我們限制了發送方的最大發送?

也就是說,滑動窗口能夠保證,接收方最大同時處理數據的上限,和發送方最大能發送數據的上限

如果在這種批量傳輸的情況下,出現數據丟失怎么辦?

情況一:接收方的ACK丟失

這里可以看到,我們的ACK即使丟了,也無妨,下一條ACK只要能到達,ACK就不需要重新傳送,因為發送5001的意思是前5000個數據全部收到了

??情況二:發送方的數據包丟失

這里可以看到,即使是數據包丟失了也無所謂,主機2會持續的返回1001,這樣主機1就會重新發送一次1001 ,??所以滑動窗口,是很好的一種提高TCP傳輸速率的方法

5. 流量控制

接收端處理數據的速度是有限的。如果發送端發的太快,導致接收端的緩沖區被打滿,這個時候如果發送端繼續發送,就會造成丟包,繼而引起丟包重傳等等一系列連鎖反應。
因此TCP支持根據接收端的處理能力,來決定發送端的發送速度。這個機制就叫做流量控制

  • 接收端將自己可以接收的緩沖區大小放入 TCP 首部中的 "窗口大小" 字段,通過ACK端通知發送端;
  • 窗口大小字段越大,說明網絡的吞吐量越高;
  • 接收端一旦發現自己的緩沖區快滿了,就會將窗口大小設置成一個更小的值通知給發送端;
  • 發送端接受到這個窗口之后,就會減慢自己的發送速度;
  • 如果接收端緩沖區滿了,就會將窗口置為0;這時發送方不再發送數據,但是需要定期發送一個窗口探測數據段,使接收端把窗口大小告訴發送端

6. 擁塞控制

?簡單來說,就是速度如果達到了傳輸的上限,那么就會立刻反彈回一個較低的值,然后繼續增長速率

如此反復,直到穩定在了一個比較合理的數值范圍內,這就是擁塞控制

最開始我們的速率增長是指數級別的增長,比如? 2的一次方?-> 2的二次方 -> 2的三次方....

然后到了一個比較高的值之后,為了防止下一個次方直接超出接受范圍很多

所以從那個值之后,我們采用線性增長,而不是指數增長了

7. 延遲應答

接收方接受數據之后,不會立刻相應給發送方,而是等待一段時間,等接收方接收到多組數據后再返回

8. 捎帶應答

?如果在很短的時間內,接收方收到很多信息,并且都需要返回,那么多條返回消息,就可以合并為一條消息返回

9. 字節流粘包問題

當TCP發送多條數據,數據都存儲再緩沖區中,由于我們的數據是字節流的,所以我們的數據很有可能會粘到一起,無法區分出哪些是一條數據

粘包問題處理方法:

1.通過分隔符:比如指定一個分隔符作為包的結束標記,這樣每一個包就區分開來了

2.通過指定報的長度:比如再報文開頭位置聲明長度,這樣讀數據的時候,只讀取指定長度的數據,就不會發生粘包問題了

10. TCP的異常處理

情況一:程序突然崩潰
操作系統會自動回收程序遺留/占用的資源,類似于close操作,然后發生四次揮手

情況二:程序正常退出
同情況一,回收資源+四次揮手

情況三:沒法發送和接收數據(電腦壞了,網絡斷了)
接收方無法接受
接收方無法接受數據,也就是無法回應ACK相應給發送方,當發送方多次發送數據也沒有ACK回應之后,就默認接收方不行了,然后停止發送數據

發送方無法發送
在接收方和發送方里面存在一個"心跳包",雙方會周期性發送一個小數據,判斷對方是否存活,如果檢測到發送方沒有心跳回應,那么就默認發送方沒了,接收方也就停止接收數據.

注意:在接收方電腦壞了的情況下也能用心跳包判斷,但是ACK更加直接

面試題:如何使用UDP來實現可靠傳輸?

其實是考察TCP,我們只需要基于UDP在應用層,實現確認應答,超時重傳,引入序列號等待操作就可以了

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

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

相關文章

k8s--使用cornJob定時執行sql文件

CronJob apiVersion: batch/v1beta1 kind: CronJob metadata:name: hello spec:schedule: "0 * * * *"jobTemplate:spec:template:spec:containers:- name: postgres-alpineimage: xxxximagePullPolicy: IfNotPresentcommand:- psql- -h- 數據庫服務地址- -d- 數據庫…

大語言模型:LLM的概念是個啥?

一、說明 大語言模型(維基:LLM- large language model)是以大尺寸為特征的語言模型。它們的規模是由人工智能加速器實現的,人工智能加速器能夠處理大量文本數據,這些數據大部分是從互聯網上抓取的。 [1]所構建的人工神…

02 - git 文件重命名

查看所有文章鏈接:(更新中)GIT常用場景- 目錄 文章目錄 1. 第一種方式2. 第二種方式 1. 第一種方式 mv kongfu_person.txt kongfu.txt git add .2. 第二種方式 git mv kongfu_person.txt kongfu.txt

微服務實戰項目-學成在線-項目優化(redis緩存優化)

微服務實戰項目-學成在線-項目優化(redis緩存優化) 1 優化需求 視頻播放頁面用戶未登錄也可以訪問,當用戶觀看試學課程時需要請求服務端查詢數據,接口如下: 1、根據課程id查詢課程信息。 2、根據文件id查詢視頻信息。 這些接口在用戶未認…

Unity 人物連招(三段連擊)

一: 連招思路 首先人物角色上有三個攻擊實例對象 Damage,每一個damage定義了攻擊的傷害值,攻擊距離,觸發器名稱,傷害的發起者,攻擊持續時間,攻擊重置時間,傷害的碰撞框大小等字段: …

【WordPress】給你一萬個不使用WP-Cron定時機制的理由

這篇文章也可以在我的博客中查看 定時任務 cron Cron是Unix/Linux系統中的任務調度工具,允許用戶在預定的時間和日期間隔自動運行命令或腳本 它通過Cron表達式定義任務執行的頻率,該表達式包含分鐘、小時、日期等信息 我們可以利用Cron來定期執行維護…

MySQL表的增刪查改

目錄 一,新增 二,查詢 2.1 全列查詢 2.2 指定列查詢 2.3 查詢字段為表達式 2.4 別名 - as 2.5 去重 - distinct 2.6 排序 - order by 2.7 條件查詢 - where 2.8 分頁查詢 - limit 三,修改 - update 四,刪除 - delete 一…

@Mapper POJO 與DTO之間的class屬性轉換映射

Mapper注解基于mapStract 框架實現對象轉換&#xff1a;MapStract java bean 屬性轉換映射 引用轉自&#xff1a;org.mapstruct:mapstruct 包&#xff08;Mapper、Mapping&#xff09;的使用 依賴包&#xff1a; <!--mapStruct依賴--> <dependency><groupId&g…

Spring-2-透徹理解Spring 注解方式創建Bean--IOC

今日目標 學習使用XML配置第三方Bean 掌握純注解開發定義Bean對象 掌握純注解開發IOC模式 1. 第三方資源配置管理 說明&#xff1a;以管理DataSource連接池對象為例講解第三方資源配置管理 1.1 XML管理Druid連接池(第三方Bean)對象【重點】 數據庫準備 -- 創建數據庫 create …

純前端 -- html轉pdf插件總結

一、html2canvasjsPDF&#xff08;文字會被截斷&#xff09;&#xff1a; 將HTML元素呈現給添加到PDF中的畫布對象&#xff0c;不能僅使用jsPDF&#xff0c;需要html2canvas或rasterizeHTML html2canvasjsPDF的具體使用鏈接 二、html2pdf&#xff08;內容顯示不全文字會被截斷…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目錄 [RoarCTF 2019Online Proxy]sql巧妙盲注解題腳本腳本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解題 在源代碼界面發現&#xff1a;Current Ip 我們會聯想到&#xff1a;X-Forwarded-For來修改ip&#xff1a; 結果我們發現&#xff0c;response會講Last Ip回顯出…

Semaphore 原理分析

分析下SemaPhore吧&#xff0c;也是基于AQS實現的&#xff0c;對并發進行控制的工具類&#xff0c;看下其怎么實現的&#xff0c; Semaphore semaphore new Semaphore(3);semaphore.acquire();semaphore.release();Semaphore 常用于控制并發量&#xff0c;比如這里設置為3&…

請教電路高手幫忙Review一下是否可行?

想要實現STM32 3.3V GPIO 控制5V電源通斷&#xff0c;默認狀態為&#xff1a;接通。 使用如下電路圖有無問題&#xff1f;參數是否需要調整&#xff1f;

8.14 ARM

1.練習一 .text 文本段 .global _start 聲明一個_start函數入口 _start: _start標簽&#xff0c;相當于C語言中函數mov r0,#0x2mov r1,#0x3cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0stop: stop標簽&#xff0c;相當于C語言中函數b stop 跳轉到stop標簽下的第一條…

C++的IO流

C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放在變量中。printf(): 將指定的文字/字符串輸出到標準輸出設備(屏幕)。注意寬度輸出和精度輸出控制。C語言借助了相應的緩沖區來…

javaScript:如何獲取html中的元素對象

目錄 前言&#xff1a; 方法 1.通過id獲取元素 2.通過標簽名獲取元素 3.通過類名class獲取元素 獲取body的方法 1.document.getElementsByTagName(body)[0] 2.document.body 相關代碼 前言&#xff1a; 通過獲取HTML中的元素對象&#xff0c;JavaScript可以對網頁進行動…

學生成績管理系統V1.0

某班有最多不超過30人&#xff08;具體人數由鍵盤輸入&#xff09;參加某門課程的考試&#xff0c;用一維數組作函數參數編程實現如下學生成績管理&#xff1a; &#xff08;1&#xff09;錄入每個學生的學號和考試成績&#xff1b; &#xff08;2&#xff09;計算課程的總分…

Vue [Day7]

文章目錄 自定義創建項目ESlint 代碼規范vuex 概述創建倉庫向倉庫提供數據使用倉庫中的數據通過store直接訪問通過輔助函數 mapState&#xff08;簡化&#xff09;mutations傳參語法(同步實時輸入&#xff0c;實時更新輔助函數 mapMutationsaction &#xff08;異步輔助函數map…

IntelliJ IDEA 2021/2022關閉雙擊shift全局搜索

我這里演示的是修改&#xff0c;刪除是右鍵的時候選擇Remove就好了 IDEA左上角 File-->Settings 找到Navigate -->Search Everywhere &#xff0c;右鍵添加快捷鍵。 OK --> Apply應用

C語言學習之const關鍵字的使用

const修飾變量&#xff1a;const關鍵字修飾變量時&#xff0c;該變量表示是一個只讀變量&#xff0c;不能通過變量名修改變量的值&#xff1b;案例&#xff1a; const int m 20; int const n 30; m 30;//不可以賦值&#xff0c;因為m是只讀變量 n 20;//不可以賦值&#xf…