TCP 半連接隊列和全連接隊列(結合 Linux 2.6.32 內核源碼分析)

文章目錄

  • 一、什么是 TCP 半連接隊列和全連接隊列
  • 二、TCP 全連接隊列
    • 1、如何查看進程的 TCP 全連接隊列大小?
      • 注意
    • 2、TCP 全連接隊列溢出問題
      • 注意
    • 3、TCP 全連接隊列最大長度
  • 三、TCP 半連接隊列
    • 1、TCP 半連接隊列溢出問題
    • 2、TCP 半連接隊列最大長度
    • 3、引申問題

一、什么是 TCP 半連接隊列和全連接隊列

TCP 三次握手期間,Linux 內核會維護兩個隊列,分別是:

  • 半連接隊列,也稱 SYN 隊列
  • 全連接隊列,也稱 Accept 隊列
    在這里插入圖片描述
    不管是半連接隊列還是全連接隊列,都有最大長度限制

二、TCP 全連接隊列

1、如何查看進程的 TCP 全連接隊列大小?

# -l:顯示正在監聽(listening)的 socket
# -n:不解析服務名稱
# -t:只顯示 tcp socket
$ ss -lnt  | grep 55535
State       Recv-Q Send-Q         Local Address:Port                        Peer Address:Port
LISTEN      0      5               192.168.5.28:55535                                  *:*

注意

ss 命令的 Recv-Q/Send-Q 在「LISTEN 狀態」和「非 LISTEN 狀態」所表達的含義是不同的

/* Linux Kernel 2.6.32 tcp_diag.c */
static void tcp_diag_get_info( ... )
{.../* LISTEN 狀態 */if (sk->sk_state == TCP_LISTEN) {/* 當前全連接隊列大小 */	    r->idiag_rqueue = sk->sk_ack_backlog;/* 當前全連接隊列最大長度 */r->idiag_wqueue = sk->sk_max_ack_backlog;} else {/* 已收到但未被進程讀取的字節數 */r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq;/* 已發送但未收到確認的字節數 */r->idiag_wqueue = tp->write_seq - tp->snd_una;}...
}

「LISTEN 狀態」的 Recv-Q/Send-Q 含義如下:

  • Recv-Q:當前全連接隊列大小
  • Send-Q:當前全連接隊列最大長度

2、TCP 全連接隊列溢出問題

Linux 有個參數(tcp_abort_on_overflow),可以指定在 TCP 全連接隊列滿了的情況下使用什么策略回應客戶端

/proc/sys/net/ipv4/tcp_abort_on_overflow 共有兩個值:

  • 0:全連接隊列滿了的情況下,服務端丟棄客戶端發來的 ACK 報文
  • 1:全連接隊列滿了的情況下,服務端回給客戶端 RST 報文

注意

通常情況下,應該把參數 tcp_abort_on_overflow 設為 0,這樣有利于應對突發流量

例如,TCP 全連接隊列滿了的情況下,服務端丟棄客戶端發來的 ACK 報文,但此時客戶端的連接狀態卻是 ESTABLISHED,客戶端可以在建立好的 TCP 連接上發出請求,只要服務端沒有對請求回復 ACK 應答,那么請求就會被客戶端重發,如果服務端只是因為短暫的繁忙致使全連接隊列滿了,那么當全連接隊列有空位時,再次接收到的請求報文中由于含有 ACK 標志,仍會觸發服務端建立 TCP 連接,所以,tcp_abort_on_overflow=0 可以提高連接建立的成功率

3、TCP 全連接隊列最大長度

min(somaxconn,backlog),其中,somaxconn 是 Linux 內核參數,可以通過 /proc/sys/net/core/somaxconn 調整,而 backlog 是 listen() 函數參數

/* Linux Kernel 2.6.32 socket.c */
SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{.../* /proc/sys/net/core/somaxconn */somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;/* TCP 全連接隊列最大長度 */if ((unsigned)backlog > somaxconn)backlog = somaxconn;...
}

三、TCP 半連接隊列

1、TCP 半連接隊列溢出問題

  1. 如果半連接隊列滿了,并且沒有開啟 tcp_syncookies,丟棄
  2. 如果全連接隊列滿了,并且沒有重傳 SYN+ACK 的連接請求多于 1 個,丟棄
  3. 如果沒有開啟 tcp_syncookies,并且 tcp_max_syn_backlog - 當前半連接隊列長度 < (tcp_max_syn_backlog >> 2),丟棄
/* Linux Kernel 2.6.32 tcp_ipv4.c* TCP 第一次握手的 Linux 內核代碼 */
int tcp_v4_conn_request( ... )
{.../* 條件 1* 如果半連接隊列滿了*/if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
#ifdef CONFIG_SYN_COOKIESif (sysctl_tcp_syncookies) {want_cookie = 1;} else
#endif/* 如果半連接隊列滿了,并且沒有開啟 tcp_syncookies,丟棄 */goto drop;}/* 條件 2* 如果全連接隊列滿了,并且沒有重傳 SYN+ACK 的連接請求多于 1 個,丟棄*/if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)goto drop;...if (want_cookie) {...} else if (!isn) {...if ( ... ) {...}/* 條件 3* 如果沒有開啟 tcp_syncookies,* 并且 tcp_max_syn_backlog - 當前半連接隊列長度 < (tcp_max_syn_backlog >> 2),* 丟棄*/else if (!sysctl_tcp_syncookies && sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) <(sysctl_max_syn_backlog >> 2)) && ...) {...goto drop_and_release;}...}...
}

