网络基础二——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左右;

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

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

相关文章

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…

设计模式总结-面向对象设计原则

面向对象设计原则 面向对象设计原则简介单一职责原则单一职责原则定义单一职责原则分析单一职责原则实例 开闭原则开闭原则定义开闭原则分析开闭原则实例 里氏代换原则里氏代换原则定义里氏代换原则分析 依赖倒转原则依赖倒转原则定义依赖倒转原则分析依赖倒转原则实例 接口隔离…

React 入门

一、官网地址 英文官网: https://reactjs.org/中文官网: https://react.docschina.org/ 二、React 特点 声明式编码组件化编码React Native 编写原生应用高效&#xff08;优秀的 Diffing 算法&#xff09;高效的原因&#xff1a;1.使用虚拟DOM&#xff0c;不总是直接操作页面…

Navicat Premium 16 Mac/win---数据库设计、管理与维护轻松掌握数据库管理精髓

Navicat Premium是一款功能强大的数据库开发工具&#xff0c;支持多种数据库系统&#xff0c;如MySQL、Redis、MariaDB、Oracle等&#xff0c;并可与云数据库兼容&#xff0c;如Amazon RDS、Microsoft Azure等。它提供了直观易用的用户界面&#xff0c;使得开发者能够轻松上手并…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…

基于单片机的无线红外报警系统

**单片机设计介绍&#xff0c;基于单片机的无线红外报警系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的无线红外报警系统是一种结合了单片机控制技术和无线红外传感技术的安防系统。该系统通过无线红外传感器实…

思通数科:利用开源AI能力引擎平台打造企业智能搜索系统

在信息爆炸的时代&#xff0c;如何高效地管理和检索海量数据已成为企业和个人面临的一大挑战。思通数科 StoneDT 多模态AI能力引擎平台&#xff0c;以其强大的自然语言处理&#xff08;NLP&#xff09;、OCR识别、图像识别和文本抽取技术&#xff0c;为用户带来了前所未有的智能…

UE4 C++获取Niagara变量值

UE4 获取Niagara变量值 Niagara有一堆Get方法&#xff0c;但是是基于数据的&#xff0c;单独的Set方法是有的&#xff0c;因此&#xff0c;我们这参考Set源码去Get 源代码如下&#xff1a; 我们的实现&#xff08;当然要返回其他类型值&#xff0c;修改一下对应传参就行了…

一个简单的Demo展示fastapi+tortoise-orm+celery如何搭配

1. 创建并激活虚拟环境 python3 -m venv venv source venv/*/activate 2. 安装依赖包 pip install fastapi uvicorn[standard] tortoise-orm celery[redis] fastapi-cdn-host 3. 配置数据库连接参数 - config.py from typing import TypedDictclass TortoiseInitParam(Ty…

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…

【旅行商问题TSP】基于大邻域搜索算法LNS

课题名称&#xff1a;大规模邻域搜索算法LNS求解TSP问题 版本时间&#xff1a;2024-04-01 程序运行&#xff1a;直接运行LNS_TSP.m 文件即可 代码获取方式&#xff1a; QQ&#xff1a;491052175 VX&#xff1a;Matlab_Lover 模型介绍&#xff1a; 第一步&#xff1a;设定…

LeetCode-统计完全连通分量的数量

题目要求&#xff1a; 给你一个整数 n 。现有一个包含 n 个顶点的 无向 图&#xff0c;顶点按从 0 到 n - 1 编号。给你一个二维整数数组 edges 其中 edges[i] [ai, bi] 表示顶点 ai 和 bi 之间存在一条 无向 边。 返回图中 完全连通分量 的数量。 如果在子图中任意两个顶点…

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展&#xff0c;OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题&#xff0c;给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…

Tik Tok与抖音:一母同胞的不同风采

随着智能手机的普及和网络技术的飞速发展&#xff0c;短视频平台已经成为了大众娱乐生活中不可或缺的一部分。在众多的短视频平台中&#xff0c;Tik Tok和抖音无疑是最受欢迎的两个。尽管它们有着相似的基因——都源自中国&#xff0c;但两者在定位、内容、用户群体以及运营策略…

解决VScode中matplotlib图像中文显示问题

一、更改配置文件 参考这个文件路径找到自己Python环境下的matplotlibrc文件并用记事本打开。 用ctrl F寻找下面的这两行并将前面的#删除&#xff0c;保存并退出。 font.family: sans-serif font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, N…

红黑树介绍与模拟实现(insert+颜色调整精美图示超详解哦)

红黑树 引言红黑树的介绍实现结点类insert搜索插入位置插入调整当parent为gparent的左子结点当parent为gparent的右子结点 参考源码测试红黑树是否合格总结 引言 在上一篇文章中我们认识了高度平衡的平衡二叉树AVL树&#xff1a;戳我看AVL树详解哦 &#xff08;关于旋转调整的…

springboot 项目整合easy-captcha验证码功能

效果 1、验证码使用easy-captcha,在pom文件增加依赖 <!-- google 验证码 --><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId></dependency> 2、增加获取kaptcha的ctrl package com.*.*.s…

AcWing 786. 第k个数——算法基础课题解

AcWing 786. 第k个数 文章目录 题目描述思路CGo 题目描述 给定一个长度为 n的整数数列&#xff0c;以及一个整数 k&#xff0c;请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数&#xff08;所有整数均在 …

韩顺平 | 零基础快速学Python

环境准备 开发工具&#xff1a;IDLE、Pycharm、Sublime Text、Eric 、文本编辑器&#xff08;记事本/editplus/notepad&#xff09; Python特点&#xff1a;既支持面向过程OOP、也支持面向对象编程&#xff1b;具有解释性&#xff0c;不需要编程二进制代码&#xff0c;可以直…