基于C++从0到1手写Linux高性能网络编程框架(超清)

基于C++从0到1手写Linux高性能网络编程框架(超清)

TIME_WAIT状态存在原因有两点:

其一是可靠的中止tcp连接;

其二是保证让延迟的tcp报文有足够的时间被识别;

客户端在关闭连接阶段需要处理收到重复的结束报文,然后回复最后的ACK给服务端,否则客户端在收到服务端的FIN就直接回复ACK,这样后续服务端重传的FIN包都会被回复RESET报文,这时服务端认为是错误报文,这就是第一点存在的原因;

那么第二点是为了不让同一个tcp端口被多次打开或者是断开以后马上被一个新的连接接管,这样存在数据安全和处理异常等问题,让tcp最大时间坚持2MSL也是为了确保重发和延时的tcp包在这段时间内被丢弃(使用端口复用采用socket选项SO_REUSEADDR);

tcp超时重传和拥塞控制

tcp服务必须能够重传超时时间内未收到的tcp报文段。

为此,tcp模块为每一个tcp报文都维护一个重传定时器,linux两个重传相关的内核参数:

/proc/sys/net/ipv4/tcp_retries1和/proc/sys/net/ipv4/tcp_retries2

前者表示tcp最少执行重传次数,默认为3;

后者表示tcp最多执行重传次数,默认为15;

tcp服务有重传必然就会导致拥塞,那么接下来介绍网络底层如何进行拥塞控制?

拥塞控制包括四个部分:慢启动,拥塞避免,快速重传和快速恢复;

在此之前还需要介绍窗口概念:RNWD(接收窗口,指前面tcp报文中的对端发送的win窗口),CWND(拥塞窗口,是系统定义的一个状态变量大小),SWND(发送窗口,是RNWD和CWND之间的较小值);

在tcp模块刚开始发送数据阶段并不知道网络的实际情况,需要试探性地增加CWND,这一过程称为慢启动,CWND初始值设置为2-4个MSS;然后发送端每次收到接受端的一个确认,就按照公式:

CWND += min(N, MSS)

其中N是此次确认中包含的之前未确认的字节数;

如果随着CWND不断累加,不加控制会造成网络拥塞,那么需要进行拥塞避免算法,界定慢启动和拥塞避免过程通过慢启动门限(ssthresh)控制,当CWND超过ssthresh则进入拥塞避免阶段;

拥塞避免阶段控制CWND是每个RTT时间都计算(如果RTT时间内收到多少确认包),公式:

CWND += SMSS*SMSS/CWND

这样就保障了CWND缓慢增长,直到传输超时或者tcp重传定时器溢出,就需要重新调整ssthresh,再次进入慢启动阶段,那么ssthresh计算公式:

ssthresh = max(FlightSize/2, 2MSS)

其中FlightSize已经发送但是还未收到确认的字节数;

另外一种情况:在接受端接收到重复的确认报文段的时候,tcp模块如何处理?

如果发送端收到3个重复的确认报文,认为拥塞发生,启动快速重传和快速恢复,先计算ssthresh;

然后通过CWND = ssthresh + 3 * SMSS计算出CWND,再次每收到1个重复确认时,设置CWND += SMSS,最后当收到新数据的确认时,直接设置CWND = ssthresh,这样快速重传和快速恢复完成,又再次进入拥塞避免阶段。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络网络层之(4)IPv4协议

网络网络层之(1)IPv4协议 Author: Once Day Date: 2024年4月4日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的…

IDEA远程连接docker服务,windows版docker desktop

1.windows上安装docker desktop docker desktop下载地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker 有的windows系统不支持安装docker desktop 安装完之后我们可以直接打开,可以选择不登录使用 我们用IDEA连接到docker …

什么是 AI Agent ?

