【Java EE初阶十七】网络原理(二)

2. 传输层

2.2 TCP协议

2.2.2 关于可靠传输

4.滑动窗口

        前面的三个机制,都是在保证 tcp 的可靠性;

        TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了);

        滑动窗口,就让可靠传输对性能的影响,更少一些.TCP 只要引入了可靠性,传输效率是不可能超过没有可靠性的 UDP 的,TCP 这里的"效率机制" 都是为了让可靠传输对传输效率的影响更小,尽可能的缩短和 UDP 的差距,即实际上缩短确认应答的的等待时间;

        正常的确认应答的简略图如下所示:

        针对上图由于收到确认应答的等待时间过长的修改措施是批量传输数振,如下图所示:

批量传输数振:
        不等 ack 回来,直接再发下一个数据;

        批量传输也不是无限传输的,批量传输也是存在一定的上限的.达到上限之后,再统一等待 ack;

        不等待的情况下,批量最多发多少数据,这个数据量,称为"窗口大小“;

        如上图所示,当前 A ->B 是批量的发了四份数据,此时 B 也要给 A 回应四组 ACK,但是当 A 已经达到窗口大小, 再收到 ACK 之前,不能继续往下发了.需要等待有 ACK 回来了之后,才能继续往下发.

        q1:这里的A是怎么继续发送消息的?是等待四个 ack 都回来了,在继续发四条?还是回来一个 ack 就继续发一个呢?

        a1:回来一个 ack, 就立即继续发一个;这里看起来的直观效果,这个"窗口"就开始往后"滑动",当然窗口越大, 等待的 ack 越多,此时传输效率也就越高.

        上述滑动窗口中,确认应答是可以正常工作的.但是如果出现丢包了咋办?
        我们当前这里的重传,相比于前面的超时重传,又有很多情况,如下所示:

情况一:ack 丢了

        当前这种情况, 不需要任何重传;所谓确认序号,表示的含义是,当前序号之前的数据,已经确认收到了.即下一个数据包你应该从确认序号这里,继续发送
        简单来说,如果 1001 这个 ack 丟了.但是 2001 ack到了.就可以说明2001 之前的数据都已经确认传输成功了,如此就涵盖了 1001 的情况!!!

情况二: 数据包丢了

        综上所述:主机 A 就需要知道是哪个数据丢了.主机 B 也就得告诉 A 是哪个数据丟了;

上述的重传过程中,并没有额外的冗余操作, 哪个数据丢了,就重传哪个,没丟的数据则不需要重传,总的来说就是整个过程都是比较快速的.(快速重传)

        如果通信双方,传输数据的量比较小,也不频繁,就仍然是普通的确认应答和普通的超时重传;
        如果通信双方,传输数据量更大,也比较频繁,就会进入到滑动窗口模式, 按照快速重传的方式处理;

        通过滑动窗口的方式传输数据,效率是会提升的.所谓窗口越大,传输效率就越大,(一份时间,等待 的 ack 更多了,总的等待时间更少了)
        但是滑动窗口, 设置的越大,不一定越好,如果传输的速度太快,就可能会使接收方,处理不过来了.此时,接收方也会出现丢包,发送方还得重传....由此会会造成tcp传输变得不太可靠起来;TCP 前提是可靠性,可靠性的基础上,再提高传输效率.

5、流量控制

        站在接收方的角度,反向制约发送方的传输速率.发送方发送数据报的速率,不应该超过接收方的处理能力,如下图所示:

        当数据到达B的系统内核中时,tcp socket对象上带有接收缓冲区,A ->B发的数据, 就会先到达 B 的接收缓冲区,8 这边还有应用程序,就会调用 read 这样的方法,把数据从接收缓冲区中读出来,进一步的进行处理.(一旦数据被 read 了,就可以从接收缓冲区中删除了),

        接收方每次收到数据之后,都会把接收缓冲区剩余空间大小,通过 ack 返回给发送方.发送方就会按照这个数值来调整下一轮的发送速度;

