Linux内核对连接的组织和全连接队列

一、Linux内核的组织形式

1.1 描述“连接”的结构

        TCP协议的特点是面向连接,一个服务端可能会被多个客户端连接,那这些连接也一定会被操作系统组织起来,接下来我们谈一谈在Linux内核中是如何管理这些连接的。

        既然要管理这些连接,首先就需要 “ 先描述在组织 ” ,即这些连接的本质都是结构体字段。在Linux中对于TCP协议就是 struct tcp_sock 结构体,该结构体是在TCP连接建立时创建的。在接收到一个有效的SYN包并准备发送SYN-ACK包时,内核会创建一个新的 struct tcp_sock 实例来存储与该连接相关的所有信息。该结构体还包含了实现TCP协议各种功能所需的字段和算法,包括连接的建立、数据的传输、连接的关闭等。同时,struct tcp_sock 还提供了与TCP流量控制和拥塞控制相关的字段和算法。

        struct tcp_sock 结构体的第一个成员是 struct inet_connection_sock 结构体,这个结构体包含了管理面向连接协议(如 TCP)所需的各种字段。用于处理连接的建立、维护、关闭等过程,以及实现协议的各种特性。

        而 struct inet_connection_sock 结构体的第一个成员是 struct inet_sock 它提供了管理套接字所需的所有基本结构和功能,包括端口的绑定、IP地址的分配、套接字选项的处理以及路由信息的缓存等。如 inet_dport 和 inet_sport分别表示目的端口和源端口,inet_daddr 和 inet_saddr分别表示目的 IP 地址和源 IP 地址

         struct inet_sock 结构体的第一个字段是 struct sock ,它作为套接字在内核中的表示,存储了套接字的各种关键信息和状态。通过操作这个结构体,内核能够管理套接字的生命周期,处理数据的发送和接收,以及实现协议的各种特性。

        上述所有的结构体就是OS所描述的连接,但是我们在写网络通信代码时,首先会通过socket函数返回一个套接字,后续的通讯都是向这个套接字中输入输出信息,那套接字和这些所谓“连接”的结构体怎么联系起来呢?

1.2 网络套接字与文件描述符的关系

        网络通信的本质就是主机的进程之间的通信,而通信的本质就是IO,所以套接字的本质也是一个文件描述符描述的文件struct file

当我们创建一个套接字时,系统会创建一个 struct socket 结构体对象,而这个结构体内部有一个struct file* 类型的指针,有了这个指针我们就可以通过套接字来找到对应的文件了。

但是我们更重要的是通过文件描述符来找到套接字,而struct file中也存在存在一个指针,这个指针就是指向struct socket结构体的,所以我们可以通过fd来找到对应的struct file,在通过这个指针找到struct socket对象。

在struct socket结构体中其实还存在一个struct sock*的指针,这个指针是指向tcp_sock结构体的第一个对象,这样文件描述符与套接字结构体及描述连接的结构体都联系在一起了。

此时有人就疑惑了,struct sock*的指针为什么就可以访问整个tcp_sock结构体呢?这种形式是Linux内核中常用的,属于C风格的多态,可以通过将这个指针强转为不同的类型,就可以访问到整个结构体所有的属性。整体结构如下图所示:

上述是TCP在内核中的组织形式,那对于UDP怎么组织呢?

在内核中,UDP的组织形式与TCP是共用一套的,由于UDP协议是不面向连接的,所以他相比于TCP少了一层,没有 struct inet_connection_sock 结构体。可以通过struct socket结构体中的struct sock*指针指向udp_sock对象来获取对应的udp信息,所以struct socket结构体也被称为

“BSD socket ”—> 通用socket接口。

在内核中,这个指针既可以指向tcp_sock也可以指向udp_sock,那系统是怎么区别是哪种协议呢?在socket结构体中存在一个描述属性的字段

int socket(int domain, int type, int protocol);

所以创建一个listen套接字的流程就是申请文件描述符获得文件结构体,创建套接字socket和连接tcp_sock,然后将他们关联起来。

那么调用accept()函数是从listen套接字监听的套接字中获取普通连接并返回,这个过程又是怎样的呢?

实际上在struct inet_connection_sock结构体中维护一个全连接队列,当经历过三次握手后,系统会自动创建一个连接tcp_sock,然后将该连接加入到全连接队列中,当调用accept()函数时,操作系统会申请新的文件描述符和套接字socket,然后从全连接队列中取出一个连接tcp_sock,之后普通套接字socket中的 sk指针 指向该连接tcp_sock,就完成了获取连接的操作。

