text: 计算机网络（三）—— 数据链路层（4）：可靠传输_主机甲采用停等协议向主机乙发送数据,数据传输速率_大彤小忆的博客
  计算机网络系列内容的学习目录 → \rightarrow →谢希仁计算机网络学习系列内容汇总。
  4. 可靠传输
  4.1 可靠传输的基本概念
  ■ 使用差错检测技术（例如循环冗余校验CRC），接收方的数据链路层就可检测出帧在传输过程中是否产生了误码（比特错误）。
  ■ 数据链路层向上层提供的服务类型： ⋄ \diamond ⋄ 不可靠传输服务：仅仅丢弃有误码的帧，其他什么也不做； ⋄ \diamond ⋄ 可靠传输服务：想办法实现发送端发送什么，接收端就收到什么。 ■ 一般情况下， 有线链路的误码率比较低，为了减小开销，并不要求数据链路层向上提供可靠传输服务。即使出现了误码，可靠传输的问题由其上层处理。 ■ 无线链路易受干扰， 误码率比较高，因此要求数据链路层必须向上层提供可靠传输服务。
  ■ 比特差错只是传输差错中的一种。 ■ 从整个计算机网络体系结构来看，传输差错还包括分组丢失、分组失序以及分组重复。（我们将帧的称呼改为了分组，这意味着传输差错不仅仅局限于数据链路层的比特差错。） ■ 分组丢失、分组失序以及分组重复这些传输差错，一般不会出现在数据链路层，而会出现在其上层。 ■ 可靠传输服务并不仅局限于数据链路层，其他各层均可选择实现可靠传输。
  例如下图所示的是TCP/IP的4层体系结构。如果网络接口层使用的是802.11无线局域网，那么其数据链路层要求实现可靠传输；如果网络接口层使用的是以太网，那么其数据链路层不要求实现可靠传输。网际层中的IP协议向其上层提供的是无连接、不可靠的传输服务。运输层中的TCP协议向其上层提供的是面向连接的可靠传输服务；而UDP协议向其上层提供的是无连接、不可靠的传输服务。
  4.2 可靠传输的实现机制
  停止-等待协议SW、回退N帧协议GBN、选择重传协议SR这三种可靠传输实现机制的基本原理并不仅限于数据链路层，可以应用到计算机网络体系结构的各层协议中。
  4.2.1 停止-等待协议SW
  如图所示，收发双发基于互连网进行通信，而不是局限在一条点对点的数据链路，纵坐标为时间。
  发送方给接收方发送数据分组，接收方收到后对其进行差错检测，若没有误码，则接受该数据分组，并给发送方发送确认分组，简称为ACK。发送方收到对所发送数据分组的确认分组后，才能发送下一个数据分组。假设这个数据分组在传输过程中出现了误码，接收方收到后对其进行差错检测，发现了误码，则丢弃该数据分组，并给发送方发送否认分组，简称为NAK。发送方收到对所发送数据分组的否认分组后就知道了之前自己所发送的数据分组出现了差错，而被接收方拒绝，于是立刻重传该数据分组。因此发送方每发送完一个数据分组后，并不能立刻将该数据分组从缓存中删除，只有在收到针对该数据分组的确认分组后，才能将其从缓存中删除。 发送方每发送完一个数据分组后，就停止发送下一个数据分组，等待来自接收方的确认分组或否认分组。若收到确认分组，则可继续发送下一个数据分组；若收到否认分组，则重发之前发送的那个数据分组，这样就实现了发送方发送什么，接收方最终都能收到什么，也就是所谓的可靠传输。 但实际情况远比我们想象的要复杂，例如下图所示的这种情况。发送方给接收方发送数据分组，然而该数据分组在传输过程中丢失了。需要说明的是，对于数据链路层点对点信道而言，不太容易出现这种情况；但对于多个网络通过多个路由器互联的复杂互联网环境而言，这种情况是会经常出现的。对于这种情况，接收方既然收不到数据分组，那么也就不会无缘无故的发送确认或否认分组。如果不采取其他措施，发送方就会一直处于等待接收方确认或否认分组的状态。
  为了解决该问题，可以在发送方发送完一个数据分组时，启动一个超时计时器，若到了超时计时器所设置的重传时间，而发送方仍收不到接收方的确认或否认分组，则重传原来的数据分组，这就叫做超时重传。 一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。
  如上图所示，发送方超时重传之前所发送的数据分组，接收方正确接收重传的数据分组后，给发送方发送确认分组，发送方收到确认分组后，发送下一个数据分组，接收方正确接收该数据分组后，给发送方发送确认分组。到目前为止，貌似基于停止等待，使用确认或否认分组，再加上超时重传的手段，就可以实现可靠传输了。 思考： 是否还会出现目前这些手段不足以应对实现可靠传输的其他情况呢？
  如上图所示的这种情况，既然发送方发送的数据分组可能丢失，那么接收方发送的确认或否认分组就也有可能丢失。例如，发送方发送了一个数据分组，接收方正确接收该数据分组后，给发送方发送确认分组，但该确认分组在传输过程中丢失了，这必然会造成发送方对之前所发送数据分组的超时重传。假设这个重传的数据分组也正确到达了接收方，问题： 接收方如何判断该数据分组是否是一个重复的分组呢？为了避免分组重复这种传输错误，必须给每个数据分组带上序号。
  对于停止等待协议，由于每发送一个数据分组就停止等待，只要保证每发送一个新的数据分组，其发送序号与上次发送的数据分组的序号不同就可以了，因此用一个比特来编号就够了，即序号0和1。 这样根据数据分组的序号，接收方就可以判断出该数据分组是否是重复的。接收方丢弃重复的数据分组，并给发送方发送针对该数据分组的确认分组，以免发送方对该数据分组的再次超时重传。
  发送方收到针对0号数据分组的确认分组，就可以发送下一个数据分组了，其序号为1。接收方正确收到1号数据分组后，给发送方发送确认分组。通过确认分组丢失的情况，引出了给数据分组编号的问题。 思考： 既然数据分组需要编号，那么确认分组是否也需要编号呢？
  如上图所示的这种情况，发送方发送0号数据分组，接收方正确接收后，给发送方发送确认分组。由于某些原因，该确认分组迟到了，这必然会导致发送方对0号数据分组的超时重传。 在重传的0号数据分组的传输过程中，发送方收到了迟到的确认分组，于是发送1号数据分组。接收方收到重传的0号数据分组后，发现这是一个重复的数据分组，将其丢弃，并针对该数据分组给发送方发送确认分组，以免发送方再次超时重传该数据分组。
  问题： 对0号数据分组的重复确认，发送方如何知道呢？ 如果不采取其他措施的话，发送方会误认为这是对1号数据分组的确认。如果对确认分组也进行编号，就可以使发送方避免这种误判。如下图所示，该确认分组的序号为0，发送方通过确认分组的序号知道这是一个重复的确认分组，忽略即可。接收方正确接收1号数据分组后，给发送方发送针对该数据分组的确认分组，其序号为1。发送方收到该确认分组后，发送下一个数据分组，序号为0。要注意的是，该数据分组与之前序号为0的数据分组不是同一个数据分组。
  我们用给确认分组编号的方法，解决了确认迟到所导致的重复确认的问题。 需要说明的是，对于数据链路层的点对点信道，往返时间比较固定，不会出现确认迟到的情况。因此，如果只在数据链路层实现停止等待协议，可以不用给确认分组编号。
  注意事项：
  接收端检测到数据分组有误码时，将其丢弃并等待发送方的超时重传。但对于误码率较高的点对点链路，为使发送方尽早重传，也可给发送方发送NAK分组。
  为了让接收方能够判断所收到的数据分组是否是重复的，需要给数据分组编号。由于停止-等待协议的停等特性，只需1个比特编号就够了，即编号0和1。
  为了让发送方能够判断所收到的ACK分组是否是重复的，需要给ACK分组编号，所用比特数量与数据分组编号所用比特数量一样。数据链路层一般不会出现 ACK分组迟到的情况，因此在数据链路层实现停止-等待协议可以不用给ACK分组编号。
  超时计时器设置的重传时间应仔细选择。一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。 ⋄ \diamond ⋄ 在数据链路层点对点的往返时间比较确定，重传时间比较好设定。 ⋄ \diamond ⋄ 在运输层，由于端到端的往返时间不确定，设置合适的重传时间有时并不容易。
  停止-等待协议的信道利用率：
  ■ 当往返时延RTT远大于数据帧发送时延T D _D D​时 (例如使用卫星链路)，信道利用率非常低。 ■ 若出现重传， 则对于传送有用的数据信息来说，信道利用率还要降低。 ■ 为了克服停止-等待协议信道利用率很低的缺点，就产生了另外两种协议，即后退N帧协议GBN和选择重传协议SR。
  像停止-等待协议这种通过确认和重传机制实现的可靠传输协议，常称为自动请求重传协议ARQ。
  4.2.1.1 课后练习
  1. 在停止-等待协议中，当发送端所发送的数据帧出现丢失时，由于接收端收不到数据帧，也就不会给发送端发回相应的确认帧，则发送端会永远等待下去，解决这种死锁现象的办法是( D ) A. 检错码 B. 帧编号 C. NAK机制 D. 超时重传 分析： 发送方给接收方发送数据分组，然而该数据分组在传输过程中丢失了。如果不采取其他措施，发送方就会一直处于等待接收方确认或否认分组的状态。 为了解决该问题，可以在发送方发送完一个数据分组时，启动一个超时计时器，若到了超时计时器所设置的重传时间，而发送方仍收不到接收方的确认或否认分组，则重传原来的数据分组，这就叫做超时重传。
  2. 在停止-等待协议中，为了让接收方能够判断所收到的数据分组是否是重复的，采用的方法是( A ) A. 帧编号 B. 检错码 C. 重传计时器 D. ACK机制 分析： 发送方发送了一个数据分组，接收方正确接收该数据分组后，给发送方发送确认分组，但该确认分组在传输过程中丢失了，这必然会造成发送方对之前所发送数据分组的超时重传。假设这个重传的数据分组也正确到达了接收方，接收方如何判断该数据分组是否是一个重复的分组呢？为了避免分组重复这种传输错误，必须给每个数据分组带上序号。 这样根据数据分组的序号，接收方就可以判断出该数据分组是否是重复的。接收方丢弃重复的数据分组，并给发送方发送针对该数据分组的确认分组，以免发送方对该数据分组的再次超时重传。
  3. 主机甲采用停止-等待协议向主机乙发送数据，数据传输速率是6kbps，单向传播时延是100ms，忽略确认帧的传输延时。当信道利用率等于40%时，数据帧的长度为( D ) A. 240比特 B. 320比特 C. 600比特 D. 800比特 分析：
  4.2.2 回退N帧协议GBN
  停止-等待协议的信道利用率很低，若出现超时重传，则信道利用率更低。如果发送方在收到接收方的确认分组之前，可以连续发送多个数据分组，则可大大提高信道利用率，这是一种流水线式的传输。同等条件下，在相同的时间内，使用停止-等待协议的发送方只能发送一个数据分组，而采用流水线传输的发送方可以发送5个数据分组。
  回退N帧协议 GBN（Go-Back-N）在流水线传输的基础上，利用发送窗口来限制发送方可连续发送分组的个数。 假设采用三个比特给分组编序号，因此序号的取值范围是0~7。如下图所示，这是收发双方各自的分组序号，当序号增加到7时，下一个序号又从0开始。发送方要维持一个发送窗口，序号落在发送窗口内的数据分组可被连续发送，而不必等收到接收方的相应确认分组后再发送。发送窗口的尺寸记为W T _T T​。序号落在发送窗口内的这5个数据分组可以连续发送，而序号落在发送窗口外的数据分组不允许发送。接收窗口的尺寸即为W R _R R​。序号落在接收窗口内的这个数据分组允许接收，而序号落在接收窗口外的数据分组不允许接收。
  累积确认： 使用回退N帧协议的接收方可以采用累计确认的方式，也就是说，接收方不一定要对收到的数据分组逐个发送确认，而是可以在收到几个数据分组后，对按序到达的最后一个数据分组发送确认。 优点： 1. 即使确认分组丢失，发送方也可能不必重传； 2. 减小接收方的开销； 3. 减少对网络资源的占用。 缺点： 不能向发送方及时反映出接收方已经正确接收的数据分组的信息。
  回退N帧协议的工作原理小结：
  回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量，是一种连续ARQ协议。 在协议的工作过程中发送窗口和接收窗口不断向前滑动，因此这类协议又称为滑动窗口协议。 由于回退N帧协议的特性，当通信线路质量不好时，其信道利用率并不比停止-等待协议高。
  例： 数据链路层使用后退N帧(GBN) 协议，发送方已经发送了编号为0-7的帧。当计时器超时时，若发送方只收到0、2、3号帧的确认，则发送方需要重发的帧数是( C ) A. 2 B. 3 C. 4 D. 5 分析： (1) "发送方只收到0、 2、3号帧的确认"表明接收方正确接收了0-3号帧，井针对它们中的每一个发送了确认帧，只不过针对1号帧的确认帧丢失了(这是题目中的陷阱，但又没有相应的选项，所以迷惑性并不是很大) ； (2) 截止到计时器超时，发送方只收到了针对0-3号帧的确认，而发送方之前已经发送了0-7号帧，因此应该从4号帧开始重传，即重传之前已经发送过的4、5、 6、7号帧，共计重传4个帧。
  4.2.2.1 课后练习
  1. 数据链路层采用回退N帧协议GBN，发送方已经发送了编号0~6的帧。计时器超时时，只收到了对1、2、4号帧的确认，发送方需要重传的帧的数目是( B ) A. 1 B. 2 C. 5 D. 6 分析： (1) "发送方只收到1、 2、4号帧的确认"表明接收方正确接收了0-4号帧，井针对它们中的每一个发送了确认帧，只不过针对0、3号帧的确认帧丢失了； (2) 截止到计时器超时，发送方只收到了针对0-4号帧的确认，而发送方之前已经发送了0-6号帧，因此应该从5号帧开始重传，即重传之前已经发送过的5、 6号帧，共计重传2个帧。
  2. 数据链路层采用回退N帧协议GBN，帧编号由7个比特构成，则发送窗口的最大长度为( C ) A. 7 B. 8 C. 127 D. 128 分析： W R = 1 < = W T < = 2 n − 1 W_R = 1 <= W_T <= 2^n-1 WR​=1<=WT​<=2n−1。 W R W_R WR​接收窗口， W T W_T WT​发送窗口， n n n帧序号位。
  3. 数据链路层采用回退N帧协议GBN，如果发送窗口的大小是32，那么至少需要几个比特来给帧编号才能保证协议不出错( C ) A. 4 B. 5 C. 6 D. 7 分析： 在后退N帧的协议中，序列号个数> = MAX_ SEQ+ 1，设序列号尾数用s表示，则2 s ^s s > = MAX _SEQ + 1，即2 s ^s s >= 33，即得 s 最小为6。
  4.2.3 选择重传协议SR
  ■ 回退N帧协议的接收窗口尺寸W R _R R​只能等于1，因此接收方只能按序接收正确到达的数据分组。 ■ 一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码)。这必然会造成发送方对这些数据分组的超时重传，显然这是对通信资源的极大浪费。 ■ 为了进一 步提高性能，可设法只重传出现误码的数据分组。因此，接收窗口的尺寸W R _R R​不应再等于1 (而应大于1) ，以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组，等到所缺分组收齐后再一井送交上层，这就是选择重传协议。 ■ 选择重传协议为了使发送方仅重传出现差错的分组，接收方不能再采用累积确认，而需要对每个正确接收到的数据分组进行逐一确认。
  选择重传协议的工作原理： 假设采用三个比特给分组编序号，因此序号的取值范围是0~7。如下图所示，左边是发送方的分组序号，右边是接收方的分组序号。当序号增加到7时，下一个序号又从0开始。发送窗口的尺寸W T _T T​的取值范围是 1 < W T _T T​ <= 2 ( 3 − 1 ) ^{(3-1)} (3−1)，其中的3是构成分组序号的比特数量。
  序号落在发送窗口内的这4个数据分组可以连续发送，而序号落在发送窗口外的数据分组不允许发送。接收窗口的尺寸W R _R R​的取值一般情况下可与发送窗口的尺寸W T _T T​的取值相同，在本例中其值为4。序号落在接收窗口内的这4个数据分组允许接收，而序号落在接收窗口外的数据分组不允许接收。
  发送方将序号落在发送窗口内的这4个数据分组依次连续发送出去，它们经过互联网的传输陆续到达接收方，但其中的二号数据分组丢失了。
  只要序号落入接收窗口内且无误码的数据分组，接收方都会接收。接收方接收0号和1号数据分组并发送0号和1号确认分组，接收窗口向前滑动两个位置，这样就有4和5这两个新的序号落入接收窗口。
  接收方接收3号数据分组并发送3号确认分组，但接收窗口不能向前滑动，因为3号数据分组是未按序到达的数据分组。
  这些确认分组经过互联网的传输陆续到达发送方，发送方每按序收到一个确认分组，发送窗口就要向前滑动一个位置。发送方接收0号和1号确认分组，发送窗口向前滑动两个位置，这样就有4和5这两个新的序号落入发送窗口。发送方将序号落入发送窗口的4号和5号数据分组发送出去，发送方现在可以将已经收到确认的0号和1号数据分组从发送缓存中删除了，而接收方可择机将已按序接收的0号和1号数据分组交付上层处理。
  发送方接收3号确认分组，但发送窗口不能向前滑动，因为这是一个未按序到达的确认分组，发送方还未收到它之前的2号确认分组。不过需要记录3号数据分组已收到确认，这样该数据分组就不会超时重发。
  例： 数据链路层采用选择重传协议(SR) 传输数据，发送方已发送了0~3号数据帧，现已收到1号帧的确认，而0、2号帧依次超时，则此时需要重传的帧数是( B ) A. 1 B. 2 C. 3 D.4 分析：(1) 与回退N帧协议不同，选择重传协议不支持累积确认。接收方每接收一个数据帧，就会发回相应的确认帧。 (2) 题目所给“收到1号帧的确认，而0、2号帧依次超时”。因此需要重传0、2号帧。至于发送方已发送的3号数据帧，题目并未给出它的任何其他线索，因此无须考虑3号帧。
  4.2.3.1 课后练习
  1. 数据链路层采用选择重传协议SR，帧编号由5个比特构成，则接收窗口的最大长度为( B ) A. 15 B. 16 C. 31 D. 32 分析： 选择重传协议中接收窗口尺寸取值范围 1 < = W R < = W T < = 2 n − 1 1<= W_R<=W_T<=2^{n-1} 1<=WR​<=WT​<=2n−1， 帧编号由5个比特构成，则接收窗口的最大长度为 W R = 2 4 = 16 W_R=2^4=16 WR​=24=16。
  2. 数据链路层采用选择重传协议SR，帧编号由6个比特构成，则发送窗口的最大长度为( A ) A. 32 B. 33 C. 64 D. 65 分析： 选择重传协议中发送窗口尺寸取值范围 1 < = W T < = 2 n − 1 1<=W_T<=2^{n-1} 1<=WT​<=2n−1 ，帧编号由6个比特构成，则发送窗口的最大长度为 W T = 2 5 = 32 W_T=2^5=32 WT​=25=32。
  3. 以下哪些协议的接收方只能按序接收分组( A ) I. 停止-等待协议 II. 回退N帧协议 III. 选择重传协议 A. I、II B. I、III C. II、III D. 全部 分析： 若接收窗口等于1，即只能按序分组。