(注:本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 讲解的同时,也给你推荐一些实用的学习资源。 AI agent (智能体 / 代理)这个词儿最近非常流行,似乎「大语…

使用Three.js开发一个3D案例Demo

使用Three.js开发一个3D案例 最近在找工作,发现好多招聘要求都需要会Three.js,以前接触比较多的是2D开发,也就是平面开发,用到的做多的技术就是d3.js,现在3D开发已经成为了大势所趋,所以就学习下Three.js。…

sql优化思路

sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称,可以尽量使用覆盖索引,避免回表查询,因此可以提高效率 2.字面意思,无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…

上市公司财务困境模型​MertonDD、OScore、RLPM、ZScore四种模型​(1992-2022年)

01、数据介绍 上市公司财务困境模型是用于预测和评估上市公司是否可能陷入财务困境的一种模型。这个模型通常基于一系列的财务比率和其他相关变量,通过统计分析方法来构建。​ 数据名称:上市公司财务困境模型MertonDD、OScore、RLPM、ZScore五种模型 …

PHPStudy Apache或者MySQL启动以后自动停止

问题 phpstudy小皮面板中的Apache或MySQL启动以后自动停止 正在启动——已启动——已停止 总结:最主要的原因:端口冲突 端口冲突了,已经有其他程序占用了80、3306端口。 也就是说你的电脑上已经有了一个Apache、MySQL并且正在运行。 解决方案…

springboot lua检查redis库存

需求 最近需求需要实现检查多个马戏场次下的座位等席对应库存渠道的库存余量,考虑到性能,决定采用Lua脚本实现库存检查。 数据结构 库存层级结构 redis库存hash类型结构 实现 lua脚本 --- 字符串分割为数组 local function split(str, char)local…

微信小程序16: 组件通信

父子组件之间的通信 父子组件通信一共有三种方式 属性绑定 用于父组件向子组件的指定属性设置数据,仅能设置JSON兼容的数据 事件绑定 用于子组件向父组件传递数据,可以传递任意数据 获取组件实例 父组件还可以通过this.selectComponent()获取子组件的实…

蓝桥杯单片机之模块代码《AT24C02》

过往历程 历程1:秒表 历程2:按键显示时钟 历程3:列矩阵按键显示时钟 历程4:行矩阵按键显示时钟 历程5:新DS1302 历程6:小数点精确后两位ds18b20 历程7:35定时器测量频率 文章目录 过往历…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.4 神经网络层

目录 神经网络第一层(隐藏层)计算过程1.输入向量2.神经元的计算2.标识不同神经元3.层输出(激活)向量4.神经网络分层5.标识不同层 神经网络第二层(输出层)计算过程1.输入向量2.层输出(激活&#…

cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明二

一. 简介 前面几篇文章学习了 cmake的一些目录属性,主要有两个重要的目录属性INCLUDE_DIRECTORIES 属性、LINK_DIRECTORIES 属性。文章如下: cmake进阶:目录属性之 INCLUDE_DIRECTORIES-CSDN博客 本文学习 父目录的 INCLUDE_DIRECTORIES …

基于svm的手写数字识别程序介绍(matlab)

1、程序界面介绍 该程序GUI界面包括手写板、手写数字可视化(原图)、对图像进行灰度处理(灰度图)、图像二值化处理(二值化)、图像特征可视化(HOG特征(方向梯度直方图)&…

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

这是一个版本问题 我用koa2和mysql2链接就没有问题 不知道这个老项目运行为啥有这个问题 解决方案 打开mysql运行这个两个命令: ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123321; FLUSH PRIVILEGES; 须知(给小白看的!) …

Hive Views 视图

Hive Views 视图 在Hive中,视图(Views)是虚拟表,它只包含查询定义,而不包含实际的数据。视图可以简化复杂查询,隐藏数据结构,提供安全性,以及促进数据访问和重用。 创建视图的语法如…

汽车灯罩一般都是用什么材质做的?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩一般都是用什么材质做的? 汽车灯罩一般使用的主要材质是聚碳酸酯(PC)和丙烯酸酯(PMMA)这两种塑料。这两种材料具有良好的透明性、耐候性和耐冲击性,因此非常适合用于汽车灯罩的制造。 聚碳酸酯&am…

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看(非必须) docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地,这样即使容器被删除,数据也不会丢失。 mkd…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤: 1、确定采集目标:需要明确要采集的商品类别、筛选条件(如天猫、价格区间)、销量和金额等数据。例如,如果您想了解“小鱼零食”的销量和金额,您需要设定好价…

解决3D模型只显示线框材质的方法---模大狮模型网

在3D建模和渲染过程中,正确的材质和纹理是呈现逼真效果的关键。然而,有时候用户可能会遇到一个常见问题,即3D模型在渲染或查看时只显示线框材质,而没有正确的表面纹理和颜色。本文将介绍解决这一问题的几种方法,帮助用…

一文了解CRM系统帮助中心:从认识到搭建

客户关系管理(CRM)系统是企业的一个重要部分。而CRM系统帮助中心为用户提供了便捷的支持服务,提升了用户体验,减少了企业运营成本。本文将从认识到搭建,带你全面了解CRM系统帮助中心。 一、认识CRM系统帮助中心 CRM系统…