滑动窗口
滑动窗口(Sliding window)是一种流量控制技术。
早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。
由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
其实滑动窗口就是互相的协商, 发送的数据不能超过对方的处理能力.
image.png
#1 表示已经发送并确认的数据
#2 表示已经发送但是并未 Ack 的数据
#3 表示即将要发送还未发送的数据
#4 表示没有发送的数据
image.png
黑色的框就是我们说的滑动窗口, 它的大小为 20 字节, 当 #2 Ack回来的时候, 会重新返回对方的窗口大小, 然后发送方进行动态调节。
image.png
上图展示了发送窗口和接收窗口两端的实际执行情况, 有意思的是最后出现了 窗口占满(window=0) 的情况, 通常这种情况会发生 RST 标志位进行重置, 这个不再此次范围讨论里面。
从图中我们可以看到 Server 端每次根据自身消费数据缓冲区情况,重新计算 RCV.WND 值大小, ACK 响应给 Client 端都会携带 window 字段, Client 端根据 Server端的 window 大小, 重新调整了 发送窗口 大小。
Nagle算法
John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的,他在1984年首次用这种方法来尝试解决福特汽车公司的网络拥塞问题。
他解决的问题就是所谓的silly window syndrome,中文称“愚蠢窗口症候群”。
具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及40 个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞。
Nagle化后来成了一种标准并且立即在因特网上得以实现。
它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是合乎需要的。
如果频繁的进行