二、全连接队列

2.1全连接与半连接
  1. 全连接

    • 指的是TCP连接已经成功建立的状态,即已经完成了三次握手过程,客户端和服务器之间可以开始传输数据。
    • 在Linux系统中,全连接队列用于存储已经成功建立连接但尚未被应用程序接受(accept)的TCP连接。
  2. 半连接

    • 指的是TCP连接建立过程中的一个中间状态,即服务器已经收到了客户端的SYN报文,并发送了SYN-ACK报文,但尚未收到客户端的ACK报文确认。
    • 在这个状态下,连接还没有完全建立,服务器需要等待客户端的ACK报文来完成三次握手过程。
    • 在Linux系统中,半连接队列用于存储处于半连接状态的TCP连接。

全连接队列的长度实际会受到listen第二个参数的影响,一般TCP全连接队列的长度就等于listen第二个参数backlog的值加1。

int listen(int sockfd, int backlog);
2.2 全连接的意义
  1. 防止连接丢失:当服务器的并发连接请求超过其处理能力时,全连接队列可以暂存已经建立但尚未被应用程序接受的连接。这避免了连接请求被丢失,从而提高了服务器的稳定性和可靠性。
  2. 提高资源利用率:通过有效地管理全连接队列,服务器可以更加高效地利用系统资源。例如,当队列中的连接数量较少时,服务器可以释放部分资源以供其他任务使用;而当队列中的连接数量增加时,服务器可以动态地增加资源分配以满足需求。
  3. 优化网络性能:全连接队列的存在使得服务器能够更加灵活地处理网络流量。当网络流量较大时,服务器可以通过增加全连接队列的长度来容纳更多的并发连接请求;而当网络流量较小时,则可以减小队列长度以节省资源。
2.3 全连接的长度

在实际应用中,需要根据服务器的性能和需求来设置全连接队列的长度。

  • 如果队列长度设置得太短,可能会导致连接请求被拒绝或超时
  • 而如果设置得太长,则可能会浪费系统资源并降低性能。
  • 所以全连接队列要取一个合适的长度,系统一般设置为5。

全连接队列的长度由两个参数共同决定:

  1. backlog参数:这是应用程序在调用listen函数时指定的参数,它表示全连接队列的最大长度。然而,这个值并不是最终的全连接队列长度,因为它还需要与另一个参数进行比较。
  2. somaxconn参数:这是系统级别的参数,通常可以在Linux系统的/proc/sys/net/core/somaxconn文件中找到。它表示系统允许的最大socket连接数,也可以理解为全连接队列的一个上限值。

最终的全连接队列长度是这两个参数中的较小值。也就是说,如果backlog参数的值大于somaxconn参数的值,那么全连接队列的长度将被限制为somaxconn的值;反之,如果backlog参数的值小于或等于somaxconn参数的值,那么全连接队列的长度将被限制为backlog的值。

在Linux系统中,somaxconn参数的默认值通常为128,但可以通过修改/etc/sysctl.conf文件或使用sysctl命令来更改这个值。例如,要将其更改为4096,可以在/etc/sysctl.conf文件中添加或修改以下行:

net.core.somaxconn = 4096

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1553014.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue3中el-input在form表单按下回车刷新页面

摘要&#xff1a; 在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面&#xff01; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 &#xff0c;并设置style“display:none” <ElInput style"display…

SkyWalking 高可用

生产环境中,后端应用需要支持高吞吐量并且支持高可用来保证服务的稳定,因此需要高可用集群管理。 集群方案 Skywalking集群是将 skywalking oap 作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalking oap在运行,就可以提供服务。 高可用…

鸿蒙应用开发前置学习-TypeScript

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

数据安全新攻略!4大神技在手,固态硬盘数据恢复秒变Easy Mode

现在咱们都离不开电脑和手机了&#xff0c;里面存了好多重要的东西&#xff0c;比如学习资料、工作文件&#xff0c;还有照片、视频这些宝贵的记忆。但是有时候数据可能会不小心弄丢或者删掉&#xff0c;特别是在固态硬盘上的数据&#xff0c;要是没了&#xff0c;想找回来比老…

Sui主网升级至V1.34.2

