TCP使用滑动窗口协议的另一种方式来实现流量控制。该协议允许发送方在停止并等待确认之前可以连续发送多个分组。由于发送方不必每发送一个分组就停下来等确认,因此该协议可以加速数据的传输。

一、滑动窗口

接收方通告的窗口称之为提供的窗口 (offered window) 。
当接收方确认数据以后,这个滑动窗口不时向右移动。

  1. 称窗口左边沿向右边沿靠近为窗口合拢 (close)。发生在发送的数据被确认 (data is sent and acknowedged)。
  2. 窗口右边沿向右移动时,允许发送更多的数据,称之为窗口张开 (open)。发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存。
  3. 右边沿向左移动时,称之为窗口收缩 (shrink)。RFC强烈建议不要使用这种方式,但TCP必须能够在某一段产生这种情况时进行处理。

  1. 发送方不必发送一个全窗口大小的数据
  2. 来自接收方的一个报文段确认数据将窗口向右滑动
  3. 窗口的大小可以减小,但是窗口的右边沿不能向左移动
  4. 接收方在发送一个ACK之前不必等待窗口被填满

窗口大小

由接收方提供的窗口的大小通常可以由接收进程控制,窗口大小将影响TCP的性能。

二、PUSH标志

发送方使用该标志通知接收方将所收到的数据全部交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据
由于源于伯克利的实现一般从不将接收到的数据推迟交付给应用程序,因此他们忽略所接收的PUSH标志。

三、慢启动 (slow start)

