java网络原理(四)----tcp特性

news2024/11/19 15:11:17

一.滑动窗口

滑动窗口:可以提高传输效率,准确的来说是让tcp在可靠传输的前提下,效率不要太拉胯。使用滑动窗口不能使tcp变的比UDP块,但能减少差距。
前面谈过tcp的传输数据的时,会把数据进行编号,每次传固定的长度。比如主机A给主机B发信息,信息经过应用层后到传输层,tcp会把应用层发来的信息通过每个字节进行编号,假设编号为1到3000,tcp会批量传输编号内容。设主机A第一次传输编号为1到1000的内容。主机B收到给A返回确认应答后,主机A才能接着发1001到2000的数据。
在这里插入图片描述
这样传输能够保证可靠性,但大量的时间都消耗在等ack上了。使用滑动窗口就是为了缩短等待时间。
在这里插入图片描述
一次性发出一组数据,发送一组数据的过程中不需要等待Ack,就直接往前发。此时就相当于使用一份等待时间等四个ACK。把一次发多少个数据,不用等ACK的大小称为滑动窗口。窗口越大此时批量发送的数据越多,效率就越高,但是窗口不能无限大,如果无限大,相当于完全不必等,此时就和不可靠传输一样。
在这里插入图片描述
主机A假设一次性传1-2000,2001-3000,3001-4000,4001-5000,这样的数据就需要4个ack,虽然一次性发了4条数据但是等主机B的4个ack都返回后在进行第二轮发送显然效率有点慢,可以等第一条数据的ACK收到后直接进行第二轮发送,发送50001-6000的数据,这样还是等4条ACK,窗口大小还是一样大,只是往后平移了一个格子。这样可以缩短时间,比之前能提升一定的效率。
如果按照滑动窗口传输数据丢包了咋办?
对于Tcp提高效率,必然不应该影响可靠性。2种情况数据丢了和Ack丢了。
1.ack丢了:
ack丢了,不用做任何处理,也是正确的。假设2001到3000数据的Ack丢了,但是4001到5000的Ack在说明4000之前的数据都发送成功了,此时并不需要重传。
2.数据丢了
假设1001到2000的数据丢了,3001到4000的数据到达了B,B返回的确认应答任然是1001,会一直向A索要1001到2000的数据,当A连续收到几次B的索要,A就明白1001到2000的数据丢失了,A就会重传1001到2000的数据。
在这里插入图片描述
如果接收缓冲区1001到2000少了。返回的Ack会始终索要这个数据,一旦1001这个数据报补上了,此时1001到2000后面的数据报都不必要重传了,接下来看后面的数据哪里有缺失,如果有补上,没有直接索要缓冲器的最后一个数据的下一个即可。

滑动窗口并不是使用tcp一定会涉及,通信双方大规模传输数据的时候会使用滑动窗口,如果数据较少仍然按照超时重传。

二.流量控制

滑动窗口,窗口越大,传输效率越高,但是窗口也不能无限大,如果窗口太大,就可能使双方处理不过来了,或者是中间的传输链路层处理不过来了。这样就会丢包,得重传,反而影响了效率。流量控制就是给滑动窗口刹车。
通过流量控制限制发送方发射窗口的速度。数据发送到缓存区后,此时就会把缓存区剩余空间大小,通过ack报文反馈给发送方,作为下一次发送数据,窗口大小的依据。
假设内存缓存区的空间大小为4000,A第一轮发送的数据占用4000大小的空间,缓冲区空间大小已满,这个时候A就不能继续发数据了,等B去消耗数据,A在等待的同时会时不时给B发送窗口探测包(不会携带具体数据),只是为了触发ACK(查询当前接收缓冲区的情况)。一旦发现内存空间释放了,就可以继续发送了。接收方可以根据窗口的大小就可以反向限制发送方传输速度了。

三.拥塞控制

传输数据的时候要经过很多线路,路由器,交换机。每个路由器交换机处理数据的能力不一样,如果中间某个节点处理数据的能力特别差,那么主机A发送数据的能力不能超过这里的阀值。总的传输效率是一个木桶效应,取决于最短板。
在这里插入图片描述
虽然中间的设备一般由运营商提供的企业级路由器/交换机,整体的转发的能力特别强,但如果量很大的话也会堵车。具体怎么衡量中间设备的转发能力呢?把中间的设备看做一个整体,采用实验的方式,动态调整,产生一个合适的大小。

