一、TCP流量控制
1.为什么需要流量控制?什么是流量控制? 答:
发送方给接收方发送数据时,需要考虑接收方接收数据的处理能力,不能无脑发送,否则会因为对方无法及时处理数据而触发重传机制,从而造成网络流量的浪费。
流量控制:让发送?根据接收?的实际接收能?,控制发送的数据量。
2. 如何进行流量控制? 答:
发送方有一个发送窗口,控制每次发送的最大数据量。接收方有一个接收窗口,表示此时接收方最大的数据接收处理能力。
流量控制,就是接收方每次告诉发送方当前的窗口大小,从而进行数据发送控制。
3.流量控制过程中两个问题? 答:
窗口关闭:发送方窗口大小为0,发送方不再发送数据。
窗口关闭产生的死锁问题:当接收方处理完数据,接收窗口变大时,会发送ACK报文给发送方。如果这个ACK报文丢失,那么发送方因
为收不到非0窗口通知而一直等待,接收方也会一直等待发送方数据,造成死锁问题。
解决死锁:发送方收到接收方的0窗口通知时,就启动持续计时器。如果计时器超时,发送方会主动发送窗口探测报文,接收方收到这个
探测报文后,就会给出自己的接收窗口大小。
糊涂窗口综合症:接收方的接收窗口不断变小,使得发送方每次能发送的数据也越来越小。而由于TCP+IP头就有40个字节,导致每次传
输的有效数据很少。
解决糊涂窗口综合症:让接收方不再通告小窗口给发送方,或者发送方避免发送小数据。
二、TCP拥塞控制
1. 为什么需要拥塞控制?什么是拥塞控制?如何判断网络拥塞? 答:
流量控制避免了发送方的数据填满接收方的缓存。
但是实际传输时,可能由于网络过于拥堵,而导致发送方迟迟收不到接收方的确认应答号,从而发送方触发重传机制,重复发送先前的数据包,那么会导致网络更加拥堵。因此,TCP需要检测当前时刻的网络状态,来调整数据发送量。这就是为什么需要TCP拥塞控制的原因。
【tcp/ip|TCP流量控制和拥塞控制】拥塞控制:避免发送方的数据填满整个网络。
拥塞窗口cwnd:控制发送方的发送数据量,根据网络拥堵程度动态变化。网络好,cwnd大,网络差,cwnd小。
发送窗口值swnd = min(cwnd,rwnd),rwnd是接收窗口的值。
拥塞判断:当发送方没有在规定时间内收到ACK应答报文,发送重传机制,就认为网络出现拥塞。
2. 如何避免网络拥塞? 答:
第一阶段:刚开始发送数据时,需要慢慢提高数据发送量。具体是慢启动技术,每当发送方收到一个ACK应答报文,拥塞窗口cwnd就加
1。
第二阶段:通过第一阶段,慢启动使得拥塞窗口值cwnd超过阈值ssthresh,这时使用拥塞避免算法,每收到一个ACK报文,cwnd的值增
加1/cwnd。
第三阶段:通过第二阶段,cwnd的值会一直增大,到一定程度肯定会发生网络拥堵,发生拥堵就会进行数据包重传,分为超时重传和快速重
传。在两种重传机制中,会通过降低cwnd的值来消除拥塞。
超时重传:一旦发生超时重传,阈值设置为cwnd/2,cwnd变为1。一下子回到第一阶段,重新进入慢启动过程。
快速重传:当接收方发现丢了一个数据包,发送三次前一个包的ACK,于是发送方就会快速重传,而不必超时重传。
此时先将cwnd变为原来一半,阈值ssthresh设置为cwnd,回到第二阶段。然后,进入快速恢复算法。
快速恢复算法如下:1. 拥塞窗? cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
2. 重传丢失的数据包;
3. 如果再收到重复的 ACK,那么 cwnd 增加 1; 如果收到新数据的 ACK 后,把 cwnd 设置为第二阶段中的 ssthresh 的值。(原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进?拥塞避免状态)
推荐阅读
- 计算机网络梳理|四、TCP中的流量控制和拥塞控制
- Linux|Linux网络(传输层TCP/UDP)
- tcp/ip|IP地址的认识(一)
- C++|C++s简单实现Scoket编程
- web|Web --- 端口协议
- 分布式|图解域名解析成IP的全过程(你浏览器摁下一个网址后发生了啥())
- tcp/ip|网络协议--SSL/TLS
- 前端所遇问题栏|解决(笔记本能连接 WiFi,但在浏览器中并不能访问网页的问题的四种方案;)
- 字节一面(说说TCP的三次握手)