全連接隊列

監聽套接字

使用socket接口創建一個套接字,然后bind給套接字綁定地址,最后listen將套接字設置為監聽套接字。監聽套接字以前理解是三元組標識,后面看了netstat,覺得應該是五元組,只不過它這個五元組是{協議,本地ip,本地端口,0.0.0.0,*},也就是對端的地址無論是ip還是port都是任意的,我們既可以三元組也可以五元組,這個不重要

理解 listen 接口

int listen(int sockfd, int backlog);

第一個參數很easy,不就是套接字文件描述符嘛,主要看第二個backlog,這個參數是用來指定監聽套接字的全連接隊列大小的,linux中全連接隊列大小通常是backlog+1

結合代碼理解全連接隊列

test_server.cc
#include "tcp_socket.hpp"
int main(int argc, char* argv[]) {
if (argc != 3) {
printf("Usage ./test_server [ip] [port]\n");
return 1;
}
TcpSocket sock;
bool ret = sock.Bind(argv[1], atoi(argv[2]));
if (!ret) {
return 1;
}
ret = sock.Listen(2);
if (!ret) {
return 1;
}
// 客戶端不進行 accept
while (1) {
sleep(1);
}
return 0;
}
test_client.cc
#include "tcp_socket.hpp"
int main(int argc, char* argv[]) {
if (argc != 3) {
printf("Usage ./test_client [ip] [port]\n");
return 1;
}
TcpSocket sock;
bool ret = sock.Connect(argv[1], atoi(argv[2]));
if (ret) {
printf("connect ok\n");
} else {
printf("connect failed\n");
}
while (1) {
sleep(1);
}
return 0;
}

服務器端創建好監聽套接字,并設置backlog為2,那全連接隊列大小就是3,后面服務器端一直死循環,不進行accept。前三個客戶端過程都一樣,進行創建套接字,然后connect開始三次握手,發送SYN包,服務器端收到后在監聽套接字的半連接隊列里創建struct request_sock,然后響應SYN+ACK包,客戶端主機收到后,進程從套接字通用等待隊列上喚醒,喚醒后connect執行完畢返回,也會進入死循環,當然這要等進程重新被調度再走這些,在收到包后還要返回ACK包,服務器端收到后會將監聽套接字半連接隊列中的struct request_sock升級成全連接隊列中的struct sock,三個客戶端都是這個式,我們來看第4個客戶端,客戶端同樣connect觸發三次握手發送SYN包,服務器端收到后同樣的在監聽套接字的半連接隊列中創建對應結構,然后響應SYN+ACK包,客戶端收到后,進程被喚醒,然后響應ACK包,服務器端收到后因為全連接隊列滿了,那半連接隊列中的struct request_sock就沒法升級,所以該通信套接字會卡在SYN_RECV,客戶端的通信套接字卻因為收到了SYN+ACK所以是ESTABLISHED狀態

netstat -anptu查看一下

ProtoRecv-QSend-QLocal AddressForeign AddressStatePID/Program
tcp330.0.0.0:90900.0.0.0:*LISTEN9084/./test_server
tcp00127.0.0.1:9090127.0.0.1:48178SYN_RECV-
tcp00127.0.0.1:9090127.0.0.1:48176ESTABLISHED-
tcp00127.0.0.1:48178127.0.0.1:9090ESTABLISHED9140/./test_client
tcp00127.0.0.1:48174127.0.0.1:9090ESTABLISHED9087/./test_client
tcp00127.0.0.1:48176127.0.0.1:9090ESTABLISHED9088/./test_client
tcp00127.0.0.1:48172127.0.0.1:9090ESTABLISHED9086/./test_client
tcp00127.0.0.1:9090127.0.0.1:48174ESTABLISHED-
tcp00127.0.0.1:9090127.0.0.1:48172ESTABLISHED-

客戶端的四個通信套接字全是ESTABLISHED,沒問題,服務器端一個LISTEN套接字,三個ESTABLISHED,一個SYN_RECV,和我們預期一摸一樣

netstat命令

netstat其中一個作用是查看套接字

(1) 查看所有 TCP 連接??

netstat -ant

  • -a:顯示所有連接(包括監聽和通信)
  • -n:顯示數字
  • -t:僅顯示 TCP 連接

??(2) 查看所有 UDP 連接??

netstat -anu

  • -u:僅顯示 UDP 連接

??(3) 查看監聽狀態的端口??

netstat -tuln

  • -l:僅顯示監聽(LISTEN)狀態的套接字

??(3) 最常用的配合

?netstat -anptu?

屬性行中Recv-Q和Send-Q是什么?

ProtoRecv-QSend-QLocal AddressForeign AddressStatePID/Program

1. 基礎概念??

字段全稱作用范圍單位
Recv-QReceive Queue接收隊列字節
Send-QSend Queue發送隊列字節

??2. 不同狀態下的含義??