6、拥塞控制
        流量控制,是考虑的接收方的处理能力.
        拥塞控制则考虑的不仅仅是接收方,还有整个通信的路径.  拥塞控制则是考虑整个通信过程中间节点的情况(在中间的转发过程中,任何一个节点,处理能力达到上限,都可能会对发送方产生影响,都可能会影响到可靠传输)

        接收方的处理能力,很方便进行量化.但是由于中间节点,结构更复杂, 更难以直接的进行量化,因此就可以使用“实验”的方式,来找到个合适的值:

        首先让 A 先按照比较低的速度先发送数据(小的窗口),如果数据传输过程非常顺利,没有丢包,再尝试使用更大的窗口, 更高的速度进行发送,(一点一点变化);

        其次随着窗口大小不停的增大,达到一定程度,可能中间节点就会出现问题了.此时这个节点就可能会出现丢包,发送方发现丢包了,就把窗口大小调整小,此时如果发现还是继续丢包,继续缩小,如果不丢包了,就继续尝试变大;

        最后在这个过程中,发送方不停的调整窗口大小,逐渐达成"动态平衡“,这种做法就相当于把中间节点,都视为“整体”,通过试验的方式,来找到中间节点的瓶颈在哪里;

        关于拥塞控制的节点的相关图解如下图所示:

        流量控制和拥塞控制,都是在限制发送方的发送窗口的大小.最终时机发送的窗口大小,是取决于流量控制和拥塞控制中的窗口的较小值.

7、延时应答
        A 把数据传给 B,B 就会立即返回 ack 给 A[正常]
        也有的时候,A 传输给 B,此时 B等一会再返回 ack 给 A[延时应答] 

        延时应答的本质上也是为了提升传输效率,发送方的窗口大小, 就是传输效率的关键;流量控制这里,就是根据接收缓冲区的剩余空间来决定发送速率的。如果能够有办法,让这个流量控制得到的窗口更大点,发送速率就更快点(前提是能够让接收方还是能处理过来的)

        延时返回 ack,给接收方更多的时间,来读取接收缓冲区的数据,此时接收方读了这个数据之后,缓冲区剩余空间,变大了,同时返回的窗口大小也就更大

eg:

        初始情况下,接收缓冲区剩余空间是 10kb, 如果立即返回 ack,返回了 10kb 这么大的窗口.
如果延时个 200ms 再返回,这 200ms 的过程中,接收方的应用程序的,又读了 2kb,此时,返回的 ack, 就可以返回 12kb 的窗口了

8、捎带应答

        在延时应答的基础上,进一步的提高效率.网络通信中,往往是这种"一问一答”这样通信模型,即如下图所示:

        综上,本来是要传输两个 tcp 数据包 (封装分用两遍),目前通过上述操作,就可以把两个包合并成一个了.此时就可以得到更高效的效果,

9、面向字节流 

        这里有一个最重要的问题---->粘包问题 (不是 tcp 独有的,而是面向字节流的机制都有类似的情况)

        此处"包"应用层数据包.如果同时有多个应用层数据包被传输过去,此时就容易出现粘包问题,举个例子,如下图所示:

        目前,接收缓冲区中,这三个应用层数据包的数据,就是以字节的形式,紧紧挨在一起的,接收方的应用程序,读取数据的时候可以一次读一个字节,也可以读两个字节,也可以读多个字节;但是最终的目标是为了得到完整的应用层数据包,问题是B应用程序,就不知道缓冲区里的数据, 从哪里到哪里是一个完整的应用数据包了;

        相比之下,像 UDP 这样的面向数据报的通信方式,就没有上述问题,UDP 的接收缓冲区中,相当于是一个又一个的 DatagramPacket 对象,应用程序读的时候,就能明确知道哪里到哪里是一个完整的数据,如下图所示:

        q3:如何解决粘包问题?

        a3:核心思路: 通过定义好应用层协议,明确应用层数据包之间的边界,解决方法主要有下面两个:

        1、引入分隔符
        2、 引入长度.

        一个简单的例子,使用 \n 作为分隔符,如下图所示:

        引入例子,定义数据包的长度:

        需要注意的是,自定义应用层协议的格式,像xml,json,protobuffer等本身都是明确了包的边界的

10、异常情况的处理

        如果在使用 tcp 的过程中,出现意外,会如何处理?下面就针对一些出现的异常,就其相关的解决方案一一列列举:

