当前位置:网站首页>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就可以和这个响应一起过去了,也就触发了延时应答。
边栏推荐
- SQALE 是什么
- 全流程调度——MySQL与Sqoop
- 8、统一处理异常(控制器通知@ControllerAdvice全局配置类、@ExceptionHandler统一处理异常)
- 学习DAVID数据库(1)
- Intel's software and hardware optimization empowers Neusoft to accelerate the arrival of the era of smart medical care
- JS 函数 this上下文 运行时点语法 圆括号 数组 IIFE 定时器 延时器 self.备份上下文 call apply
- LeetCode Daily Question 2022/7/25-2022/7/31
- The modification is not properly placed in the sandbox, causing Apple compatibility issues
- Mysql 45讲学习笔记(二十五)MYSQL保证高可用
- Modbus on AT32 MCU
猜你喜欢
随机推荐
7、私信列表
12 Disk related commands
return in try-catch
Android's webview cache related knowledge collection
【Android】Room —— SQLite的替代品
Go 项目实战-获取多级分类下的全部商品
Refuse to work overtime, a productivity tool set developed by programmers
Hanyuan Hi-Tech 8-channel HDMI integrated multi-service high-definition video optical transceiver 8-channel HDMI video + 8-channel two-way audio + 8-channel 485 data + 8-channel E1 + 32-channel teleph
Face detection based on opencv
The modification is not properly placed in the sandbox, causing Apple compatibility issues
Live Preview | KDD2022 Doctoral Dissertation Award Champion and Runner-up Dialogue
CorelDRAW2022精简亚太新增功能详细介绍
8、统一处理异常(控制器通知@ControllerAdvice全局配置类、@ExceptionHandler统一处理异常)
Number 16, top posts
品牌广告投放平台的中台化应用与实践
【编译原理】递归下降语法分析设计原理与实现
什么是分布式锁?实现分布式锁的三种方式
拒绝加班,程序员开发的效率工具集
SonarQube的BUG定义
The application of AI in the whole process of medical imaging equipment








