系統性能優化-6 TCP 三次握手

系統性能優化-6 TCP 三次握手

TCP 三次握手

image-20250626113832542

客戶端優化

客戶端發送 SYN 給服務器		此時客戶端連接狀態:SYN_SENT

如果服務器繁忙或中間網絡不暢,客戶端會重發 SYN,重試的次數由 tcp_syn_retries 參數控制,默認是 6 次,第 1 次重試發生在 1 秒鐘后,接著會以翻倍的方式在第 2、4、8、16、32 秒共做 6 次重試,最后一次重試會等待 64 秒,如果仍然沒有返回 ACK,才會終止三次握手。所以,總耗時是 1+2+4+8+16+32+64=127 秒,超過 2 分鐘。

因此,對于內網中通訊時,就可以適當調低重試次數,盡快把錯誤暴露給應用程序。

sysctl net.ipv4.tcp_syn_retries

服務端優化

服務器發送 SYN+ACK 給客戶端				    此時服務端連接狀態:SYN_RECV
客戶端收到 SYN+ACK 發送 ACK+數據 到服務端 	 此時客戶端連接狀態:Established

服務器收到 SYN 報文后,自動回復 SYN + ACK,并把連接放入半連接隊列,當半連接隊列已滿,就無法再建立新連接了

# 查詢服務器因 SYN 半連接隊列滿而丟棄的新連接,是一個【累計值】
netstat -s | grep "SYNs to LISTEN"# 當發現這個值在一直增加時,可以適當增大半連接隊列長度
## 查看當前最大半連接隊伍長度
sysctl net.ipv4.tcp_max_syn_backlog
## 通過這個文件修改后 sysctl -p 即可生效
vim /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 1024

不過開啟 syncookies 功能就可以在不使用 SYN 隊列的情況下成功建立連接。修改 tcp_syncookies 參數即可,其中值為 0 時表示關閉該功能,2 表示無條件開啟功能,而 1 則表示僅當 SYN 半連接隊列放不下時,再啟用它。由于 syncookie 僅用于應對 SYN 泛洪攻擊(攻擊者惡意構造大量的 SYN 報文發送給服務器,造成 SYN 半連接隊列溢出,導致正常客戶端的連接無法建立),這種方式建立的連接,許多 TCP 特性都無法使用。所以,應當把 tcp_syncookies 設置為 1,僅在隊列滿時再啟用。

# 開啟 syncookies 
vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
sysctl -p

如果服務器發送 syn 和 ack 后一直沒有回應,就會重發,修改重發次數的方法是,調整 tcp_synack_retries 參數:

# 查看 syn ack 的重發次數
sysctl net.ipv4.tcp_synack_retries# 默認值, 1,2,4,8,32 最多等待 63 秒
net.ipv4.tcp_synack_retries = 5
服務端收到 ack + 數據,將連接從半連接隊列移入已連接隊列		服務端連接狀態進入Established

服務器收到 ack 后,就會把連接從 SYN 半連接隊列 移入到 accept 隊列,等待進程調用 accept 函數時把連接取出來。如果進程一直不取,accept 隊列就會溢出,最終導致建立好的 TCP 連接被丟棄。可以選擇向客戶端發送 RST 復位報文,告訴客戶端連接已經建立失敗。

# 默認為 0 不開啟,這樣更有利于應對突發流量,因為此時客戶端的狀態是已連接,就會開始發送報文,只要服務器不回復 ack,就會重發,當服務器不再繁忙,再次接收到的請求報文由于含有 ACK,仍然會觸發服務器端成功建立連接。
tcp_abort_on_overflow = 0
# listen 函數的 backlog 參數就可以設置 accept 隊列的大小,但是同時受到 linux 系統閾值的限制
# Linux 系統級的隊列長度上限
net.core.somaxconn = 128
# 查看各監聽端口上的 accept 隊列長度
ss -ltn# 查看有多少個連接因為隊列溢出而被丟棄
netstat -s | grep "listen queue"

如果持續不斷地有連接因為 accept 隊列溢出被丟棄,就應該調大 backlog 以及 somaxconn 參數。

調查顯示:三次握手消耗的時間,在 HTTP 請求完成的時間占比在 10% 到 30% 之間。因此,Google 提出了 TCP fast open 方案(簡稱TFO),客戶端可以在首個 SYN 報文中就攜帶請求,這節省了 1 個 RTT 的時間

TFO 通訊分為兩個階段,第一階段為首次建立連接,這時走正常的三次握手,但在客戶端的 SYN 報文會明確地告訴服務器它想使用 TFO 功能,這樣服務器會把客戶端 IP 地址用只有自己知道的密鑰加密(比如 AES 加密算法),作為 Cookie 攜帶在返回的 SYN+ACK 報文中,客戶端收到后會將 Cookie 緩存在本地。

之后,如果客戶端再次向服務器建立連接,就可以在第一個 SYN 報文中攜帶請求數據,同時還要附帶緩存的 Cookie。很顯然,這種通訊方式下不能再采用經典的“先 connect 再 write 請求”這種編程方法,而要改用 sendto 或者 sendmsg 函數才能實現。

