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. 高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令

    1. 启动 Nginx poechant@ubuntu:sudo ./sbin/nginx 2. 停止 Nginx poechant@ubuntu:sudo ./sbin/nginx -s stop ...

  2. sql优化 原因

    不使用子查询例: SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang'); 子查询在MySQL5.5版本里,内部执行 ...

  3. jvisualvm远程监控服务器tomcat

    1.在 {服务器tomcat路径}/bin/catalina.sh 中,的[# OS specific support.  $var _must_ be set to either true or f ...

  4. C++继承后的函数访问权限

    今天在写代码时发现对继承后的函数访问权限不太清楚,于是自己做了个测试: 1.头文件(test.h) 1 #include <iostream>  2 using namespace std ...

  5. It's not too late to start!

    It's not too late to start! 以此鼓励,希望能坚持下去,一个半路自学PHP的准PHPer!

  6. TCP、UDP、HTTP、SOCKET之间的区别与联系-乾颐堂CCIE

    IP:网络层协议: TCP和UDP:传输层协议: HTTP:应用层协议: SOCKET:TCP/IP网络的API. TCP/IP代表传输控制协议/网际协议,指的是一系列协议. TCP和UDP使用IP协 ...

  7. [Training Video - 4] [Groovy] Constructors in groovy, this keyword

    Bank.log = log Bank b1 = new Bank() b1.name = "BOA" b1.minbalance = 100 b1.city="Lond ...

  8. CSS 伪类和伪元素--pseudo

    总结在前: 0. 参考资料 1. 伪类和伪元素是不同的两种东西. 2. 伪类和伪元素都属于CSS选择器. 3. CSS引入伪类和伪元素是为了实现基于文档树之外的信息,i.e. 段落的第一行,的格式化. ...

  9. CentOS下的Git服务器

    [Gitosis]CentOS下的Git服务器:Gitosis  [摘要]         详细介绍如何在CentOS上配置Gitosis        我们很多人知道Git可能是从Github开始的 ...

  10. 15 输入三个整数x,y,z,请把这三个数由小到大输出。

    题目:输入三个整数x,y,z,请把这三个数由小到大输出. public class _015ThreeNumberSort { public static void main(String[] arg ...