网络基础二——TCP可靠性实现机制补充2

验证客户端和服务端三次握手和四次挥手时的状态

三次握手

#include <sys/types.h>        
#include <sys/socket.h>
int listen(int sockfd, int backlog);
netstat ntp
//查看连接的状态

​ 将TCP服务端套接字设置为listen状态之后,此时服务端是处于LISTEN状态的;服务端没有使用accept接口时,在收到客户端的连接请求时双方会经历3次握手,最终都处于ESTABLISHED状态;即连接的建立和accept没有关系,三次握手是双方操作系统自动完成的

​ 当listen的第二个参数设为一时,能建立全连接的连接数是2;操作系统会将没有被上层accept的连接管理起来,对它们先描述再组织,并且以队列的方式管理这些连接结构;三次握手时每次形成的连接本质上就是创建一个连接结构体对象并将其链入到队列当中,而accept就是从队列中将连接取走和特定的文件关联起来,返回特定的文件描述符;listen的第二个参数+1表示已经建立好的连接队列的最大长度,这个队列叫做全连接队列;accept和连接入队还有全连接队列构成了CP模型;服务端三次握手完成或者建立连接成功就将连接入队列,如果队列满了就无法入队列了,就会将连接状态设置为SYN_RECV状态,换句话说就是因为全连接队列满了,服务端将客户端发送过来的第三次握手应答报文直接丢弃了;

​ 如果服务端长时间无法得到应答就会释放掉SYN_RECV状态的连接,这种连接叫做半连接;半连接也需要进行管理,所以也会存在半连接队列,节点并不会长时间维持;

​ 这样就出现了客户端和服务器连接不一致的问题;服务端直接将应答丢弃,但是确实是收到了应答,所以第二次握手是可靠的,知道客户端建立连接成功了,并不会发送RST标志位;对于客户端建立连接成功了,但是发送数据不成功,就转而继续开始进行三次握手;

​ 大量建立半连接会导致真正地SYN洪水;服务器资源有限制不会挂掉,但是其他客户端就无法正常的访问了;

​ 全连接队列长度不可以太长,因为上层处理繁忙时,就无法保证将全连接队列获取完,而队列长度过长就会导致资源闲置,维护还要有成本,而且变相地减少了上层空间,降低了处理的效率;而队列的存在可以保证,半连接变成全连接和全连接被上层处理可以并发运行;所以一般全连接队列的长度一般要设置为10左右;

四次挥手

​ 当客户端关闭连接时,服务端的连接会处于CLOSE_WAIT状态,由于服务端不关闭连接,会维持此状态维持一段时间,直到关闭连接时,才会将此状态改为LAST_ACK,收到应答后关闭连接;

​ 主动关闭连接的一方最终会先处于TIME_WAIT状态(连接没有完全断开),一般维持60-120s的时长,这时候就不可以重新绑定端口号,因为连接没有完全断开意味着IP和端口号还在被使用,并且一个端口号只能绑定一个进程,所以重启服务会失败,得等待60-120s;对于一个服务器不可以立即重启会产生很大的损失,所以需要修改此状态,进行地址复用;

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);//将TIME_WAIT的IP和端口号复用;
//第一个参数是要被修改属性的套接字,第二个参数一般是SOL_SOCKET表示在套接字层,第三个参数表示操作名字,如:复用IP和端口号,第四个参数表示将选项设置为有效;
int opt = 1;
setsockopt(listensockfd_, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &opt, sizeof(opt));
//这样就可以重新建立好连接了

​ 客户端能够立即重连是因为使用的是系统分配的随机端口号,所以重连时的端口号与上一次不一样,就不会出现绑定失败的情况;

​ MSL:数据报在网络中最多存活的时长;

​ TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(maximum segment lifetime)的时间后才能回到CLOSED状态;MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同, 在Centos7上默认配置的值是60s;可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看msl的值;

​ 1.TIME_WAIT等待两个MSL时间是因为要让历史数据在网络中消散(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);序号一般是随机的,防止黑客的恶意攻击和历史保温的影响;

​ 2.让断开连接四次挥手具有较好的容错性;

最大存在时长不等于最大传送时长;还包括了异常的路由阻塞时间;一般TIME_WAIT时长为60-120秒;如果没有accept可能就会没有TIME_WAIT状态,直接关闭;

11.3.7流量控制

​ 流量控制不仅保证了可靠性,而且提高了效率;捎带应答也是保证可靠性并且提高效率;

​ 流量控制,发送方通过接收到接收方发送过来的报头(16位窗口大小)知道接收方接收缓冲区剩余空间的大小,进而调整发送速度;

