目的
提高 TCP 协议效率的机制
示例
- 场景一,未使用滑动窗口
这样 一发一收 的方式效率比较低,那么我们一次发送多条数据(也就是多个段的等待时间重叠在一起了),统一等待 ACK,就可以大大提高性能。
- 场景二,使用滑动窗口
蓝色框表示已经发送的数据有哪些
当收到 ACK(2001)后,表示 2001 之前的数据已经发送完成,可以发送 5001 - 6000 了
这就类似于,拉粑粑的时候也可以玩手机,看 CSDN 大佬的文章,没必要拉屎的时候就只拉屎。。。。有点恶心,但是还是挺形象的。(我觉得有点像 海王 行为)
有点类似与以前小学的一个题,烤一个饼子需要 20 分钟,正面 10 分钟,背面 10 分钟,一个锅最多一次能烤两个饼子,请问烤 3 个饼子最短需要多少时间?
- 场景三,使用滑动窗口,但是 ACK 丢了
1001 ACK 丢失,但是客户端已经收到 2001 ACK ,表示 2000 以前的数据都收到了,并不要紧。
- 场景四,使用滑动窗口,丢包
连续收到几次同样的 ACK 时进行重传。这样就保证了可靠性的同时提高效率!
而重传机制的也依赖与 32 位确认序号。丢失那个序号的数据就重传那个序号的数据,保证了传输的效率是比较高的,重传的效率也是比较高的(比较没有重传多余的数据)。因此丢包重传也叫做 快速重传。
滑动窗口大小的设计
滑动窗口越大,效率就越高,但是存在一个问题,滑动窗口越大,那么就要有一个相对的缓冲区,缓冲区也就是一块内存。内存占用过大是不科学的;
而影响窗口大小的还有接收方的接受速率,如果接收方处理数据慢,而发送数据却发送得很快,就会导致丢包。此时就要限制发送发的窗口大小。因此就有了 流量控制机制 !
而两台主机之间传输数据会有很多中间节点,也就是路由器,路由器的处理数据能力并不知道,为了防止丢包,因此就有了 拥塞控制机制。