2、TCP 半連接隊列最大長度

tcp_max_syn_backlog < min(somaxconn,backlog) ? tcp_max_syn_backlog * 2 : min(somaxconn,backlog) * 2,其中,tcp_max_syn_backlog 是 Linux 內核參數,可以通過 /proc/sys/net/ipv4/tcp_max_syn_backlog 調整
在這里插入圖片描述

3、引申問題

半連接隊列最大長度并不代表服務端處于 SYN_RCVD 狀態的最大個數

我們在上述內容中總結過 TCP 第一次握手報文被丟棄的三種條件:

  1. 如果半連接隊列滿了,并且沒有開啟 tcp_syncookies,丟棄
  2. 如果全連接隊列滿了,并且沒有重傳 SYN+ACK 的連接請求多于 1 個,丟棄
  3. 如果沒有開啟 tcp_syncookies,并且 tcp_max_syn_backlog - 當前半連接隊列長度 < (tcp_max_syn_backlog >> 2),丟棄

假設條件一不成立,也就是當前半連接隊列長度沒有超,而后的條件二也不成立,一旦滿足條件三,”半連接隊列最大長度并不代表服務端處于 SYN_RCVD 狀態的最大個數“ 結論正確,例如 somaxconn = 128, backlog = 511,tcp_max_syn_backlog = 256,計算出半連接隊列最大長度是 256,但是按照假設,一旦當前半連接隊列長度 > tcp_max_syn_backlog - (tcp_max_syn_backlog >> 2),也就是 256 - 64 = 192,SYN 報文就會被丟棄,那么此時處于 SYN_RCVD 狀態的最大個數是 193,而非 256

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

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

相關文章

linux下fabric環境搭建

參考教程&#xff1a; https://devpress.csdn.net/cloudnative/66d58e702045de334a569db3.html?dp_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MjA2MzY4NywiZXhwIjoxNzQwMzY4MDc0LCJpYXQiOjE3Mzk3NjMyNzQsInVzZXJuYW1lIjoiaHVhbmd0dXBpIn0.oh8e4F6Sw_A4SV2ODQ5W0pYK0…

Redis Pipeline介紹:提高操作Redis數據庫的執行效率

Redis Pipeline是一種用于提高Redis執行效率的技術&#xff0c;通過減少客戶端與服務器之間的通信開銷&#xff0c;顯著提升批量操作的性能。本文將詳細介紹Redis Pipeline的概念、使用場景、實現方式及其優勢。 一、Redis Pipeline的概念 Redis Pipeline是一種批處理機制&am…

linux長時間鎖屏無法喚醒

是的&#xff0c;您這么理解很直接&#xff0c;抓住了要點。 簡單來說&#xff0c;就是這樣&#xff1a; 電腦睡覺有兩種方式&#xff1a; 打個盹&#xff08;掛起/Suspend&#xff09;&#xff1a; 把工作狀態保存在內存里。這個一般和 Swap 分區沒關系。睡死過去&#xff…

STM32F103_Bootloader程序開發11 - 實現 App 安全跳轉至 Bootloader

導言 想象一下&#xff0c;我們的單片機 App 正在穩定地運行著&#xff0c;突然我們想給它升級一下&#xff0c;添加個新功能。我們該如何安全地通知它&#xff1a;“嘿&#xff0c;準備好接收新固件了” ? 這就需要 App 和 Bootloader 之間建立一個可靠的"秘密握手"…

Explain解釋

參考官方文檔&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html explain關鍵字可以分析你的查詢語句的結構和性能。 explain select查詢&#xff0c; 執行會返回執行計劃的信息。 注意&#xff1a;如果from中有子查詢&#xff0c;仍然會執行該子查詢…

選擇 PDF 轉 HTML 轉換器的 5 個關鍵特性

市面上有很多 PDF 轉 HTML 的轉換器&#xff0c;每一款產品都有不同的功能組合。要理清并理解每個功能可能會讓人感到困惑。那么&#xff0c;真正重要的是什么呢&#xff1f; 這篇文章將介紹我們認為在選擇最佳 PDF 轉 HTML 轉換器時最重要的 5 個關鍵特性&#xff1a; 1. 轉換…

使用堡塔在服務器上部署寶塔面板-linux版

使用堡塔在服務器上部署寶塔面板-linux版 使用堡塔多機管理登錄服務器 進入寶塔官網&#xff0c;獲取安裝腳本 wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec3. 在堡塔多機管理中&#xff0c;…

【Unity高級】Unity多界面游戲場景管理方案詳解

引言&#xff1a;游戲界面管理的挑戰 在Unity游戲開發中&#xff0c;尤其是包含多個功能界面&#xff08;如主菜單、關卡選擇、游戲頁面、設置和商城&#xff09;的游戲&#xff0c;如何高效管理場景與界面是架構設計的核心挑戰。本文將深入探討三種主流實現方案&#xff1a;單…

