tcp 的三次握手與四次揮手

      • 問1: 請你說一下tcp的三次握手
          • 一次握手
          • 兩次握手
          • 三次握手
          • 問: 為什么不四(更多)次握手?
      • 問 2: 請說一下 tcp 的 4 次揮手
          • 一次揮手
          • 兩次揮手
            • 問題:能不能等到數據傳輸完成再返回 ack?
          • 三次揮手
          • 四次揮手
          • 問: 為什么要等兩個最大報文存在時間?

bg: tcp 是可靠的連接,如何保證

  1. 建立連接: 三次握手
  2. 傳輸: 重傳,擁塞機制
  3. 斷開: 四次揮手

問1: 請你說一下tcp的三次握手

如果自己去設計一個tcp建立連接的流程會怎么做?

一次握手

客戶端(請求連接:SYN)->服務端

問題 1: 客戶端不知道服務端能不能收到
問題 2: 客戶端不知道服務端是否可以發送數據
問題 3: (假設服務端收到請求,并同意連接)服務端不知道客戶端是否可以接收到數據.

舉個例子:
客戶端連接的是一個關閉的服務器,如果只進行一次握手,客戶端發送給關閉的服務器,服務器是不可能收到的.

結論: 一次握手不行

兩次握手

客戶端(請求連接:SYN)->服務端
服務端(ack+SYN)->客戶端

問題 1: 服務端不知道客戶端是否可以收到數據

舉個例子:
第二次握手的數據丟包了,客戶端沒有收到
這時候客戶端認為連接沒有建立好(沒有收到服務器的返回)
服務器認為連接已經建立好了
這時服務器發送數據給客戶端,客戶端是不接收的(因為客戶端認為連接沒有建立好)

結論: 兩次握手也不行

三次握手

客戶端(請求連接:SYN)->服務端
服務端(ack+SYN)->客戶端
客戶端(ack)->服務端

服務端知道客戶端可以發送與接受數據
客戶端知道服務端可以發送與接受數據

結論: 三次握手可以

問: 為什么不四(更多)次握手?

三次握手已經滿足需求,多余的只是在浪費性能.

問 2: 請說一下 tcp 的 4 次揮手

自己來設計斷開連接的流程會怎么設計?

終端 A 數據傳輸完成,準備與終端 B 斷開連接

一次揮手

A(FIN)->B

問題 1:A不知道 B 是否能收到斷開連接的信號
問題 2: A不知道 B 的數據是否已經傳輸完成,可能會丟失數據

舉個例子:
B 并沒有傳輸完成數據,這時 A 斷開了連接,沒有完成傳輸的數據就丟失了

結論: 一次揮手不行

兩次揮手

A(FIN)->B
B(ack)->A

問題 1: A不知道 B 的數據是否已經傳輸完成,可能會丟失數據

問題:能不能等到數據傳輸完成再返回 ack?

不能
舉個例子: 如果 A 發送 FIN 給 B ,這個過程可能丟包了,B 沒有收到 A 發起的 FIN 就不會 ACK,所以 3 有重傳,只要一段時間沒有收到 ACK 就會重傳 FIN

那么問題來了,如果等到數據傳輸完成再返回 ack,那么如果 B 數據沒有傳輸完成,還需要傳輸很久,比如 10 分鐘,那么這十分鐘都沒有返回 ack,A 端沒收到 ack 會認為丟包了,就會不斷的重發 FIN

結論: 兩次揮手不行

三次揮手

A(FIN)->B
B(ack)->A
B(FIN)->A

問題: B 不知道 A 是否能收到發出的 FIN 信號,如果丟包,A 會保持 tcp 連接

四次揮手

A(FIN)->B
B(ack)->A
B(FIN)->A
A(ack)->B

保證雙方數據都傳輸完畢,等待兩個報文段最大存活時間就會斷開

問: 為什么要等兩個最大報文存在時間?

有兩種說法:

  1. 確保 B 能收到 ack,不然 B 就會認為FIN丟包了,繼續發送 FIN
  2. 最后 ack 后可能網絡中還有一些數據包(丟包重傳的),如果這時再建立連接可能會是同一個端口,那么這些(上一個連接)數據包可能在新的連接中被接受到,造成數據的錯亂.

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

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

相關文章

Kubernetes(k8s)離線部署DolphinScheduler3.2.2

1.環境準備 1.1 集群規劃 本次安裝環境為:3臺k8s現有的postgreSql數據庫zookeeper服務 1.2 下載及介紹 DolphinScheduler-3.2.2官網:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2 官網安裝文檔:https://dolphinscheduler.apach…

C++的侵入式鏈表

非侵入式鏈表 非侵入式鏈表是一種鏈表數據結構,其中每個元素(節點)并不需要自己包含指向前后節點的指針。鏈表的結構和節點的存儲是分開的,鏈表容器會單獨管理這些指針。 常見的非侵入式鏈表節點可以由以下所示,即&a…

Flutter組合動畫學習

如何使用動畫控制器和動畫來創建一個簡單的動畫效果。具體來說,它通過一個 AnimationController 來控制兩個動畫,一個用于旋轉,一個用于繪制。 前置知識點學習 SingleTickerProviderStateMixin SingleTickerProviderStateMixin 是 Flutter …

在vscode的ESP-IDF中使用自定義組件

以hello-world為例,演示步驟和注意事項 1、新建ESP-IDF項目 選擇模板 從hello-world模板創建 2、打開項目 3、編譯結果沒錯 正在執行任務: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…

2025差旅平臺怎么選?一體化、全流程降本案例解析

