一般来说,我们总是希望传输数据的更快一些,但假设发送方把数据发送的非常快。而接收方来不及接收,这就可能造成数据的丢失。流量控制就是让发送方的发送速率不要太快。让接收方来得及接收。

对于成块数据流,TCP利用滑动窗体机制来实现流量的控制,对于交互数据流,TCP利用捎带ACK和Nagle算法来实现流量的控制。

后两种就不说了,上篇博文中将已经写得比較清楚了,对于滑动窗体机制。上篇博文中也又说到,仅仅是没有刻意提到用滑动窗体来实现流量的控制。以下就具体说下利用滑动窗体机制来实现流量控制的机制,先看下图:

我们假设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗体是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。

因此,发送方的发送窗体不能超过接收方给出的接收窗体的数值。

请注意,TCP的窗体单位是字节。不是报文段。TCP连接建立时的窗体协商过程在图中没有显示出来。再设每个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值。

从图中能够看出,B进行了三次流量控制。

第一次把窗体降低到 rwnd = 300 。第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 。即不同意发送方再发送数据了。这样的使发送方暂停发送的状态将持续到主机B又一次发出一个新的窗体值为止。

我们考虑一种特殊情况。假设B在向A发送了零窗体报文段后不久,B的接收缓存又有了一些存储空间,于是B向A发送了一个rwnd=400的报文段,然而这个报文段在传送过程中丢失了,A就一直等待B发送非零窗体的报文通知,而B一直等待A发送数据,假设没有不论什么措施的话。这话死锁的局面会一直延续下去。

为了解决问题,TCP为每个连接设有一个持续计时器(也叫坚持定时器)。仅仅要TCP连接的一方收到对方的零窗体通知,就启动持续计时器。

若持续计时器设置的时间到期,就发送一个零窗体控測报文段(携1字节的数据),对方在收到探測报文段后。在对该报文段的确认洪给出如今的窗体值,假设窗体值仍未零,则收到这个报文段的一方就又一次设置持续计时器,假设窗体不为零。那么死锁的僵局就被打破了。

糊涂窗体综合症。

设想一种情况。TCP接收方的缓存已满。而应用进程一次仅仅从接收缓存中读取1字节(这样就使接收缓存空间仅腾出1字节),然后向发送方发送确认,并把窗体设置为1个字节(但发送的数据报为40字节长)。接收,发送方又发来1个字节的数据(发送方的IP数据报是41字节)。接收方发回确认,仍然将窗体设置为1个字节。这样,网络的效率非常低。要解决问题。可让接收方等待一段时间,或者等到接收方缓存已有一半空暇的空间。仅仅要出现这两种情况之中的一个。接收方就发回确认报文,并向发送方通知当前的窗体大小。

此外。发送方也不要发送太小的报文段。而是把数据报积累成足够大的报文段。或达到接收方缓存的空间的一半大小时再发送给接收端。

【网络协议】TCP的流量控制机制的更多相关文章

  1. 网络协议TCP、Http、webservice、socket区别

    网络协议TCP.Http.webservice.socket区别 http 和 webservice 都是基于TCP/IP协议的应用层协议 webservice是基于http的soap协议传输数据 w ...

  2. python网络编程--socket,网络协议,TCP

    一. 客户端/服务端架构(用到网络通信的地方) 我们使用qq.微信和别人聊天,通过浏览器来浏览页面.看京东的网站,通过优酷.快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档 ...

  3. 网络协议TCP/IP、IPX/SPX、NETBEUI简介

    网络中不同的工作站,服务器之间能传输数据,源于协议的存在.随着网络的发展,不同的开发商开发了不同的通信方式.为了使通信成功可靠,网络中的所有主机都必须使用同一语言,不能带有方言.因而必须开发严格的标准 ...

  4. 网络体系结构的概念 - 网络协议TCP - 红黑联盟

    https://i.cnblogs.com/EditPosts.aspx?opt=1 网络体系结构的概念  计算机网络就是一组通过一定形式连接起来的计算机系统,它需要四个要素的支持,即通信线路和通信设 ...

  5. Go语言学习之9 网络协议TCP、Redis与聊天室

    主要内容 1. Tcp编程2. redis使用 1. Tcp编程 (1)简介       Golang是谷歌设计开发的语言,在Golang的设计之初就把高并发的性能作为Golang的主要特性之一,也是 ...

  6. [网络协议]TCP粘包分析

    关于socket粘包,socket缓冲区设置的问题,记录一下: 一 .两个简单概念长连接与短连接: 长连接     Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送 ...

  7. 【网络】TCP的流量控制

    一.利用滑动窗口实现流量控制 流量控制是让发送方的发生速率不要太快,要让接收方来得及接收. 发送方的发送窗口不能超过接收方给出的接收窗口的数值,TCP的窗口单位是字节,不是报文段. TCP为每一个连接 ...

  8. 网络协议TCP

    TCP:传输控制协议 tcp的特点:面向连接(打电话模型),可靠传输 tcp通信的三个步骤: 1.通信双方建立连接 2.收发收据 3.关闭连接 tcp客户端实现流程 """ ...

  9. 31.网络协议介绍tcp/udp

    网络协议 TCP:网络中传输数据的协议,打电话 解决了我可能在网络中找不到别人(数据无法传输到) 保证数据传输的稳定性,可靠性 保证数据的安全性,完整性 对方要有响应 尝试重新发送 UDP:传输数据的 ...

随机推荐

  1. 【Luogu】P2053修车(费用流)

    题目链接 早上状态不好,虚树搞崩只好来刷网络流了qwq. (然后我犹豫几秒之后看了题解) 使用拆点大法把工人拆成n*m个点,然后每个点代表每个时间段的工人, 然后从车到每个工人点连一条边,权值是耽误的 ...

  2. [LOJ#2255][BZOJ5017][Snoi2017]炸弹

    [LOJ#2255][BZOJ5017][Snoi2017]炸弹 试题描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: ...

  3. 算法复习——背包dp

    1.01背包 二维递推式子: 代码: ;i<=n;i++) ;x--) ][x-w[i]]+c[i],f[i-][x]); ][x]; printf("%d",f[n][m] ...

  4. java面试题之BeanFactory和FactoryBean的区别

    BeanFactory是个Factory,也就是IOC容器或对象工厂:FactoryBean是个Bean.在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的. ...

  5. Java面试题之多线程同步和互斥有几种实现方法,都是什么?

    线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另外一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. 线程互斥是指对于共享的进程系统资源,每个线程访问时的排他 ...

  6. 你能说出SQL聚集索引和非聚集索引的区别吗?

    最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别. AD:WOT2015 互联网运维与开发者大会 热销抢票 其实对于非专业的数据库操作人员来 ...

  7. 解决c#所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。 转载

    最近做一个后来程序,启动了事务后有一段操作业务,当运行一段时间后,出现这个异常 CLR 无法从 COM 上下文 0x1b1c38 转换为 COM 上下文 0x1b1da8,这种状态已持续 60 秒.拥 ...

  8. FZOJ 2102 Solve equation

                                                                                                        ...

  9. MySQL的@与@@区别

    MySQL的@与@@区别 @x 是 用户自定义的变量  (User variables are written as @var_name) @@x 是 global或session变量  (@@glo ...

  10. 【Visual Studio】工程类型选择win32还是x64 ?

    1. 如果将Visual Studio的工程类型设置为win32,那么我们开发的程序既能在32位操作系统上运行,也能在64位操作系统上运行. 2. 如果将Visual Studio的工程类型设置为x6 ...