【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:本篇的内容刀片这里就结束了,如果大家感兴趣的话就请一键三连哦!!!

        

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

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

相关文章

Linux:docker在线仓库(docker hub 阿里云)基础操作

把镜像放到公网仓库,这样可以方便大家一起使用,当需要时直接在网上拉取镜像,并且你可以随时管理自己的镜像——删除添加或者修改。 1.docker hub仓库 2.阿里云加速 3.阿里云仓库 由于docker hub是国外的网站,国内的对数据的把控…

2024年十大数字技术趋势与其安全挑战报告

今天分享的是行业报告:《2024年十大数字技术趋势与其安全挑战报告》 (内容出品方:CSA GCR) 报告共计:86页 来源:《见鹿报告》 序言 随着数字技术的迅猛发展,越来越多的组织和个人在数字化环境中开展业…

【IIS中绑定SSL证书】

下载SSL证书: 打开服务器IIS: 点击导入 在IIS中新增网站:

2024年【天津市安全员B证】考试技巧及天津市安全员B证复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年天津市安全员B证考试技巧为正在备考天津市安全员B证操作证的学员准备的理论考试专题,每个月更新的天津市安全员B证复审模拟考试祝您顺利通过天津市安全员B证考试。 1、【多选题】《建设行政处罚决定…

常见的几种Web安全问题测试简介

Web项目比较常见的安全问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击。它指的是恶意攻击者往Web 页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web 里面的html 代码会被执行,从而达到恶意用户的特殊…

论文解读:Masked Generative Distillation

文章汇总 话题 知识蒸馏 创新点 带掩盖的生成式蒸馏 方法旨在通过学生的遮罩特征来生成老师的特征(通过遮盖学生部分的特征来生成老师的特征),来帮助学生获得更好的表现 输入:老师:,学生:,输入:,标签:,超参数: 1:使…

多模态学习综述(MultiModal Learning)

最早开始关注到多模态机器学习是看到Jeff Dean在2019年年底NeurIPS大会上的一个采访报道,讲到了2020年机器学习趋势:多任务和多模态学习将成为突破口。 Jeff Dean 谈2020年机器学习趋势:多任务和多模式学习将成为突破口 站在2022年&#xff…

HMI界面:感官与体验俱佳的智能家居界面分享

Hello,我是大千UI工场,本期分享HMI人机交互界面在智能家居领域的案例,关注大千,学习N多UI干货,有设计需求,可以联络。 设计感官和体验俱佳智能家居的UI界面时,可以考虑以下几个方面:…

一起学量化之Aroon指标

Aroon指标是由Tushar Chande于1995年开发的技术分析工具,旨在识别股票是否处于趋势中及趋势的强度。它通过分析股票价格在一定周期内创下的新高和新低来预测趋势的变化,这基于一种观念:强势趋势通常伴随着频繁的新高或新低。 1. Aroon指标的组成 Aroon指标由两个部分组成:…

【Linux内核】从0开始入门Linux Kernel源码

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[Linux内核] ❤️ 前置学习专栏:[Linux学习]从0到1 ⏰ 我们仍在旅途 ​ 目录 …

【测试】自动化

目 录 一.什么是自动化二.自动化测试分类三.selenium工具(web自动化测试工具)四.环境部署五.什么是驱动?1.常见的元素操作2.窗口3.执行脚本4.等待5.浏览器的操作6.弹窗7.选择器8.文件上传9.浏览器参数 一.什么是自动化 有效的减少人力的消耗&#xff0…

基于PPNSA+扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于PPNSA扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图和优化收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行…

[力扣 Hot100]Day27 合并两个有序链表

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 出处 思路 简单题,两个指针就能解决。 代码 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(!list1)…

蓝桥杯嵌入式学习记录——按键的使用

目录 一、按键原理简介 二、cubeMX的配置 三、按键的短按代码 四、按键的长按代码 一、按键原理简介 在STM32中,按键连接通常使用GPIO(通用输入/输出)端口来实现。当按键未被按下时,GPIO端口处于高电平状态(即1&am…

CSS 评分器星星效果

<template><view class="rating"><!-- 5颗星 --><input value="5" name="rating" id="star5" type="radio"><label for="star5"></label><!-- 4颗星 --><input val…

每日一练:LeeCode-530、二叉搜索树的最小绝对差【二叉搜索树+pre辅助节点+DFS】

本文是力扣LeeCode-530、二叉搜索树的最小绝对差【二叉搜索树pre辅助节点DFS】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。…

Docker容器运行

1、通过--name参数显示地为容器命名&#xff0c;例如:docker run --name “my_http_server” -d httpd 2、容器重命名可以使用docker rename。 3、两种进入容器的方法&#xff1a; 3.1、Docker attach 例如&#xff1a; 每间隔一秒打印”Hello World”。 Sudo docker run…

杂题——字符串——试题 算法训练 二元函数

分析&#xff1a; 关键在于&#xff0c;如果处理输入的字符串成表达式字符串分三种情况&#xff1a; 如果 S 中只包含一个整数&#xff0c;则该整数就是表达式 S 的值&#xff1b;如果 S 中包含 f 函数&#xff0c;则递归计算 f 函数的参数&#xff0c;并将计算结果代入 f 函数…

第三百五十一回

文章目录 1. 概念介绍2. 获取方法3. 示例代码4. 对比与总结4.1 横向对比4.2 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍获取当前时区.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们使用的北京…

线程池 ThreadPool

文章目录 线程池一、线程池概述1、什么是线程池&#xff1f;2、为什么需要线程池&#xff1f;3、线程池的优势4、基本原理 二、线程池相关接口与方法1、Executor2、ExecutorService3、ScheduledExecutorService4、Runnable & Callable5、Future & FutureTask6、execute…