扩展— TCP 全连接队列与 tcpdump 抓包
前言在 Linux 网络编程开发中listen() 函数的第二个参数backlog是容易被初学者忽略的知识点。大多数开发者仅知道该参数和连接排队相关但不了解内核存在半连接队列、全连接队列两套独立管理结构一旦并发连接量超过队列上限会出现客户端连接超时、建链失败等问题。本文结合完整 C TCP 服务端 / 客户端实验、数据结构图解、netstat状态观测、tcpdump命令行抓包完整拆解 TCP 双队列底层逻辑配套可复现的实操案例所有内容基于本科计算机网络、Linux 系统编程体系无复杂度解析适合网络编程入门和知识学习。一、TCP 两套连接队列1.1 三次握手与双队列分工TCP 建立连接需要三次握手Linux 内核协议栈为监听端口维护两套独立队列分别管理握手不同阶段的连接请求两套队列各司其职互不干扰半连接队列存储服务器收到客户端SYN报文、回复SYNACK但尚未收到客户端第三次握手ACK的连接。全连接队列客户端完成三次握手、连接进入ESTABLISHED状态但应用程序未调用accept()从内核取出的连接。1.2 backlog 参数backlog仅约束全连接队列结论全连接队列最大有效长度 backlog 1。同时系统全局参数net.core.somaxconn会对队列上限做兜底限制最终生效长度取min(backlog1, somaxconn)线上高并发服务需同步调高该内核参数避免队列提前溢出。队列溢出后果当全连接队列填满新完成三次握手的连接无法存入队列内核不会回复 RST 重置报文客户端会持续重传第三次握手 ACK最终出现连接超时失败服务端侧新连接长期停留在SYN_RECV状态无法转为ESTABLISHED。二、TCP 双队列复现实验2.1 设计思路服务端逻辑调用Bind绑定端口Listen(2)设置 backlog2永久不调用 accept ()所有完成握手的连接全部积压在全连接队列。客户端逻辑循环发起 TCP 连接不主动断开预期现象backlog2全连接队列最大容量为 3启动 3 个客户端可正常建立ESTABLISHED连接启动第 4 个客户端时第四个连接停留在SYN_RECV无法进入全连接队列。2.2 源代码2.2.1 服务端 test_server.cc#include tcp_socket.hpp #include cstdio #include unistd.h int main(int argc, char* argv[]) { // 参数校验./test_server [ip] [port] 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) { printf(Bind failed\n); return 1; } // listen第二个参数backlog2 ret sock.Listen(2); if (!ret) { printf(Listen failed\n); return 1; } // 核心不调用accept所有连接积压在内核全连接队列 while (1) { sleep(1); } return 0; }2.2.2 客户端 test_client.cc#include tcp_socket.hpp #include cstdio #include unistd.h 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; }2.3 步骤与状态观测编译运行服务端./test_server 127.0.0.1 9090依次打开 3 个终端启动客户端./test_client 127.0.0.1 9090执行netstat -an | grep 9090查看连接状态服务端监听端口tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN3 组双向ESTABLISHED连接内核全连接队列未满4启动第 4 个客户端再次执行netstat 观测新增一条服务端侧状态为SYN_RECV的记录客户端侧显示ESTABLISHED。原因客户端已完成三次握手并收到服务端 SYNACK本地连接置为 ESTABLISHED但服务端全连接队列已满无法将该连接从半连接队列迁移至全连接队列服务端持续停留在SYN_RECV。三、TCP 数据结构图解3.1 层级关系用户态进程到 TCP 传输控制块的内核层级调用链路task_structLinux 进程核心结构体包含struct files_struct文件描述符管理结构fd_array[ ]文件描述符数组每个 fd 指向独立struct filestruct file私有数据private_data绑定struct socket套接字结构struct socket持有通用传输控制块struct sockstruct sock为多态基类衍生inet_sock、tcp_sock所有 TCP 连接的收发缓冲区、半 / 全连接队列、状态标识全部存储在tcp_sock结构体中是内核管理 TCP 连接的底层载体。3.2 sk_buffsk_buff是 Linux 网络协议栈承载单个数据包的标准容器网卡收发、TCP 队列排队的数据包全部封装为该结构四个指针划分内存区域head整块缓冲区内存起始地址data当前有效协议数据起始可前后移动用于动态增删二层 / IP/TCP 头部tail当前有效数据末尾end缓冲区内存边界内存分区从前往后依次为头空间、二层帧头、IP 头、TCP 头、应用层数据、尾空间。头部 / 尾部预留空闲空间协议栈处理报文时无需拷贝数据仅移动指针即可完成头部增减提升网络性能。图中nr_frags 2代表数据包存在分片分片数据通过frag_list链表挂载适合大报文分段存储。四、tcpdump 命令行抓包tcpdump是 Linux 原生命令行抓包工具无需图形界面适合服务器线上故障排查支持精准过滤 IP、端口、TCP 标志位抓包文件可导出.pcap格式在 Wireshark 中可视化分析。4.1 安装Ubuntu/Debian 系列sudo apt-get update sudo apt-get install tcpdumpCentOS/RHEL 系列sudo yum install tcpdump注意tcpdump 必须 root 权限运行普通用户执行需加sudo前缀。4.2 抓包命令分类4.2.1 按网络接口# 捕获所有网卡全部TCP报文 sudo tcpdump -i any tcp # 仅捕获eth0网卡流量 sudo tcpdump -i eth0 tcp参数说明-i指定网络接口any匹配本机全部网卡末尾tcp过滤仅保留 TCP 协议报文。4.2.2 按源/目的 IP 报文# 捕获源IP 127.0.0.1的TCP包 sudo tcpdump src host 127.0.0.1 and tcp # 捕获发往127.0.0.1的TCP包 sudo tcpdump dst host 127.0.0.1 and tcp # 双向过滤仅抓取127.0.0.1与192.168.1.10交互流量 sudo tcpdump src host 127.0.0.1 and dst host 192.168.1.10 and tcp4.2.3 按端口过滤# 抓取9090端口所有TCP流量服务端监听端口 sudo tcpdump port 9090 and tcp4.2.4 抓包存储# 将9090端口抓包数据保存至test.pcap sudo tcpdump -i any port 9090 -w test.pcap # 离线读取pcap文件分析数据包 tcpdump -r test.pcap4.3 注意事项-n不反向解析主机名、端口名称避免云服务器 DNS 解析延迟、乱码主机名线上抓包必加-v/-vv/-vvv逐级提升报文打印详细程度查看 TCP 序列号、窗口大小、校验和第三次握手纯 ACK 报文数据长度为 0无应用层负载。结语TCP 连接队列是网络编程底层核心基础看似简单的listen函数背后涉及完整内核队列管理机制。本文通过可复现 C 实验代码、内核结构体图解、命令行抓包实验覆盖理论、代码、观测完整链路。读者们可本地搭建实验环境修改 backlog 参数重复观测队列溢出现象加深对 TCP 内核双队列模型的理解。

