一、滑动窗口简介
滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的 拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包, 谁也发不了数据,所以就有了滑动窗口机制来解决此问题。滑动窗口协议是用来改善吞吐量的一种 技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包 (称窗口尺寸)。
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于 接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报。滑动窗口是 TCP 中实现诸如 ACK 确认、流量控制、拥塞控制的承载结构。
说明:
1、可以把窗口理解为缓冲区的大小;
2、滑动窗口的大小会随着发送数据和接收数据而变化;
3、通信双方都有发送缓冲区和接收缓冲区;
服务器:
发送缓冲区(发送缓冲区窗口)
接收缓冲区(接收缓冲发窗己)
客户端:
发送缓冲区(发送缓冲区窗口)
接收缓冲区(接收缓冲发窗己)
二、滑动窗口图文解释
1、发送缓冲区
白色格子:空闲的空间;
灰色格子:数据己经发送出去了,但是还没有被接收;
紫色格子:还没有发送出去的数据;
2、接收缓冲区
白色格子:空闲的空间;
紫色格子:还没有发送出去的数据;
三、滑动窗口工作流程
# mss:Maximum segment size(一条数据的最大的数据量)
# win:滑动窗口
1、客户端向服务器发起连接,客户端的滑动窗口是4096,一次发送的最大数据量是1460(第一次握手);
2、服务器接收连接情况,告诉客户端服务器的窗口大小是6144,一次发送的最大数据量10243(第二次握手);
3、第三次握手;
4、4-9客户端连续给服务器发送了 6k 的数据,每次发送 1k;
5、第10次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了 2k,窗口大小是 2k;
6、第11次,服务器告诉客户端:发送的 6k 数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了 4k,窗口大小是 4k;
7、第12次,客户端给服务器发送了 1k 的数据;
8、第13次,客户端主动请求和服务器断开连接,并且给服务器发送了1k的数据
9、第14次,服务器回复ACK 8194,a:同意断开连接的请求 b:告诉客户端已经接受到方才发的2k的数据 c:滑动窗口2k;
10、第15、16次,通知客户端滑动窗口的大小;
11、第17次,第三次挥手服务器端给客户端发送FIN ,请求断开连接;
12、第18次,第四次回收各户端同意了服务器端的断开请求。
说明:1-3是三次握手,4-9是进行通信;第一次和第二次握手时不能带有通信数据,因为还没有建立连接,第三次握手时可以带通信数据;
四、TCP 通信图解
1、三次握手