重學TCP協議(9) 半連接隊列、全連接隊列

1. 半連接隊列、全連接隊列基本概念

image.png

  1. 三次握手中,在第一步server收到client的syn后,把相關信息放到半連接隊列中,同時回復syn+ack給client(第二步),同時開啟一個定時器,如果超時還未收到 ACK 會進行 SYN+ACK 的重傳,重傳的次數由 tcp_synack_retries 值確定。在 CentOS 上這個值等于 5。;
  2. 第三步的時候server收到client的ack,如果這時全連接隊列沒滿,那么從半連接隊列拿出相關信息放入到全連接隊列中,否則按tcp_abort_on_overflow指示的執行。

1.1 tcp_abort_on_overflow

  • tcp_abort_on_overflow 為 0 表示三次握手最后一步全連接隊列滿以后 server 會丟掉 client 發過來的 ACK,服務端隨后會進行重傳 SYN+ACK。
  • tcp_abort_on_overflow 為 1 表示全連接隊列滿以后服務端直接發送 RST 給客戶端。

1.2 ss 命令

ss 命令可以查看全連接隊列的大小和當前等待 accept 的連接個數,執行 ss -lnt 即可

ss -lnt | grep :9090
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     51     50           *:9090                     *:*

Recv-Q 表示 accept 隊列排隊的連接個數,Send-Q 表示全連接隊列(也就是 accept 隊列)的總大小。

2. 半連接隊列

2.1 半連接隊列的長度

半連接隊列的大小由3個值決定:

  • 用戶層 listen 傳入的backlog
  • 系統變量 net.ipv4.tcp_max_syn_backlog,默認值為 128
  • 系統變量 net.core.somaxconn,默認值為 128

2.2 半連接隊列長度的計算過程

  1. 如果用戶傳入的 backlog 值大于系統變量 net.core.somaxconn 的值,用戶設置的 backlog 不會生效,使用系統變量值,默認為 128。

  2. 將上一步計算的backlog值穿給nr_table_entries,sysctl_max_syn_backlog 為 net.ipv4.tcp_max_syn_backlog 的值

int reqsk_queue_alloc(struct request_sock_queue *queue,unsigned int nr_table_entries)
{nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog);nr_table_entries = max_t(u32, nr_table_entries, 8);nr_table_entries = roundup_pow_of_two(nr_table_entries + 1);for (lopt->max_qlen_log = 3;(1 << lopt->max_qlen_log) < nr_table_entries;lopt->max_qlen_log++);
}
  • 在 nr_table_entries 與 sysctl_max_syn_backlog 兩者中的較小值,賦值給 nr_table_entries(因為sysctl_max_syn_backlog默認是128,如果沒有修改,產生的最大值就只能是128)
  • 在 nr_table_entries 和 8 取較大值,賦值給 nr_table_entries(最小只能是8)
  • nr_table_entries + 1 向上取求最接近的最大 2 的指數次冪(保證是2的冪次)
  • 通過 for 循環找不大于 nr_table_entries 最接近的 2 的對數值

3.全連接隊列

全連接隊列」包含了服務端所有完成了三次握手,但是還未被應用調用 accept 取走的連接隊列。此時的 socket 處于 ESTABLISHED 狀態。每次應用調用 accept() 函數會移除隊列頭的連接。如果隊列為空,accept() 通常會阻塞。全連接隊列也被稱為 Accept 隊列。

3.1 全連接隊列的長度

全連接隊列的大小由3個值決定:

  • 用戶層 listen 傳入的backlog
  • 系統變量 net.core.somaxconn,默認值為 128

3.2 全連接隊列長度的計算過程

全連接隊列的大小是 listen 傳入的 backlog 和 somaxconn 中的較小值

3.3 全連接隊列溢出的情況

