转载声明:文章来源https://blog.csdn.net/weixin_52690231/article/details/123495183
1.详细讲一下TCP的滑动窗口
在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。
为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。
从下面的图可以看到滑动窗口左边的是已发送并且被确认的分组,滑动窗口右边是还没有轮到的分组。
滑动窗口里面也分为两块,一块是已经发送但是未被确认的分组,另一块是窗口内等待发送的分组。随着已发送的分组不断被确认,窗口内等待发送的分组也会不断被发送。整个窗口就会往右移动,让还没轮到的分组进入窗口内。
可以看到滑动窗口起到了一个限流的作用,也就是说当前滑动窗口的大小决定了当前 TCP 发送包的速率,而滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值。
2. 聊聊 TCP 的滑动窗口
思路讲解: TCP 滑动窗口是个高频考点,我们需要知道 TCP 报文首部有个字段win控制窗口大小的,同时也需要掌握,滑动窗口是怎么滑的。
TCP 发送一个数据,如果需要收到确认应答,才会发送下一个数据。这样的话就会有个缺点:效率会比较低。
这就好像我们面对面在聊天,你说完一句,我应答之后,你才能说下一句。那么,如果我在忙其他事情,没有能够及时回复你呢?你说完一句后,要等到我忙完回复你,你才说下句,这显然不现实,效率太低。
为了解决这个问题,TCP 引入了窗口,它是操作系统开辟的一个缓存空间。窗口大小值表示无需等待确认应答,而可以继续发送数据的最大值。
TCP 头部有个字段叫 win,也即那个16 位的窗口大小,它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度,从而达到流量控制的目的。
★ 通俗点讲,就是接受方每次收到数据包,在发送确认报文的时候,同时告诉发送方,自己的缓存区还有多少空余空间,缓冲区的空余空间,我们就称之为接受窗口大小。这就是 win。
TCP 滑动窗口分为两种: 发送窗口和接收窗口。发送端的滑动窗口包含四大部分,如下:
● 已发送且已收到 ACK 确认
● 已发送但未收到 ACK 确认
● 未发送但可以发送
● 未发送也不可以发送
● 虚线矩形框,就是发送窗口。
● SND.WND: 表示发送窗口的大小, 上图虚线框的格子数是 14 个,即发送窗口大小是 14。
● SND.NXT:下一个发送的位置,它指向未发送但可以发送的第一个字节的序列号。
● SND.UNA: 一个绝对指针,它指向的是已发送但未确认的第一个字节的序列号。
接收方的滑动窗口包含三大部分,如下:
● 已成功接收并确认
● 未收到数据但可以接收
● 未收到数据并不可以接收的数据
● 虚线矩形框,就是接收窗口。
● REV.WND: 表示接收窗口的大小, 上图虚线框的格子就是 9 个。
● REV.NXT: 下一个接收的位置,它指向未收到但可以接收的第一个字节的序列号。
跟着大佬输出,感觉能量满满