TCP/IP协议详解 卷一:协议 20章、TCP的成块数据流

1、引言

该协议允许发送方在停止并等待确认前可以连续发送多个分组,由于发送发不必每发送一个分组就停下来等待确认,因此该协议可以加速数据的传输。

2、正常数据流

数据传输过程中,经受时延的确认。一般来说,发送端发送一个数据报之后,接收端都会发送一个对这个数据报的确认。但是使用TCP的滑动窗口协议的时候,接收方不必对每一个接收的数据报进行确认。我们在上一个章节有提到过,捎带数据的ACK。这里我们要介绍的是,ACK的累积机制。
在TCP中,ACK是累积的,它们表现为接收方已经正确接收了一直到确认序号减1的所有字节。或者说,发送端会一直发送数据直到接收端缓存已满(或者接近),而接收方对这些数据只要以一个ACK的方式进行确认就可以了,类似前面的经受时延的ACK。

发送同一段数据可能有不同的时间序列

  • 由于发送方和接收方处理数据的能力不同,那么时间序列也可能不同。(快的发送方和慢的接收方)
  • 比如接收方处理得慢,那么发送方必须等到接收方处理完窗口里面的数据才能发送。
  • 如果接收方的缓冲区数据满了,会返回一个ACK,并通知窗口为0.
  • 过一段时间缓冲区有位置了,会再发一个ACK通知窗口大小。(并不是有位置就马上通知)

3、滑动窗口

TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。

滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是可以被发送的帧。

窗口移动:

(1)窗口左边沿向右边沿靠近为窗口合拢。 (发生在数据被发送和确认时)
(2)窗口右边沿向右边移动为窗口张开。 (发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时)
(3)窗口右边沿向左边移动为窗口收缩。(RFC强烈建议不要使用这种方式)

如果左边沿到达右边沿,则称其为一个0窗口,此时发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。

4、窗口大小

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

窗口大小由进程控制,插口API允许进程设置发送和接收缓存的大小,接收缓存的大小是该连接上所能够通告的最大窗口大小。默认的4096并不是最理想的窗口大小,而16384则可以使吞吐量大大的增加。

滑动窗口是用来加速数据传输。TCP要保证“可靠”,就需要对一个数据包进行ack确认表示接收端收到(窗口张开)。有了滑动窗口,接收端就可以等收到许多包后只发一个ack包,确认之前已经收到过的多个数据包。有了滑动窗口,发送端在发送完一个数据包后不用等待它的ack,在滑动窗口大小内可以继续发送其他数据包(窗口合拢)。

发送的数据TCP包都有一个序号。它是这么计算的:最初发送SYN时,有一个初始序号,根据RFC的定义,各个操作系统的实现都是与系统时间相关的。之后,序号的值会不断的增加,比如原来的序号是100,如果这个TCP包的数据有10个字节,那么下次的TCP包序号会变成110。

滑动窗口用于加速传输,比如发了一个seq=100的包,理应收到这个包的确认ack=101后再继续发下一个包,但有了滑动窗口,只要新包的seq与没有得到确认的最小seq之差小于滑动窗口大小,就可以继续发。

因为窗口的左边沿受另一端发送的确认序号的控制,因此不可能向左边沿移动。如果接收到一个指示窗口左边沿向左移动的ACK,则它被认为是一个重复的ACK,并被丢弃。

 5、PUSH标志

发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其它数据。

(1)发送方将发送缓冲区的数据立即发送给接收方。

(2)接收方将接收缓冲区的数据立即提交给接收进程。

如果待发送数据会清空发送缓冲区,该包将自动设置PUSH标志。

6、慢启动

如果在发送方和接收方之间存在多个路由器和速度较慢的链路时(广域网),一开始就不断发送报文段直至达到接收方的窗口满为止,这样的行为可能导致拥塞。

慢启动算法(slow start)通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。

慢启动需要加入一个新的窗口概念——拥塞窗口,cwnd. 
拥塞窗口初始化为1个报文段,每接收到一个ACK就增加一个报文段。(cwnd以字节为单位,但是慢启动以报文段大小为单位,也就是1个报文段。)