??(1) 對于?LISTEN?狀態的套接字(服務端)??
  • ??Recv-Q??:
    已完成三次握手,全連接隊列中等待被?accept()?系統調用取走的連接數。
    示例Recv-Q: 5?表示全連接隊列中有 5 個連接等待處理。

  • ??Send-Q??:
    全連接隊列的最大長度,linux中為backlog+1。
    示例Send-Q: 128?表示全連接隊列的大小為 128。

??(2) 對于 ESTABLISHED 狀態的套接字(已建立的連接)??
  • ??Recv-Q??:
    內核已接收但??應用層未讀取??的數據量(堆積在接收緩沖區)。
    正常情況:應為 0 或較小值。若持續增長,可能表示應用層讀取過慢。

  • ??Send-Q??:
    已發送但??未收到對方 ACK?? 應答的數據量(在發送緩沖區中等待確認)。
    正常情況:在網絡無擁塞時應快速清零。若持續增長,可能表示網絡延遲或丟包。

TCP 套接字狀態解析??

netstat?輸出的?State?列顯示 TCP 連接狀態,常見狀態如下:

??狀態????含義????典型場景??
??LISTEN??服務器正在監聽端口,等待客戶端連接(bind()?+?listen()?后)sshd?監聽 22 端口
??SYN_SENT??客戶端發送 SYN 后等待 SYN+ACK(主動連接中)curl google.com?發起連接時
??SYN_RECV??服務器收到 SYN 并回復 SYN+ACK,等待 ACK(半連接狀態)SYN Flood 攻擊時大量出現
??ESTABLISHED??連接已建立,數據可正常傳輸正常 HTTP 請求、SSH 會話
??FIN_WAIT1??主動關閉方發送 FIN,等待對方 ACK客戶端調用?close()?后
??FIN_WAIT2??收到對端 ACK,等待對端 FIN四次揮手的中間狀態
??TIME_WAIT??主動關閉方收到 FIN 后進入,等待 2MSL(防止舊連接數據干擾新連接)服務器重啟后短時間殘留
??CLOSE_WAIT??被動關閉方收到 FIN 后進入,等待應用層調用?close()應用未正確關閉連接時堆積
??LAST_ACK??被動關閉方發送 FIN 后,等待最終 ACK即將完全關閉連接
??CLOSED??連接已完全關閉(通常不會在?netstat?中顯示)-

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

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

相關文章

JavaWeb-JSP

JSP JSP就是模板引擎 Template,因為看到的jsp是模板不變的,如果想讓頁面發生改變,就是自己添加java代碼改變頁面。有Java代碼,Tomcat服務器就會對jsp模板進行解析,解析完之后就是Servlet(java類&#xff09…

大模型中常說的Token到底是什么?和Cookie和Session有什么區別?一文講清

什么是Token(令牌)Acesss Token是訪問資源接口(API)時所需要的資源憑證。簡單token的組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的一定長…

RAGFlow:檢索增強生成技術的高效實現與深度探索

在當今信息爆炸的時代,如何從海量的數據中快速、準確地獲取并利用有價值的信息,成為了眾多領域面臨的關鍵挑戰。檢索增強生成(Retrieval-Augmented Generation, RAG)技術應運而生,它將信息檢索與大型語言模型&#xff…

【軌物洞見】光伏逆變器數據:分布式電站價值回歸的“第一塊多米諾骨牌”

1. 逆變器:光伏電站的核心“數據心臟” 逆變器是將光伏組件產生的直流電轉換為交流電的關鍵設備,其性能直接影響著整個電站的效率與穩定性。對其電壓、電流、功率參數以及故障告警信息進行遠程數據采集,是實現精細化運維和預測性維護的起點。…

如何在 npm 上發布 Element Plus 二次封裝組件

在一次開發中,小李接到一個重要的任務:將 Element Plus 中的時間組件根據團隊的獨特需求進行二次封裝。他靈機一動,決定將這個自定義組件打包成一個 npm 包,以便團隊的其他小伙伴們可以快速、方便地使用。接下來,讓我們…

vue2使用v-viewer圖片預覽:打開頁面自動預覽,禁止關閉預覽,解決在微信瀏覽器的頁面點擊事件老是觸發預覽初始化的問題

1、安裝: npm install v-viewer viewerjs2、在 main.js 中全局注冊: import Viewer from v-viewer; import viewerjs/dist/viewer.css; Vue.use(Viewer ); //配置項(可選,根據需求調整) // Vue.use(Viewer, { // d…

開源 Arkts 鴻蒙應用 開發(八)多媒體--相冊和相機

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發,公司安排開發app,臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 Arkts …

無線通信資源分配相關算法

1.Maximum Clique First (MCF)是一種啟發式圖著色算法(heuristic graph coloring algorithm),它的核心思想是:優先為圖中最大團(maximum clique)中的頂點分配不同的顏色,然后再依次為其他頂點上…

Kafka監控體系搭建:基于Prometheus+JMX+Grafana的全方位性能觀測方案

為什么需要Kafka監控監控架構概述步驟一:部署JMX Exporter 1.1 下載JMX Agent1.2 創建指標暴露配置 步驟二:配置Kafka集成JMX 2.1 啟動參數配置2.2 驗證指標暴露 步驟三:配置Prometheus采集 3.1 修改Prometheus配置3.2 驗證數據采集 步驟四&a…

stack 和 queue

目錄 一、stack 1.1 stack 的介紹 1.2 stack的使用 1)最小棧 2)棧的彈出壓入序列 3)逆波蘭表達式求值 1.3 stack 的模擬使用 二、queue 2.1 queue的介紹 2.2 queue的使用 2.3 queue的模擬使用 三、容器適配器 3.1 什么是容器適配…

