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

news2024/12/22 23:17:11

一、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.coloradmin.cn/o/2184962.html

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

相关文章

vue3 升级实战笔记

最近要将公司项目的移动端进行 vue3 的升级工作,就顺便记录下升级过程。 项目迁移的思路 我的想法是最小改动原则。 从 vue2.x 升级到 vue3,且使用 vue3 的 选项式 API。构建工具要从 vue-cli(webpack)升级到 vite。路由需要升级到…

软件测试面试八股文(含答案+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师…

17.反射与动态代理

目录 1.反射的概述 2.学习反射到底学什么? 3.字节码文件和字节码文件对象 4.获取字节码文件对象的三种方式 5.Class类中用于获取构造方法的方法 6.Class类中用于获取成员变量的方法 7.Class类中用于获取成员方法的方法 8.反射和配置文件结合动态获取的练习与利用反…

企业在数字化转型过程中如何确保数据安全性?

在数字化转型过程中,确保数据安全性是至关重要的。以下是一些关键措施,可以帮助企业在数字化转型中保障数据安全: 一、建立健全数据安全管理体系 制定完善的数据安全政策、制度和流程:明确数据安全管理的责任部门和人员&#xff…

stm32四足机器人(标准库)

项目技术要求 PWM波形的学习 参考文章stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客 舵机的学习 参考文章 stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)…

前端学习第一天笔记 HTML5 CSS初学以及VSCODE中的常用快捷键

前端学习笔记 VsCode常用快捷键列表HTML5标题标签标签之段落、换行、水平线标签之图片图片路径详解标签之超文本链接标签之文本列表标签之有序列表列表标签之无序列表标签之表格表格之合并单元格Form表单表单元素文本框 密码框 块元素与行内元素(内联元素&#xff0…

【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

序言: 本文详细讲解了关于我们在程序设计中所用到的class类的各种参数及语法。 笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正。 B站黑马的课程链接&am…

横排文字、图层蒙版-1(2024年09月30日)

2024年09月30日 记录_导读 2024年09月30日 10:13 关键词 优惠券 设计 图层 背景 元素 调整 画笔工具 颜色 大小 位置 复制 移动 添加涂层 多选 显示 PS 元素文件 隐藏 使用规则 Logo 全文摘要 通过在Photoshop中精心操作图层,包括复制、移动和调整设置&#xf…

自动驾驶系列—自动驾驶发展史介绍

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

CMU 10423 Generative AI:lec13/13.5(text-to-image models:三大类方法、评估标准、图像编辑原理)

1 文章目录 1 lec13和lec13.5概述2 Text-to-Image Generation 概念、主要方法、挑战、发展历程1. **基本概念**2. **主要技术方法**2.1. **生成对抗网络(GAN)**2.2. **自回归模型(Autoregressive Models)**2.3. **扩散模型&#x…

声纳技术24.1.19声纳定向方法

一、基本原理 本质:利用声程差和相位差 声程差: 时间差: 相位差: 二、最大值测向 原理:接收到的信号幅度最大时换能器或基阵的指向性来测量目标方位 优点:简单,利用人耳可判别目标性质&a…

单链表的增删改查(数据结构)

之前我们学习了动态顺序表,今天我们来讲一讲单链表是如何进行增删改查的 一、单链表 1.1、单链表概念 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2、链表与顺序表的…

大豆重测序二(同一领域互竞)-文献精读58

High-quality genome of a modern soybean cultivar and resequencing of 547 accessions provide insights into the role of structural variation 现代大豆品种的高质量基因组及对547个种质资源的重测序揭示结构变异的作用 大豆重测序-文献精读53 摘要 大豆提供蛋白质、油…

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中,我们制作了AB分区系统镜像,并成功通过uboot加载kernel以及d…

基于Springboot+Vue的美妆神域(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

基于STM32的智能停车管理系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据读取模块停车位控制模块OLED显示状态应用场景结论 1. 引言 智能停车管理系统旨在提高停车场的管理效率,减少车主寻找停车位的时间。该系统通过传感器实时监测停车…

Spring Boot技术在足球青训管理中的实践与挑战

摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…

深圳大学 Github 学生认证并免费使用 Copilot AI编程工具(超详细)

文章目录 01 注册学生邮箱并添加邮箱到Github1.1 注册学生邮箱1.2 绑定学生邮箱 02 修改 Github profile 信息03 申请学生认证[^2]04 配置 Copliot05 VS code 使用 Copilot 01 注册学生邮箱并添加邮箱到Github 1.1 注册学生邮箱 对于深圳大学的学生来说,学校已经帮…

【CSS in Depth 2 精译_042】6.4 CSS 中的堆叠上下文与 z-index(下)——深入理解堆叠上下文

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…

聊聊国内首台重大技术装备(2)

上次,介绍了《首台(套)重大技术装备推广应用指导目录(2024年版)》中介绍的硅外延炉,湿法清洗机,氧化炉,见文章: 《聊聊国内首台重大技术装备(1)》…