大小变化:1->2->4->8…… 可以看出拥塞窗口的大小是以指数方式增长的。

发送方取拥塞窗口与通告窗口的最小值作为发送上限。(就是你能发送的大小和对方能接收的大小的最小值)

慢启动算法用于保证新分组进入网络的速率与另一端返回确定的速率相等。
拥塞窗口是发送使用的流量控制,通告窗口是接收方使用的流量控制。

7、成块数据的吞吐量

吞吐量 概念:单位时间内成功传送数据的数量

发送方和接收方之间的路径称为管道。

带宽时延乘积 capacity(bit)=bandwidth(b/s) x round-trip time(s) 
通道容量=带宽 x 往返时间 (容量=时间 x 速度)也就是整个通道能装下的容量大小

拥塞:当数据到达一个打的管道(如一个快速局域网)并向一个较小的管道(如一个较慢的广域网)发送时,便会发生拥塞。当多个输入流到达一个路由器,而路由器的输出流小于这些输入流的总和时也会发生拥塞。

当发送方收到ACK的时候,拥塞窗口的值就+1.
TCP的自计时:由于接收方只在数据到达的时候才生成ACK,所以发送方接收到ACK之间的间隔与数据到达接收方的间隔是一致的。(然而在实际中,返回路径上的排队(拥塞)会改变ACK的到达率)

在拥塞窗口的值足够大之后,发送方和接收方之间的管道(pipe)被填满,此时无论拥塞窗口和通告窗口的值为多少,管道都不能再容纳更多的数据。
当接收方在某个时间段从网络上移走一个报文段,发送方就再发送一个报文段到网络上。
它们就像一辆挤满人的公交车,只有有人下车,才能有其他人上车。
但是不管有多少报文段填充了这个管道,返回路径上总是有相同数目的ACK,这就是理想的稳定状态。

8、紧急方式

“紧急方式”使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中,接收方收到通知,并决定如何处理。

可以通过设置TCP首部中的两个字段来发出这种从一端到另一端的紧急数据已经被放置在数据流中的通知。URG比特被置为1,并且一个16bit的紧急指针放置为一个正的偏移量,该偏移量必须与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。

当紧急数据进入发送缓冲区后,下一个将要发送的数据(可能是紧急,也可能不是)的URG比特置为1,发送给接收方。接收方知道后就知道发送方处于紧急状态(仅仅知道而已,不会采取什么措施,它会通知应用层现在有紧急数据,你自己看着办),直到接收到最后一个字节的紧急数据后解除这种状态。

如果接收方通告窗口为0,那么数据无法发送出去,但是URG比特这个报文还是会发送出去,通知对面我这边有紧急数据。

人们常常错误的将紧急数据称之为带外数据。TCP紧急方式只是一个从发送发到接收方的通知,该通知告诉接收方紧急数据已经被发送,并提供该数据最后一个字节的序号。应用程序使用的有关紧急数据部分的编程接口常常都不是最佳的,从而导致更多的混乱。

9、小结

没有一种单一的方法可以使用TCP进行成块数据的交换。这是一个依赖许多因素的动态处理过程,有些因素我们可以控制(发送和接收缓存的大小),而另一方面我们则没有办法控制(网络阻塞、与实现有关的特征)。

进行成块数据有效传输的最重要的方法是TCP的滑动窗口协议。

时间: 2024-10-10 23:54:03

TCP/IP协议详解 卷一:协议 20章、TCP的成块数据流的相关文章

TCP/IP协议详解 卷一:协议 17章、TCP传输控制协议

1.TCP服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. (1)面向连接 两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接.过程与打电话相似,先拨号振铃,等待对方摘机说"喂",然后才说明是谁. 说明:在一个TCP连接中,仅有两方彼此进行通信.广播和多播不能用于TCP. (2)可靠性 TCP通过下列方式来提供可靠性: 1)应用数据被分割成TCP认为最适

TCP/IP详解 卷一(第二章 链路层)

