网络原理-四

news2024/11/20 7:09:59

一、续

当窗口大小为0,意味着缓冲区满了,此时发送方,就因该暂停发送,发送方会周期性的除法 " 窗口探测包 " ,并不携带载荷,这样的包对于业务不产生影响,只是为了触发ACK,一旦查询出来的结果是非0,缓冲区右有空间了,发送方就可以继续发送.

二、拥塞控制

要限制发送方发送数据的速率

如果当前接收方处理数据的速度非常快,但是中间路径出现了问题,发送速度再快也没有用.

木桶效用 : 能装多杀水,取决于最短的板

针对这种情况,核心思路,把中间的路径经过的所有设备看作一个整体,通过实验的方式找到最快的方式.

如果按照某个窗口大小发送数据之后,出现丢包,就视为中间路径存在拥堵,就减小窗口大小,

没出现丢包,视为中间路径不存才拥堵,就增大窗口大小.

这种方案,一方面简化了问题,另一方面也能很好地适应,当前网络环境的复杂性.

中间这些节点,什么时候出现拥堵,什么时候不拥堵,都是随机的

此时按照以上策略,就可以让发送速率,.动态变化.

总的原则是,流量控制和拥塞控制,谁产生的窗口大小更小,谁说的算.

拥塞控制具体是怎么把窗口大小给试出来的?

1. 慢启动.刚开始传输的数据,速率是比较小的,采用的窗口 (拥塞窗口) 大小也就比较小.此时,网络的拥堵情况未知,如果上来就很大,可能会出问题.

2. 此时上述传输的数据,没有出现丢包,说明网络还是通畅的,就要增大窗口大小,此时,增大的方式是按照指数来增长的.

由于慢启动,.开始的时候,窗口大小非常小,也有可能网络上就是很畅通,通过指数可以让上述窗口快速增长,这样就可以保证效率了.

3. 指数增长,不会一直保持的,可能会增长太快,一下子导致网络拥堵.

这里引入了一个 "阈值",当拥塞窗口达到阈值后,此时指数增长就变成线性的了.