​ 对于第一次发送数据报文时,也要保证发送的数据量是合理的;因为正式通信交换数据之前,要通过进行三次握手来可靠的建立连接,这期间是发送了报文的,通信双发都可以得知对方接收缓冲区的剩余空间大小,也可以携带16位窗口大小;

​ 第三次握手的时候其实是可以携带数据的,即可以是携带应答;

​ 当接收方的接收缓冲区写满了,发送发继续发送报文会产生丢包,为了大规模的减少这种问题,就需要进行流量控制;1.发送方会定期的向接收方发送窗口探测(仅仅是一个报头,不携带数据,所以丢失不会产生大影响),当发送方收到窗口探测应答,则说明有空间了或者接收端返回了上次数据报文的应答也可以说明有空间了;2.接收方会主动发送窗口更新消息(也是一种报头);

​ 以上两种方式一起使用选择最优的,一定程度上提高了效率,而且两种方式提高了容错性;

​ 如果两种方式是执行了一定次数后还没有成功就会认为网络异常并且关闭连接;

​ TCP窗口大小(接收缓冲区的大小)默认最大就是65535字节,但是可以配合TCP首部40字节的选项窗口扩大因子M使用,实际的窗口大小就是窗口字段的值左移M位,这还与操作系统实际提供多大的缓冲区有关;

11.3.8滑动窗口

​ 如果串行的发送数据报文加确认应答,确实可以保证可靠性,但是效率太低;所以除了控制使用串行的方式,常规都是使用并行的方式发送一批数据报文后才接受一批确认应答;没有收到应答就会使用超时重传机制;

​ 为了保证数据的可靠性需要在设置的特殊时间间隔里将大量的发送数据报文管理起来;这些数据报文本来就存在于发送缓冲区,没必要专门再拷贝一份的方式维护,只需要将发送缓冲区进行划分即可;

​ 可以简单地划分为三部分从左往右依次为已发送已确认区域,已发送未确认区域,待发送区域;对于已发送已确认的区域是可以被覆盖的;已发送未确认区域可以继续发送数据,即支持发送一批数据,如果没有收到应答就继续维护此数据,如果收到了应答就将此数据移动到已发送已确认区域,表示此数据已经被清理掉;已发送未确认区域就叫做滑动窗口

​ 滑动窗口是发送缓冲区的一部分;

​ 滑动窗口的数据是可以直接发送给接收方的,这样就可以一次性发送一批数据报文,等到接收到应答时,在将数据移动到另一个区域,不再维护;如果没有收到应答,就可以进行补发;

​ 滑动窗口的大小默认是接收方的16位窗口大小,但是还需要考虑到网络的情况;

​ 对于发送缓冲区区域的划分可以使用双指针的方式(数组下标)如:win_start,win_end,来划分成三个区域;维护发送缓冲区其实就是修改这些特殊下标缓冲区;

​ 收到确认就是应答就是将start右移,如果接收方的接收缓冲区变大了,就将end右移使得滑动窗口变大;这样的过程就像是在滑动;换句话说滑动的本质就是指针的右移;

​ 网络是不支持发送大块数据的,只能分段发送;

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

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

相关文章

水泥5G智能制造工厂数字孪生可视化平台,推进水泥行业数字化转型

水泥5G智能制造工厂数字孪生可视化平台&#xff0c;推进水泥行业数字化转型。水泥5G智能制造工厂数字孪生可视化平台&#xff0c;是水泥行业数字化转型的关键推手。数字孪生平台运用先进的信息技术和数字化手段&#xff0c;实现水泥生产过程的数字化模拟、可视化监控和智能化管…

常见的线程安全类

线程安全&#xff01;线程安全&#xff01;&#xff01;线程安全&#xff01;&#xff01;&#xff01; 鼠鼠我最近被线程安全这个词弄得好烦啊&#xff0c;那既然如此就来写一篇常见的线程安全类防止以后鼠鼠我的大脑又宕机了忘记了....... 这里我们讨论的线程安全的是指&am…

DVWA-File Inclusion通关教程-完结

DVWA-File Inclusion通关教程-完结 文章目录 DVWA-File Inclusion通关教程-完结页面功能LowMediumHighImpossible 页面功能 点击页面上提供的三个页面&#xff0c;单击这些文件就会显示其执行内容&#xff0c;同时发现提交是由GET方式进行&#xff0c;使用page参数传参。 …

华为CCE部署RabbitMQ中间件操作文档