在TCP/IP协议族中,链路层主要有三个目的: 1.为IP模块发送和接收IP数据报 2.为ARP模块发送ARP请求和接收ARP应答 3.为RARP请求和接收RARP应答 TCP/IP支持多种不同的链路层协议,本文主要讨论以太网链路层协议.PPP协议以及大多数实现都包含的环回(loopback)驱动程序. 使用ipconfig命令查看本机的网络接口 其中eth0就是以太网接口,lo是环回接口. 1.以太网IP数据包的封装 2.PPP协议(点对点协议) 3.环回接口 环回接口允许在同一台主机上的客户

TCP/IP详解 卷一(第一章 概述)

很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但TCP/IP协议族允许它们相互进行通信. 1.分层 TCP/IP不是一个协议,而是一个协议族,通常它被认为是一个四层的协议系统,下面展示了TCP/IP协议族中不同层次的协议 2.互联网的地址 互联网上每个接口必须有一个唯一的Internet地址(IP地址).IP地址(IPv4)长32bit,下面是5类不同的互联网地址格式 下面是各类IP地址的范围 3.端口号 TCP和UDP采用16bit的端口号来识别应用程序 4.RFC RFC(

TCP/IP头部详解

在网上找了很多有关tcp/ip头部解析的资料,都是类似于下面的结构 抽象出图文是这种结构,但是在底层中数据到底是怎么传输的呢?没有答案,在深入学习之后,总结出数据传输的方式 IP数据包头部格式: 上面是在数据到达传输层对数据进行IP头部封装的数据 TCP协议 TCP协议是传输协议,为应用层提供数据服务,和UDP不同,TCP提供可靠的面向连接服务,关于TCP头部数据格式的说明 跟IP头部差不多,基本长度为20个字节,基本介绍到此为止,详解在网上多如牛毛,下面用两台pc建立连接为例说明: 主机1:I

tcp ip参数详解

http://www.cnblogs.com/digdeep/p/4869010.html 1. TCP/IP模型 我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.而实际的Linux网络层协议是参照了OSI标准,但是它实现为4层:应用层,传输层,网络层,网络接口层.OSI的多层对应到了实际实现中的一层.我们最为关注的是传输层和网络层.一般而言网络层也就是IP层,负责IP路由寻址等等细节,而传输层TCP/UDP负责数据的

rtp协议详解/rtcp协议详解

转自:http://www.cnblogs.com/li0803/archive/2010/11/20/1882792.html 1.简介 目前,在IP网络中实现实时语音.视频通信和应用已经成为网络应用的一个主流技术和发展方向,本文详细介绍IP协议族中用于实时语音.视频数据传输的标准协议RTP( Real-time Transport Protocol)和RTCP(RTP Control Ptotocol)的主要功能. 2.RTP/RTCP协议简介 RTP 由 IETF(http://www.i

iOS中 HTTP/Socket/TCP/IP通信协议详解

// OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. 物理层 // TCP/IP, 由美国国防部制定 // 1. 应用层, HTTP, FTP, SMTP, DNS // 2. 传输层, TCP, UDP // 3. 网络层, IP // 4. 链路层, ARP, RARP // HTTP(短连接) // 1. 建立链接, 三次握手 // 2. 断开

TCP/IP模型详解

上述为TCP/IP的协议模型,主机到网络层又被称为网络接口层,网络互联层又被称为网间层. 网络接口层:实际上,TCP/IP参考模型并没有真正描述这一层的实现,只是要求能够提供给其上层一个访问接口,以便能在其上传递IP分组.由于这一层没有被定义,所以其具体实现的方法随着网络类型的不同而不同. 网间层:它的功能是把分组发往目标网络或主机.本层定义了IP协议,RIP协议,负责数据的包装.寻址和路由功能.同时提供ICMP用来诊断网络信息. 传输层:包括了面向连接的TCP与面向无连接的UDP.传输层的功能

iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 简单介绍: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. 物理层 // TCP/IP, 由美国国防部制定 // 1. 应用层, HTTP, FTP, SMTP, DNS // 2. 传输层, TCP, UDP // 3. 网络层, IP // 4. 链路层,

TCP/IP状态详解[转]

TCP正常建立和关闭的状态变化 TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做 四次握手. 建立连接 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态: 第三次握手:客户端