TCP的三次握手和四次揮手

文章目錄

  • 三次握手
  • 四次揮手
    • TIME_WAIT
    • CLOSE_WAIT
  • 使用wireshark觀察

三次握手

握手的最終目的是主機之間建立連接

首先要有兩個預備知識點

  1. 三次握手建立連接不一定會成功,其中最擔心的就是最后一次握手失敗,不過會有配套的解決方案
  2. 建立好連接后是需要被操作系統統一管理起來的。也就是說連接不是隨便一連就完事了,操作系統會經過描述組織后管理起來每一次的連接,又因為維護是需要成本的因而連接并不是建立多少個都可以的

對現實生活來說,都是客戶端主動去向服務端請求連接。

  1. 第一次握手:客戶端向服務端發送連接請求,TCP報文是有類型的,請求建立連接則TCP報頭的SYN置1,也就是發送SYN類型的報文,代表申請連接。當客戶端發出請求后,此時的狀態為SYN_SENT
  2. 第二次握手:服務端接收到請求,由于應答機制則會返回應答,且應答中有著同意連接的響應,因而服務端返回的報文類型為SYN和ACK。當客戶端接收到應答時,注意此時的客戶端就已經認為連接成功了,但是服務端并沒有認為連接成功,對于TCP而言兩端是獨立的。當服務端發出應答后,狀態為SYN_REVD
  3. 第三次握手:客戶端接收到應答后,再向服務端返回一次應答。當服務端接收到應答之后,才會認為連接成功了

image-20230814152140636

那么問題來了,既然三次握手可以建立連接,那么一次,兩次,四次等可不可以呢

  1. 對于一次和兩次而言:上述提到了建立連接后操作系統需要對每個連接維護起來,那么維護需要成本。如果只有一次握手,那么客戶端每一次發送請求后,服務端一收到就建立連接成功了。那么如果有很多客戶端都發來請求,那么服務端就會承受不住這么多連接了,這就會出現安全問題導致SYN洪水問題并且一次兩次握手都只能單向的建立連接,不能確保可靠性。一次握手時,客戶端沒有收到服務端的應答,就不知道服務端收到了請求并已經建立好連接了。兩次握手時,服務端沒有收到客戶端的應答,就不知道客戶端已經收到了響應并建立好了連接
  2. 那么對于三次以上:其實三次以上的握手都是可以的,因為都能確保雙向收到應答確保可靠性。但是這樣建立連接的效率不高,時間會更長,因為網絡通信是需要成本的。

因此,三次握手是可以用最小的成本驗證是否建立好連接,并且可以有效的防止單機進行對服務器的攻擊

四次揮手

揮手的最終目的是:為了斷開主機間的連接

  1. 第一次揮手:主動斷開連接端向被動斷開連接端發送FIN類型報文,代表不再發送數據,需要斷開連接。
  2. 第二次揮手:被動斷開連接端收到主動斷開連接端的請求,返回應答,此時被動斷開端為CLOSE_WAIT狀態。
  3. 第三次揮手:被動斷開端向主動端發送FIN類型報文,代表不再發送數據,斷開連接。此時被動端為LAST_ACK狀態
  4. 第四次揮手:主動段收到報文后,向被動端發送應答。主動端此時為TIME_WAIT狀態。被動端收到應答后,至此四次揮手完成,連接全部斷開

注意上述的不再發送數據,這里的數據指的是用戶數據,也就是報文中的有效載荷。因為底層還是會交互管理的報文,只不過是上層會關閉掉套接字文件

image-20230814155039202

主動斷開連接端揮手的最終的狀態為TIME_WAIT。被動斷開連接段兩次揮手后會變為CLOSE_WAIT狀態

和雙方誰是客戶端誰是服務端沒有關系,在TCP看來兩端的地位是平等的

TIME_WAIT

主動斷開連接端在揮手完成后需要保持一段時間的TIME_WAIT狀態,為什么呢?

  1. 為了盡量確保最后一次的ACK被對方收到
  2. IME_WAIT狀態允許操作系統完全釋放與TCP連接相關的資源,比如可以在釋放該連接的所有相關資源之前確保該連接在網絡中的所有數據已經被刪除
  3. 如果一個新的TCP連接想要使用與之前CLOSED狀態的連接相同的源IP地址和源端口號,而且該連接的目的IP地址和目的端口號與剛關閉的連接相同,那么TIME_WAIT狀態可以防止舊連接的數據干擾新連接的數據。

TIME_WAIT狀態一般會維持 2 * MSL的時間

