tcp流量控制

注:流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。当然,tcp发送方也可能是因为ip网络的拥塞而被遏制;这种性质的发送方的控制被称为拥塞控制。即使流量控制和拥塞控制采取的动作非常相似(对发送方的遏制),但是它们显然是针对完全不同的原因而采取的措施。

为什么需要流量控制

一条tcp连接每一侧主机都为该连接设置了接受缓存。当该tcp连接收到正确,按序的字节后,它就将数据放入接受缓存。相关联的应用进程会从该缓存中读取数据,但不必是数据刚一到达就立即读取。事实上,接收方应用也许正忙于其他任务,甚至要过很长时间后采取读取该数据。如果某应用程序读取数据时相对缓慢,而发送方发送得太多,太快,发送的数据就会很容易地使该连接的接收缓存溢出。为了消除缓存溢出的可能性,tcp为它的应用程序提供了流量控制服务。

tcp如何控制流量

tcp通过让发送方维护一个称为接受窗口的变量来提供流量控制。通俗的说,接收端给发送方一个指示--该接收方还有多少可用的缓存空间(rwnd = RcvBuffer - (LastByteRcvd-LastByteRead))。发送方跟踪LastByteSent和LastByteAcked两个变量,确保LastByteSent-LastByteAcked<=rwnd,通过将未确认的数据量控制在值rwnd以内,来保证发送方不会使接收方的接受缓存溢出。

有什么问题

假设接收方的接受缓存已经满了,使得rwnd = 0。在将rwnd=0通告给发送方后,还要假设接收方没有任何数据要发送给发送方。此时,因为主机B上的应用进程将缓存清空,tcp并不向发送方发送带有rwnd新值的新报文段;事实上,tcp仅当在它有数据或有确认要发时才会发送报文段给发送方。这样,发送方不可能知道接收方的接受缓存已经有新的空间了,即发送方被阻塞而不能再发送数据!为了解决这个问题,tcp规范中要求,当接收方的接受窗口为0,时,发送方继续发送只有一个字节数据的报文段。

与tcp不同的是,udp并不提供流量控制。如果接收方从缓存中读取报文段的速度不够快,那么缓存将会溢出,并且将丢失报文段。

本文主要参考《计算机自顶向下学习方法》一书,仅做读书笔记用。

你可能感兴趣的:(tcp流量控制)