TCP协议作为一个可靠的面向字节流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。

要区分TCP的流量控制和拥塞控制:

流量控制是发送方的发送数据的速度不能太快,要考虑到接收方的接收缓冲区的大小,不然数据发送的太快,就可能导致接收方的接收缓冲区数据溢出。所以在流量控制中发送方的发送窗口大小受接收方的接收缓冲区的大小的制约。

拥塞控制是发送方根据当前网络的拥塞程度调整自己的发送窗口的大小。当网络出现拥塞的时候,减少发送数据的数量,当网络空闲的时候,适时的增加数据的发送量。

1. 以字节为单位的滑动窗口

TCP协议的两端分别为发送者A和接收者B,由于是全双工协议,因此A和B应该分别维护着一个独立的发送缓冲区和接收缓冲区,由于对等性(A发B收和B发A收),我们以A发送B接收的情况作为例子。

现在假设A收到了B发来的确认报文段,其中窗口数是20(字节),确认号是31(折表明B期望收到的下一个序号是31,而序号30为止的数据都已经收到)。根据这两个数据A就构造出了自己的发送窗口。

看看A的发送窗口,发送窗口表示:在没有收到B确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时的时候重传。

发送窗口后沿的后面部分表示已发送且已收到确认的字节,这些数据显然不在需要保留了,而发送数据前沿的前面部分表示不允许发送的,因为接收方的接收缓冲区不够大,不能暂存这么多的数据。

发送窗口的位置由窗口前沿和窗口后沿的位置共同决定

发送窗口后沿的变化情况有两种:不动(没有收到新的确认)、前移(收到了新的确认)。发送窗口的后沿不可能向后移动,因为不能撤销掉已经收到的数据。

发送窗口的前沿也有两种变换情况:不动(没有收到新的确认,对方通知的窗口数大小也没有变化或者收到了新的确认,但是对方通知的窗口数减少了,正好使得发送窗口的前沿不动)、前移(这个很正常)。

注意:如果对方通知的窗口缩小了,那么发送窗口的前沿就会向后收缩,这时TCP的标准强烈不赞成的。


如下图所示:A发送了序号为31~41的数据,现在的状态就是下面这个样子:

小于P1的是已发送并收到确认的部分,大于P3的是不允许发送的部分。

P3-P1=A的发送窗口

P2-P1=已发送但尚未收到确认的字节数

P3-P2=允许发送当尚未发送的字节数(可用窗口或者有效窗口)

再来看一下这时的接收窗口的状况:

接收窗口内的31~50的序号是允许接收的,如上图所示的这个样子,B接收到了32、33的两个序号,但是31号还没有到,收到的数据不是按序到达的,这时B发送的确认报文确认号仍然要是31(期望收到的序号),而不是32或者33。

当B收到了31号的数据,就把31~33的数据交付,并删除这些数据,接着把接收窗口向前移动3个序号,同时给A发送确认,其中的窗口数仍为20,但是确认号变为34,表明B收到了序号33为止的数据。A收到了B的确认后,就可以把发送窗口向前滑动3个序号,但是指针P2不动,移动的只是指针P1和P3.

注意到了,B收到了序号为37、38、40的数据,但是他们没有按序达到,所以只能暂时存放在接收窗口中。


A继续发送完42~53的数据后,指针P2不断的向前移动,最后和指针P3重合,A的有效窗口缩小为0,因此必须停止发送。

这时存在这种情况,A不能再继续发送,等待B的确认。这些数据也都正确的到达B,同时B给出了确认,但是这些确认都滞留在网络中,所以A要设置一个超时计时器,在经过一段时间后,如果A还没有收到B有效的确认,就要重传整个发送窗口中的数据。知道收到B的确认为止。

窗口滑动总结:

整个流量控制就是限制发送方的数据的发送速度,让接收方能够及时的处理,不至于数据从接受缓冲区中溢出。所以这里涉及两个概念:

发送方的应用进程把字节流写入TCP的发送缓冲,接收方的应用进程从TCP的接收缓冲中读取字节流。

缓冲区的空间和序号的空间都是有限的,并且都是循环使用的,所以可以把他们看成是圆环形状的。


2. 利用滑动窗口实现流量控制

如下图所示:

在A和B建立连接的时候,也就是在TCP的三次握手的时候,发送端和接收端进行了窗口大小的协商,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

最后窗口的大小减少到了0,也就是不允许发送方再发送数据,这种使发送方暂停发送的状态将持续到主机B重新发送一个新的窗口值为止。但是可能发生这样的情况,B向A发送了窗口值为400的报文,但是这个报文在传送的过程中丢失了,那么A就一直等待B发送的非零窗口的通知,而B也一直等待A发送的数据,这样就发生了死锁。

为了解决这个问题,TCP为每一个连接设置一个持续计时器,只要TCP连接的一方收到了零窗口的通知,那么就启动这个定时器。如果到了定时器的时间,就发送一个零窗口的探测性报文。而对方就在确认这个探测性报文段时给出了现在的窗口值。如果窗口值还是为零,就继续启动定时器。

TCP的流量控制的更多相关文章

  1. TCP的流量控制和拥塞控制

    1.TCP的流量控制 一般说来,我们总是希望数据传输的更快一些.但如果发送方吧数据发送的过快,接收方就可能来不及接收,就会造成数据的丢失.所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来的及 ...

  2. TCP/IP详解学习笔记(15)-- TCP的流量控制和拥塞控制

    TCP的流量控制 1.概述      所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制.TCP的窗口单位是字节,不是报 ...

  3. TCP的流量控制与拥塞控制小结

    概述 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认.其中TCP的流量控制与拥塞控制是 ...

  4. 【计算机网络】TCP的流量控制和拥塞控制

    TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收. 利用滑动 ...

  5. 运输层7——TCP的流量控制和拥塞控制

    目录 1. TCP的流量控制 2. TCP的拥塞控制 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控 ...

  6. TCP的流量控制(转载)

    1.TCP的滑动窗口 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认. TCP的两端都 ...

  7. TCP的流量控制和拥塞处理

    1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收.    利用滑动窗口机制可以 ...

  8. NetWork——TCP的流量控制和拥塞控制

    ,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大. 这里为什么替换掉了慢开始算法呢,这是因为收到重复的ACK不仅仅告诉我们一个分组丢失了,由于接收方只有在收到另一个报文段时才会产生重复的ACK,所 ...

  9. 【网络协议】TCP的流量控制机制

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

随机推荐

  1. JSF简单介绍

    JSF简单介绍 一. 什么是 JSF: JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架.它提供了一种以组件为中心来开发 Java Web 用户界 ...

  2. Nagios利用NSClient++监控Windows主机

    在Nagios的libexec下有check_nt这个插件,它就是用来检查windows机器的服务的.其功能类似于check_nrpe.不过还需要搭配另外一个软件NSClient++,它则类似于NRP ...

  3. Fix The thread xxx has exited with code 259 (0×103)

    When run the test case in VS2013, you may encounter below problem After test case end, it will show ...

  4. 自学Xpath的几个例子

    Xpath可以对XML文件中的信息进行查找,并对XML文件树形结构进行遍历.详细语法请转:http://www.w3school.com.cn/xpath/index.asp 例子:利用在JavaSc ...

  5. Spire PDF for .NET 在ASP.NET中的使用 ---- 并非那么“美好”,有些挫折!

    笔者注:看此文前,请您先看一下上一篇文章吧. 昨天的时候,我测试了一下Spire PDF在WinForm程序中的应用,可以说用起来很简单(请忽略效率问题,没有进行测试).不过在互联网如此发达的今天,适 ...

  6. bootstrapvalidator之API学习

    最近项目用到了bootstrap框架,其中前端用的校验,采用的是bootstrapvalidator插件,也是非常强大的一款插件.我这里用的是0.5.2版本.下面记录一下使用中学习到的相关API,不定 ...

  7. AngularJs 常用函数

    /** * [intersect 取两个数组的交集] var firstArray = [1,3,5]; var secondArray = [2,5,8]; var result */ .filte ...

  8. Xcode升级7.3 自动补全不提示导入的自定义类解决方案

    见图:

  9. 在MFC主对话框OnInitDialog()中弹出对话框

    BOOL CXXXDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FA ...

  10. http request parameter

    http request parameter add htmlspecialchars host?vendor_id=1000000&q=Some%20children%20wish%20to ...