TCP三次握手全方面詳解

文章目錄

  • (1) 三次握手各狀態
    • CLOSE狀態
    • SYN_SENT狀態
    • SYN_RECV狀態
    • ESTABLISHED狀態
  • (2) 為什么握手時的seqnum是隨機值,以及acknum的功能
  • (3) 三次握手中的半連接隊列(SYN隊列)和全連接隊列(ACCEPT隊列)
    • 半連接隊列
    • 全連接隊列
  • (4) 怎么緩解SYN泛洪
  • (5) TCP實現P2P
  • (6) 為什么需要三次握手?

在這里插入圖片描述

(1) 三次握手各狀態

CLOSE狀態

發起連接和listen之前的初始狀態

SYN_SENT狀態

第一次握手,客戶端向服務器發起連接請求,發送一個SYN數據包,該數據包中包含了客戶端的初始序列號等信息,用于請求與服務器建立TCP連接
SYN_SENT: 初始狀態發送SYN報文后,即進入到了SYN_SENT狀態,并等待服務端的發送三次握手中的第2個報文。

SYN_RECV狀態

第二次握手,服務器接著會向客戶端發送一個SYN+ACK數據包,這是對客戶端SYN請求的響應。該數據包包含了服務器的初始序列號以及對客戶端SYN包的確認信息,表示服務器同意與客戶端建立連接。
SYN_RCVD: 這個狀態表示LISTEN狀體時接受到了SYN報文,在正常情況下,這個狀態是服務器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態

ESTABLISHED狀態

第三次握手,客戶端收到服務器的SYN+ACK包后,會 向服務器發送一個ACK數據包 ,用于確認收到了服務器的SYN+ACK包。這個ACK包標志著客戶端和服務器之間的TCP連接已經基本建立成功,此時連接處于ESTABLISHED狀態。

當服務端收到收到ack包以后會進入ESTABLISHED狀態。

(2) 為什么握手時的seqnum是隨機值,以及acknum的功能

在第一次握手的時候,tcp包頭部的Sequence number是一個隨機值,就算自己隨便設置一個值后續的TCP連接也是可以正常運作的(上圖的seqnum = 1234),但是在第二次握手回復的TCP包中的acknum會比第一次握手的Sequence number多一(acknum 1235),這里的1235表示表示 1235以前的所有包都收到了,作用:保證了tcp包的不丟失,不重復
包括第二次握手時服務端發出的seqnum也是隨機值(4567),但是第三次握手時的acknum是seqnum+1(4568)
作用:避免被抓包以后被別人知道之前發過多少個包

(3) 三次握手中的半連接隊列(SYN隊列)和全連接隊列(ACCEPT隊列)

在這里插入圖片描述

半連接隊列

當服務器收到客戶端發送的 SYN 報文段時,會創建一個半連接節點并放進半連接隊列,該節點記錄了該連接的相關信息,如客戶端的 IP 地址、端口號等,此時連接處于半連接狀態,

SYN隊列的作用:在服務器處理能力有限的情況下,SYN 隊列可以暫時緩存客戶端的連接請求,避免因為同時處理過多連接請求而導致系統崩潰。

全連接隊列

服務器收到客戶端的ACK包后,會檢查這個ACK包的合法性和有效性,如確認序列號是否正確等。如果檢查通過,服務器會將對應的連接從SYN隊列中取出,并放入accept隊列。Accept 隊列用于存放已經完成三次握手的 TCP 連接,此時,應用程序就可以通過調用accept系統調用從accept隊列中獲取已經建立好的連接,開始進行數據傳輸等操作。

Accept隊列的作用
(1)Accept 隊列將網絡層已經建立好的連接與應用層的處理隔離開來。應用層可以按照自己的節奏從 Accept 隊列中獲取連接,而不會受到網絡層連接建立速度的直接影響。

(2)緩沖連接數據:在應用程序暫時無法處理新連接時,Accept 隊列可以作為一個緩沖區域,存儲這些已經建立的連接,避免連接因為等待處理時間過長而出現問題。

(4) 怎么緩解SYN泛洪

