tcp欢动窗口机制_TCP协议中的窗口机制------滑动窗口详解

一、窗口机制的分类

在TCP协议当中窗口机制分为两种:

1.固定的窗口大小

2.滑动窗口

二、固定窗口存在的问题

如下图所示:

我们假设这个固定窗口的大小为1,也就是每次只能发送一个数据,只有接收方对这个数据进行了确认后才能发送第二个数据。在图中我们可以看到,发送方每发送一个数据接收方就要给发送方一个ACK对这个数据进行确认。只有接收了这个确认数据以后发送方才能传输下个数据。

存在的问题:如果窗口过小,当传输比较大的数据的时候需要不停的对数据进行确认,这个时候就会造成很大的延迟。

如果窗口过大,我们假设发送方一次发送100个数据,但接收方只能处理50个数据,这样每次都只对这50个数据进行确认。发送方下一次还是发送100个数据,但接受方还是只能处理50个数据。这样就避免了不必要的数据来拥塞我们的链路。

因此,我们引入了滑动窗口

二、滑动窗口(以字节为单位)

1.概述

滑动窗口通俗来讲就是一种流量控制技术。

它本质上是描述接收方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据,如果发送方收到接收方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来

2.工作原理

第一次发送数据这个时候的窗口大小是根据链路带宽的大小来决定的。

假设这时候的窗口是3.这个时候接收方收到数据以后会对数据进行确认告诉哦发送方我下次希望收到的数据是多少。

在上图中:我们看到接收方发送的ACK = 3(这是对发送方发送序列2的回答确认,下一次接收方期望接收到的是3序列信号),这个时候发送方收到这个数据以后就知道我第一次发送的3个数据对方只收到了两个,就知道第三个数据对方没有收到,下次返送的时候就从第3个数据开始发。这时候窗口大小就变为了2.

如下图所示:

看到接收方发送的ACK是5就表示他下一次希望收到的数据是5,发送方就知道我刚才发送的2个数据对方收到了,这个时候开始发送第5个数据。

*****当链路变好或者变差,这个窗口还会发生变化,并不是第一次协商好了以后就永远不会变化了。

3.死锁状态

(1)概述:

当接收端向发送端发送零窗口报文段后不久,接收端的接收缓存又有了一些存储空间,于是接收端向发送端发送了Windows size = 2的报文段,然而这个报文段在传输过程中丢失了。发送端一直等待收到接收端发送的非零窗口的通知,而接收端一直等待发送端发送数据,这样就死锁了。

(2)解决方法

TCP为每个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

4.TCP报文段的发送时机(传输效率问题)

可以用以下三种不同的机制控制TCP报文段的发送时机:

(1)TCP维持一个变量MSS,等于最大报文段的长度。只要缓冲区存放的数据达到MSS字节时,就组装成了一个TCP报文段发送出去

(2)由发送方的应用进程指明要发送的报文段,即:TCP支持推送操作

(3)发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过MSS)发送出去。

5.Nagle算法(控制TCP报文段的发送时机)

(1)主旨:避免大量发送小包

(2)初衷:避免发送大量的小包,防止小包泛滥于网络,在理想情况下,对于一个TCP连接而言,网络上每次只能有一个小包存在。它更多的是端到端意义上的优化

【CORK算法:提高网络利用率,理想情况下,完全避免发送小包,仅仅发送满包以及不得不发的小包】

发送方将第一个数据字节发送出去,把后面到达的数据字节缓存起来。当发送方接收对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段再发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认之后,才继续发送下一个报文段。规定一个TCP连接最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其它的小分组。当数据到达较快而网络速率较慢时,用这样的方法可以明显的减少所用的网络带宽。

Nagle算法还规定:当达到的数据已经达到发送窗口大小的一半或者已经达到报文段的最大长度时,就可以立即发送一个报文段。

6.糊涂窗口综合症(接收端糊涂,网络上小包泛滥的原因之一)

(1)概述:

TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存区中读取1字节(这样就使接收缓存空间仅腾出1字节),然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报为40字节的话),然后,发送方又发来1字节的数据(发送方的IP数据报是41字节),接收方发回确认,仍将窗口设置为1个字节,这样,网络效率就会很低