sqlsuger 子表獲取主表中的一個字段的寫法

在使用 SQL 語言進行數據庫操作時,如果你想要從子表獲取數據,同時關聯到主表中的一個字段,通常我們會使用 SQL 的 JOIN 語句。JOIN 語句允許你通過一個或多個共同的字段將兩個或多個表連接起來。這里我將展示幾種常見的 JOIN 類型&#xff08…

Docker配置Gitlab-runner實現自動化容器化部署前端項目

疊甲前言 本文僅作為個人學習GitLab的CI/CD功能記錄,不適合作為專業性指導,如有紕漏,煩請君指正。 云主機注冊Gitlab Runner 自動化構建部署的弊端 在前一文中,我們在Linux云主機上注冊了Gitlab-runner, 每次在gitlab流水線上發…

MySQL介紹和MySQL包安裝

文章目錄MySQL介紹和安裝1.MySQL介紹1.1 MySQL 的定義1.2 MySQL 的特點1.3 MySQL 的應用領域1.4 MySQL 的存儲引擎1.5 MySQL 的架構1.6 MySQL 的優勢和局限性1.7 MySQL 的未來發展趨勢2.MySQL安裝2.1 主機初始化2.1.1 設置網卡名2.1.2 設置ip地址2.1.3 配置鏡像源2.1.4 關閉防火…

J2EE模式---視圖助手模式

視圖助手模式基礎概念視圖助手模式(View Helper Pattern)是一種結構型設計模式,其核心思想是將視圖層中復雜的邏輯提取到獨立的助手類中,使視圖代碼更加簡潔、易于維護。視圖助手通常提供一系列工具方法,用于處理格式化…

開源的語音合成大模型-Cosyvoice使用介紹

1 模型概覽 CosyVoice 是由阿里巴巴達摩院通義實驗室開發的新一代生成式語音合成大模型系列,其核心目標是通過大模型技術深度融合文本理解與語音生成,實現高度擬人化的語音合成體驗。該系列包含初代 CosyVoice 及其升級版 CosyVoice 2.0,兩者…

深度學習·CLIP

CLIP 數據大小 4億個文本-圖像對,而且是高質量的 預訓練方法 Text encoder“The text sequence is bracketed with [SOS] and [EOS] tokens and the activations of the highest layer of the transformer at the [EOS] token are used as the feature representati…

美光MTFC8GAKAJCN-4M_IT型eMMC應用介紹

1.1 芯片訂購信息美光MTFC8GAKAJCN-4M_IT型eMMC,容量8GB,153-ball VFBGA封裝。1.2 eMMC料號含義2.1 特性?多媒體卡(MMC)控制器和NAND閃存?153球FBGA封裝(符合RoHS標準,環保封裝)?VCC&#xf…

面向對象分析與設計40講(6)設計原則之開閉原則

文章目錄 一、概念 二、示例(C++ 實現) 1. 違反開閉原則的示例 2. 遵循開閉原則的示例 一、概念 開閉原則(Open-Closed Principle,OCP)是面向對象設計中的重要原則,由 Bertrand Meyer 提出,核心思想可以概括為:對擴展開放,對修改關閉。 具體來說,一個軟件實體(如類…

[Linux入門] Linux 網絡設置入門:從查看、測試到配置全攻略

目錄 一、查看網絡信息&#xff1a;了解你的網絡狀態 1??核心工具&#xff1a;ip命令&#xff08;替代ifconfig&#xff09; <1> 基本語法&#xff1a; <2> 實用操作示例&#xff1a; 2??查看路由表&#xff1a;route命令 3??查看網絡連接狀態&#xf…

TyFlow:三維領域的粒子特效革命者

在動態模擬與視覺特效領域&#xff0c;??TyFlow?? 作為 3ds Max 中誕生的一款革命性粒子系統插件&#xff08;后來也支持獨立開發&#xff09;&#xff0c;正在徹底改變藝術家們創作復雜動力學效果的方式。它以其無與倫比的靈活性、強大的計算能力和開創性的技術理念&#…