(1)net.ipv4.tcp_max_syn_backlog:在 Linux 系統中,該參數用于設置 SYN 隊列的最大長度。默認值通常為 1024 或 2048,可以根據服務器的性能和實際需求進行調整。
通過限制 SYN 隊列的長度,可以在一定程度上抵御 SYN Flood 攻擊。當 SYN 隊列已滿時,服務器會丟棄新的 SYN 請求,從而避免被大量偽造的 SYN 報文淹沒。

(2)somaxconn:這是系統級別的參數,用于限制 Accept 隊列的最大長度。在不同的操作系統中,默認值可能不同。例如在 Linux 中,默認值通常為 128。
listen(int socketfd, int backlog):在網絡編程中,listen 函數backlog 參數用于設置服務器端監聽套接字的 Accept 隊列長度。它會覆蓋系統默認的 somaxconn 值,但通常不能超過 somaxconn。
當 Accept 隊列已滿時,服務器會拒絕新的 SYN 請求,從而避免服務器因處理大量的 SYN 請求而耗盡資源,在一定程度上可以緩解 SYN 泛洪攻擊對服務器造成的影響。

(5) TCP實現P2P

在這里插入圖片描述
P2P中沒有客戶端和服務端的概念

(6) 為什么需要三次握手?

三次握手的主要目的是為了確認服務器端和客戶端的發送和接受能力是否正常

  • 第一次握手:客戶端發送網絡包,服務端收到了。 這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。

  • 第二次握手:服務端發包,客戶端收到了。 這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器并不能確認客戶端的接收能力是否正常。

  • 第三次握手:客戶端發包,服務端收到了。 這樣服務端就能得出結論:客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。

假設只有兩次握手。
當客戶端發送第一個SYN,但由于網絡延遲或其他原因,第一個SYN沒有及時到達服務端,于是客戶端又發送一次SYN,這次的SYN成功到達了服務端,在連接結束后,第一個SYN終于到了服務端,此時服務端以為客戶端再次發起連接請求,于是回復ACK+SYN導致再次連接再次建立,浪費資源

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

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

相關文章

數據結構與算法-遞歸