差旅支出在企業中一直是一項重要但容易被忽視的成本開支,尤其是在項目驅動型企業中,因頻繁的差旅需求,支出規模往往持續增長。以差旅平臺分貝通簽約伙伴——某智能制造業的業務模式為例,該模式要求員工定期前往不同的工廠、供應商…

【linux】NFS實驗

NFS NFS服務 nfs,最早是Sun這家公司所發展出來的,它最大的功能就是可以透過網絡,讓不同的機器,不同的操作系統,進行實現文檔的共享。所以你可以簡單的將他看做是文件服務器。 實驗準備 ①先準備一個服務器端的操作系統和客戶端的操作系統(Red Hat)。 ②選擇NAT模式,…

智源研究院與安謀科技達成戰略合作,共建開源AI“芯”生態

12月25日,智源研究院與安謀科技(中國)有限公司(以下簡稱“安謀科技”)與正式簽署戰略合作協議,雙方將面向多元AI芯片領域開展算子庫優化與適配、編譯器與工具鏈支持、生態系統建設與推廣等一系列深入合作&a…

ROG NUC:強大內核激發創意,AI賦能學子科技探索

有這么一款能夠激發無限創意、助力科技探索的迷你主機,它以其卓越的性能和迷你的身材成為了成為了ProArt百校行活動中的明星產品,助力廣大學子勇敢探索未知,追逐屬于自己的科技夢想。它就是ROG NUC 2024! 強大性能,創意…

從零玩轉CanMV-K230(8)-多線程例程

文章目錄 前言一、_thread模塊API二、使用示例創建并啟動線程停止線程_thread.exit() 總結 前言 K230上不支持threading,只能支持_thread,該模塊實現了相應 CPython 模塊的子集,CPython 是 Python 編程的參考實現 語言,也是最著名…

yii2 手動添加 phpoffice\phpexcel

1.下載地址:https://github.com/PHPOffice/PHPExcel 2.解壓并修改文件名為phpexcel 在yii項目的vendor目錄下創建一個文件夾命名為phpoffice 把phpexcel目錄放到phpoffic文件夾下 查看vendor\phpoffice\phpexcel目錄下會看到這些文件 3.到vendor\composer目錄下…

安卓多渠道apk配置不同簽名

一般簽名都是放在buildTypes里面: ... android {...defaultConfig {...}signingConfigs {release {storeFile file("myreleasekey.keystore")storePassword "password"keyAlias "MyReleaseKey"keyPassword "password"}}bu…

數據庫-用戶管理

一、創建用戶 create user xy104192..168.42.24 identified by 123456;xy104:用戶名 localhost;這個權限最高的root用戶 %:任務ip地址 192.168.42.24:登錄的IP地址 identified by ‘123456’:指定該用戶的密碼 mysql…

管理者需要的技能

管理者需要具備技術技能、人際技能和概念技能,這三種技能的內涵如下: 技術技能 專業知識與技術能力:指管理者掌握和運用某一專業領域內的知識、技術和方法的能力。這包括對特定行業的專業知識、技術流程、工具設備的熟悉和精通。例如&#x…

scala基礎學習(數據類型)-字符串

文章目錄 scala中的字符串引號單引號雙引號三引號 常用內置函數length 獲取字符串長度charAt 字符串元素訪問substring 獲取字串indexOf 獲取字串位置replace 字符串替換toLowerCase,toUpperCase 字符串大小寫轉換trim 去除首位空白符split 字符串切割以及查看startsWith,endsW…

數據庫安全-redisCouchdb

1.redis未授權訪問 默認端口:6379 1.1 Redis沙盒逃逸漏洞RCE-CVE-2022-0543 介紹:Redis 是一套開源的使用 ANSI C編寫、支持網絡、可基于內存亦可持久化的日志型、鍵值存儲數據庫,并提供多種語言的API。Redis 如果在沒有開啟認證的情況下,…

springboot集成websokcet+uniapp開發聊天原型驗證(一)

1. 整體思路 群組聊天功能實現思路 需要為每個群組維護一個對應的集合(可以是 Set 等數據結構),用來存放該群組內所有在線用戶的 WebSocketSession。當有消息發送到群組時,遍歷該群組對應的集合,向其中的每個在線用戶…

Reed-Muller(RM)碼之編碼

點個關注吧! 看了一些中文的博客,RM碼沒有很詳細的資料,所以本文嘗試給出推導原理。 推導 RM碼由 ( r , m ) ( r , m ) (r,m

List直接使用removeAll報錯

List直接使用removeAll報錯 需要先將list轉換才能使用 原因是: removeAll 方法在 Java 中用于從當前列表中刪除另一個列表中存在的所有元素。如果直接對 List 接口的一個實現使用 removeAll 方法拋出異常,可能的原因有: 不同的List實現&am…

Linux -- 線程的優點、pthread 線程庫

目錄 線程的優點 pthread 線程庫 前言 認識線程庫 簡單驗證線程的獨立棧空間 線程的優點 與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少得多。 調度進程時,CPU 中有一個 cache(緩存,提高運行效率&#xff0…

【magic-dash】01:magic-dash創建單頁面應用及二次開發

文章目錄 一、magic-dash是什么1.1 安裝1.2 使用1.2.1 查看內置項目模板1.2.2 生成指定項目模板1.2.3 查看當前magic-dash版本1.2.4 查看命令說明1.2.5 內置模板列表二、創建虛擬環境并安裝magic-dash三、magic-dash單頁工具應用開發3.1 創建單頁面項目3.1.1 使用命令行創建單頁…