1.使用一个较小的窗口,如果传输正常就增大窗口。
2.使用一个较小的窗口,如果丢包就减小窗口。

而拥塞窗口就是在拥塞机制下,采用的窗口大小。
tcp中拥塞控制具体是这样展开的:

1.慢启动,刚开始通信的时候,会使用一个较小的窗口来试水。
2.指数增长:在传输通畅的过程中,拥塞窗口会指数增长。
3.线性增长:当拥塞窗口指数增长到设定的阀值时,会线性增长。
4.拥塞窗口回归最小窗口:当窗口大小增长过程中,如果出现丢包,认为当前网络拥堵了。此时就会把窗口调整成最小的小窗口,继续回到指数增长加线性增长的过程中,另外会根据当前丢包的窗口大小,调整阀值。

在这里插入图片描述
拥塞控制和流量控制共同限制了滑动窗口的大小,可以使滑动窗口在可靠性的机制下,提高传输效率。

四.延迟应答

是否有办法在滑动窗口的基础上再次提高效率?需要在返回ACK的时候,延迟一点时间,利用这个时间,就可以给应用程序腾出来更多的消费数据的时间。接收缓存区剩余空间就会更大了。
在这里插入图片描述
如果数据传过来,此时立刻返回ACK此时窗口的大小就是3kb,稍等500ms,此时在返回ack,就有可能在这500ms里面又消耗了2kb数据,此时返回的窗口大小就是5kb了。

五.捎带应答

稍带应答在延迟应答的基础上,让ack和响应一起返回,提高了效率。
在这里插入图片描述
数据从两个合并一个,效率会有明显的提升。主要还是因为这里每次传输数据都需要封装分用。
能合并的原因,一方面是时机是可以同时的,一方面ACK本身不需要带载荷,和正常的数据不冲突,完全可以让一个数据报,既能够携带载荷数据,又能带有ack信息。

六.面向字节流

在面向字节流的情况下会产生粘包问题。粘包问题是数据发送过来,tcp会把数据进行编号,根据编号每次发送一部分数据。那么数据报发过来,但是接收的时候怎么知道从哪里到哪里是一个完整的应用数据报,这就是粘包问题。
发送是2个包,读可能读了半个或者一个半,这个时候都会产生问题。
在这里插入图片描述
站在发送方的角度预期,aaa是一个应用层数据报,bbb是一个应用层数据报,ccc是一个应用层数据报。此处正确的做法是合理的设计应用层协议,这件事情在传输层很难解决,需要在应用层解决这个问题。

1.应用层协议中,引入分割符,区分包之间的边界。
2,应用层协议中,引入包长度,也能区分边界。

1.使用\n约定包之间的分隔符
在这里插入图片描述

2.使用包的长度区分
在这里插入图片描述
粘包问题不仅仅是tcp才有的,只要是面向字节流(文件)也有同样的问题,解决问题都是一样的,要么使用分割符号,要么使用长度。

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

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

相关文章

Go语言介绍以及如何在Go语言中操作MySQL数据库

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

Oracle中实现根据条件对数据的增删改操作——Merge Into

一、需求描述 在我们进行项目开发的过程中,会遇到这样的场景,需要根据某个条件对数据进行增、删、改的操作;遇到这种情况我们有2种方法进行解决: 方法一:①查询指定条件;②根据查询出的指定条件结果在执行…

LeetCode146:LRU缓存

leetCode:146. LRU 缓存 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#x…

ZnO非线性电阻产品特征技术规范

ZnO非线性电阻是一种多组分的多晶陶瓷半导体。它以ZnO为主体,添加其它各种成分组成。不同厂家及研究机构的添加物成分不完全相同,当添加物含量超过0.001mol时开始呈现非线性,典型的ZnO非线性电阻的显微结构包括四部分: ① ZnO 主体:它是由电阻率为0.0010m~0.10m&…

八股 -- C#

面向对象 (三大特性) 三大特性目的是为了提供更好的代码组织、可维护性、扩展性和重用性 C#基础——面向对象 - 知乎 (zhihu.com) 封装 理解: 你不需要了解这个方法里面写了什么代码,你只需要了解这个方法能够给你返回什么数据&…

​Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具

Edge-TTS是由微软推出的文本转语音Python库,通过微软Azure Cognitive Services转化文本为自然语音。适合需要语音功能的开发者,GitHub上超3000星。作为国内付费TTS服务的替代品,Edge-TTS支持40多种语言和300种声音,提供优质的语音…

