TCP Flow Control

TCP Flow Control这里写自定义目录标题TCPFlowControlTCP简述TCP传输机制滑动窗口FlowControl计时器总结TCPFlowControl最近在学习《计算机网络》在TCP的FlowControl部分理解不太清楚,查阅了资料后有一些粗浅的理解,如有不准确的地方,请大佬指正。参考资料1.计算机网络2.TCPFlowControlTCP简述TCP(Transmissi…

大家好,又见面了,我是你们的朋友全栈君。

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.开始计时后,发送端会间断地发送小数据包以确认缓冲区是否有空位。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134868.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月6日 上午8:46
下一篇 2022年6月6日 上午8:46


相关推荐

  • 语义分割总结_细粒度语义分割

    语义分割总结_细粒度语义分割图像分割算法总结1.评价指标:普通指标:PixelAccuracy(PA,像素精度):标记正确的像素点占所有像素点的比例。混淆矩阵中=\(\frac{{\rm{对角线}}}{总和}\)Mea

    2022年8月5日
    6
  • C语言数组作为函数参数「建议收藏」

    C语言数组作为函数参数「建议收藏」一:数组元素作为函数的实参数组元素就是变量,与普通变量没有区别,将数组元素传送给形参,实现单向的值传递。#include&lt;stdio.h&gt;floatmax(floatx,floaty){ if(x&gt;y) returnx; else returny;}intmain(){ inta[6]={3,2,1,4,9,0}; intm…

    2022年7月11日
    18
  • DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运[通俗易懂]

    DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运[通俗易懂]DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运导读:2020年的开篇,开的太意外,无论以什么样的眼光去回顾2020,它一定是载入史册的一年。突然起来的疫情,打得人们措手不及!人生的确不易,每个人都在负重前行,致敬那些可爱的人,感谢钟院士,感谢医护人员,感谢我们这这个强大的国家。2020年,太特殊,特殊的就像一场梦,无数的关键词涌入了记忆的心头:新冠,武汉,没毕业照,科比……前几天看到这样的一段话:2020年,最大的收获是一身伤,一身债,半条命、还活.

    2022年7月26日
    7
  • ASSERT_VALID_assert语句

    ASSERT_VALID_assert语句ASSERT()ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。在Release版本的程序中它不起任何作用。ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT()宏在Release版本中不对表达式求值),因此对于任何有函数调用的参数表达式,应该使用宏VERIFY(),以保证表达式中的函数调用在Release版本中会被正确求值…

    2025年9月20日
    10
  • android studio不能输入中文_Android模拟器

    android studio不能输入中文_Android模拟器很多Android项目的运行都需要用到中文输入法,在一年前的AndroidStudio需要导入输入法apk安装,现在新版的AndroidStudio免去了这个麻烦,下面就教大家如何设置谷歌拼音输入法。

    2022年8月30日
    4
  • hostapd中beacon流程

    hostapd中beacon流程hostapd中beacon流程ieee802_11_build_ap_params()-ieee802_11_set_beacon()–ieee802_11_set_beacons()—handle_assoc()—hostapd_2040_coex_action()—hostapd_intolerant_add()—update_ht_state()—ap_…

    2022年5月11日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号