当前位置:网站首页>TCP详解(二)
TCP详解(二)
2022-07-31 02:58:00 【爪哇菜鸡@】
5.流量控制
对滑动窗口的进一步补充。
本质上就是在控制滑动窗口的大小。
既然如此,窗口大小取多少合适?
窗口越大,为了保证可靠性,资源开销的就越多。
窗口太小,速度也不能得到保证。
此处流量控制是基于接收方的处理能力来限制窗口大小的。
TCP这个传输数据的过程,其实就类似一个 生产消费者模型。
主机A发弄得数据就到达了主机B的接收缓冲区。此时主机A就是生产者,主机B的应用程序,通过socket api 来读取数据,被socket api 读取到的数据就从缓冲区中删掉了,应用程序就是消费者,接收缓冲区就是交易场所(类似于一个队列)。
所说的窗口大小,其实是指发送方(主机A)批量发送多少数据。比如,主机A发送的数据很快,窗口很大,如果主机B的应用程序读取的速度很慢,随着时间的推移,接收缓冲区逐渐就满了,如果不加任何限制,主机A还是按照一样的速度进行发送数据,此时新来的数据就没有地方保存了,就别内核丢掉了…
流量控制这个机制,就是为了解决这个问题的!!!
根据接收方的处理能力(接收缓冲区剩余空间大小),来动态决定发送方的发送速率(控制窗口大小)。
分析图中案例:
接收缓冲区的大小是4000
1 - 1000 数据叨叨的时候,缓冲区这里面用了1000,还剩3000,返回的ACK中就会把3000这个信息告诉发送方。
发送方再次发送数据的时候,就按照3000作为窗口大小来进行发送。
过了重发超时的时间以后若还没有收到窗口更新的通知,发送端会发送个窗口探测的包。
窗口大小(接收缓冲区的剩余空间)是如何返回给发送方的?
通过报头中的16位窗口大小
如果窗口大小为0了.(接收端这边满了)然后发送方就停了嘛?
此时发送方是不再继续发数据了.但是为了能够查询当前接收方的窗口大小,每隔一段时间,还会再来触发一个窗口探测包,通过这个包(不传输具体的业务数据)触发ack,在这个ack中就能够知道当前窗口的大小了。
问题:16位数字最大表示65535,那么tcp窗口最大就是65535字节吗(64K)?
实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位(左移一位就是 * 2)。
6.拥塞控制
站在另一个角度来限制发送方的窗口大小。
在一个宏观的角度看看待这个问题,把整个中间的链路都看成一个整体,只看结果!!
逐渐尝试的过程,先试用一个比较小的窗口来传输数据,看看是否都丢包,如果不丢包,说明网络比较通畅,若是丢包,说明网络发生拥堵。
当网络通畅的时候,逐渐加大发送速率,出现丢包的时候,立即降低发送频率。
通过这样的方式,就可以逐渐实验出一个比较合适的窗口大小。
真实的发送窗口的大小 是取流量口至的窗口和拥塞控制窗口两者之间的最小值。
慢启动:刚开始发送的时候,给一个较小的窗口。
这个图描述了拥塞控制中,窗口大小的变化规则。
指数增长速度是非常快的,刚开始启动的时候,窗口比较小,通过指数增长,就能在很少的轮次中,把窗口的大小顶上去。
如果达到阈值,就从指数增长变成线性增长。
7.延时应答
为了提高效率,也是从窗口大小入手。
让窗口大小,在保证可靠的基础之上,能尽量在大一点。
对于流量控制来说,窗口大小就是接收缓冲区的剩余空间大小。会随着时间的推移越来越多。
就可以得出,如果接收方立刻返回ACK,此时返回的窗口大小,就是缓冲区剩余的空间。
但是如果接收方稍等一会儿,再返回ACK,稍等的这个时间里,应用程序就可能会消费一些缓冲区中的数据,此时缓冲区剩余的空间就变大了。
图示:
延时应答并不是所有的包都进行延时应答
一方面是数量限制:每隔N个包就应答一次
一方面是时间限制:超过最大延迟时间就应答一次
8.捎带应答
在延时应答的基础之上
很多的客户端/服务器的通信模式,都是这种“一问一答”的方式。
图示:
由于有了延时应答,返回的ACK不是立即返回,而是等一会儿,正好在这个等一会儿的期间,服务器要返回业务上的response了,此时就可以把这个ACK和response合二为一,把这两个包变成一个包。
牢记!网络通信涉及大量的封装和分用,针对每个包都要进行封装,收到之后在进行解析
图示:
针对四次握手来说,确实是可能四次变成三次的。
捎带应答,是可能把中间的ACK和FIN给合并成一个。于是四次挥手就变成了三次挥手。
四次挥手啥时候能变三次?
不能确定的!!!捎带应答本身就是一个"概率性的机制"
当前ACK延时的时间正好要比接下来发业务数据的时间要更长一些。
例如,服务器收到请求到返回响应,这个过程消耗时间50ms,但是延时应答假设最多等20ms,这个情况就无法触发捎带应答了.但是延时应答假设是最多等60ms,第50ms 的时候,此时触发了响应,ACK就可以和这个响应一起过去了,也就触发了延时应答。
边栏推荐
猜你喜欢
随机推荐
JS 函数 this上下文 运行时点语法 圆括号 数组 IIFE 定时器 延时器 self.备份上下文 call apply
Unity3D Button 鼠标悬浮进入与鼠标悬浮退出按钮事件
The use of font compression artifact font-spider
什么是分布式锁?实现分布式锁的三种方式
7. List of private messages
print task sorting js od huawei
Number 16, top posts
10 权限介绍
6. Display comments and replies
选好冒烟测试用例,为进入QA的制品包把好第一道关
php 网站的多语言设置(IP地址区分国内国外)
Moxa NPort device flaw could expose critical infrastructure to devastating attack
Graphical lower_bound & upper_bound
The simulation application of common mode inductance is here, full of dry goods for everyone
测试中的误报和漏报同样的值得反复修正
【C语言】表达式求值的一般方法
【Android】Room —— SQLite的替代品
10. Redis implements likes (Set) and obtains the total number of likes
The Sad History of Image Processing Technology
golang GUI for nuxui — HelloWorld