Sui主网现已升级至V1.34.2版本&#xff0c;同时协议升级至60版本。其他升级要点如下所示&#xff1a; 协议 #19014: 在验证Groth16 zk-proof时对无效公共输入进行快速判断。添加了一个新的Move函数flatten&#xff0c;可将向量中的向量展平成单个向量&#xff0c;这在新协议…

爬虫——爬取小音乐网站

爬虫有几部分功能&#xff1f;&#xff1f;&#xff1f; 1.发请求&#xff0c;获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意&#xff1a;开始爬虫前&#xff0c;需要给其封装 headers {User-…

计算机网络:计算机网络体系结构 —— OSI 模型 与 TCP/IP 模型

文章目录 计算机网络体系结构OSI 参考模型TCP/IP 参考模型分层的必要性物理层的主要问题数据链路层的主要问题网络层的主要问题运输层的主要问题应用层的主要问题 分层思想的处理方法发送请求路由器转发接受请求发送响应接收响应 计算机网络体系结构 计算机网络体系结构是指将…

12.Velodyne16线激光雷达在ROS下的仿真(使用 URDF 描述和 Gazebo 插件来模拟 Velodyne 激光扫描仪)

1 下载VLP16的模型描述文件 在这个网站上进行下载&#xff1a; Bitbuckethttps://bitbucket.org/DataspeedInc/velodyne_simulator/src/master/ 使用 URDF 描述和 Gazebo 插件来模拟 Velodyne 激光扫描仪&#xff01; 下图是一个官方给的效果。 URDF with colored meshe…

嵌入式外设应用(代码)

文章目录 1. 工业自动化2. 智能家居设备3. 汽车电子4. 生命体征监测仪5. 物联网应用嵌入式外设应用广泛,有很多应用领域: 1. 工业自动化 应用场景:使用传感器监测设备状态,控制电机的启动和停止。 示例代码: #include <stdio.h> #include <stdbool.h>// 模…

Android 日志打印频率过高排查的一些技巧

最近项目快到 sop 阶段了&#xff0c;看到最近的一个新的任务&#xff0c;提示应用打印频率每秒超过 100 行/秒&#xff0c;需要优化一下。 那这样看起来需要删减一点日志&#xff0c;是不是先要找一下我们的应用打印了多少。 当然如果项目是自己维护的&#xff0c;那肯定是知…

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式&#xff08;List&#xff0c;Set&#xff0c;Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…

Let‘s Encrypt 的几个常用命令

Lets Encrypt 是免费的 ssl 证书提供商&#xff0c;在当前纷纷收费的形式下&#xff0c;这是一个良心厂家&#xff0c;虽然使用起来略微繁琐。坚决抵制某 cxxn 站&#xff0c;竟然开始有辣么多收费的东西。这里记录几个常用的命令&#xff08;使用环境Ubuntu 24&#xff09;&am…

MySQL高阶2041-面试中被录取的候选人

目录 题目 准备数据 分析数据 总结 题目 编写解决方案&#xff0c;找出 至少有两年 工作经验、且面试分数之和 严格大于 15 的候选人的 ID 。 可以以 任何顺序 返回结果表。 准备数据 Create table If Not Exists Candidates (candidate_id int, name varchar(30), yea…

给大家提个醒!!!

前些天在某鱼买了一个KNX路由器&#xff0c;外观看起没什么问题&#xff0c;但内部就大跌眼镜了。 话不多说&#xff0c;直接上图 拿到手&#xff0c;外壳看起来没有什么问题 . 上电只亮灯 之后插网线&#xff0c;路由器上找不到设备 开壳&#xff0c;惊掉下巴 加个PHY…

利用自动化工具增强防火墙管理

在选择下一代防火墙以平衡安全需求和网络性能时&#xff0c;组织应优先考虑哪些因素&#xff1f; 最重要的部分——安全需求、可用性和网络性能必须保持平衡&#xff0c;而找到共同点并不总是那么容易。 选择防火墙时&#xff0c;组织必须采取的第一步是深入了解现有网络基础…

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…

基于 STM32F407 的串口 IAP

目录 一、概述二、IAP 实现三、IAP 程序1、串口部分2、iap 程序3、内部 flash 读写4、main 程序 IAP&#xff08;In Application Programming&#xff0c;在应用编程&#xff09;是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写。简单来说&#xff0c;就是开发者…

红外画面空中目标检测系统源码分享

红外画面空中目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

Spring Boot助力IT领域交流平台开发

2 系统关键技术 2.1 JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;…

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…