自顶向下 | TCP流量控制

527 阅读2分钟

预备知识:可靠数据传输原理

我们都知道TCP是面向连接的可靠传输协议,这个连接的意思就是在两个进程通讯之前需要相互发送某些预备报文段,以建立确保数据传输的参数。连接的双方都将初始化一些与连接相关的缓存变量,这些都是TCP连接的组成部分。

其中之一就是接收缓存,当TCP连接接收到正确、按序的字节后,它就将数据放入接收缓存,上层应用会从该缓存中读数据。如果上层应用读取速率慢,发送方发送速率快,就会导致接收缓存溢出。TCP为了解决该问题,提供了流量控制服务

流量控制即让发送方的发送速率和接收方应用进程读取速率相匹配,因此流量控制服务是一个速度匹配服务。TCP让发送方维护了一个变量,称为接收窗口,该变量指示了接收方还有多少可用的接收缓存空间。

TCP是全双工的,也就是说连接的两端都有各自的接收缓存和接收窗口。一方在向另一方发送报文段时,就会将自己可用的接收缓存空间大小放入接收窗口字段中。

全双工:双向两车道。半双工:双向单车道。单工:单向单车道。

发送端会维护两个变量:LastByteSentLastByteAcked,通过控制LastByteSent - LastByteAcked <= rwnd即已发送未被确认数据量小于等于接收窗口,就可以保证发送端不会使接收端接收缓存溢出。

还有一个需要注意的小问题是,某一时刻接收端告知发送端接收缓存已满,因此发送端不会再向接收端发送数据。如果此时接收端接收缓存有可用空间,但是接收端没有数据要发送给发送端,发送端也就无法更新接收窗口,就会被阻塞而不能再发送数据。

因此TCP要求当发送端接收窗口为0时,发送端会继续发送只有一个字节数据的报文段,这些报文段将会被接收方确认,当接收端应用进程开始读取数据时,接收端就会回复发送端一个确认报文,该报文段会包含一个非0的接收窗口。