MSL:報文的最大壽命,以防止TCP報文在網絡中循環傳遞,避免網絡擁塞或因網絡故障導致報文無法到達目的地。根據操作系統的 不同值不同,在Centos7中默認為60s。

因此如果是服務器在連接過程中關閉了進程,那么就是服務器主動斷開連接,此時是不能夠立即重啟該端口的。但是也有辦法可以立即重啟

調用setsockopt接口,設置socket描述符的選項SO_REUSEADDR為1, 表示允許創建端口號相同但IP地址不同的多個socket描述符

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

CLOSE_WAIT

CLOSE_WAIT狀態的維持是非常短暫的,只要被動斷開端發出斷開請求后,這個狀態就沒有了,也就是第三次揮手。

如果服務器中出現大量的CLOSE_WAIT,這種情況可能是因為

  1. 出現bug,沒有做出關閉套接字文件描述符
  2. 服務器壓力太大,可能一直在給客戶端推送數據,來不及關閉文件

如果這個狀態出現的太久,可能會導致資源浪費和連接數量上限的問題。

使用wireshark觀察

首先觀察握手過程

image-20230814164144203

再看看揮手過程

image-20230814164212984

為什么會只出現3次揮手呢?

實際上是因為TCP具有捎帶應答機制,導致第二和第三次揮手重疊在一起了

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

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

相關文章

【重溫老古董——Strust2框架】基于Idea使用maven創建Strust2項目

1、新建項目 紅色圈出的部分是【強制】,其他部分看個人喜好。 2、修改 pom 文件,管理依賴 <dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.5.22</version></dependency&g…

微服務中RestTemplate訪問其他服務返回值轉換問題

背景&#xff1a; 接收一個springcloud項目&#xff0c;UI模塊訪問其他服務的接口&#xff0c;返回數據統一都是使用fastjson進行轉換&#xff0c;但是新開發了幾個新模塊之后發現fastjson很多bug&#xff08;各種內存溢出&#xff09;&#xff0c;但是很多地方已經重度依賴fa…

數據結構:力扣OJ題(每日一練)

目錄 題一&#xff1a;環形鏈表 思路一&#xff1a; 題二&#xff1a;復制帶隨機指針的鏈表 思路一&#xff1a; 本人實力有限可能對一些地方解釋的不夠清晰&#xff0c;可以自己嘗試讀代碼&#xff0c;望海涵&#xff01; 題一&#xff1a;環形鏈表 給定一個鏈表的頭節點…

IDEA如何調試Stream API

Stream API現在在實際開發中應用非常廣泛&#xff0c;經常會遇到需要調試Stream API的場景&#xff0c;這篇文章主要講解如何使用IDEA調試Stream Testpublic void test(){Stream.of(10, 20, 30, 40, 50).mapToInt(e->e*10).filter(e->e>200).forEach(System.out::pri…

使用css實現時間線布局(TimeLine)

前言 在使用uni-app開發微信小程序過程中&#xff0c;遇到了時間軸布局&#xff0c;由于每項的內容高度不一致&#xff0c;使用uniapp自帶的擴展組件uni-steps&#xff0c;樣式布局無法對齊豎線&#xff0c;于是自己造輪子&#xff0c;完成特殊的布局。顯示效果如下&#xff1…

linux shell變量

linux shell變量 1、變量命名規則2、只讀變量3、刪除變量 1、變量命名規則 變量名不能加$命名只能使用英文字母、數字和下劃線&#xff0c;首個字母不能以數字開頭中間不能有空格。可以有下劃線不能使用標點符號不能使用bash中的關鍵字 username"tom"引用 $userna…

WebDAV之π-Disk·派盤+Commander One

Commander one是一款為Mac用戶設計的雙窗格文件管理器,Commander One專業版在原先的版本功能擁有較大的提升。Commander One PRO可以幫助大家將文件從一個地方復制到另一個地方,支持多標簽瀏覽、搜索、自定義熱鍵設置、顯示隱藏文件等功能。 π-Disk派盤 – 知識管理專家 派…

(一)創建型設計模式:4、原型模式(Prototype Pattern)

目錄 1、原型模式的含義 2、C實現原型模式的簡單實例 1、原型模式的含義 通過復制現有對象來創建新對象&#xff0c;而無需依賴于顯式的構造函數或工廠方法&#xff0c;同時又能保證性能。 The prototype pattern is a creational design pattern in software development. …

【校招VIP】java語言考點之Map1.7和1.8

考點介紹&#xff1a; HashMap是大中小廠面試的高頻考點&#xff0c;主要從底層結構&#xff0c;和線程安全等角度來進行考察&#xff0c;考察點比較集中&#xff0c;但是有一定難度。 分為初級和高級兩種&#xff1a;初級一般集中在中小公司的map的key-value的可重復和可空問題…