(2)解决办法

a.你糊涂我不糊涂法。即Nagle算法。

可让接收方等待一段时间,使得或者  接收缓存已有足够的空间容纳一个  最长的报文段,或者等到接收方缓存已有一半的空闲空间。只要出现这两种情况,接收方就发回确认报文,并向发送方通知当前的窗口大小。此外,发送方也不要发送太小的报文段,而是把数据报文积累为足够大的报文段或达到接收方缓存的空间的一半大小。

b.治疗接收端的糊涂(其中一种机制是延迟ACK(还有其它机制,例如不发送小窗口通告等))

对于接收方而言, 延迟ACK可以拖延ACK发送时间,进而延迟窗口通告,在这段时间内,接收窗口有机会进一步放大

对于发送方而言, 不理会接收端的小窗口通告等于说不马上1发送小包,小包有时间积累成大包

————————————————

版权声明:本文为CSDN博主「m0_37962600」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_37962600/java/article/details/79951780

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

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

相关文章

1-1.HTML、CSS、JavaScript语言在web前端开发中的作用

HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。 CSS样式是表现。 就像网页的外衣。比如,标题字体、颜色变化,或为标题加入背景图片、边框等。所有这些用来改变内容外观的东西称之为…

判断html()中有长度,VBS 字符串长度判断的问题

对于给你一个字符串你应该怎样判断他的字符串长度,试举一些典型的例子C语言——字符串长度的计算方法提示:(1)计算字符串长度时关键是要注意辨认转义字符;(2)一个转义字符总是以反斜杠开始,再加一个其他字符组成。所以&#xff0c…

maxvalue mysql自动分区_创建mysql表分区的方法

创建mysql表分区的方法我来给大家介绍一下mysql表分区创建与使用吧,希望对各位同学会有所帮助。表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考手册。表分区是最近才知道的哦,以前自己做都是分表来实现上亿级别的数据了&…

html概述

什么是html? HTML(Hyper Text Markup Language)超文本标记语言。 标记语言就是让文本展示更丰富,更美观的一种语言。比如说文本加粗 更换颜色 斜体 html这种标记语言就是为了让网页展示更丰富,更美观的一种语言 开发…

计算机专业后悔么,王言匀

《中华独特疗法大成》分方法和治疗两篇。方法篇依据用药与否,分为药物疗法和非药物疗法两章,药物疗法按照给药途径分为内服法和外用法两节;非药物疗法根据施术手段分为针灸、推拿、气功及其他4节。这些章节介绍了273种治疗方法的基本内容、适…

python制作网页样式与布局_Python开发【第十二篇】:CSS装饰页面

CSS称为层叠样式表,是Cascading Style Sheets的缩写。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS引入方式:行内式:对标签元素添加style属性,在style属性中设置CSS样式&#…

html标签的用途

语义化。那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理) 比如,网页上的文章的标题就可以用标题标签,网页上的各个栏目的栏目名称也可以使用标题标签。文章中内容的…

应用计算机散热的原理是什么,水冷散热器是什么原理?水冷可以带给机箱多大的散热作用?...

用户若是CPU安装了水冷散热器,就可以利用水快速导热和散热的特性加强主机硬件的散热效果,和普通风扇的散热效果相比,水冷可以更加有效的降低硬件温度和热量散发速度。阅读下文了解水冷散热器的原理和作用。CPU水冷散热器是指使用液体在泵的带…

markdown改字体和背景颜色(html)

背景色是 1 背景色2 BlueViolet 背景色是orange 字体的设置我是黑体字 我是微软雅黑 我是华文彩云 color#0099ff size72 face”黑体” color#00ffff colorgray Size&#xff1a;规定文本的尺寸大小。可能的值&#xff1a;从 1 到 7 的数字。浏览器默认值是 3 <tabl…

计算机展望未来网络形态,在学习中展望未来

域。虚拟现实技术、模拟技术、流媒体以及网络技术使我们的教育达到了前所未有的地步。利用技术&#xff0c;我们可以把浩瀚的宇宙、微小的分子、原子世界展现在学生面前&#xff1b;利用技术&#xff0c;学生不用走出教室&#xff0c;就可以遨游五洲&#xff0c;跨越四海。我们…

