详细解析socket

news2024/11/23 13:38:04

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
    ====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
    ====> |||《C#专栏》::记录我复习C#的经历,深度理解查漏补缺,不定期更新。|||
    ====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||

详细解析socket

  • Listen参数backlog
  • 文件描述符和socket的关系

Listen参数backlog

根据TCP三次握手建立链接可知。
在这里插入图片描述
accept接口不参与三次链接的建立过程。

在这里插入图片描述
backlog + 1表示TCP的全链接队列中,最多可以缓存多少个已经完成三次握手,而因为各种原因,未被accept处理的链接。
全链接队列中的链接个数已经是backlog+1后,其他客户端在申请建立链接,则客户端会卡在SYN_SENT状态中,其代表该链接并未建立。

关于backlog参数大小的设置也很讲究。
首先我们不能设置的太小,如果设置的太小,则当上层很忙时,那么只能有少量的链接被挂在全链接队列中,其他客户端不论怎么申请,都无法成功建立链接,这时客户可能就不会访问该服务器了,当服务器闲下来后,全链接队列中的链接过少,在上层处理完后,服务器就进入了闲置状态,增加了服务器的闲置率。
其次我们不能设置的太大,如果太大,则当上层很忙时,大量的链接都被挂在全链接队列中这会导致内存开销很大,同时,大量链接挂接在全链接队列中,靠后的链接可能需要很久才能被处理,导致用户体验不好。

文件描述符和socket的关系

在进程部分,我们详细的讲解了pcb的内容,pcb中存在文件描述符数组的指针,指向一个文件描述符数组,每个数组中存放一个file类型的结构体,我们知道socket接口返回值也是一个文件描述符,这期间是存在关系的。
在这里插入图片描述
如上图,这是创建套接字的公共部分,我们不论创建TCPsocket/listensock还是UDPsocket还是本地的socket,还是网络socket,都会存在这样的结构,而其中,struct socket结构体被成为通用socket。
通用socket中存在一些字段,可以确定其是本地还是网络,TCP还是UDP。
比如type字段,可以通过是面向数据报还是面向字节流来判断是TCP还是UDP。
在这里插入图片描述

socket中存在一个字段struct sock类型的指针,可以指向tcp_sock或者udp_sock,我们之前说过,TCP是面向链接的,所以在tcp_sock中存在结构体struct inet_connect_sock,其中就维护了全链接队列。 同时在inet_sock中存储了socket的四元组{src ip, dest ip, src port, dest port}
在这里插入图片描述

TCP全链接队列的字段,存在struct requst_sock* head和tail指针,指向struct request_sock结构,该结构内存在一个struct sock结构的指针sk,sk指向一个tcp_sock,这样就将所有的tcp_sock链接在全链接队列中了。
在这里插入图片描述
当我们accept后,就取出队头链接并且创建公共结构
在这里插入图片描述
让公共结构中的struct sock* sk指针指向队头链接,就代表accept成功了。

在struct sock结构体中,存储了两个指针,sk_recive_buffer,sk_send_buffer,这两个指针指向struct sk_buff结构体,该结构体内,维护了三个指针head,tail和data,head指向一个报文的报头,tail指向一个报文的结尾,data指向报文的有效载荷,这代表了一个报文,当许多个sk_buff结构体相连,形成了TCP接收/发送缓冲区
在这里插入图片描述

我们还需要知道在三次握手中,我们的链接在什么时候加入全链接队列,如下图。

在这里插入图片描述
在第一次握手时,不会创建tcp_sock,而是创建request_sock将其放入半连接队列中,这是为了防止,后续如果建立链接失败,则开辟的更大的tcp_sock的空间就浪费了,同时,在request_sock结构中,会存储发送端发送的mss信息,同时在下一次握手时,将自己的mss信息发出,随后双方都有了双方的mss信息,取最小的作为通信时的mss,最大程度防止分片。
当服务器收到第三次握手请求时,代表TCP链接已经建立完成,此时在创建tcp_sock结构,同时将半链接队列中的request_sock中的sk指针指向tcp_sock,同时将request_sock连入全链接队列中。 等待上层的accept。

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

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

相关文章

书生大模型实战营第三期——入门岛——Git基础知识

第三关:Git基础知识 任务如下: 任务描述 破冰活动:自我介绍 每位参与者提交一份自我介绍。 提交地址:GitHub - InternLM/Tutorial: LLM&VLM Tutorial 的 camp3 分支~实践项目:构建个人项目 创建一个个人…

PDF发票解析并将信息回填到前端(2)前端页面

本人前端基础薄弱,此处的前端仅仅是一个练习展示 1. 创建一个前端项目 打开终端使用以下命令创建一个基于webpack模板的新项目 vue init webpack my-project输入命令之后一直点击enter知道项目创建完成即可 进入项目,安装并运行 $ cd my-project //…

ExtJS生成日历组件

