滑动窗口
TCP都是每发送一个数据,都要进行一次确认应答,上一个数据包收到了应答,在发送下一个。引入滑动窗口解决发送效率低的问题。
窗口大小:无需等待确认应答,而可以继续发送数据的最大值。假设发送窗口大小能容下3个TCP段,那么发送端就能连续发送3个TCP段,若中途有ack丢失,可以通过下一个确认应答进行确认,也称为累计确认或者累计应答。
TCP头中有一个win字段,记录着窗口大小,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,从而不会导致接收端处理不过来。
流量控制
流量控制是一种TCP的机制,它可以让发送方根据接收方的实际接收能力控制发送的数据量。接收端通过ack应答报文来告知发送方此时接收方的接收缓存中的窗口大小。
窗口关闭:表现为ack报文中的win字段为0,通知发送方不要发送数据。
窗口探测报文:TCP为每个连接设有一个持续定时器,只要TCP连接一方收到对方的零窗口通知,就启动定时器,如果定时器超时就会发送窗口探测报文,用来解决ack(win 0)报文在传输中丢失,而产生的的死锁现场。
糊涂窗口综合征:如果接受方腾出几个字节就告诉发送方现在有几个字节的窗口,那么发送方就一定会发送这几个字节。会导致发送很多小数据,通信效率低下。
- 让接收方不通告小窗口:当接收窗口小于MSS或者缓存空间的一半时,就发送ack(win 0)
- 让发送方避免发送小数据:使用Nagle算法,该算法是默认打开的
拥塞控制
流量控制是避免发送方的数据填满接收方的缓存,没有考虑网络中的情况,计算机的网络都是处于一个共享的环境,因此有可能会因为其他主机之间的通信使得网络拥堵。TCP在网络发生拥堵时,就会降低发送的数据量。
拥塞控制:避免发发送方的数据填满整个网络。
拥塞窗口cwnd:是发送方维护的一个状态变量,它会根据网络的拥塞程度动态变化。因此swnd=min(cwnd, rwnd)。
拥塞窗口的变化规则:只要网络中没有出现拥塞,cwnd就会增大;单网络中出现了拥塞,cwnd就会减小。
网络中出现拥堵的判断:发送方没有再规定时间内收到ack应答报文,发生了超时重传现象。
拥塞控制的算法
- 慢启动:当发送方每收到一个ACK,拥塞窗口cwnd的大小就加1(1个MSS大小的数据),慢启动呈指数性增长,直到到达ssthresh(慢启动门限)
- 拥塞避免:每收到一个ACK时,cwnd增加1/cwnd。接下来呈线性增长,慢慢进入了拥塞状态,直到触发重传机制时
- 拥塞发生:
超时重传拥塞避免发生算法
STEP1: ssthresh=cwnd/2
STEP2: cwnd=1
STEP3:重新开始慢启动
快速重传拥塞避免发生算法
STEP1: cwnd=cwnd/2
STEP2: ssthresh=cwnd
STEP3: 进入快速恢复算法 - 快速恢复:快速重传和快速恢复算法一般同时使用,快速恢复算法认为如果还能收到三个重复ACK说明网络质量不会太糟糕,所以窗口调节不会太剧烈。
STEP1:拥塞窗口cwnd=ssthresh+3(3的意思是有三个数据包被收到了)
STEP2:重传丢失的数据包
STEP3:如果再收到重复的ACK,那么cwnd加1
STEP4:如果收到信数据的ACK,把cwnd设置为第一步中的ssthresh的值,再次进入拥塞避免状态