單路遞歸 二分查找 /*** 主函數:執行二分查找。* * param a 要搜索的數組(必須是已排序的)* param target 目標值* return 返回目標值在數組中的索引;如果未找到,則返回 -1*/ public static int binarySearch(int[] …

軟中斷和tasklet的區別是什么?

軟中斷和 tasklet 都是 Linux 內核中用于實現異步事件處理的機制,它們的主要區別如下: 實現機制 軟中斷:是一種基于軟件觸發的中斷機制,在內核中是一組靜態定義的、預先分配好的軟中斷向量。每個軟中斷都有一個唯一的編號和對應…

Termux安裝ssh實現電腦ssh

Termux下載 點擊下載 在 Termux 中安裝并使用 SSH,按照以下步驟操作: 1. 更新軟件包列表 pkg update && pkg upgrade2. 安裝 OpenSSH pkg install openssh3. 設置 SSH 密碼(必須,否則無法使用 SSH 服務器&#xff09…

深入理解 C++17 std::is_swappable

文章目錄 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的變體注意事項結論 深入理解 C17 std::is_swappable 引言 在 C 編程中,交換兩個對象的值是一個常見的操作。為了確保代碼的通用性和安全性&am…

51單片機之馮·諾依曼結構

一、概述 8051系列單片機將作為控制應用最基本的內容集成在一個硅片上,其內部結構如圖4-1所示。作為單一芯片的計算機,它的內部結構與一臺計算機的主機非常相似。其中微處理器相當于計算機中的CPU,由運算器和控制器兩個部分構成;…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太強~~ DeepMind 表示,他們提出的算法蒸餾(AD)是首個通過對具有模仿損失的離線數據進行順序建模以展示上下文強化學習的方法。同時基于觀察…

c#對接deepseek 聊天AI接口

注意:不是免費 對接文檔:對話補全 | DeepSeek API Docs 注冊地址:DeepSeek 申請key 在線請求示例 apifox deepseek - deepseek

23.PPT:校攝影社團-攝影比賽作品【5】

目錄 NO12345? NO6 NO7/8/9/10? 單元格背景填充表格背景填充文本框背景填充幻燈片背景格式設置添加考生文件夾下的版式 NO12345 插入幻燈片和放入圖片?快速:插入→相冊→新建相冊→文件→圖片版式→相框形狀→調整邊框寬度左下角背景圖片:視圖→…

創新領先!珈和科技獲評省級企業技術中心

為充分發揮中小企業創新主體作用,提高自主創新、集成創新和引進消化吸收再創新能力,增強創新驅動發展的動力,做好專精特新“小巨人”企業的培育工作。 近日,湖北省經信廳對申報2024年湖北省中小企業技術中心的企業進行審核認定并…

Android車機DIY開發之軟件篇(十二)編譯Automotive OS錯誤(3)

Android車機DIY開發之軟件篇(十二)編譯Automotive OS錯誤(3) 問題 [ 85% 113538/132897] //hardware/interfaces/neuralnetworks/1.1/utils:neuralnetworks_utils_hal_1_1 clang src/Device.cpp [ 85% 113539/132897] //hardware/interfaces/neuralnetworks/1.1/utils:neural…

初次體驗Tauri和Sycamore (2)

原創作者:莊曉立(LIIGO) 原創時間:2025年2月8日(首次發布時間) 原創鏈接:https://blog.csdn.net/liigo/article/details/145520637 版權所有,轉載請注明出處。 關鍵詞:Sy…

iPhone 在華銷量大幅下挫

iPhone在喬布斯時代締造的神話在中國正逐漸走向沒落,擠牙膏式的升級方式類似于諾基亞的N70系列,毫無新意的創新能力,求穩著陸的經營理念,工藝和美學不再獨領風騷,甚至拍照領域和AI增強計算,折疊屏等技術領域…

vs封裝dll 給C#使用

一,vs創建控制臺應用 創建控制臺應用得好處時,我們可以自己測試接口,如果接口沒有問題,改成dll重新編譯一遍就可以。 二, 創建一個c 類,將所需提供得功能 封裝到類中。 這樣可以將 所有功能,進…

懸鏈線的方程及其推導過程

懸鏈線的方程及其推導過程 懸鏈線是描述理想鏈條或柔軟繩索在重力作用下的自然形態的數學曲線。其特征在于:如果將一根均勻、不可伸長的鏈條兩端懸掛在固定點上,鏈條所呈現的形狀就會遵循一種特殊的曲線,這個曲線就是懸鏈線。 懸鏈線的方程…

緊跟潮流,將 DeepSeek 集成到 VSCode

Visual Studio Code(簡稱 VSCode)是一款由微軟開發的免費開源代碼編輯器,自 2015 年發布以來,憑借其輕便、強大、且擁有豐富擴展生態的特點,迅速成為了全球開發者的首選工具。VSCode 支持多平臺操作系統,包…

算法基礎之八大排序

文章目錄 概要1. 冒泡排序(Bubble Sort)2. 選擇排序(Selection Sort)3. 插入排序(Insertion Sort)4. 希爾排序(Shell Sort)5. 歸并排序(Merge Sort)6. 快速排…

html 列動態布局

樣式說明: /* 列動態布局,列之間以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }

(python)如何看自己安裝的包的版本

linux pip list | grep "numpy\|scipy\|tensorflow\|keras"windows環境下 pip list | findstr "numpy scipy tensorflow keras"輸出 numpy 1.13.1 scipy 0.19.1 tensorflow-cpu 2.4.0 tensorflow-estimator 2.4.0 tensorflow-gpu 2.4.0

從O(k*n)到O(1):如何用哈希表終結多層if判斷的性能困局

【前言】 ??本文將以哈希表重構實戰為核心,完整展示如何將傳統條件匹配邏輯(上千層if-else判斷)轉化為O(1)的哈希表高效實現。通過指紋驗證場景的代碼級解剖,您將深入理解: ??1.哈希函數設計如何規避沖突陷阱 ??2.鏈式尋址法的工程實現…

離線統信系統的python第三方庫批量安裝流程

一、關于UOS本機 操作系統&#xff1a;UOS&#xff08;基于Debian的Linux發行版&#xff09; CPU&#xff1a;海光x86 二、具體步驟 1、在聯網的電腦上用控制臺的pip命令批量下載指定版本的第三方庫 方法A cd <目標位置的絕對路徑> pip download -d . --platform many…