# 概述
滑动窗口实现了TCP流控制。首先明确滑动窗口的范畴:TCP是双工的协议,会话的双方都可以同时接收和发送数据。TCP会话的双方都各自维护一个发送窗口和接收窗口。各自的接收窗口大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用数据处理的速率)。各自的发送窗口则要求取决于端通告的接口窗口,要求相同。
滑动窗口解决的是流量控制的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。接收端的缓存传输数据给应用层,但是这个过程不一定是即时的,如果发送速度过快,会出现接收端数据overflow,流量控制解决的是这个问题
# 窗口的概念
发送方的发送缓存内的数据都可以被分成4类
- 已发送,已收到ACK
- 已发送,未收到ACK
- 未发送,但允许发送你
- 未发送,但不允许发送
其中类型2和3都属于发送窗口。
接收方的缓存数据分成3类
- 已接收
- 未接收但准备接收
- 未接收而且不准备接收
其中类型2属于接收窗口
窗口大小代表了设备一次能从端处理多少数据,之后在传给应用层。缓存传给应用内层的数据不能乱序,窗口机制保证了这一点。现实中,应用层可能无法理科从缓存中读取数据。
# 滑动机制
发送窗口只有接收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不会对后续字节确认。依次取保对端会对这些数据重传
遵循快速重传、累计确认、选择确认等规则。
发送发的window size = 8192;就是接收端最多发送8192字节,这个8192一般就是发送发接收缓存的大小。
# 参考
← 一文搞懂TCP与UDP的区别 axios →