TCP 的滑动窗口机制 TCP 这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议
既然是一个可靠的传输协议就需要对数据进行确认
TCP 协议里窗口机制有2 种一种是固定的窗口大小
一种是滑动的窗口
这个窗口大小就是我们一次传输几个数据
我们可以看下面一张图来分析一下固定窗口大小有什么问题
这里我们可以看到假设窗口的大小是1,也是就每次只能发送一个数据只有接受方对这个数据进行确认了以后才能发送第 2 个数据
我们可以看到发送方每发送一个数据接受方就要给发送方一个ACK 对这个数据进行确认
只有接受到了这个确认数据以后发送方才能传输下个数据
这样我们考虑一下如果说窗口过小,那么当传输比较大的数据的时候需要不停的对数据进行确认,这个时候就会造成很大的延迟
如果说窗口的大小定义的过大
我们假设发送方一次发送 100 个数据
但是接收方只能处理 50 个数据
这样每次都会只对这50 个数据进行确认
发送方下一次还是发送 100 个数据,但是接受方还是只能处理 50 个数据
这样就避免了不必要的数据来拥塞我们的链路
所以我们就引入了滑动窗口机制,窗口的大小并不是固定的而是根据我们之间的链路的带宽的大小,这个时候链路是否拥护塞
接受方是否能处理这么多数据了
我们看看滑动窗口是如何工作的
我们看下面几张图
首先是第一次发送数据这个时候的窗口大小是根据链路带宽的大小来决定的
我们假设这个时候窗口的大小是3
这个时候接受方收到数据以后会对数据进行确认告诉发送方我下次希望手到的是数据是多少
这里我们看到接收方发送的ACK=3
这个时候发送方收到这个数据以后就知道我第一次发送的3 个数据对方只收到了 2 个
就知道第3 个数据对方没有收到
下次在发送的时候就从第3个数据开始发
这个时候窗口大小就变成了 2
这个时候发送方发送2 个数据
看到接收方发送的ACK 是5