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

11.3.4确认应答机制

​ 1.双方通信时要返回确认应答报文,保证对方发送的报文是有效的;尽管整个通信过程中无法保证数据全部可靠,但是可以保证单个方向发送的数据是可靠的;

​ 发送的报文要设置序号,如果是应答报文要设置确认序号;

11.3.5超时重传机制

​ 当报文超时或者丢包就要进行重传;丢包分为消息报文丢失和应答报文丢失;

​ 当一个报文发送出去且没有收到应答之间,这段时间是不知道报文是丢了还是还在发送的过程当中;所以必须要设置一段特殊的时间间隔,在时间间隔之内没有收到应答就认为丢包了,就进行报文重传,这种策略叫做超时重传;

​ 如果补发多次没有成功,主机就会判定网络出现了问题,连接自动断开;

​ 由于超时重传,所以接收方一定会收到多个相同的报文,导致数据不可靠,所以需要进行去重;使用序号就可以实现去重;

超时时间设置

​ 1.对于网络情况好就需要时间间隔要短;时间过长就需要等待很长的时间才重传,效率太慢;

​ 2.网络情况较差,如果设置的时间间隔较长,就会导致发一个报文就需要进行重传,产生大量的重复报文,需要进行大量的去重,使得重传和去重变成了一种负担;

​ 为了保证TCP通信的高性能,时间间隔的设置是动态的,与网络状况是有关的;Linux中超时以500ms为一个单位进行控制,每次超时重传的时间间隔都是500ms的整数倍;默认是500ms,如果重传一次之后仍然得不到应当,就等待2*500ms后再进行重传,还是得不到应答就等待4*50ms,以此类推,当达到某一重传次数时,本机的TCP就会认为网络或者对端主机出现了异常,然后断开连接;

11.3.6连接管理机制

​ TCP通信是基于连接的,在连接建立和断开的过程中会进行三次握手和四次挥手;

​ 三次握手和四次挥手的原因是,保证双方互相给对方发送消息的可靠性;其实本质上是每次发送过去的报文要保证可靠性,都要有一个应答;如果数据报文不完整,则会导致功能不完整,应答不完整就会导致数据不可靠,甚至导致报文重传还需要进行去重;

​ 是三次握手而不是四次握手是因为,通信的前提是双方都建立连接,一方建立连接另一方不建立是无意义的,所以双方都要同步的发起建立连接请求,使用捎带应答的方式提高了通信效率;而四次挥手不是三次挥手是因为,双方断开连接是需要协商的,是有时间差的;即一方完成了通信的需求,但是另一方还未完成,需要继续通信,就不可以断开连接,只有双方都完成了通信才可以断开连接,才可以使用捎带应答的方式实现"类似的三次握手",但是这种情况占少数,不采用这种方式;

三次握手的原因

​ 1.三次握手有效的保证了客户端和服务器各自至少进行了一次收和发并且是可靠的,测试了连接是否通畅;

​ 2.没有应答机制,会导致服务端直接建立连接并且承担风险,影响其他客户端;

​ 如果是一次握手并且一次握手就使得双方建立连接,客户端就会存在先建立连接,然后一直向服务端发送建立连接请求的(SYN洪水)情况,这时服务端就会建立一大批连接的结构体并管理起来,但是实际上只是用一个连接资源管理就可以了,这样就会导致资源的闲置和浪费;

​ 3.奇数次握手保证了,握手失败的连接成本嫁接到了客户端,而不是服务端接收风险,降低了对其他客户端的影响;使用三次握手使得保证可靠性的同时建立连接的成本最小;

​ 如果是两次握手,会存在服务端返回确认应答并建立连接,客户端收到应答建立连接;服务端先建立了连接,不管客户端是否异常都会默认维护连接一段时间;如果客户端异常断开了,那么这些连接实际上是无效的,无法进行通信的;因为服务器是一对多的,服务器出现了问题,所有的客户端就都不可以使用了,不应该让服务器来承担风险;三次握手保证了是让客户端先建立了连接,这样就让风险由客户端来承担,影响就减少了;