1)、进程崩溃:

        进程没了,异常终止了.文件描述符表,也就释放了.相当于调用 socket.close(),此时就会触发 FIN,对方收到之后,自然就会返回 FIN 和 ACK,这边再进行 ACK (正常的四次挥手断开连接的流程),TCP 的连接,可以独立于进程存在(进程没了,TCP 连接不一定没;

2)、主机关机(正常流程)
        在进行关机的时候,就是会先触发强制终止进程操作,(相当于 1),此时就会触发 FIN,对方收到之后,自然就会返回 FIN 和 ACK;但是主机关机不仅仅是进程没了,整个系统也可能关闭了.如果在系统关闭之前,对端返回的 ACK 和 FIN 到了,此时系统还是可以返回 ACK,进行正常的四次挥手的,如果系统已经关闭了,ACK 和 FIN 迟到了,无法进行后续的ACK 的响应,站在对端的角度,对端以为是自己的 FIN 丢包了,重传 FIN.重传几次都没有响应,自然就会放弃连接.(把持有的对端的信息就删了)

3)、主机掉电 (非正常)

        此时,是一瞬间的事情,来不及杀进程,也来不及发送 FIN,主机直接就停机了.
        站在对端的角度,对端不一定知道这个事情咋搞,根据掉电的对端来分析:

        1、如果对端是在发送数据(接收方掉电),发送的数据就会一直等待 ack,触发超时重传,触发 TCP 连接重置功能,发起"复位报文段“,如下图所示:

如果 复位报文段发过去之后,也没有效果,此时就会释放连接了.

        2、如果对端是在接收数据(发送方掉电),对端还在等待数据到达.….等了半天没消息,此时其实无法区分,是对端没法发消息,还是对方挂了;TCP 中提供了心跳包机制.即接收方也会周期性的给发送方发起一个特殊的,不携带业务数据的数据包,并且期望对方返回一个应答
如果对方没有应答,并且重复了多次之后,仍然没有回复,就视为对方挂了,此时就可以单方面释放连接

4)、网线断开
        网线断开,和刚才的主机掉电非常类似的.

        当前假设,是 A 正在给 B发送数据,一旦网线断开,A 就相当于就会触发超时重传 ->连接重置 ->单方面释放连接;

        B 就会触发心跳包 ->发现对端没响应 ->单方面释放连接.

2.3 TCP和UDP之间的对比

        TCP 优势:可靠传输(TCP 适用于绝大部分场景.)
        UDP 优势:更高效率(UDP 更适合于, 对于"可拿性不敏感","性能敏感"场景)

"可拿性不敏感","性能敏感"场景--->局域网内部(同一个机房)的主机之间通信,即同一个机房内部, 网络结构简单,带宽充足,交换机/路由器网络设备负载程度也不是很高,出现丢包的概率就不大.故此往往也希望机器之间数据传输能更快.

        如果要传输比较大的数据包,TCP 更优先(UDP 有 64KB 的限制);

        如果要进行“广播传输”,优先考虑UDP,因为UDP天然支持广播,TCP不支持(所谓广播就是有一种特殊的场景,需要把数据发送给局域网的所有机器,这种情况就是广播);

ps:本篇的内容刀片这里就结束了,如果大家感兴趣的话就请一键三连哦!!!

        

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

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

相关文章

什么是FTC能效标签? FTC能效标签办理流程是怎么样?

亚马逊美国站能源标签FTC 什么是FTC及历史背景 Federal TradeCommission(FTC)是美国联邦贸易委员会,是执行多种反托拉斯和保护消费者法律的联邦机构。其目的是确保国家市场行为具有竞争性,且繁荣、 高效地发展,不受不合理的约束。美国联邦贸易…

前端工程化面试题 | 10.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

赋能AI原生应用开发:百度智能云千帆AppBuilder正式开放服务

为满足企业敏捷、高效地进行AI原生应用开发的需求,降低AI原生应用开发门槛,百度智能云千帆AppBuilder正式开放服务。戳我体验 AppBuilder将大模型开发AI原生应用的常见模式、工具、流程,沉淀成一个工作台,帮助开发者聚焦业务本身…

【网络安全】什么样的人适合学?该怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题: 什么样的人适合学习网络安全?我适不适合学习网络安全? 当然,产生这样的疑惑并不奇怪,毕竟网络安全这个专业在2017年才调整为国家一级…

C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

介绍完了list类的相关内容后:C初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: 文章目录 1.stack的初步介绍2.stack的使用3.queue的初步介绍4.queue的使用5.容器适…

rust函数 stuct struct方法 关联函数

本文结合2个代码实例主要介绍了rust函数定义方法,struct结构体定义、struct方法及关联函数等相关基础知识。 代码1: main.rc #[derive(Debug)]//定义一个结构体 struct Ellipse {max_semi_axis: u32,min_semi_axis: u32, }fn main() {//椭圆&#xff0…

