洪爵在前一节介绍了TCP段的最初格式:
《面试必问的TCP,你真的回答对了吗?》,
今天,我们来介绍一下TCP的流量控制是如何实现的~
很多人可能在面试中被问到过流量控制和拥塞控制的区别,但在回答这个问题之前,需要知道流量控制和拥塞控制是什么。
首先,为什么需要流量控制? 一般来说,数据希望能够更快地传输,但如果发送方发送太多数据,则接收方可能无法接收,数据可能会丢失。 对于“流控制”,发送方的发送速率不应太快,以便接收方可以接收。
接下来举个例子。 假设TCP建立连接后,接收方b向发送方a传达接收方窗口大小(receiver window,rwnd )为400字节。
首先,b告诉a,因为我的rwnd=400,所以发送方的发送窗口不能超过接收方发出的接收窗口rwnd。 需要注意的是,TCP在消息传递段中发送,但TCP窗口的单位是字节。 其中,假设每个消息段的大小为100字节,并且数据消息段的初始值为1 (实际进程是随机值),用seq表示,大写ACK表示确认位,小写ACK表示确认字段的值请参阅。
如在图片中可知,主机b进行总共3次流控制,为了第一次使接收窗口减少为rwnd=300,第二次减少为100,最后减少为0,接收窗口动态地变化,减少为0后,接收方重新开始请注意,只有ACK=1的确认号字段有效,因此在传递发送方窗口的值时,ACK也必须设置为1。
不知道是否考虑过这样的问题,如果b向a发送了0窗口的段,在b的缓冲器中形成了空闲空间之后,b向a发送了rwnd=400的段,但是该段在传输中丢失了。 a等不及b发送的非0窗口通知,b也在等待a发送数据。 这将引起彼此等待的死锁。
为了名为solve的question,TCP为每个连接设置持续计时器。 这个计时器什么时候启动? 如果有一个TCP连接从对方接收到0窗口的通知,将启动持续计时器,经过一段时间后发送0窗口的探测消息块(包括1字节的数据),另一个则在确认该探测消息块时启动当前窗口值如果不为0,则可以开始传输数据。
应该注意的是,TCP规定,即使设置为零窗口,也需要接收零窗口探测消息块、确认消息块和具有紧急数据的消息块。
是的,流量控制介绍到这里!
希望每个人都能有嫌疑地阅读文章,探究其原理。
路途坎坷漫长,往事有序,来日本成为篇章。
我们期待着下一次的相遇!