目录
一、拥塞控制
二、延迟应答
一、拥塞控制
虽然 TCP 拥有滑动窗口这个大杀器机制来根据具体情况对发送的数据大小和速度进行实时控制, 能够高效并且可靠的发送大量的数据.
但是如果在双方建立好连接后的刚开始阶段就发送大量的数据。仍然可能引发一些问题. 因为同一个网络上有很多台计算机, 有可能当前的网络状态就已经较为拥堵.
在不清楚当前网络的状态下, 直接发送大量的数据, 是很有可能导致网络更加拥堵的.。所以TCP引入了慢启动机制,先发少量的数据,让其先去探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度来向对方传输数据。
• 此处引入一个新的概念称为拥塞窗口
• 发送开始的时候, 将拥塞窗口大小定义为1;
• 每次收到一个 ACK应答, 拥塞窗口的大小就加1;
• 每次要发送数据报文的时候, 将拥塞窗口的大小和接收端主机反馈的窗口大小进行比较, 取较小的值作为实际发送的窗口;
像上面这样的拥塞窗口的增长速度, 是指数级别的。 "慢启动" 只是指初使时较慢, 但是增长速度非常快。
• 为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍增长。
• 此处引入一个叫做慢启动的阈值来控制流量。
• 当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长。
• 当 TCP 开始启动的时候, 慢启动阈值等于窗口最大值;
• 在每次网络拥塞,超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1;
发生少量的丢包时, 仅仅是触发超时重传; 当大量的丢包出现时, 就认为是网络拥塞;
当 TCP 连接建立好通信开始后, 网络吞吐量就会逐渐上升; 随着网络发生拥堵, 吞吐量会迅速下降; 从而拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力而采取的一种折中方案。
二、延迟应答
如果接收数据的主机接收到数据后立刻返回ACK应答, 根据拥塞控制和流量控制如果立马返回,这时候返回的窗口可能比较小。
• 假设接收端缓冲区为1MB。一次收到了 500KB的数据; 如果立刻应答, 返回的窗口就是500KB;
• 但实际上可能处理端的处理速度非常快, 10ms 之内就把500KB数据从缓冲区提出来了;
• 在这种情况下, 接收端处理的能力还远没有达到自己的极限, 即使窗口再放大一些, 也能正常处理过来;
• 如果接收端稍等一会再做应答, 比如等待 200ms 再做应答, 那么这个时候返回的窗口大小就是1M;
窗口越大, 网络的吞吐量就越大, 传输效率就会越高。
而我们的目标是在保证网络不拥塞的情况下尽量的去提高传输效率;
那么所有的包都可以进行延迟应答吗? 肯定也不是的;
• 数量限制: 每间隔N个包就应答一次;
• 时间限制: 超过最大的延迟时间就应答一次;
具体的数量和超时时间, 各个操作系统之间也有差异;
一般 N 取 2, 最大延迟时间取 200ms;