实例分割——细胞实例分割数据集

一、重要性及意义 细胞实例分割是单细胞空间研究的基石,有助于我们更深入地理解健康和疾病状态下的细胞相互作用 通过细胞实例分割,研究人员能够探索正常和病理条件下的细胞如何相互影响,进而增强对基本生物过程的理解。这种理解有助于我们揭…

Web API —— BOM 学习(完结)

目录 一、BOM 介绍 二、Window 对象 (一)基本介绍 (二)定时器 —— 延时函数 1.语法 2.清除时间函数 3.和 interval 间歇函数的区别 (三)JS 执行机制 1.介绍 2.同步任务 3.异步任务 4.执行过程…

FPGA之组合逻辑与时序逻辑

数字逻辑电路根据逻辑功能的不同,可以分成两大类:组合逻辑电路和时序逻辑电路,这两种电路结构是FPGA编程常用到的,掌握这两种电路结构是学习FPGA的基本要求。 1.组合逻辑电路 组合逻辑电路概念:任意时刻的输出仅仅取决…

微信小程序使用Vant组件库流程

目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。这样开发原生微信小程序的会方便很多。 官方网址:Vant Weapp - 轻量、可靠的小程序 UI 组件库 步骤一 通过 npm 安装 npm i vant/weap…

建立动态MGRE隧道的配置方法

目录 一、实验拓扑 1.1通用配置 1.1.1地址配置 1.1.2静态缺省指向R5,实现公网互通 1.1.3MGRE协议配置 1.1.4配置静态 二、Shortcut方式 三、Normal方式(非shortcut) 四、总结 一、实验拓扑 下面两种配置方法皆使用静态方式 1.1通用配…

C#进阶-反射的详解与应用

一、反射的概念 反射是.NET框架提供的一个功能强大的机制,它允许程序在运行时检查和操作对象的类型信息。通过使用反射,程序可以动态地创建对象、调用方法、访问字段和属性,无需在编译时显式知道类型信息。在.NET中,所有类型的信…

代码随想录训练营第58天 | LeetCode 739. 每日温度、​​​​​​LeetCode 496.下一个更大元素 I

目录 LeetCode 739. 每日温度 文章讲解:代码随想录(programmercarl.com) 视频讲解:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 496.下一个更大元素 I 文…

【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

目录 前言 1、文件目录 2、安装依赖 3、POM项目实战-案例:打开指定页面 目录结构: pages中的代码: cases中的代码: 4、解决登录问题 问题: 解决方案: 获取登录的用户信息(cookie&a…

静态住宅IP优缺点,究竟要怎么选?

在进行海外 IP 代理时,了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和,并提供选择建议,帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

[C++]内联函数(内联函数的概念,内联函数的特性,内联函数与宏的区别)

一、内联函数的概念 以inline修饰的的函数叫内联函数,编译时C编译器会在调用内联函数的位置将内联函数展开,内联函数没有调用函数参数压栈的开销,内联函数可以提高程序的运行效率。 例子: 没有使用内联函数 使用内联函数&#xff…

STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

文章目录 一、简易刷卡式打卡考勤系统(一)功能简介原理图设计程序设计 哔哩哔哩: https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…

UE4_旋转节点总结一

一、Roll、Pitch、Yaw Roll 围绕X轴旋转 飞机的翻滚角 Pitch 围绕Y轴旋转 飞机的俯仰角 Yaw 围绕Z轴旋转 飞机的航向角 二、Get Forward Vector理解 测试: 运行: 三、Get Actor Rotation理解 运行效果: 拆分旋转体测试一&a…

警惕垃圾邮件,伪造法院传真传播Sodinokibi勒索病毒

Sodinokibi勒索病毒在国内首次被发现于2019年4月份,2019年5月24日首次在意大利被发现,在意大利被发现使用RDP攻击的方式进行传播感染,这款病毒被称为GandCrab勒索病毒的接班人,在GandCrab勒索病毒运营团队停止更新之后&#xff0c…

Can‘t resolve ‘mockjs‘ in ‘......

问题场景: 未从根本目录打开项目在运行npm run serve 后报错:Parsing error: No Babel config file detected for...... 解决方法:在终端 cd ./含有package.json的文件夹/ npm run serve 此时在加载到70%之后报错 Cant resolve mockjs in .…