(线性增长能使当下窗口保持在一个很快的效率,并且不容易丢包.

4. 线性增长也是一直在增长,积累一段时间之后,传输速度可能太快,此时还是会引起丢包,一旦出现丢包,就把拥塞窗口重置成最小的值,回到最初的慢启动的过程(再次指数增长),并且这里也会根据刚才丢包的窗口大小,重新设置指数增长到线性增长的阈值.

三、延时应答

也是基于滑动窗口,是要尽可能在提高一点效率.

结合滑动窗口及流量控制,能够通过延时应答ACK的方式,把反馈窗口的大小变得更大一点.

核心就在于在允许范围内,使,窗口尽可能的变大.

接收方收到数据之后,不会立即返回ACK,而是稍等一下,等一下再返回ACK.

等了一会儿,相当于给接收方的应用程序这里,腾出来更多的时间,来消费这里的数据.

也就是等一会儿,让接受让先处理一下数据,就会让缓冲区空余空间变大,然后再发送更多的数据.

延时应答是按照ACK丢了的方式来处理,因为滑动窗口中ACK丢了也不会产生什么影响.

正常每个数据都有ACK,此时就可以隔几个数据返回一次ACK,

四、捎带应答

基于延时应答,引入的机制,能够提升传输效率.

修改窗口大小,确实是提高效率的有效途径.

捎带应答,就是走另一条路,尽可能的把能合并的数据包进行合并,从而起到提高效率的效果.

正常情况下,服务器返回的ACK和response之间,有一定的时间间隔,此时就得分两个包发送了.

由于有了延时应答, 服务器收到请求后,要执行业务逻辑,根据请求计算响应.

ACK延时这段时间里,响应数据刚好准备好了,此时就可以把AKC和响应数据合并成一个TCP数据报

本身ACK也不带载荷,只是把报头中的ACK标志位设为1,并且设置确认序号以及窗口.

这几个属性不会冲突.

五、面向字节流

"粘包问题"

此处的包是 " TCP载荷中的应用数据包"

TCP传输的数据到了接收方后,接收方要根据socket api 来 read 出来,read出来的结果就是应用层数据包.

由于整个read过程非常灵活,可能会使代码中无法区分出当前的数据是从哪到哪是一个完整的应用数据包,

如上图,就无法确定从哪到哪是一个数据.

解决问题的关键,就是"明确包与包之间的边界"

1. 通过特殊符号,作为分隔符,见到分隔符,就视为一个包结束了

2. 指定出包的长度,比如在包开始的位置,加上一个特殊的空间来表示整个数据的长度.

上述这样的问题,都应该是在设计应用层协议的时候就设计好了的.

六、异常问题

考虑比丢包更严重的情况,甚至说网络直接出现故障等情况

1. 其中有一方出现了进程崩溃

进程无论是正常结束,还是异常崩溃,都会触发到回收文件资源,关闭文件这样的效果(系统自动完成的),就会触发四次挥手

TCP的生命周期.可以比进程更长一点,虽然进程已经退出了,但是TCP连接还在,仍然可以继续进行四次挥手.

2. 其中有一方关机了(正常流程)

关机会强制终止所有进程,此时四次挥手不一定能完成

如果够快,此时,本段和对端都能正确删除保存的连接信息.

如果不够快,至少也把第一个FIN发给对方,告诉对方我这里要结束了.

对端收到FIN后,对端也要进入释放连接的流程了,返回ACK,并且也发FIN,这里发的FIN不会再有ACK了.

FIN没有收到ACK之后,会进行重传,达到指定次数后,就单方面释放连接了.

3. 其中一方出现断电.

   3.1 断电的是接收方,发送方会突然发现没有ACK了,就要重传.

        重试几次后还是不行,TCP就会尝试复位连接.(相当于清楚原来的TCP中的各种临时数据,重新开始.)

这就需要用到TCP中的一个复位报文段.

通过此处的RST,报文直接复位.

        3.2 断电的是发送方

接收方本来在阻塞等待发送方的消息,结果一直没来.

这是就要区分,发送方是挂了还是没准备好.

TCP中,接收方一段时间后,没有收到消息,就会触发 " 心跳包 " 来询问对方的情况.

心跳包:不携带应用层数据包的特殊数据包,1. 周期的   2. 没有心跳,视为是对端挂了.

如果对端没有心跳了,此时本端也会尝试复位并且单方面释放连接了.

   4. 网线断开.

这种情况本质上就是3的3.1 和 3.2 的结合了.

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

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

相关文章

GPT-4o:新一代人工智能技术的全方位解析引言

目录 🐋引言 🐋梳理 GPT 各版本之间的内容 🦈GPT-1:开创性的起点 🦈 GPT-2:参数规模的大幅提升 🦈 GPT-3:参数爆炸与多任务学习 🦈GPT-4:进一步提升的智…

Qt 5桌面APP开发实战

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 第一节:Qt 5桌面APP开发实战入门 Qt 5的跨平台特性 Qt 5的界面设计工具 Qt 5的…

Leecode---栈---每日温度 / 最小栈及栈和队列的相互实现

栈:先入后出;队列:先入先出 一、每日温度 Leecode—739题目: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温…

Android下HWC以及drm_hwcomposer普法(下)

Android下HWC以及drm_hwcomposer普法(下) 引言 不容易啊,写到这里。经过前面的普法(上),我相信童鞋们对HWC和drm_hwcomposer已经有了一定的认知了。谷歌出品,必须精品。我们前面的篇章见分析到啥来了,对了分析到了HwcDisplay::in…

git报错prohibited by Gerrit: not permitted: update

git push报错: Push to refs/for/[branch] to create a review, or get Push rights to update the branch. Contact an administrator to fix the permissions (prohibited by Gerrit: not permitted: update)原因: 使用Gerrit代码审核时,本…

c++车票管理系统

这里写自定义目录标题 c车票管理系统vx:sredxc车票管理系统初始页面,需要源码vx:sredxc新增车票信息查询车票信息代码包含完整的发布车票信息,购票,退票,票数检测,余票检测,车票查询等功能 c车票管理系统vx:sredxc 这段代码实现了一个简单的高铁票务管理系统,具有以…

算法每日一题(python,2024.05.24) day.6

题目来源(力扣. - 力扣(LeetCode),简单) 解题思路: 排序+双指针 先将两个数组进行排序,cursor1和cursor分别指向两个数组的首位,比较两个指针所指的值的大小&#xff0…

斑消宝六周年大动作,斑小将将再迎高光时刻

如今,周年庆典已经成为众多品牌展示自身实力与影响力的重要舞台。这不仅仅是一个简单的庆祝活动,更是一次向外界展示品牌发展历程、未来规划以及团结合作伙伴的绝佳机会。在这样的背景下,广州斑消宝化妆品有限公司将打造别具一格的盛典&#…

TiDB-从0到1-分布式存储

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、TiDB-DML语句执行流程(增删改) DML流程概要 1、协议验证 用户连接到TiDB Server后首先工作的是Protocol Layer模块,该模块会对用…

【Node】Assertion testing 模块的使用

简言 node:assert 模块提供了一组用于验证不变式的断言函数。 node版本:20.14.0 Assertion testing 测试断言模块 node:assert 模块是一个测试相关的模块。 严格模式和非严格模式 感觉该模块的严格模式和js的严格模式相匹配,非严格模式也是这样的。…

Visual Studio的桌面快捷方式图标不显示

1.问题描述 以下以Visual Studio 2019举例, 正常图标: 但是当前Visual Studio的桌面快捷方式图标不显示了? 2.问题原因分析 Visual Studio 2019桌面快捷方式图标不显示可能由以下几个原因造成: 图标缓存问题:Windo…

实用软件分享---超级轻量级的强力卸载软件工具UninstallView_1.51

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

大话设计模式学习笔记

目录 工厂模式策略模式备忘录模式(快照模式)代理模式单例模式迭代器模式访问者模式观察者模式解释器模式命令模式模板方法模式桥接模式适配器模式外观模式享元模式原型模式责任链模式中介者模式装饰模式状态模式 工厂模式 策略模式 核心:封装…

基于springboot实现大学生就业需求分析系统项目【项目源码+论文说明】计算机毕业设计

摘要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以…

用容器构建wordpress项目

用容器构建wordpress项目 #准备两个镜像 #数据库和centos docker pull mysql:5.7 docker pull centos:7 #创建一个wordpress文件夹,在wordpress文件里面写一个Dockerfile文件 vim DockerfileFROM centos:7 #基于centos环境RUN yum -y install epel-release ;\ #安装…

【个人质量提高指南】红酒篇|品酒新手必读:一文学会如何品酒解锁干、半干、半甜、甜型葡萄酒的味觉密码!

文章目录 一.葡萄酒常识1.葡萄酒分类2.葡萄酒年份颜色【随年份的增加,颜色从左向右】3.葡萄酒五大要素4.葡萄品种分类5. 葡萄酒产区6.葡萄酒酒杯分类7.葡萄酒瓶型分类8.葡萄酒专业词汇新形容 二.拓展篇1.葡萄酒里的甜味是怎么来的?2.干型、半干、半甜和甜…

String类型的二维数组怎么写

今天做题遇到一个问题&#xff1a;就是需要写String类型的二维数组时&#xff0c;我蒙圈了。后来查了资料发现&#xff0c;String类型的二维数组其实是由若干个一维数组构成的。 1.先初始化一个二维数组&#xff1a;List<List<String>> list new ArrayList<&g…

【mysql数据库】mycat中间件

MyCat 简介 Mycat 是数据库 中间件 。 1、 数据库中间件 中间件 是一类连接软件组件和应用的计算机软件&#xff0c; 以便于软件各部件之间的沟通 。 例子 Tomcat web 中间件 。 数据库 中间件 连接 java 应用程序和数据库 2、 为什么要用 Mycat ① Java 与数据库紧耦合 …

java向上转型

介绍 代码 父类 package b;public class father_ {//father classString name"动物";int age10;public void sleep() {System.out.println("睡");}public void run() {System.out.println("跑");}public void eat() {System.out.println("…