谈谈你对滑动窗口的了解?
TCP 利用滑动窗口实现流量控制的机制。滑动窗口(Sliding window)是一种流量控制技术。
早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
--------------------------------------------------------------------------------------------------------------------------
滑动窗口:发送窗口快照
滑动窗口分为发送窗口和接受窗口。
可用窗口/发送窗口
针对这四部分还可以得到两个概念
• 可用窗口:46-51 字节 / 发送窗口:32-51 字节
可用窗口:46-51如果还需要发送字节,这些是可以去发送的,所以一般称为可用窗口。
什么是发送窗口呢?其实也就是发送未确认+还没有发送,但是可以发送的,这两部分加起来就叫做发送窗口,也就是32-51字节。
46-51 字节已发送
当将可用窗口当中的46-51字节发送出去的时候,那我们的可用窗口就耗尽了,为0了。但是我们的发送窗口没有发生变化。
32 到 36 字节已确认
• 发送窗口移动
之前的发送窗口是32-51字节,如果32到36字节这5个字节我们收到了ack的确认,此时发送窗口的大小没有发生变化,那么发送窗口就可以右边移动5个字节,因为我收到了5个字节,接下来52到56字节又变成了可用窗口,所以接下来又可以发送这5个字节了。
这就是所谓的滑动窗口!!!!!!!!!!!!!!!!!!!
发送窗口
• SND.WND(可以看到发送窗口一直是20个字节)
• SND.UNA(已发送,但是还没有收到ack确认的地方)
约等于对端发送窗口的接收窗口
• RCV.WND(接收窗口,内存缓冲区的大小设置有关,缓冲区还能接受20个字节,所以接受窗口大小为20个字节)
通常接受窗口和对端的发送窗口是相等的,但是实际上是约等于,实际上滑动窗口并不是一成不变的,比如接受窗口,应用进程读取速度快的话,那么接收窗口很快就可以空出来。
空出来之后怎么传递给对端呢?需要通过TCP报文的Windows字段来传递的,传递是有延迟的,所以是约等于的关系。
前面的可靠传输的工作原理,比较概括一些,比如停止等待协议,连续ARQ和滑动窗口,以字节为单位的滑动窗口技术其实就是详细的说连续ARQ和滑动窗口是怎么实现的。
应用程序要将文件传输给另外一个计算机,其实这个文件是以字节流的方式往缓存里面放,在缓存里面将字节分段。
分段,每个序号为分段中的第一个。
滑动窗口技术详解
a和b计算机通信的时候要建立连接,b计算机告诉a计算机这边的接受窗口是400个字节,最大支持的报文段mss是100个字节,这是b计算机告诉a计算机的,400个字节就是接受窗口。
这个时候a在缓存里面设置一个发送窗口,这个窗口是400个字节,然后将里面传输的内容以字节流的方式以100个字节分组,并且编号。
这个时候会有4个分组在这个滑动窗口里面,这个时候就可以发1,2,3,4个分组,这个就是连续ARQ,第一个序号是1,第二个序号是101..........。
b收到之后,应用程序就从缓存里面读取这些连续收到的,这个时候接受窗口开始移动,相当于腾出空间了(可用窗口变大),收到之前4个数据段给a发送一个确认,确认号ack的标记位ACK=1,确认号是401,这就意味着前面400个字节全部收到了,你该给我发401个字节了,这个时候发送窗口也开始移动,然后后面的数据段跑到滑动窗口里面来了,又重复上面步骤。
收到确认之后,已发送的那些数据段就可以在缓存里面删除了。
在发送的时候,第7个假如丢了,接收端收到了5,6,8,这个时候收到之后由于7没有收到,窗口就不能向前移动了,这个时候会向a发出确认,该给我发601了,在之前的我都收到,接收端开始滑动窗口,那么9,10都进了滑动窗口,然后发送9,10。
7丢了,啥时候发呢?每次发送一个分组都有一个计时,在等了一个往返时间,超时之后自动重发。收到确认之后,并不是立刻发丢了的7,而是先窗口移动,落到窗口的9和10发。(因为支持选择性确认,那么8就不会重新发了)
7 8 9 10都收到了,就开始读这些连续的数据,读到连续的字节再给它确认发1001.
上面就是以字节为单位的滑动窗口技术。
这个滑动窗口大小是b计算机告诉a的。