【计网】理解TCP全连接队列与tcpdump抓包

理解TCP全连接队列与tcpdump抓包
- 1 TCP 全连接队列
- 1.1 重谈listen函数
- 1.2 初步理解全连接队列
- 1.3 深入理解全连接队列
- 2 tcpdump抓包
1 TCP 全连接队列
1.1 重谈listen函数
这里我们使用之前实现的tcp_echo_server的客户端与服务端。
我们来看listen
LISTEN(2) Linux Programmer's Manual
NAMElisten - listen for connections on a socketSYNOPSIS#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);
这里的第二个参数我们之前设置的是一个const常量,但是这个到底代表什么含义呢?今天我们就来学习一下。
当我们启动客户端和服务端时,我们能够通过netstat -natp查找到建立的两个连接!

分别是客户端到服务端与服务端到客户端的连接!我们将服务端的的accept注释掉来看:
void Loop(){_isrunning = true;while (_isrunning){sleep(1);// accept接收sockfd// struct sockaddr_in client;// socklen_t len = sizeof(client);// int sockfd = ::accept(_listensockfd, (struct sockaddr *)&client, &len);// if (sockfd < 0)// {// LOG(WARNING, "accept error\n");// sleep(1);// continue;// }// InetAddr addr(client);// // 读取数据// LOG(INFO, "get a new link, client info : %s, sockfd is : %d\n", addr.AddrStr().c_str(), sockfd);// version 4 --- 线程池版本// task_t t = std::bind(&TcpServer::Service , this , sockfd , addr);// ThreadPool<task_t>::GetInstance()->Equeue(t);}
这里的服务端的启动后,就只进行了初始化套接字文件,不会进行accept!

我们看这个结果中,服务端和客户端还是建立起了连接!也就是说三次握手建立连接的过程与服务端是否进行accept无关!
当我们启动多个客户端进程之后,会发现有一些客户端进程的连接处于SYN_SENT状态,因为在服务器来不及进行accept的时候,底层的TCP listen sock 允许用户进行三次握手建立连接,但是不能建立太多!**这个数量就是backlog + 1!**而维护的成功连接在操作系统维护的数据结构就是全连接队列!
- listen函数中 backlog 的含义就是全连接队列中已经建立三次握手成功的个数!
这时我们就能够理解listen函数的两个参数了!
- int sockfd:sockfd是调用socket函数创建的套接字文件描述符。在调用listen之前,服务器应用程序必须先用socket函数创建一个套接字,一般使用bind函数将其绑定到一个本地地址和端口上。
- int backlog:backlog指定了在拒绝新的连接请求之前,系统应该为该套接字排队的最大连接数量。这个参数对防止过载很有用,它控制了未完成连接(SYN_RCVD状态)队列和已完成但还未被应用程序的accept调用接收的连接(ESTABLISHED状态)队列的总和的大小。
1.2 初步理解全连接队列
在操作系统中有应用层,传输层,网络层…在传输层中有一个接收队列accept_queue,建立连接时就进行三次握手。操作系统中用户访问的网站多种多样,并且会并发的运行,所以在操作系统内部一定是要通过数据结构来进行管理的!
- 连接本质就是操作系统内核中的一批数据结构!
在传输层中将这个数据结构放入队列中进行管理!应用层会调用accept获取连接,传输层就会返回给一个文件描述符供应用层使用,通过这个文件描述符,应用层就可以进行通信!这个队列就是全连接队列!
当应用层非常忙,来不及accept,那么全连接队列中会挤压连接,这个总数不能超过 backlog !这个并不代表服务端只能同时处理 backlog + 1个连接。全连接队列中的连接表示连接成功但来不及及时处理的连接!
- 全连接队列的本质就是生产消费模型,应用层从其中获取资源,传输层向其中放入资源!这个队列保证了在应用层较忙时无法获取连接时,可以先将一些连接维护起来,等待应用层调用,这样可以大大提升效率,提高连接吞吐量!增加服务端闲置率,减少给用户提供服务的效率和体验!
1.3 深入理解全连接队列
当服务器启动时,本质上是启动一个进程,那么就会有对应的task_struct。在这个结构体中都会有struct files_struct!其中包含文件描述符表struct file*fd_array[],每个元素都指向文件结构体struct file。
当创建网络套接字时,会创建一个struct socket结构体!在内核中时这样一个结构:

可以看到struct socket结构体内部有一个struct file结构体,但是未来我们是想通过文件描述符找到对应的套接字,然后进行读取数据。可是现在是struct socket结构体内部有一个struct file结构体,如果通过struct file结构体找到套接字呢?
在struct file结构体有一个指针void* private_data,这个指针指向struct socket结构体。这样两个结构体就联系起来了!
struct socket结构体是网络Socket的入口,其内部还包含一个const struct proto_ops结构体

这是一个方法集,集合了bind,connect…一系列的函数指针!
虽然我们struct socket结构体是内核中的套接字结构,但建立连接时真实的数据结构是tcp_sock结构体!

这是TCP套接字,其中包含了慢启动算法阈值,拥塞窗口大小,关联进程…一系列TCP协议中的对应字段!这个tcp_sock就是三次握手时候建立的结构体!其中的第一个成员struct inet_connection_sock是复制连接属性的!这里就包含连接的相关信息。全连接队列就在这个结构体中!

这里有超时重传的触发时间,TCP 连接的状态,握手失败重试次数,全连接队列…等数据。
全连接队列中时这样的结构:

struct inet_connection_sock中的第一个成员是struct inet_sock结构体,这是网络层的结构体。

struct inet_sock结构体其中包含了目的端口号,源端口号,目的 IP 地址和源 IP 地址等数据!更重要的是其中第一个成员是struct sock结构体,里面包含着报文的一些属性。这是整个tcp_sock中最底层的结构体,其中有两个字段:接收队列和发送队列
struct sk_buff_head sk_receive_queue;
struct sk_buff_head sk_write_queue;
这两个队列对于网络通信至关重要,因为它们直接参与了数据的接收和发送过程。今天不详细讲解。
我们再回过来看struct socket,其中有一个结构体指针struct sock* sk,这个指针可以指向tcp_sock中最底层的struct sock结构体,然后可以通过类型转换,最终读取到整个tcp_sock结构体!也就是说,这个指针指向了tcp_sock结构体!这是C风格的多态!
同样的创建UDP套接字时,udp_sock的第一个成员是struct inet_sock结构体(因为udp不需要连接所以没有包含连接属性结构体)。那么最终也是一个struct sock结构体,所以也可以通过C风格的多态实现!
通过基类struct socket,我们可以进行tcp和udp的通信,所以说他是网络socket的入口。

此时,我们看上图,可以直观的理解套接字的结构。每当创建网络套接字时就会创建一个socket文件。这个文件中会指向通用socket,这个通用socket可以指向TCP结构体或UDP结构体。
三次握手建立一个连接时,主要是创建tcp_sock或udp_sock, 两者的区别就是是否包含连接属性结构体!然后就将这个结构体放入到全连接队列中去!获取连接时,会通过sock_map_fd方法,将sock套接字转换为文件描述符!
2 tcpdump抓包
现在我们已经学习完毕了TCP协议的内容,熟悉了TCP报头结构中各个字段的意义,了解了三次握手和四次挥手的过程。接下来我们落实一下动手能力—进行抓包。
Linux系统中我们使用TCPDump :TCPDump 是一款强大的网络分析工具, 主要用于捕获和分析网络上传输的数据包。
tcpdump 通常已经预装在大多数 Linux 发行版中。 如果没有安装, 可以使用包管理器进行安装。 例如 Ubuntu系统可以使用以下命令安装:
sudo apt-get update
sudo apt-get install tcpdump
我们接下来在我们的云服务器进行一些抓包!

通过 sudo tcpdump -i any tcp命令,我们可以看到实时传输的数据包!
- -i any 指定捕获所有网络接口上的数据包, i 可以理解成为 interface “界面”的意思.
- tcp 指定捕获 TCP 协议的数据包。
我们如果想要捕获特定源或目的源IP地址的TCP报文呢?
使用 host 关键字可以指定源或目的 IP 地址。 例如, 要捕获源 IP 地址为192.168.1.100 的 TCP 报文, 可以使用以下命令:
$ sudo tcpdump src host 192.168.1.100 and tcp
要捕获目的 IP 地址为 192.168.1.200 的 TCP 报文, 可以使用以下命令:
$ sudo tcpdump dst host 192.168.1.200 and tcp
同时指定源和目的 IP 地址, 可以使用 and 关键字连接两个条件:
$ sudo tcpdump src host 192.168.1.100 and dst host 192.168.1.200 and tcp
我们如果想要捕获特定端口的TCP报文呢?
使用 port 关键字可以指定端口号。 例如, 要捕获端口号为 80 的 TCP 报文(通常是HTTP 请求), 可以使用以下命令:
$ sudo tcpdump port 80 and tcp
保存捕获的数据包到文件与读取
使用 -w 选项可以将捕获的数据包保存到文件中, 以便后续分析。 例如:
$ sudo tcpdump -i eth0 port 80 -w data.pcap
这将把捕获到的 HTTP 流量保存到名为 data.pcap 的文件中。
• 了解: pcap 后缀的文件通常与 PCAP(Packet Capture) 文件格式相关, 这是一种用于捕获网络数据包的文件格式,不能通过直接的cat读取!
使用 -r 选项可以从文件中读取数据包进行分析。 例如:
sudo tcpdump -r data.pcap
注意事项
- 使用 tcpdump 时, 请确保你有足够的权限来捕获网络接口上的数据包。 通常, 你需要以 root 用户身份运行 tcpdump。
- 使用 tcpdump 的时候, 有些主机名会被云服务器解释成为随机的主机名, 如果不想要, 就用-n 选项
- 主机观察三次握手的第三次握手, 不占序号
通过抓包我们可以验证三次握手和四次挥手的过程:

可以看到是第一次是SYN请求,第二次是SYN+ACK,第三次是ACK!通信过程中也把窗口大小确定了!

可以看到四次会受到过程!这里因为服务端和客户端同时断开连接,所以中间两次的挥手合并为一次通信,通过ACK序号和确认序号可以确定!!!我们可以通过sleep将服务端和客户端断开的时间错开

这样就是完整的四次挥手!
相关文章:
【计网】理解TCP全连接队列与tcpdump抓包
希望是火,失望是烟, 生活就是一边点火,一边冒烟。 理解TCP全连接队列与tcpdump抓包 1 TCP 全连接队列1.1 重谈listen函数1.2 初步理解全连接队列1.3 深入理解全连接队列 2 tcpdump抓包 1 TCP 全连接队列 1.1 重谈listen函数 这里我们使用…...
react18中实现简易增删改查useReducer搭配useContext的高级用法
useReducer和useContext前面有单独介绍过,上手不难,现在我们把这两个api结合起来使用,该怎么用?还是结合之前的简易增删改查的demo,熟悉vue的应该可以看出,useReducer类似于vuex,useContext类似…...
排序算法 —— 冒泡排序
目录 1.冒泡排序的思想 2.冒泡排序的实现 3.冒泡排序的总结 1.冒泡排序的思想 冒泡排序的思想就是在待排序序列中依次比较相邻两个元素,将大的or小的元素往后挪,每一趟都能保证将至少一个元素挪动到正确的位置,然后在待排序序列中重复该过…...
QT--文本框 QLineEdit、qtextedit
在Qt中,文本框(QLineEdit 或 QTextEdit)和标签(QLabel)是两种不同的部件(widget),它们的主要区别在于用途和功能: QLabel(标签) 用途࿱…...
Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu
一、使用说明 1.1 设备模拟-Com 第一步,填写要模拟的设备地址,0表示自动处理,也就是收到什么地址就应答什么地址。第二步,填写对应的串口号和波特率。第三步,单击打开串口,成功后会变成关闭串口字样。单击…...
Standard_Matrix
文章目录 假设我们有一个样本矩阵X,每一列表示一个样本,现在我们要把样本转换成均值为0,方差为1的样本矩阵 X s t a n d a r d X − μ s \begin{equation} X_{standard}\frac{X-\mu}{s} \end{equation} XstandardsX−μpython 测试…...
js 通过input,怎么把选择的txt文件转为base64格式
文章目录 基本概念与作用说明Base64编码File对象相互转换的意义 从File对象到Base64编码从Base64编码到File对象批量转换File对象为Base64编码批量转换Base64编码为File对象功能使用思路思路一:动态生成预览思路二:异步处理与用户反馈思路三:…...
华为HCIP-openEuler认证详解
华为HCIP认证(Huawei Certified ICT Professional)是华为提供的专业级ICT技术认证,它旨在验证技术人员在特定技术领域的专业知识和实践能力。对于华为欧拉(openEuler)方向的HCIP认证,即HCIP-openEuler&…...
YOLO11改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码+小白必备】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在本文中,给大家带来的教程是…...
sentinel原理源码分析系列(四)-ContextEntry
启动和初始化完成后,调用者调用受保护资源,触发sentinel的机制,首先构建或获取Context和获取Entry,然后进入插槽链,决定调用是否通过,怎样通过 上图展示构建Context和获取Entry的类互动图 获取或构建Conte…...
Tcp协议讲解与守护进程
TCP协议:面向链接,面向字节流,可靠通信 创建tcp_server 1.创建套接字 域:依旧选择AF_INET 连接方式: 选择SOCK_STREAM 可靠的 2.bind 3.监听装置 client要通信,要先建立连接࿰…...
学习threejs,THREE.LineDashedMaterial 虚线材质,基于gosper高斯帕曲线生成雪花动画
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.LineDashedMaterial虚…...
LeetCode 热题100之哈希
1.两数之和 思路分析1(暴力法) 双重循环枚举满足num[i] nums[j] target的索引,刚开始不知道如何返回一对索引。后来知道可以直接通过return {i,j}返回索引;注意:j应该从i1处开始,避免使用两次相同的元素…...
软工——模块设计(爱啦爱啦)
过程设计的工具 一、程序流程图 程序流程图又称为程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法。 它的主要优点是对控制流程的描绘很直观,便于初学者掌握。 程序流程图历史悠久,至今仍在广泛使用着。 程序流程图的主要缺点&a…...
Xmind一款极简思维导图和头脑风暴软件,支持PC和移动端,Xmind 2024.10.01101版本如何升级到Pro版?简单操作,最新可用!
文章目录 Xmind下载安装Xmind免费升级到Pro Xmind 是一款全功能的思维导图和头脑风暴软件,不限制节点和文件数,创新无限,界面纯净简洁无广告,支持PC和移动端,思维导图和大纲视图自由切换,可本地化文档存储&…...
自动化工具:Ansible
目录 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 三、安装部署Ansible 1、环境部署 2、管理节点安装 Ansible 3、查看Ansible相关文件 4、配置主机清单 5、免密管理 ssh-keygen 5.1、测试连通性 5.2、简洁输…...
我是类(最终版)
文章目录 再看构造函数类型转换static静态成员友元内部类匿名对象对象拷贝时的编译器优化 再看构造函数 本标题的目的是解决如下问题:当实现MyQueue时,我们不需要写默认构造函数,因为编译器会调用Stack的默认构造,但是࿰…...
详解ip route
ip route命令用于查看 Linux 系统中的路由表信息。 路由表包含的主要信息 目标网络地址(Destination) 显示网络的目标地址,可以是一个具体的网络地址(如192.168.1.0/24),也可以是一个默认网络(…...
OpenGL进阶系列04 - OpenGL 点精灵
一:概述 OpenGL 点精灵是一种渲染技术,用于在3D场景中渲染小的、可缩放的点。它们通常用于表示粒子效果、光源或其他小物体。点精灵会根据视图和投影矩阵自动调整大小,使其始终在屏幕上保持一致的视觉效果。实现时,点精灵通常通过使用纹理和适当的着色器来增加视觉效果。 …...
VSCode按ctrl与鼠标左键无法实现跳转的解决办法
vscode编译环境老是出问题,下面介绍两种解决方法 需要提前配置好代码编译需要的库以及编译器位置等等。 ctrlshiftp,输入 >C/C配置(JSON) 打开生成的c_cpp_properties.json {"configurations": [{"name": "Li…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