相关新闻

C++ ADO远程访问Oracle数据库:环境配置、核心代码与性能优化

C++ ADO远程访问Oracle数据库:环境配置、核心代码与性能优化

1. 项目概述:为什么选择C与ADO进行Oracle远程访问?在众多企业级应用的后台,尤其是那些运行在Windows平台上的历史遗留系统或高性能中间件,C与Oracle数据库的组合依然是一个坚如磐石的经典架构。当项目需求明确指向“远程访问”时&…

2026/10/29 18:34:11 阅读更多 →
嵌入式C++安全编码实践与内存管理优化

嵌入式C++安全编码实践与内存管理优化

1. 嵌入式C安全编码概述在资源受限的嵌入式环境中,C因其高效性和面向对象特性成为主流开发语言。但嵌入式系统的特殊性(如实时性要求、内存限制、长期运行等)使得安全编码比传统软件开发更为关键。我曾参与过医疗设备控制系统的开发&#xff…

2026/10/28 23:14:40 阅读更多 →
《说文解字》白话译本选择与使用指南:从汉字结构到文化解读

《说文解字》白话译本选择与使用指南:从汉字结构到文化解读

1. 为什么《说文解字》值得读,但很多人读不下去《说文解字》是东汉许慎编撰的第一部系统分析汉字字形、考究字源的字典,收录了9353个汉字,按540个部首编排。这本书被称作“字圣经典”,是因为它不仅是查古字的工具,更是…

2026/10/30 17:03:06 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/31 0:19:11 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/31 10:20:19 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/31 10:20:23 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/31 0:59:28 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/31 10:30:19 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/31 9:29:43 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 17:32:24 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 11:00:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 0:09:01 阅读更多 →