如果发送方一开始就向网络发送多个报文段,直至达到接收方通告的窗口大小为止,并且在发送方和接收方之间存在多个路由器和速率较慢的链路时,会出现一些问题。一些中间的路由器必须缓存分组,并有可能耗尽存储器的空间。
慢启动通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口 (congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段。每收到一个ACK,拥塞窗口就增加一个报文段。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
慢启动中拥塞窗口的增长是指数关系 (1->2->4...)。
当达到互联网容量时,中间路由器会丢弃分组,通知发送方它的拥塞窗口开的太大。发送方会调整拥塞窗口。

四、窗口大小的选择

带宽时延积

发送端和接收端之间通道的容量是:
\[capacity(bit) = bandwidth(b/s) \times roundtrip\ time(s)\]
一般称之为带宽时延积。这个值依赖于网络速度和两端的RTT。无论是带宽还是时延,都会影响发送方和接收方之间通路的容量。
一般窗口的大小不应小于带宽时延积,否则会引起拥塞,或不能很好利用带宽。

拥塞

当一个大的管道并向一个较小的管道发送时便会发生拥塞。
当多个输入流导到一个路由器,而路由器的输出流小于这些输入流的总和时,也会发生拥塞。

五、紧急方式

TCP提供了“紧急方式 (urgent mode)”,它使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。另一端被通知这个紧急数据已被放置在普通普通数据流中,由接收方决定如何处理。

首部中的两个字段被用来通知紧急数据已经被放置在数据流中。

  1. URG比特被置为1
  2. 一个16bit的紧急指针被置为一个正的偏移量。该偏移量和TCP首部中的序号字段相加,得出紧急数据的最后一个字节序号。

TCP的成块数据流的更多相关文章

  1. 【TCP/IP详解 卷一:协议】第二十章 TCP的成块数据流

    本章节主要内容: ACK的累积 滑动窗口协议(即 接收方TCP数据报缓存的大小) 流量控制(慢启动 -发送方TCP的 拥塞窗口(cwnd) 以及接受方的 通告窗口) 20.1 引言 在教材的之前章节中 ...

  2. TCP/IP详解 卷1 第二十章 TCP的成块数据流

    先补充一个知识: 1.停止等待协议:是tcp保证传输可靠的重要途径,"停止等待"就是指发送完一个分组就停止发送,等待对方确认之后,才能继续发送下一个分组 停止等待协议的优点是简单, ...

  3. 12.TCP的成块数据流

    1.滑动窗口协议             TCP滑动窗口的可视化表示       我们将字节从1到11进行标号,接收方通告的窗口称为提供的窗口,它覆盖了第4字节到第9字节的数据,且通告窗口大小为6.发 ...

  4. TCP/IP详解 卷一(第二十章 TCP的成块数据流)

    本章将介绍TCP所使用的被称为滑动窗口协议的一种流量控制方法. 该协议允许发送方在停止并等待确认前可以连续发送多个分组,这样就可以加速数据的传输. 滑动窗口 下图用可视化的方法显示了滑动窗口协议 我们 ...

  5. TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流

    目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

  6. TCP/IP之TCP交互数据流、成块数据流

    建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的 ...

  7. TCP/IP协议--TCP的交互数据流和成块数据流

    前边讲了TCP连接的建立和终止,分别要三次握手和四次通信.这些报文段都只包含首部,没有数据部分.    这里就讲讲数据传送的一些细节.一个TCP连接建立成功以后,就可以开始传送数据了~ 一般TCP数据 ...

  8. 【网络协议】TCP交互数据流和数据流成块

    前言 建立在TCP协议上的应用层协议有非常多,如FTP.HTTP.Telnet等,这些协议依据数据传输的多少能够分为两类:交互数据类型和成块数据类型. 交互数据类型,如:Telnet,这类协议一般仅仅 ...

  9. 使用float和display:block将内联元素转换成块元素的不同点

    使用float和display:block将内联元素转换成块元素的不同点 使用float和display:block将内联元素转换成块元素的不同点:内联元素可以转换成块级元素,常用的方法比如可以为内联 ...

随机推荐

  1. 【POJ1509】Glass Beads 【后缀自动机】

    题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...

  2. Ztree右键事件,如何让指定的子节点不显示右键菜单。

    这里我记录一下我自己的解决方案: 1.首先在Ztree的setting设置中加一个鼠标右键回调函数onRightClick,然后在加一个beforeRightClick(具体含义可以看官方API) v ...

  3. 怎样用jQuery拿到select中被选中的option的值

    1.首先要保证select中每一个option标签都有value属性: 2.jquery的写法 1 $('#sele').val()//这里假设select的id是sele,这样可以获取当前选中的op ...

  4. 【小前端】float属性

    要求 需要float的元素,必须指定一个width宽度 没了 然后就可以指定 float:right 什么的了

  5. 关于BigDecimal小记

    昨天在写一个关于金额计算的时候,随手用了BIgDecimal结果出问题了,如下图NO.3那样,期望值是10.00,结果是10.1... 后来发现犯了一个想当然的错误,那就是两个参数的构造方法是这样的, ...

  6. C程序之包含头文件

    在C程序中包含文件有以下两种方法: 方法一:#include<XXX.h> 这里的XXX一般是改动较小的标准库,用符号"<"和">"将要 ...

  7. 【原创】cython and python for kenlm

    未经允许不可转载 Kenlm相关知识 Kenlm下载地址 kenlm中文版本训练语言模型 如何使用kenlm训练出来的模型C++版本 关于Kenlm模块的使用及C++源码说明 加载Kenlm模块命令 ...

  8. Win 7 Windows Update无法自动更新解决方案

    最近发现系统很长时间没有自动更新过了,手动更新后,提示返回错误码WindowsUpdate_8024402F.网络上搜索到的解决方法大多是删除更新临时目录,重启WINDOWS UPDATE服务,然而试 ...

  9. C++获取字符串长度数

    strlen,获取到的是字节数,中文占两个字节. 如何获取字符数,无论中文英文,标点符号,都按一个字符计算呢?这里提供其中的一个方法.那就是通过MultiByteToWideChar函数,将CStri ...

  10. atom插件记录

    ├── Zen@0.16.4 写作的时候用,很给力 ├── atom-beautify@0.29.9 美化一切代码 ├── autocomplete-paths@1.0.2 路径自动提示 ├── au ...