文章目录 1.添加日历组件代码2.引入日历组件,创建了补签和取消签到,以及翻页显示的事件 1.添加日历组件代码 首先找到自己项目中对应的Ext的目录,并将日历组件添加到calendar这个目录下,我的是KwDatePicker.js 日历组件代码如下: Ext.define(Ext.calendar.KwDatePicker, {ex…

python six模块是什么

six模块是Python2和3兼容性库,它是为了解决Python2和Python3代码兼容性而产生的,众所周知Python2和Python3版本的分裂给Python开发者们带来了很大的烦恼,为了使代码同时兼容两个版本,往往要增加大量的代码,典型的就有u…

著名人工智能新经济数字经济新能源新质生产力讲师培训师教授专家唐兴通分享人工智能社会学商业模式创新人工智能就业工作与教育学习出海跨境数字化转型数字营销数字销售

添加图片注释,不超过 140 字(可选) 2024 年是人工智能在工作中真正应用的一年。根据微软和领英进行的调查(2024年5月),在过去六个月中,生成式人工智能的使用量几乎翻了一番,全球75%的…

领夹麦克风哪个品牌音质最好?八月领夹式麦克风排行榜

随着移动互联技术的飞速发展,视频内容的消费与创作正以前所未有的速度增长。从直播带货的兴起,到短视频平台的火爆,音频质量作为内容体验的重要组成部分,越来越受到创作者的重视。在这一背景下,无线领夹麦克风凭借其小…

6-8 残差网络(ResNet)

随着我们设计越来越深的网络,深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力,在这种网络中,添加层会使网络更具表现力, 为了取得质的突破,我们需要一些数学基础知识。 残差网络…

Web端高效元件库——高端元件,匠心设计

原型设计,不仅是产品从构想到落地不可或缺的桥梁,更是深化用户体验优化策略的核心环节。Axure,作为原型设计领域的领航者,凭借其卓越的交互设计引擎与无与伦比的灵活性,赢得了产品设计师们的广泛赞誉,成为他…

NiFi :1 初识这把“十年一剑”的利器

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- “现在AI和数据处理密不可分&#xff0c;80%的企业可以利用Apache NiFi轻松解决复杂的数据问题&#xff0c;快速完成场景建设。犹如花上百来块钱在家享受一顿不亚于五星级西餐厅的法式大餐。对…

非负数、0和正数 限制最大值且保留两位小数在elementpuls表单中正则验证

一、结构 <el-form-item label="单价:" prop="price"><el-inputv-model.trim="formData.price"placeholder="请输入"@blur="formMethod.fixTwo"><template #append>(元)</template></el-input…

电源芯片测试系统NSAT2000对比传统ATE测试软件有哪些优势?

随着近几年电源芯片的研究和发展&#xff0c;电源芯片向着高度的集成化、智能化的趋势发展&#xff0c;电源芯片想不过去有了更全面的功能&#xff0c;更稳定可靠的优势。相应的市场中电源芯片的测试系统同样也百花齐放&#xff0c;各类ATE测试软件层出不穷。其中纳米软件的NSA…

系统出现高CPU可能风险因素整理

文章目录 死循环无限递归序列化加解密正则表达式计算密集型任务大流量Full GC资源竞争/死锁I/O阻塞外部接口调用 死循环 死循环是最常见的原因之一。当代码中存在无穷循环&#xff08;例如在多线程环境下的HashMap线程不安全问题或分页查询条件不明确导致的无限循环&#xff0…

C++分析红黑树

目录 红黑树介绍 红黑树的性质与平衡控制关系 红黑树节点的插入 情况1&#xff1a;不需要调整 情况2&#xff1a;uncle节点为红色 情况3&#xff1a;uncle节点为黑色 总结与代码实现 红黑树的删除&#xff08;待实现&#xff09; 红黑树的效率 红黑树介绍 红黑树是第二种平衡二…

e6.利用 docker 快速部署自动化运维平台

利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…

基于tcp,html,数据库的在线信息查询系统项目总结

1.项目背景 在线信息查询系统是一种可用于检索和展示各种信息的计算机程序或平台。主要特点包括&#xff1a; 用户接口&#xff1a;通常提供友好的界面&#xff0c;用户可以方便地输入查询条件。 数据存储&#xff1a;系统往往连接到数据库&#xff0c;存储大量信息&#xf…

几个g视频能压缩成几百mb吗?分享5种视频压缩方法

现如今&#xff0c;高清视频已成为我们日常生活和工作中的重要组成部分。然而&#xff0c;随着视频分辨率和时长的增加&#xff0c;文件体积也随之膨胀&#xff0c;给存储和传输带来了巨大挑战。这时候就需要给视频进行压缩处理&#xff0c;下面给大家分享5种视频压缩方法&…

数据标注在不同行业领域的典型应用场景

数据标注产业通过提供高质量的训练和评测数据集&#xff0c;助力人工智能技术在各领域的应用和发展。 1、科学研究 生物医学&#xff1a;标注病理切片、细胞图像、基因组数据&#xff0c;用于疾病诊断和新药研发的模型训练。地球科学&#xff1a;标注卫星图像、遥感数据&…

什么牌子的超声波清洗机好用又实惠?推荐选购这几个品牌

眼镜在日常佩戴中容易变脏&#xff0c;如果不注意清洁和保养&#xff0c;长时间下来不仅会影响镜片的清晰度&#xff0c;还可能对眼部健康和视力产生负面影响。因此&#xff0c;定期清洁眼镜是非常必要的。与传统手洗方法相比&#xff0c;现在有一种更便捷的选择——超声波清洗…

NUXTJS + pm2 部署开源电商PC商城

为了符合各种服务器场景&#xff0c;使用pm2 部署 PC 商城如下 注意&#xff1a;对比package.json代码修改配置即可&#xff0c;如果2024年5月之后下载的代码可以直接用命令启动 服务器安装node pm2 如已安装跳过此章节 在 CentOS 上安装 Node.js 和 PM2 的步骤如下&#xff1…

知识图谱学习总结

1 知识图谱的介绍 知识图谱&#xff0c;是结构化的语义知识库&#xff0c;用于迅速描述物理世界中的概念及其相互关系&#xff0c;通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识&#xff0c;使信息资源更易于计算、理解以及评价&#xff0c;并能实现知识的快速响…