TCP:为什么我们需要流量控制和拥塞控制

问题描述

我已经简要地阅读了流量控制和拥塞控制,但我不明白为什么我们需要它们而不仅仅是拥塞控制。

我们不能只使用拥塞控制并将接收器作为最后一个节点吗?在我看来,流量控制可能只是拥塞控制的一个特例。

我看过这个 question,我认为 OP 和我有同样的问题,但问题表述得不够好,因此答案不完整。

假设我们发送了 100 个数据包,但只有前五个数据包被确认。发送方如何知道是网络慢还是接收方慢?它真的应该重要吗?带有接收方的网络接收速度不够快,因此发送方应该放慢速度。

这样的实现有什么问题?

if (acked() / sent() < THRESHOLD){
    transmission_rate(0.5);
}else{
    transmission_rate(SOME_RATE); // where SOME_RATE > 0
}

在 TCP 协议中是否有一些流量控制不需要拥塞控制不需要流量控制?

解决方法

我认为作者 here 很好地解释了流控制。

本质上,您是对的,拥塞控制和流量控制之间存在一些重叠。但是,它们都以不同的方式发挥作用。例如,网络可能足够大,两者都需要。

想象一下,将树莓派连接到具有千兆网络的超级计算机。现在,这个例子很愚蠢,但可以用于说明目的。发送方(超级计算机)和网络可能能够很好地支持高速,但是如果 pi 的接收缓冲区较低,那么快速发送就没有太大意义。出于这个原因,接收方将通告其发送窗口,以便发送方知道另一方处理数据的速度。这样,它将限制通过网络成功发送数据但接收方无法处理并需要丢弃数据的情况。一般来说,通过网络发送更少的字节是一个好主意,因为它有助于防止可能出现的拥塞。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...