服務器收到后,會用自己的密鑰驗證 Cookie 是否合法,驗證通過后連接才算建立成功,再把請求交給進程處理,同時給客戶端返回 SYN+ACK。雖然客戶端收到后還會返回 ACK,但服務器不等收到 ACK 就可以發送 HTTP 響應了,這就減少了握手帶來的 1 個 RTT 的時間消耗。

image-20250626133725986

# 該功能需要客戶端和服務端同時支持,第 1 個比特位為 1 時,表示作為客戶端時支持 TFO;第 2 個比特位為 1 時,表示作為服務器時支持 TFO,因此該值為3時(0x11),表示完全支持 TFO
sysctl net.ipv4.tcp_fastopen

為了確保安全及用戶 IP 會變(如 DHCP ),Cookie 值會隔一段時間變化一次。

[TCP Fast Open --TFO ](https://www.cnblogs.com/codestack/p/18112952)

總結一下文中出現的配置項:

  • net.ipv4.tcp_syn_retries 客戶端等待服務端回復 syn+ack 時的最大重試次數,默認為6,分別在 1 + 2 + 4 + 8 + 16 + 32 秒時重試,最后一次重試等待 64 秒,總耗時 127 秒
  • net.ipv4.tcp_max_syn_backlog 服務端最大的 SYN 半連接隊列長度,默認 1024,如果設置的過小,會導致無法建立新連接,netstat -s | grep "SYNs to LISTEN" 指令可以獲得由于半連接隊列已滿而引發的 SYN 丟棄個數
  • net.ipv4.tcp_syncookies 服務端在半連接隊列滿的情況下依然可以建立連接,0 表示關閉該功能,2 表示無條件開啟功能,而 1 則表示僅當 SYN 半連接隊列放不下時,再啟用。這種方式建立的連接,許多 TCP 特性都無法使用,應當設置為 1
  • net.ipv4.tcp_synack_retries 服務端等待客戶端回復針對 syn+ack 的 ack 的重試次數,默認為 5,最后一次重試后等待 32 秒,總耗時 63 秒。
  • net.ipv4.tcp_abort_on_overflow 當 accept 全連接隊列已滿,是否立即中止連接向客戶端發送 RST 復位報文,默認為 0 不開啟,可以更有利于應對突發流量(該連接會暫存在半連接隊列,等客戶端重發 ack 后續還是可以再建立連接),只有非常肯定 accept 隊列會長期溢出時,才能設置為 1 以盡快通知客戶端。
  • net.core.somaxconn Linux 系統級的隊列長度上限,與 listen 函數的 backlog 參數配合可以調整 accept 隊列的長度
  • net.ipv4.tcp_fastopen TFO 技術,第 1 個 bit 位表示作為客戶端是否支持,第 2 個 bit 位表示作為服務端是否支持。

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

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

相關文章

WPF 實現自定義彈窗輸入功能

1.前端實現 <Grid><Grid.RowDefinitions><RowDefinition Height"60" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0.1&qu…

WPF中Converter基礎用法

IValueConverter 1.創建一個類集成接口IValueConverter,并實現 2在xaml中引入 舉例 性別用int來表示&#xff0c;1為男&#xff0c;2為女 核心代碼 創建GenderConverter繼承IValueConverter public class GenderConverter : IValueConverter {//model->view轉換public…

Postgresql的json充當字典應用

一般我們會將一些系統參數放到參數表中&#xff0c;有些參數的值是json結構&#xff0c;那么如何在查詢時引用這些參數&#xff1f;&#xff1f; 比如我在業務表的的xxx_type,或xxx_status記錄的是key,又想在查詢的時候顯示其描述。 先定義字典 如下圖如何應用 Postgresql對j…

Dify全面升級:打造極致智能應用開發體驗,攜手奇墨科技共拓AI新生態

智能應用開發平臺Dify以六大核心功能升級與深度性能優化&#xff0c;重新定義AI開發效率與體驗。本次更新不僅響應了開發者社區的迫切需求&#xff0c;更通過與云計算領域先鋒奇墨科技的戰略合作&#xff0c;為企業提供了從開發到部署的全鏈路智能化解決方案。 .技術領先&#…

關于uniapp開發阻止事件冒泡問題

背景。uniapp開發微信小程序。在使用兩個組件拼接嵌套使用后&#xff0c;發現問題&#xff0c;會誤操作跳轉到更多頁面。下圖中兩個事件若不使用stop修飾符&#xff0c;會相互影響。若點擊uni-list-item會串行觸發uni-card的handledoctorlist方法。 產生上面問題原因是組件之間…

箭頭函數和普通函數的區別?

箭頭函數&#xff08;Arrow Functions&#xff09;和普通函數&#xff08;傳統函數&#xff09;在 JavaScript 中有顯著的區別&#xff0c;主要體現在語法、this 的綁定、構造函數行為、參數處理等方面。以下是詳細對比&#xff1a; 1. 語法差異 普通函數&#xff1a; functio…

Linux系統日志與守護進程開發實戰指南

Linux系統日志與守護進程開發實戰指南 系統日志與守護進程 ├── 系統日志syslog │ ├── 日志路徑: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守護進程daemon└── 創建步驟├── um…

Vue.js 過濾器詳解

Vue.js 過濾器詳解 下面我將詳細講解Vue.js中過濾器的語法和使用注意事項&#xff0c;并提供一個完整的演示頁面。 過濾器基本概念 在Vue.js中&#xff0c;過濾器&#xff08;Filters&#xff09; 是用于文本格式化的功能&#xff0c;可以在雙花括號插值和v-bind表達式中使用…

【iOS】iOS崩潰總結

【iOS】iOS崩潰總結 一、前言 之前寫了一篇博文《【Flutter】程序報錯導致的灰屏總結》&#xff0c;瀏覽量、收藏率和點贊量還挺高&#xff0c;還被收錄了&#xff0c;就想著總結一下iOS崩潰&#xff0c;這個也是在iOS面試中經常被問到的。 在 iOS 開發過程中&#xff0c;導致…

機器學習:特征向量與數據維數概念

特征向量與數據維數概念 一、特征向量與維數的定義 特征向量與特征類別 在機器學習和數據處理中&#xff0c;每個樣本通常由多個特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一張圖片的特征可能包括顏色、形狀、紋理等&#xff1b;一個客戶的特征可能包括年齡…

開發基于Jeston Orin Nx 開發版 16G的實現

一、基本配置 1.配置參數 密碼&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 終端輸入命令&#xff1a;sudo jtop 其中Jetpack是英偉達提供的專門供它自己的嵌入式計算機平臺使用的人工智能包。 終…

【技術分享】XR技術體系淺析:VR、AR與MR的區別、聯系與應用實踐

XR技術體系淺析&#xff1a;VR、AR與MR的區別、聯系與應用實踐 作者&#xff1a;EQ 雪梨蛋花湯 本文是技術分享文檔&#xff0c;淺析VR&#xff08;虛擬現實&#xff09;、AR&#xff08;增強現實&#xff09;、MR&#xff08;混合現實&#xff09;的定義、特性、技術演進路線&…

R語言入門課| 05 一文掌握R語言常見數據類型

視頻教程 大家可以先做一做R語言基礎小測驗&#xff0c;看看自己是否需要跟我們5.5h入門R語言的課程。 先上教程視頻&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整視頻回放和答疑服務可見&#xff1a;5.5h入門R語言 本節課程視頻…

vRDMA 發布,助力云上 VPC 內高性能通信

資料來源&#xff1a;火山引擎-開發者社區 近日&#xff0c;火山引擎基于部分云服務器實例規格邀測發布 vRDMA 特性&#xff0c;提供云上 VPC 內大規模 RDMA 加速能力&#xff0c;可兼容傳統 HPC 應用、AI 應用以及傳統 TCP/IP 應用&#xff0c;降低大眾化場景的適配門檻&#…

Win10安裝dify

一、win10虛擬化設置&#xff0c;控制面板中開啟如下三個服務 二、檢查確認wls服務開啟 設置自動啟動并啟動 確認服務開啟 bcdedit 是否為auto&#xff0c;如果不是&#xff0c;設置為auto bcdedit /set hypervisorlaunchtype autocpu是否為虛擬化 更新wsl wsl --update二 …

【ai學習筆記】GitLab

CI/CD&#xff08;持續集成/持續交付&#xff09;是現代軟件開發中的關鍵實踐&#xff0c;通過自動化工具可以大幅提升開發效率和軟件質量。下面為你介紹CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持續集成&#xff08;CI&#xff09;&#xff1…

Solidity 從 0 到 1 |Web3 開發入門免費共學營

開啟你的 Web3 開發之旅&#xff0c;從 Sonic 開始&#xff01; 想進入區塊鏈開發的世界&#xff0c;卻不知道從哪里開始&#xff1f;選擇對的語言和平臺&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合約開發語言&#xff0c;被廣泛應用于以太坊及其…

【unitrix】 4.4 類型級整數比較系統(cmp.rs)

一、源碼 這段代碼實現了一個類型級別的整數比較系統&#xff0c;允許在編譯時進行整數比較操作。它定義了一套類型來表示比較結果&#xff0c;并為不同類型的整數實現了比較邏輯。 use core::cmp::Ordering; use core::default::Default; use crate::sealed::Sealed; use cr…

2025年滲透測試面試題總結-2025年HW(護網面試) 14(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 1. SQL注入原理 &#x1f4a5; 2. XXE攻擊&#xff08;XML外部實體注入&#xff09; &#x1f9e9; 3. SQ…

Android開發根據滑動距離標題欄進行漸變

Android開發根據滑動距離標題欄進行漸變 假設滑動控件是NestedScrollView。 先監聽NestedScrollView的滑動距離&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…