Server - WandB 統計運行 Epoch 以及 手動上傳日志

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132227253 WandB (Weights & Biases) 是在線的模型訓練可視化工具&#xff0c;可以幫助跟蹤機器學習項目&#xff0c;記錄運行中的超參數和輸…

linux shell快速入門

linux shell快速入門 0 、前置1、簡單使用 0 、前置 一安裝linux的虛擬環境 1、簡單使用 1、新建/usr/shell目錄 2、新建hello.sh 文件 3、編寫腳本文件# !/bin/bashecho "hello world"查看是否具備執行權限 新增執行權限 chomd x hello.sh執行hello.sh文件 /b…

限制編輯下的PDF可以轉換其他格式嗎?這2個方法可行

我們知道&#xff0c;PDF可以通過設置“限制編輯”來保護文件不被隨意更改&#xff0c;那PDF設置了“限制編輯”還可以轉換其他格式嗎&#xff1f; 如果PDF設置的是禁止任何更改的“限制編輯”&#xff0c;那PDF菜單【轉換】界面下的格式選項就會呈現灰色狀態&#xff0c;無法…

vscode的配置和使用

1.側邊欄調整大小 放大&#xff1a;View -> Appearance -> Zoom in&#xff08;快捷鍵Ctrl &#xff09; 縮小&#xff1a;View -> Appearance -> Zoom out&#xff08;快捷鍵Ctrl -&#xff09; 側邊欄字體調整到合適大小后&#xff0c;可以按下一步調整代碼區…

【java】Java與SQLite3數據庫類型之間對應關系

引 在開發應用程序時&#xff0c;經常需要將數據存儲到數據庫中。SQLite3 是一種輕量級的嵌入式數據庫&#xff0c;廣泛應用于移動設備和嵌入式系統。在使用 SQLite3 數據庫時&#xff0c;了解 Java 數據類型與 SQLite3 數據庫類型之間的對應關系非常重要&#xff0c;以便正確…

一盞茶的時間,帶你輕松上手Pinia

&#x1f3ac; 岸邊的風&#xff1a;個人主頁 &#x1f525; 個人專欄 :《 VUE 》 《 javaScript 》 ?? 生活的理想&#xff0c;就是為了理想的生活 ! 目錄 &#x1f4da; 前言 &#x1f4d8; 創建 Pinia &#x1f4d8; Option Store &#x1f4d8; Pinia 提供多種選項配…

k8s pod啟動報錯: no route to host

k8s pod kuboard啟動報錯 查看pod命令 kubectl get pods -A kubectl get pods --all-namespaces查看報錯pod日志 命令&#xff1a; kubectl logs -f -n namespace nametime"2023-08-09T13:40:3608:00" levelerror msg"不能獲取 AgentEndpointsGet \"http:/…

在 Linux 中使用 systemd 注冊服務

Systemd 是一種現代的 Linux 系統初始化系統和服務管理器。它旨在管理系統服務的初始化、配置和控制。Systemd 的一個關鍵特性是它可以管理服務&#xff0c;這些服務是為系統提供特定功能的后臺進程。在本指南中&#xff0c;我們將探討如何使用 systemd 在 Linux 中注冊服務。 …

【算法基礎20-單調棧】

算法原理: 用單調遞增棧&#xff0c;當該元素可以入棧的時候&#xff0c;棧頂元素就是它左側第一個比它小的元素。 以&#xff1a;3 4 2 7 5 為例&#xff0c;過程如下&#xff1a; 動態模擬過程 題目&#xff1a; 給定一個長度為 N 的整數數列&#xff0c;輸出每個數左邊第一…

Linux 基礎(九)軟件包管理

軟件包管理 概念軟件包管理工具Red Hat 系RPMrpm安裝rpm卸載 YUM&#xff08;推薦&#xff09;源倉庫管理常見國內 yum 源更換源&#xff08;非必須&#xff0c;除非下載速度確實過慢&#xff09; YUM管理軟件 Debian 系源倉庫管理常見國內 apt 源更換源&#xff08;非必須&…

postman入門基礎 —— 接口測試流程

一、編寫接口測試計劃 接口測試計劃和功能測試計劃目標一致&#xff0c;都是為了確認需求、確定測試環境、確定測試方法&#xff0c;為設計測試用例做準備&#xff0c;初步制定接口測試進度方案。一般來說&#xff0c;接口測試計劃包括概述、測試資源、測試功能、測試重點、測試…