image.png

  • 如上圖,150166號包是三次握手中的第三步client發送ack給server,然后150167號包中client發送了一個長度為816的包給server。

  • 因為在這個時候client認為連接建立成功(因為已經完成三次握手了),但是server上這個連接實際沒有ready(因為全連接隊列已經滿了),所以server直接丟掉client發來的ACK包,并且一段時間后,server認為自己第二次握手的syn+ack包丟包了,因此就重發syn+ack包(SYN+ACK重傳的次數是由操作系統的一個文件決定的/proc/sys/net/ipv4/tcp_synack_retries

  • 一段時間后client又收到了syn+ack包,認為第三次握手的ack丟包了,然后重傳這816個字節的ack包。一直到超時,client主動發fin包斷開該連接。

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

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

相關文章

分類預測回歸預測_我們應該如何匯總分類預測?

分類預測回歸預測If you are reading this, then you probably tried to predict who will survive the Titanic shipwreck. This Kaggle competition is a canonical example of machine learning, and a right of passage for any aspiring data scientist. What if instead …

【CZY選講·Yjq的棺材】

題目描述? Yjq想要將一個長為寬為的矩形棺材&#xff08;棺材表面絕對光滑&#xff0c;所以棺材可以任意的滑動&#xff09;拖過一個L型墓道。? 如圖所示&#xff0c;L型墓道兩個走廊的寬度分別是和&#xff0c;呈90&#xff0c;并且走廊的長度遠大于。? 現在Hja想知道對于給…

“機器換人”之潮涌向珠三角,藍領工人將何去何從

企業表示很無奈&#xff0c;由于生產需要&#xff0c;并非刻意換人。 隨著傳統產業向更加現代化、自動化的新產業轉型&#xff0c;“機器換人”似乎是歷史上不可逆轉的潮流。 據報道&#xff0c;珠三角經濟圈所在的廣東省要從傳統的制造大省向制造強省轉變&#xff0c;企業轉型…

slack通知本地服務器_通過構建自己的Slack App學習無服務器

slack通知本地服務器Serverless architecture is the industrys latest buzzword and many of the largest tech companies have begun to embrace it. 無服務器架構是業界最新的流行語&#xff0c;許多大型科技公司已開始采用它。 In this article, well learn what it is an…

深入理解InnoDB(6)—獨立表空間

InnoDB的表空間 表空間可以看做是InnoDB存儲引擎邏輯結構的最高層 &#xff0c;所有的數據都是存放在表空間中。 1. Extent 對于16KB的頁來說&#xff0c;連續的64個頁就是一個區&#xff0c;也就是說一個區默認占用1MB空間大小。 每256個區被劃分成一組,第一組的前3個頁面是…

神經網絡推理_分析神經網絡推理性能的新工具

神經網絡推理Measuring the inference time of a trained deep neural model on different hardware devices is a critical task when making deployment decisions. Should you deploy your inference on 8 Nvidia V100s, on 12 P100s, or perhaps you can use 64 CPU cores?…

Eclipse斷點調試

1.1 Eclipse斷點調試概述Eclipse的斷點調試可以查看程序的執行流程和解決程序中的bug1.2 Eclipse斷點調試常用操作:A:什么是斷點&#xff1a;就是一個標記&#xff0c;從哪里開始。B:如何設置斷點&#xff1a;你想看哪里的程序&#xff0c;你就在那個有效程序的左邊雙擊即可。C…

react部署在node_如何在沒有命令行的情況下在3分鐘內將React + Node應用程序部署到Heroku

react部署在nodeIn this tutorial we will be doing a basic React Node app deploy to Heroku. 在本教程中&#xff0c;我們將進行基本的React Node應用程序部署到Heroku。 There are a lot of tutorials that do this only using the command line, so to change things u…

深入理解InnoDB(7)—系統表空間

系統表空間 可以看到&#xff0c;系統表空間和獨立表空間的前三個頁面&#xff08;頁號分別為0、1、2&#xff0c;類型分別是FSP_HDR、IBUF_BITMAP、INODE&#xff09;的類型是一致的&#xff0c;只是頁號為3&#xff5e;7的頁面是系統表空間特有的 頁號3 SYS: Insert Buffer …

CodeForces - 869B The Eternal Immortality

題意&#xff1a;已知a,b&#xff0c;求的最后一位。 分析&#xff1a; 1、若b-a>5&#xff0c;則尾數一定為0&#xff0c;因為連續5個數的尾數要么同時包括一個5和一個偶數&#xff0c;要么包括一個0。 2、若b-a<5&#xff0c;直接暴力求即可。 #include<cstdio>…

如何在24行JavaScript中實現Redux

90% convention, 10% library. 90&#xff05;的慣例&#xff0c;10&#xff05;的圖書館。 Redux is among the most important JavaScript libraries ever created. Inspired by prior art like Flux and Elm, Redux put JavaScript functional programming on the map by i…

卡方檢驗 原理_什么是卡方檢驗及其工作原理?

卡方檢驗 原理As a data science engineer, it’s imperative that the sample data set which you pick from the data is reliable, clean, and well tested for its usability in machine learning model building.作為數據科學工程師&#xff0c;當務之急是從數據中挑選出的…

Web UI 設計(網頁設計)命名規范

Web UI 設計命名規范 一.網站設計及基本框架結構: 1. Container“container“ 就是將頁面中的所有元素包在一起的部分&#xff0c;這部分還可以命名為: “wrapper“, “wrap“, “page“.2. Header“header” 是網站頁面的頭部區域&#xff0c;一般來講&#xff0c;它包含…

leetcode 1486. 數組異或操作(位運算)

給你兩個整數&#xff0c;n 和 start 。 數組 nums 定義為&#xff1a;nums[i] start 2*i&#xff08;下標從 0 開始&#xff09;且 n nums.length 。 請返回 nums 中所有元素按位異或&#xff08;XOR&#xff09;后得到的結果。 示例 1&#xff1a; 輸入&#xff1a;n …

27個機器學習圖表翻譯_使用機器學習的信息圖表信息組織

27個機器學習圖表翻譯Infographics are crucial for presenting information in a more digestible fashion to the audience. With their usage being expanding to many (if not all) professions like journalism, science, and research, advertisements, business, the re…

在HTML中使用javascript (js高級程序設計)

在HTML中使用javascript 剛開始入門的時候覺得關于應用以及在html中只用javascript很簡單&#xff0c;不需要進行學習。我又開始重溫了一下紅寶書&#xff0c;覺得還是有必要進行學習的。這是一個筆記&#xff01; script 元素插入有多種方式 屬性使用方式async延遲腳本&#x…

大數據新手之路二:安裝Flume

Ubuntu16.04Flume1.8.0 1.下載apache-flume-1.8.0-bin.tar.gz http://flume.apache.org/download.html 2.解壓到/usr/local/flume中 3.設置配置文件/etc/profile文件&#xff0c;增加flume的路徑 ①vi /etc/profile export FLUME_HOME/usr/local/flume export PATH$PATH:$FLUME…

leetcode 1723. 完成所有工作的最短時間(二分+剪枝+回溯)

給你一個整數數組 jobs &#xff0c;其中 jobs[i] 是完成第 i 項工作要花費的時間。 請你將這些工作分配給 k 位工人。所有工作都應該分配給工人&#xff0c;且每項工作只能分配給一位工人。工人的 工作時間 是完成分配給他們的所有工作花費時間的總和。請你設計一套最佳的工作…

異步解耦_如何使用異步生成器解耦業務邏輯

異步解耦Async generators are new in JavaScript. They are a remarkable extension. They provide a simple but very powerful tool for splitting programs into smaller parts, making sources easier to write, read, maintain and test.異步生成器是JavaScript中的新增功…

函數的定義,語法,二維數組,幾個練習題

1、請將’A’,’B’,’C’存入數組&#xff0c;然后再輸出2、請將”我” “愛” “你”存入數組&#xff0c;然后正著和反著輸出3、輸入10個整數存入數組&#xff0c;然后復制到b數組中輸出4、定義一個長度為10的數組&#xff0c;循環輸入10個整數。 然后將輸入一個整數&#x…