我们都知道TCP是一种可靠的,面向连接的传输层协议。我们总是希望TCP能够传输的数据越快越好。如果存在这样一种情况,发送方数据发送的非常快,而且接收方耗尽自己的资源也根本来不及接收,那这些多余的数据就会被丢弃,这就违背了TCP可靠的宗旨了。
所以就需要引入一种流量控制的手段:让发送方不要发送太快,既让接收方能够顺利接收数据,而且也不会造成网络链路的阻塞。
沿着这个思路:让发送方不要发送的太快。那就让接收方控制发送方的数据大小,每次应答的时候通知发送方自己还剩多少空间可以接收数据。当然实际交互没有这么的简单,只是提供了一种思路。利用这种思路,诞生了滑动窗口的方式。
滑动窗口类似一个窗口,是用来告诉发送方可以发送数据的大小。也可以说是窗口标记了接收方缓冲区的大小。窗口大小也就表示一次能发送多少数据量,而且这个窗口可以滑动,滑动窗口因此得名。
怎样通知发送方窗口大小呢?难道要重新发送一包数据告诉对方吗,这显然是不合理的。可以巧妙的使用确认应答包。有了确认应答包还是不够,如果是第一次交互呢?所以还需要在三次握手时候,就需要告知对方。(rwnd表示接收窗口)
在原来的确认应答策略中,每一次发送数据,都需要Ack应答,在接收到Ack之后才会发送下一个数据段,发送方没有接收到Ack应答呢?这样做的方式效率实在太低。使用了滑动窗口,可以多次发送数据,只要不要超过对方窗口大小。这样就大大提高了效率。
A 向 B 发送数据。在连接建立时,B 告诉 A:“我的接收窗口 rwnd = 400(字节)。注意:图中的箭头上面大写的ACK表示首部中的确认位ACK,小写ack表示确认字段的值。
上面的过程是这样的:
觉得不错,记得关注,转发!