micro-app以UMD js链接方式引入使用

npm 下载好micro-zoe/micro-app后,找到index.umd.js: 新建一个测试html,引入并使用: 参考: 微组件实践 - 掘金

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空,就像众多金融市场一样。但什么是卖空呢?如何外汇做空?在本文中,我们将讨论如何做空货币。什么是外汇做空? 外汇做空(Short Selling)是外汇市场上的一种投资方式。它指的是投资…

深度学习系列58:大模型训练和压缩

1. 大模型训练 1.1数据并行 1.2 模型并行 1.3 ZeRO 1.4 流水线并行 1.5 混合精度训练 1.6 offloading 把梯度放在cpu上保存和计算 1.7 overlapping 提前传输数据 1.8 checkpointing 中间线性层不保存,反向传播时再次重新计算 1.9 使用BMtrain 2. 大模型压…

蝶阀、球阀、阀门百科

一、D71X是蝶阀的型号其中D 就代表了蝶阀,7 代表是对夹式链接,1代表这个蝶阀是中线结构,x就是密封面材质为橡胶。结合起来D71X表示的就是手柄对夹中线蝶阀。 二、J41H-100C型号字母含义介绍 J41H-100C型号是德特森阀门常用的高压截止阀型号字母代表的意思是: J——代表阀门类…

MCU中断控制

目录 一、中断相关基础知识 1、NVIC:嵌套向量中断控制器 2、可屏蔽中断和不可屏蔽中断的区别 3、中断优先级 4、常见特殊中断 二、中断相关寄存器 三、中断使用步骤: 一、中断相关基础知识 1、NVIC:嵌套向量中断控制器 (1) 它是内核的…

Windows Server 2012 评估版和Windows Server 2019 评估版 升级为正式版(工作v笔记v分享)

Windows Server 2012 评估版和Windows Server 2019 评估版是微软提供的试用版本,可以免费下载和使用一段时间。当使用评估版时,可以在适当的时候将其升级为正式版,以便继续使用并享受完整的功能。 要将评估版升级为正式版,可以按…

基于ArcGIS Pro SDK的MVVM架构

示例结果展示 文件夹创建 相对于原始C#,少了Command文件夹里的类。该文件中的RelayCommand使用 ArcGIS.Desktop.Framework Properties属性配置,主要用于设置执行程序路径(自带文件夹) DarkImages用于存放深色图片(自…

面试经典150题【1-10】

文章目录 面试经典150题【1-10】88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组中的重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机1122. 买卖股票的最佳时机 II55.跳跃游戏![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff…

nvm安装配置环境

前言 对于前端开发人员来说,多个项目可能用的不同的node版本,如何方便快速的转换版本,nvm版本管理工具的出现,解决这个问题。 实战 1. 搜索nvm版本,我用的1.1.2,下载后直接安装。 2.在d盘建立nvm空文件…

uniapp H5唤起手机App 中间下载页

我这里直接是打开中间下载页,在下载页判断手机是否已存在App,有则唤起App,没有则可点击下载按钮下载app。 唤起App的关键语句是:window.location.href scheme Scheme链接格式样式: [scheme]://[host]/[path]?[que…

蓝桥杯:C++队列、优先队列、链表

C普通队列 算法竞赛中一般用静态数组来模拟队列,或者使用STL queue。使用C的STL queue时,由于不用自己管理队列,因此代码很简洁。队列的部分操作如下。 C优先队列 很多算法需要用到一种特殊的队列:优先队列。它的特点是最优数据…

Android下SF合成流程重学习之onMessageInvalidate

Android下SF合成流程重学习之onMessageInvalidate 引言 虽然看了很多关于Android Graphics图形栈的文章和博客,但是都没有形成自己的知识点。每次学习了,仅仅是学习了而已,没有形成自己的知识体系,这次趁着有时间,这次…

Python算法100例-1.7 最佳存款方案

完整源代码项目地址,关注博主私信’源代码’后可获取 1.问题描述2.问题分析3.算法设计4.完整的程序 1.问题描述 假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后5年中的每年年底取出1000元,到第5年时刚…

什么是生产排产管理系统?哪个最好用?

阅读本文,你将了解:一、生产排产管理系统是什么;二、生产排产管理系统的功能;三、盘点五款好用的生产排产管理系统;四、生产排产管理系统的优势。 一、生产排产管理系统是什么 生产排产,也叫生产计划排程…