监听套接字

使用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;正在彻底改变艺术家们创作复杂动力学效果的方式。它以其无与伦比的灵活性、强大的计算能力和开创性的技术理念&#…