大家好,又见面了,我是你们的朋友全栈君。
这里写自定义目录标题
TCP Flow Control
最近在学习《计算机网络》在TCP的Flow Control部分理解不太清楚,查阅了资料后有一些粗浅的理解,如有不准确的地方,请大佬指正。
参考资料
1.计算机网络
2.TCP Flow Control
TCP简述
TCP(Transmission Communication Protocol)是作用于传输层的常用协议,以网络层IP协议为基础,在不可靠的IP协议上提供了可靠的TCP协议,保证了数据传输的可靠性。
为了提供这样可靠的服务,TCP有各种复杂的机制,包括本文的Flow Control机制。
TCP传输机制
从应用层来的数据通过TCP,经过下层传到目的IP的TCP,再传到目的IP的应用层。
在TCP中,有缓冲区(buffer)用于储存未被处理,等待处理的数据,被称为接收缓冲区(receive buffer)。在传输数据时,若接收缓冲区已满,则不能再接收信息,不然会导致丢包,使传输不可靠。
Flow Control就是一种保证不在缓冲区已满的情况下发送端继续传输数据的机制。
滑动窗口
滑动窗口(Sliding Window)是提高TCP传输效率的办法,这种机制不仅仅被TCP采用,再其他各种协议中都有广泛的应用。
TCP若是每次只传一个数据包,等收到接收端的ACK再发送就显得效率太低。为此,使用滑动窗口,每次发送多个数据,即利用传输线路存储数据,会提高传送效率。
举一个例子,如果发送端要发送一个150000bytes的文件,TCP把它分成100个数据包,每个数据包1500bytes。
假设接收端的接收缓存区大小是45000bytes,所以window就可以是30个数据包大小。也就是说,在正常情况下,会有30个数据包在传输途中。当发送端收到接收端的最初的10个ACKs时,发送端就会把接下来的10个数据包发送出去。
Flow Control
以上是正常情况,然而,若是传输层传到应用层的速度过慢,则在传输层就会有排队,即数据包要被保存在接收缓冲区中,因此,接收缓冲区的空间就会变小,此时,在接收端发回给发送端的ACK中会标明缓冲区的剩余空间,以控制发送端减少发送数据以免数据包丢失。
举一个例子,同上,此时接收缓冲区中有10个数据包,即450000bytes中只剩下300000bytes。若此时发送端接收到了10个ACKs,表明现在线路上只有20个数据包,然而发送端也不会再发送数据包。
也就是说,满足以下不等式
最后发出的数据-最后接收到的ACK<=最后的ACK中标明的接收缓冲区剩余容量
计时器
然而,在此之上还有一个问题。
当接收缓存区没有空间时,如果接收端不发送ACK给发送端,或者ACK丢失了,那发送端永远不会知道什么时候再次发送数据包。
于是我们就陷入江局,接收端在等数据包,发送端没收到ACK不知道什么时候发数据包。
于是,当接收端收到一个标明接收缓存区不剩空间的ACK时,接收端就开始一个计时器(persist timer),时不时地发一个小数据包去check是不是接收缓存区有空间了。
总结
1.Flow Control是一种确保发送端不会发送过多数据导致接收端buffer溢出而丢包的机制。
2.每个ACK里都会标明现在buffer中的剩余空间。
3.接收端窗口的长度就是接收缓冲区的空余空间。
4.当接收缓冲区无剩余空间,发送端就停止发送数据包,开始计时。
5.开始计时后,发送端会间断地发送小数据包以确认缓冲区是否有空位。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134868.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...