共4500词,阅读大约需要30分钟,可根据目录读取需要的模块
一、可靠传输的工作原理
1.停止等待协议
全双工通信的双方既是发送方也是接收方。下面讨论中,我们仅考虑A发送数据而B接收数据并发送确认。因此A叫做 发送方 ,而B叫做 接收方。因为这里是讨论可靠传输的原理,因此把传送的数据单元都称为分组。
“停止等待” 就是没发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
(1)无差错情况
如图所示,A发送分组M1,发完就暂停发送,等待B的确认。B收到了M1就向A发送确认。A在收到了对M1的确认后,就再发送下一个分组M2。同样,在收到B对M2的确认后,再发送M3。
(2)出现差错
可靠传输协议是这样设计的:A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫做 超时重传。
实现方法: 在每发送完一个分组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。
应注意以下三点:
一、A发送完一个分组后,必须暂时保留已发送的分组的副本 (在发生超时重传的时候使用)。只有在收到相应的确认后才能去除暂时保留的分组副本。
二、分组和确认分组都必须进行 编号。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。
三、超时计时器设置的重传时间 应当比数据在分组传输的平均往返时间更长一些。 (需要考虑网络当时的拥塞情况)
停止等待协议
(3)确认丢失和确认迟到
下图中说明了另一种情况。B所发送的对M1的确认丢失了。A在设定的超时重传时间内没有收到确认,并无法知道是自己发送的分组出错、丢失,或者是B发送的确认丢失了。因此A在超时计时器到期后就要重传M1。注意B的动作,假定B有收到了重传的分组M1。这时需要采取两个行动。
第一,丢弃这个重复的分组M1 ,不向上层交付。
第二,向A发送确认。 不能认为已经发送过确认就不再发送,因为A之所以重传M1,就表示A没有收到对M1的确认。
确认丢失和确认迟到
**使用上述的确认和重传机制,我们就可以 在不可靠的参数网络上实现可靠的通信 **
像上述的这种可靠传输协议常称为 自动重传请求ARQ(Automatic Repeat reQuest) ,意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。
(4)信道利用率
停止等待协议的优点是简单,但缺点是信道利用率太低。 (信道利用率 = 发送分组所的时间TD/(TD+往返时间RTT + 确认分组从发送到到达所需要的时间) )
如图所示:
为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。如下图所示。
流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。
当使用流水线传输时,就要使用下面介绍的 连续ARQ协议和滑动窗口协议。
2.连续ARQ协议(ARQ:自动重传请求)
下图中表示发送方维持的发送窗口,它的意义是:位于发送窗口内的5个分组都可连续发送出去,而不需要等待对方的确认,这样,想到利用率就提高了。
分组发送是按照分组序号从小到大发送的。
连续ARQ协议的工作原理
连续ARQ规定,发送方没收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方一般采用 累积确认 的方式。也就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,** 对按序到达的最后一个分组发送确认** ,这就表示:到这个分组为止的所有分组都正确收到了。
二、TCP报文段的首部格式
1.概述
TCP 虽然是面向字节流的,当TCP传送的数据缺是报文段。
一个TCP报文段分为 首部和数据两部分,而TCP的全部功能都体现在它首部中各个字段的作用。
TCP报文段的首部格式
2.首部固定部分各字段的意义如下:
(1)源端口和目的端口
各占两个字节,分别写入源端口和目的端口号。TCP的分用功能也是通过端口实现的。
(2)序号
占4个字节,序号范围是[0,232-1],共232个序号,序号增加到2^32-1后,下一个序号就又回到0。也举手说,序号使用mod 2^32运算。
TCP是面向字节流的,在一个TCP连接中传送的字节流的 每一个字节都按顺序编号。 整个要传送的字节流的初始序号必须在连接建立时设置。首部中的序号字段值则是 本报文 所要发送的数据的第一个字节的序号。
(3)确认号
占4个字节,是 期望收到对方下一个报文段的第一个数据字节的序号。
若确认号 = N,则表明:到序号N-1为止的所有数据都已正确收到。
(4)数据偏移
占4 位,它指出TCP报文段的数据起始处距离TCP报文段的起始位置有多远。这个字段实际上是指出TCP报文段的首部长度。
由于4位二进制数能够表示的最大十进制数字是15,所以数据偏移的最大值是60字节==(“数据偏移的单位是32位字”)==,这也是TCP首部的最大长度(即选项长度不能超过40字节。)
(5)保留
占6位,保留为今后使用,但目前应置为0。
(6)紧急URG
当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序发送。
当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的 最前面, 而在紧急数据后面的数据仍是普通数据。这时要与上部中 紧急指针 字段配合使用。
(7)确认ACK
仅当ACK = 1时确认号字段才有效。当ACK = 0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
(8)推送PSH
发送方TCP把 PSH 置1,并立即创建一个报文段发送出去。接收方TCP 收到PSH = 1的报文段,接收方TCP收到PSH = 1的报文段,就尽快地(即 “推送” 向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
(9)复位RST
当RST = 1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文或拒绝打开一个连接。 RST也称为重建位或重置位。
(10)同步SYN
在简历连接时用来同步序号。当SYN = 1而ACK = 0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用 SYN = 1和ACK = 1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
(11)终止FIN
用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
(12)窗口
占2字节。窗口值是[0,2^16-1]之间的总数。窗口指的是发送本报文段的一方的 接收窗口 (而不是自己的发送窗口)。因为接收方的数据缓存空间是有限的。窗口值作为接收方让发送方设置其发送窗口的依据。
窗口字段明确指出了现在允许对方发送的数据量,窗口值经常在动态变化着。
(13)检验和
占2字节。检验和字段检验的范围包括首部和数据这两部分,检验是否有差错。
(14)紧急指针
占2字节。紧急指针仅在URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)
窗口为零时也可发送紧急数据
(15)选项
长度可变,最长可达到40字节。当没有使用 “选项” 时,TCP的首部长度是20字节。最后的 填充字段 仅仅是为了使整个TCP首部程度是4字节的整数倍。
三、TCP可靠传输的实现
我们 假定数据传输只在一个方向上进行 ,即A发送数据,B给出确认。
- 根据接收方给的的窗口值-发送方构造自己的发送窗口
- 发送窗口里面的序号表示允许发送的序号。显然,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而可能获得更高的传输效率。
- 发送窗口后沿的部分表示已发送且已收到了确认。这些数据显然不需要再保留了。而发送窗口前沿的部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。
- 发送窗口的位置由窗口前沿和后沿的位置共同确认。后沿不可能像后移动,前沿可以像后移动,但是强烈不赞成这样做 (因为很可能发送方在收到前沿后移的通知之前已经发送了窗口中的许多数据,现在又要收缩窗口,不让发送这些数据,这样就会产生一些错误。与上一点冲突)
- 发送方的应用进程把字节流写入TCP的发送缓存,接收方的应用进程从TCP的接收缓存中读取字节流。
四、TCP的流量控制
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
发送方的发送窗口不能超过接收方给出的接收窗口的数值。 请注意,TCP的窗口单位是字节,不是报文段。
4.1 持续计时器
持续计时器是 “为了解决发送方和接收方互相等待导致的死锁局面一直延续下去” 而设计的,TCP为每一个连接设有一个 持续计时器 。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。如果持续计时器设置的时间到期,就发送一个零窗口 探测报文段 (仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口值仍然是零,那么说到这个报文段的一方就重新设置持续计数器。如果窗口不是零,那么死锁的僵局就可以打破了。
五、TCP的传输效率
5.1 3种不同的机制控制TCP报文段的发送时机
第一种机制:TCP维持一个变量,它等于 最大报文段程度MSS。 只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去。
第二种机制:由发送方的应用进程指明发送报文段,即TCP支持的 推送(push) 操作。
第三种机制:发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过MSS)发送出去。
5.2 如何控制TCP发送报文段的时机
在TCP的实现中广泛使用Nagle算法,算法如下:若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这样的方法可明显地减少所用的网络带宽。
Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度是,就立即发送一个报文段。这样做,就可以有效地提高网络的吞吐量。
5.3 糊涂窗口综合征
指接收方有一点缓存就告诉发送方,而发送方就发送很少数据的报文段,导致网络的效率很低
解决:
可以 让接收方等待一段时间 ,使得或者接收缓存已有足够的空间容纳一个最长的报文段,或者 等到接收缓存已有一半空闲的空间。 此外,发送方也不要发送太小的报文段,而是把数据累积成足够大的报文段,或达到接收方缓存空间的一半大小。
六、TCP的拥塞控制
6.1 拥塞的概念
在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做 拥塞
网络拥塞往往是由许多因素引起的。例如:当每个结点缓存的容量太小时,到达该结点的分组因无存储空间暂存而不得不被丢弃。
6.2 拥塞控制与流量控制的关系
所谓 拥塞控制 就是 防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。 拥塞控制所要做的都有一个前提,就是 网络能够承受现有的网络负荷。 拥塞控制是一个 全局性的过程 ,涉及到所有的主机、所有的路由器、以及与减低网络传输性能有关的所有因素。
相反,流量控制往往是指点对点通信量的控制,是 端对端 (一个接收方和一个发送方)的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
6.3 TCP的拥塞控制方法
TCP进行拥塞控制的算法有四种:慢开始、拥塞避免、快重传、快恢复
慢开始和拥塞避免这两种拥塞控制也叫 基于窗口 的拥塞控制。
慢开始
算法思路:当主机开始发送数据时,由于并不清楚网络的符合情况,所以如果立即把大量数据字节注入网络,那么就有可能引起网络发生拥塞;慢开始就是让发送窗口数值从小到大逐渐增大
拥塞避免
让拥塞窗口swnd缓慢地增大,即没见过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是像慢开始阶段那样成倍增长。这种算法比慢开始算法的拥塞窗口增长速率缓慢得多。
快重传
要求接收方不要等待值发送数据时才进行捎带确认,而是要 立即发送确认,即使收到了 失序的报文段 也要立即发出对已收到的报文段的重复确认。
快恢复
发送方知道现在只是丢失了个别的报文段,设置拥塞窗口cwnd值为原来的一半。