​ 其实TCP服务端在第一次握手的时候是会建立连接的,只不过叫做半连接;大量的客户端与服务端进行第一次握手时,就会将服务端的连接资源消耗殆尽;黑客可以使用恶意程序控制多台机器,定期领取任务向服务端发起第一次握手,这些机器就叫做肉机;所以一些企业实际上是会设计一些策略,对大流量的访问进行限流,防止服务器挂掉;

四次挥手的原因

​ 四次挥手保证双方都可以得知对方不发数据的意愿;如果只有一方关闭了连接而另一方并没有,其实连接是没有被关闭的,这时候另一方就可以继续发送完数据再进行关闭;此时对方就会收到数据,最后整个连接才是真正地关闭了;换句话说,关闭连接其实是不想发送数据了,就会将发送缓冲区关闭,但是接收缓冲区还在,所以还具有读的功能;

​ 四次挥手其实就是,双方互相协商,主动断开连接的一方会发送FIN,状态设为FIN_WAIT_1,服务端收到报文后,将状态设为CLOSE_WAIT并且发送ACK,客户端收到应答报文后,就会将发送缓冲区关闭,将状态置为FIN_WAIT_2不会发送数据只是发送应答报文,这时候服务端可以继续发送数据,如果服务端要关闭连接就会发送FIN并将状态置为LAST_ACK,客户端收到后将自身设置为TIME_WAIT状态(一段时间后自动设为CLOSED状态),返回应答报文,服务端接收到应答就会将自身设置为CLOSED状态;

在这里插入图片描述

11.3.7验证客户端和服务端三次握手和四次挥手时的状态
#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左右;

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

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

相关文章

为移动云数据实现基于可撤销属性组的加密:多代理辅助方法

参考文献为2023年发表的Achieving Revocable Attribute Group-Based Encryption for Mobile Cloud Data: A Multi-Proxy Assisted Approach 动机 对于目前的代理辅助的可撤销基于属性加密来说&#xff0c;外包解密存一些缺点。当多个具有相同属性的用户请求外包转换时&#x…

日期专题:做题笔记 (时间显示/星期计算/星系炸弹/第几天/纪念日)

目录 时间显示 代码 星期计算 代码 星系炸弹 代码 第几天 纪念日 代码 时间显示 时间显示 这道题主要是单位换算。 ①单位换算 ②输出格式&#xff1a; a. 不足两位补前导零。利用printf输出 b. 注意 long long 输出格式应该是 %lld 长整型 代码 #include <…

Python 之 Fastapi 框架学习

依赖安装 Fastapi 有版本要求&#xff0c;需要的 Python 版本至少是 Python 3.8&#xff08;不要犟&#xff0c;按照版本要求来&#xff0c;我最先也是在我 Python3.6 上装的&#xff0c;果不其然跑不起来&#xff09;&#xff0c;幸好我 Win7 老古董能支持的 Python 最高版本…

《C++程序设计》阅读笔记【1-函数】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 函数1.1 概述1.2 函数定义、声明、原型1.3 变量1.3.1 全局变量1.3.…

内部类(来自类和对象的补充)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

HTMLCSSJS

HTML基本结构 <html><head><title>标题</title></head><body>页面内容</body> </html> html是一棵DOM树, html是根标签, head和body是兄弟标签, body包括内容相关, head包含对内容的编写相关, title 与标题有关.类似html这种…

非写代码无以致远

标题党一下&#xff0c;本篇文章主要汇总了一些代码题&#xff0c;让大家写一些代码练习一下吧&#xff01; 变种水仙花_牛客题霸_牛客网 (nowcoder.com) #include<stdio.h> int main() {for (int i 10000; i < 99999; i) {int sum 0;for (int j 10; j < 1000…

Linux操作系统之防火墙

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链&#xff09; ​​​​​​​一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒&#xff0c;特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 防火墙…

Python 一步一步教你用pyglet制作“彩色方块连连看”游戏(续)

“彩色方块连连看”游戏(续) 上期讲到相同的色块连接&#xff0c;链接见&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏-CSDN博客 第八步 续上期&#xff0c;接下来要实现相邻方块的连线&#xff1a; 首先来进一步扩展 行列的类&#xff1a; class R…