WINDOWS最快布署WEB服務器:apache2

安裝JDK下載 https://tomcat.apache.org/ Index of /dist/tomcat/tomcat-9 安裝測試 http://localhost:8080/ 替換自己的文件 把自己的文件復制到&#xff1a; C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT

Microsoft Edge 打開無反應、打開后顯示兼容性問題、卸載重裝 解決方案。一鍵卸載Microsoft Edge 。

背景&#xff1a;網絡上的瀏覽器修復、重裝、恢復默認應用測試后無用&#xff0c;以下卸載重裝方案經實測可以正常使用Microsoft Edg。 卸載軟件在資源里&#xff0c;請自取。 一、卸載軟件&#xff1a;Remove-Edge_GUI.exe 雙擊卸載等待即可。 二、在微軟商店重新安裝Micro…

Spring Boot - 參數校驗:分組校驗、自定義注解、嵌套對象全解析

01 依賴配置 在構建高效的校驗體系前&#xff0c;需先完善項目依賴配置。 以下是優化后的依賴示例&#xff1a; <dependencies><!-- Web 依賴&#xff0c;提供 RESTful 接口支持 --><dependency><groupId>org.springframework.boot</groupId>…

深入淺出多模態》(十一)之多模態經典模型:Flamingo系列

&#x1f389;AI學習星球推薦&#xff1a; GoAI的學習社區 知識星球是一個致力于提供《機器學習 | 深度學習 | CV | NLP | 大模型 | 多模態 | AIGC 》各個最新AI方向綜述、論文等成體系的學習資料&#xff0c;配有全面而有深度的專欄內容&#xff0c;包括不限于 前沿論文解讀、…

基于Pandas和FineBI的昆明職位數據分析與可視化實現(三)- 職位數據統計分析

文章目錄 一、職位數據分析1. 一級分類職位數量統計分析2. 職位二級分類分布分析3. 職位分布分析4. 工作經驗需求分布分析5. 學歷要求職位分布分析6. 企業職位供給前507. 不同規模公司的職位數量統計8. 區域職位分布分析9. 各區域平均薪資范圍分布分析10. 不同工作經驗平均薪資…

大數據Hadoop之——安裝部署hadoop

目錄 前期準備 一、JDK的安裝 1、安裝jdk 2、配置Java環境變量 3、加載環境變量 4、進行校驗 二、hadoop的環境搭建 1、hadoop的下載安裝 2、配置文件設置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置 hdfs-site.xml 2.4. 配置 yarn-site.xml 2.…

Spring IoC DI介紹

文章目錄 IoC & DI 介紹IoC介紹DI 介紹 組件注冊Bean 命名約定方法注解 Bean總結 掃描路徑DI 詳解屬性注入構造方法注入Setter 注入三種注入優缺點分析 當同一類型存在多個Bean時,直接使用Autowired會存在問題使用Primary注解使用Qualifier注解使用Bean的名稱使用Resource注…

【Flutter】解決 flutter_inappwebview在 Windows 上使用導致應用閃退問題

問題背景 在 Windows 11 上運行 Flutter 桌面應用時&#xff0c;應用出現閃退現象。通過系統事件日志分析&#xff0c;發現是 MSVCP140.dll 模塊的訪問沖突異常&#xff08;錯誤代碼 c0000005&#xff09;導致的崩潰。 問題分析 1. 錯誤現象 應用啟動后立即閃退Windows 事件…

使用 JavaScript、Mastra 和 Elasticsearch 構建一個具備代理能力的 RAG 助手

作者&#xff1a;來自 Elastic JD Armada 了解如何在 JavaScript 生態系統中構建 AI 代理。 Elasticsearch 與業界領先的生成式 AI 工具和服務商有原生集成。查看我們的網絡研討會&#xff0c;了解如何超越 RAG 基礎&#xff0c;或使用 Elastic 向量數據庫構建可投入生產的應用…

Active Directory 環境下 Linux Samba 文件共享服務建設方案

Active Directory 環境下 Linux Samba 文件共享服務建設方案 目錄 需求分析方案總體設計技術架構與選型詳細部署規劃共享文件性能測試非域終端共享配置運維與權限安全管理建議1. 需求分析 因某公司(編的)新增多個部門,各部門之間存在多類型終端系統,但又有同時訪問文件庫…

Python爬蟲網安-項目-簡單網站爬取

源碼&#xff1a; https://github.com/Wist-fully/Attack/tree/pc pc_p1 目標&#xff1a; 1.進入列表頁&#xff0c;順著列表爬取每個電影詳情頁 2.利用正則來提取&#xff0c;海報&#xff0c;名稱&#xff0c;類別&#xff0c;上映的時間&#xff0c;評分&#xff0c;劇…

Golang中的數組

Golang Array和以往認知的數組有很大不同。有點像Python中的列表 1. 數組&#xff1a;是同一種數據類型的固定長度的序列。 2. 數組定義&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;數組長度必須是常量&#xff0c;且是類型的組成部分。一…