1、创建有状态&#xff08;StatefulSet&#xff09;部署 中间件一般为有状态部署&#xff0c;有状态部署与无状态部署区别参考文档&#xff1a;K8S有无状态部署-CSDN博客 1.1、基本信息 注意&#xff1a; 应用名称命名规则&#xff1a;&#xff08;命名规则最好统一&#xff…

【linux】ubuntu ib网卡驱动如何适配

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

STL —— list

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C专栏 本篇文章主要讲解 list模拟实现的相关内容 &#xff11;. list简介 列表&#xff08;list&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一个容器&#xff0c;它是一个双向链表数据结构&#xff0c…

StarRocks 面试题及参考答案详解(万字详解)

1. StarRocks 的架构设计是怎样的? 参考答案: StarRocks 的架构设计遵循了现代分布式系统的多个核心原则,以确保高性能和高可靠性。它主要由以下几个组件构成: FE(Frontend):作为前端服务,负责SQL的解析、编译和优化,以及执行计划的生成。BE(Backend):后端服务,负…

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章&#xff1a;2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…

记录Linux系统中vim同时开多个窗口编辑文件

在使用Linux进行文本编辑的时候&#xff0c;通常使用vim编辑器编辑文件&#xff0c;当然啦&#xff0c;vim也可以创建文件&#xff0c;如果只是一个一个创建&#xff0c;只需要vim创建即可&#xff0c;但是如何一次性打开多个窗口编辑呢&#xff1f; 目录 1、目标&#xff1a;…

PHP数据类型

华子目录 数据类型PHP的八种数据类型基本数据类型&#xff0c;4类复合数据类型&#xff0c;2类特殊数据类型&#xff0c;2类 类型转换在PHP中有两种类型转换方式其他类型转bool类型其他类型转数值类型实例 类型判断获取和设定变量类型获取gettype(变量名)设置settype(变量名,类…

基于SSM+Jsp+Mysql的个性化影片推荐系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

【SCI绘图】【曲线图系列2 python】多类别标签对比的曲线图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【曲线图系列2 python】多类别标签对比的曲线图&#xff0c;文末附完整代码。 1.环境准备 python 3 import proplot as pp…

基于离散差分法的复杂微分方程组求解matlab数值仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于离散差分法的复杂微分方程组求解.“连续微分方程”到“离散微分方程”到“差分方程”&#xff0c;离散微分方程&#xff0c;变成差分方程。建立差分方程时&am…

【Java EE】SpringBoot的创建与简单使用

文章目录 &#x1f340;环境准备&#x1f333;Maven&#x1f332;SpringBoot是什么&#x1f384;Spring Boot 项目创建&#x1f338;使用Idea创建&#x1f338;创建SpringBoot项⽬&#x1f338;SpringBoot项目的运行 ⭕总结 &#x1f340;环境准备 如果你的IDEA是专业版&#…

C++数据结构与算法——回溯算法分割问题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

算法基本概念

算法基本概念 算法的定义 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 算法的特性 输入&#xff1a;算法具有0个或多个输入输出&#xff1a;算法至少有一个或多个输出有穷性确定性可行性 算…

设计模式(14):命令模式

介绍 将一个请求封装为一个对象&#xff0c;从而使我们可用不同的请求对象客户进行参数化&#xff1b;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。也称之为&#xff1a;动作Action模式&#xff0c;事务transaction模式。 命令模式角色 抽象命令类(Comman…

VS CODE环境安装和hello world

SAP UI5 demo walkthrough tutorial step1 hello word 首先要安装nodejs,然后才能执行下面的操作 nodejs vscode 安装ui5npm install --global @ui5/cli报错解决: idealTree:npm: sill idealTree buildDeps 这个信息说明npm正在构建,如一直停留在这个界面,检查下网络,例如…

Redis常用命令补充和持久化

一、redis 多数据库常用命令 1.1 多数据库间切换 1.2 多数据库间移动数据 1.3 清除数据库内数据 1.4 设置密码 1.4.1 使用config set requirepass yourpassword命令设置密码 1.4.2 使用config get requirepass命令查看密码 二、redis高可用 2.1 redis 持久化 2.1.1 持…

【51单片机入门记录】A/D D/A转换器概述

目录 一、A/D D/A转换器简介 &#xff08;1&#xff09;模数转换器-ADC &#xff08;analogue-to-digital conversion&#xff09; &#xff08;2&#xff09;数模转换器-DAC&#xff08;digital-to-analogue conversion&#xff09; &#xff08;3&#xff09;应用场景 二…