批量画同心不同半径圆lisp_cad绘制同心圆lisp二次开发源代码

简介&#xff1a;本资源为autocad同心圆lisp二次开发源代码下载,该代码文件可以直接在autocad中加载,执行,可以实现的功能为绘制多个间距一定的同心圆源代码&#xff1a;(Defun C:TXY ()(SetQ cp (GetPoint "圆心&#xff1a;")cr (GetDist cp "基础半径&#x…

mvc html传参数乱码,SpringMVC Controller 接收页面传递的中文参数出现乱码

在Controller中接收到的POST参数如果是中文的话&#xff0c;显示为乱码。已知客户端传过来时编码为UTF-8。问题产生分析&#xff1a;spring MVC中默认的编码格式为“ISO-8859-1”,因此造成乱码。简单的解决方式&#xff1a;New String(request.getParameter(“xxx”).getBytes(…

lisp scheme 果壳_走出Lisp(Scheme)困境

从去年开始入坑Lisp&#xff0c;周周转转也算是基本入门了这一传说中的语言。Lisp确实是一门很开明的语法规范。lambda是基本定义形式&#xff0c;递归在其骨子深处&#xff0c;试图通过函数表达世界&#xff0c;的确这个世界是周而复始的&#xff0c;有些人愿意称为循环&#…

jenkins部署流程图_持续集成-jenkins(自动化部署流程图)

1、什么是持续集成持续集成&#xff1a;简称CI。持续集成的特点&#xff1a;自动完成、保证每个时间点上团队成员提交的代码是成功集成的、需求不明确或频繁变更的情景、帮助企业减少管理风险。持续集成的应用场景&#xff1a;持续集成(CI)系统组成部分&#xff1a;版本控制系统…

django 表单html5,我们如何在django管理表单中添加动态html5数据属性

你继承Django的ModelChoiceField并修改它的render_options()和render_option()方法来显示你所需要的对象的属性。我想你也需要你自己的ModelChoiceIterator的子类&#xff0c;这样它不仅可以吐出id/label元组&#xff0c;而且可以分离出你需要的所有数据。例我只是找到了一个自…

中蜂几月份自然分蜂_蜜蜂什么时候自然分蜂?

一、自然分蜂时间蜂群自然分蜂一般多在春季晴朗天气的上午10点到下午2点左右发生&#xff0c;对于为什么蜂群多在春季自然分蜂是有原因&#xff0c;蜂群发生自然分蜂必须要具备一系列的条件才行&#xff0c;第一个条件是蜂群的群势要足够强大&#xff0c;第二个条件是外界蜜源丰…

计算机办公应用软件初级,电脑办公软件有哪些?桌面便签办公软件基础教程

原标题&#xff1a;电脑办公软件有哪些&#xff1f;桌面便签办公软件基础教程Windows电脑上的办公软件有很多&#xff0c;很多网友都觉得电脑上用的桌面便签小工具不算办公软件&#xff0c;其实只要是对工作有帮助的电脑程序&#xff0c;在某种程度上来说都可以说是办公小工具软…

电脑开机启动修复无法自动修复此计算机,Win7系统开机无法自动修复此计算机如何解决...

在使用win7系统的时候&#xff0c;总是会遇到一些问题&#xff0c;比如就有用户反映说开机提示自动修复&#xff0c;导致无法正常进入操作系统&#xff0c;经过分析部分系统修复报错文件为&#xff1a;X:Windowssystem32driversspoon.sys&#xff0c;那么要怎么解决这样的问题呢…

开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面,但可以用管理器运行程序,怎么解决...

电脑开机后黑屏不显示桌面&#xff0c;但可以用管理器运行程序&#xff0c;怎么解决以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;电脑开机后黑屏不显示桌面&#xff0c;但可以用管理器运行…

lower_bound()和upper_bound()

二分检索函数lower_bound()和upper_bound() lower_bound()&#xff1a;找到大于等于某值的第一次出现 upper_bound()&#xff1a;找到大于某值的第一次出现 必须从小到大排序后才能用 内部查找方式为二分查找&#xff0c;二分查找必定需要排序 返回值为地址 #include &l…