VC++建立空文档失败的一种情形

假设现在要在单文档程序的客户区创建控件; 把控件作为视类的成员变量; 先把成员变量定义加到视类头文件; 然后在视类的, BOOL CMyttView::PreCreateWindow(CREATESTRUCT& cs) {....... } 在此成员函数中创建控件; 运行程序,就会出现如下错误, 这就需要在类向导…

gpt4.0中文版

我愿把这个网站成为全球最强AI网站&#xff01;弄100多个AI伺候你&#xff1f;&#xff1f; 家人们&#xff0c;你们猜我发现了什么牛逼的AI网站&#xff1f;&#xff1f; 直接上图&#xff1a; 编辑 这个网站&#xff0c;聚合了国内外100多个顶尖的AI&#xff0c;包括了Op…

Spring Security 实现后台切换用户

Spring Security version 后端代码&#xff1a; /*** author Jerry* date 2024-03-28 17:47* spring security 切换账号*/RestController RequiredArgsConstructor RequestMapping("api/admin") public class AccountSwitchController {private final UserDetailsSe…

【JAVA】JAVA快速入门(长期维护)

下面是java的一些入门基础知识&#xff0c;有需要借鉴即可。 课程&#xff1a;B站黑马程序员&#xff0c;JAVA入门LINK 一、初识JAVA 1.java概述 概念&#xff1a;java是由sun公司研发&#xff0c;在2009年被oracle收购&#xff0c;祖师爷詹姆斯高斯林&#xff0c;是一种高级…

C++核心编程——4.2(2)对象的初始化和清理

4.2.5 深拷贝与浅拷贝 浅拷贝&#xff1a;编译器提供的简单的赋值拷贝操作 深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作 示例&#xff1a; class Person { public://无参&#xff08;默认&#xff09;构造函数Person() {cout << "无参构造函数…

力扣热题100_链表_2_两数相加

文章目录 题目链接解题思路解题代码 题目链接 2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 …

黑马鸿蒙笔记

目录 25-Stage模型-页面及组件生命周期 26-Stage模型-UIAbility的启动模式 25-Stage模型-页面及组件生命周期 26-Stage模型-UIAbility的启动模式 singleton 只会有一个实例 multiton 会有多个&#xff0c;但是会销毁旧的 standard 会有多个&#xff0c;但是不会销毁

【MATLAB第102期】基于MATLAB的BRT增强回归树多输入单输出回归预测模型

【MATLAB第102期】基于MATLAB的BRT增强回归树多输入单输出回归预测模型 BRT&#xff0c;即Boosted Regression Trees&#xff08;增强回归树&#xff09;&#xff0c;是一种用于回归问题的集成学习方法。它结合了多个决策树模型&#xff0c;通过逐步改进的方式来提高整体模型的…

GDAL源码剖析(九)之GDAL体系架构

GDAL源码剖析&#xff08;九&#xff09;之GDAL体系架构_gdal 源码-CSDN博客 在GDAL库中包含栅格数据的读写&#xff0c;矢量数据的读写&#xff0c;以及栅格和矢量数据的相关算法。下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明。本人英文很烂&#xff0c;有…

Linux 多线程与线程控制(程序均有详细注释)

多线程与线程控制 线程的基本概念线程的特点页表多线程 线程控制线程的创建线程传参线程id资源回收---线程等待线程id和LWP 封装一个线程库线程互斥和线程同步线程互斥基本原理线程安全VS线程不安全锁的诞生可重入VS线程安全 死锁死锁的定义 线程同步条件变量接口 生成消费者模…

使用Python获取红某书笔记详情并批量无水印下载

根据红某手最新版 请求接口必须要携带x-s x-s-c x-t,而调用官方接口又必须携带cookie,缺一不可,获取笔记详情可以通过爬取网页的形式获取&#xff0c;虽然也是无水印&#xff0c;但是一些详情信息只能获取大概&#xff0c;并不是详细的数值&#xff0c;因此既不想自己破解x-s x…