【计算机网络高分笔记】第三章:数据链路层
标签(空格分隔):【计算机网络】
大纲要求:
考点和要点分析
问,什么是帧定界?
答:当两个主机之间互相传送消息时,网络层的分组必须将封装成帧,并以帧的格式进行传送。将一段数据的前后分别添加首部和尾部,就够成了帧。首部和尾部中含有很多控制信息,这些信息的重要作用之一就是确定帧的界限,这就是帧定界。
例如,在 HDLC 协议中,帧格式使用标志 F(01111110) 来标识帧的开始和结束。
标志 | 地址 | 控制 | 信息 | 帧校验序列 | 标志 |
---|---|---|---|---|---|
F 01111110 | A 8位 | C 8位 | Info N位(可变) | FCS 16位 | F011111110 |
上表中 地址到帧校验序列之间为 透明传输区间。
常见问题 1 :旧版《计算机网络》教材认为数据链路层的任务是在两个相邻节点之间线路上无差错地传送以帧(frame)为单位地数据。数据链路层可以把一条有可能出差错地实际链路,转变成让网络层向下看起来好像是一条不出错地链路。但是《计算机网络》第五版中对数据链路层地提法改变:数据链路层地传输不能让网络层向下看起来好像是一条不出差错的链路。那种说法正确?
答:首先,在旧版本地计算机网络教材中对数据链路层的阐述都是基于 OSI 体系结构的,OSI 体系结构的数据链路层采用的是面向连接的 HDLC 协议,它提供可靠传输服务。因此旧版本中的提法对于 OSI 体系结构是正确的。也就谁说,以前确实是数据链路层向网络层提供了一条不出差错的链路。
而第五版之后,教材更加突出了 TCP/IP 体系结构,现在互联网的数据链路层协议使用最多的是 PPP 和 CSMA/CD 协议。这两种协议都不使用序号和确定机制,因此也就不能让网络层向下看起来好像是一条不出差错的链路。
新版教材中的提法更符合当前计算机网络的现状。当接受度按通过差错检错后发现帧在传输过程中出现差错之后,或者默默丢弃不做任何处理(当使用 PPP 或 CSMA/CD 协议时),或者使用重传机制要求发送方重传(使用 HDLC 协议时)。在以上两类协议中,前者占大多数,后者极少使用。如果需要可靠传输,那么就由高层的 TCP 负责重传。但是数据链路层并不知道这是重传的帧,所以还是默认可靠传输由 传输层 的 TCP 负责,而不是数据链路层。问题 2:当数据链路层使用 PPP 或者 CSMA/CD 协议时,既然不能保证可靠传输,为什么对所传输的帧进行差错检验的?这不是多此一举吗?
答:并不是多此一举,当数据链路层使用 PPP 或者 CSMA/CD 协议时,在数据链路层的接收端对所传输的帧进行差错检验是为了不将已经发现错误的帧瘦下来。如果或在接受端不进行差错检验,那么接收端上交给主机的帧就有可能包括在传输过程中除了差错的帧,而这样的帧对于接收端主机而言没有用途的。换而言之,接受度按进行差错检验的目的是为了保证“上交主机的帧都是没有传输差错的,因为有差错的帧都已经被丢弃了(丢弃不重传,所以不可靠)”。更严格来说,“我们以很接近 1 的概率认为,凡是上交主机的帧都是没有传输差错的)问题 3:数据链路层有流量控制吗?
答:这个问题不能一概而论,而需要看讨论的前提。在 OSI 体系结构中,数据链路层肯定有流量控制。而在 TCP/IP 体系结构中,数据链路层的流量控制被转移到传输层,因此没有必要再数据链路层设置流量控制。
问:为什么组帧时及要求加首部,也要加尾部?而报文切割成分组只加首部?
答:因为在网络中是以帧为最小单位进行传输的,所以接收端要正确地收到帧,必须要清楚该帧再一串比特流中是从哪里开始再哪里结束(因为接收端接收到的时一串比特流,没有首部和尾部不能正确的区分帧)。而分组(也称为 IP数据报)仅仅是包含在帧的数据部分,所以不需要加尾部来定界。
四种组帧方法:字符计数法、字节填充的首尾界符法、比特填充的首尾标志法、物理编码违例法。
字符填充的首尾界符法:
问:为什么在谢希仁的教材中和上述转换方法不一样?
答:教材上是将 EOT 转换成 ESC EOT 等。其实解决透明传输的方法由很多种,只要合理即可,即与接收方约定一种方式,可以在创新的情况下不一定非要与教材一致。
比特填充的首尾标志法:比特填充的首尾标志法是使用 01111110 作为帧的开始和结束的标志,这样看来似乎帧定界的问题便解决了,单位体随着而来,如果帧的数据部分含有 01111110 怎么办?透明传输依然是一个问题。
物理编码违例法:物理编码违例法是利用物理介质上编码的违法标志来区分帧的开始与结束,例如,在曼彻斯特编码中,码元 1 编码成高-低电平,码元 0 编码成低-高电平,而高-高和低-低点公平在编码中是无效的,可以用来作为帧的起视标志和结束标志。
注意:
奇偶校验码在实际使用中又分为垂直奇偶校验、水平奇偶校验与水平垂直奇偶校验。上述内容属于水平奇偶校验。
海明码:又称为汉明码,他是在信息字段中插入若干位数据,用于监督码字的哪一位数据发生了变化,具有一位纠错能力。假设信息位有 k 位,整个码字的长度就是 k + r 位,每一位的数据只有两种状态,因此有 r 位数据就有 2r 2 r 种状态。如果每一种状态就代表一个码元发生了错误,有 k + r个码元,就要有 k + r 种状态来表示,另外还要有一种状态来表示数据正确的情况,所以 2r−1≥k+r 2 r − 1 ≥ k + r 才可以检查出一种错误。
海明码求解步骤:
求出校验位的值。
M1 M 1 | M2 M 2 | M3 M 3 | M4 M 4 | M5 M 5 | M6 M 6 | M7 M 7 | M8 M 8 | M9 M 9 | M10 M 10 |
---|---|---|---|---|---|---|---|---|---|
P1 P 1 | P2 P 2 | 1 | P3 P 3 | 0 | 1 | 1 | P4 P 4 | 0 | 1 |
如何求取 Pi P i 的值?
首先把 D 所在位置的 Mi M i 的二进制写出来:
M3 M 3 | 3 | 0011 |
---|---|---|
M5 M 5 | 5 | 0101 |
M6 M 6 | 6 | 0110 |
M7 M 7 | 7 | 0111 |
M9 M 9 | 9 | 1001 |
M10 M 10 | 10 | 1010 |
假设出错位是 e1,e2,e3,e4 e 1 , e 2 , e 3 , e 4 , 可以知道:
e1=M1⊕M3⊕M5⊕M7⊕M9 e 1 = M 1 ⊕ M 3 ⊕ M 5 ⊕ M 7 ⊕ M 9
e2=M2⊕M3⊕M6⊕M7⊕M10 e 2 = M 2 ⊕ M 3 ⊕ M 6 ⊕ M 7 ⊕ M 10
e3=M4⊕M5⊕M6⊕M7 e 3 = M 4 ⊕ M 5 ⊕ M 6 ⊕ M 7
e4=M8⊕M5⊕M9⊕M10 e 4 = M 8 ⊕ M 5 ⊕ M 9 ⊕ M 10
把数据带入可以得到
当海明码没有错误信息时, e1,e2,e3,e4 e 1 , e 2 , e 3 , e 4 必须都等于 0,因此等式右侧的值也全部为 0,由于异或符号的特性, Pi P i 等于 Mi M i 位置上 i i 的二进制数上为 1的位置上的对应的 D 相应位置上求异或。
可以得到 P1=P2=P3=0,P4=1 P 1 = P 2 = P 3 = 0 , P 4 = 1
补充:
1.海明码如果要检测出 d 位错误,需要一个海明距为 d + 1 的编码方案;如果要纠正 d 位错误,需要一个海明距为 2d + 1 的编码方案。
理解:首先,什么是码距?码距指的是两个bima’zi码字的不一样的程度,就是把码距对其之后,有几位不同,码距便是多少。码距又称为海明距。例如,码字 110 和 111 的码距便是 1. 什么是海明距为 1 的编码方案?一个编码方案一般对应许多码字,而定义许多码字的海明距只需要看最小的即可。例如,某个编码方案中有码字 110、001、111,尽管 110 和 001 的码距为 3,但是110 与 111 的码距为 1.我们取 1 即可。
为什么误码率与信噪比有关?
因为信噪比越高,失真自然会越小,到达接受端之后得波形得变化就会很小,误码率自然变低。
申明:流量控制与可靠传输机制其实是属于传输层的功能。
- 流量控制就是要控制发送方发送数据的速率,使得接收方来得及接受。一个基本的方法就是由接收方来控制发送方的数据流。
- 常见的两种方式:停止-等待流量控制和滑动窗口流量控制。
1. 停止-等待流量控制:这是流量控制中最简单的形式。停止-等待流量控制的工作原理就是发送方发出一帧,然后等待应答信号到达之后再发送下一帧;接收方每收到一帧之后,返回一个应答信号,表示可以接受下一帧,如果接收方没有收到应答信号,则发送方必须一直等待。
2. 滑动窗口流量控制,在停止-等待流量控制中每次只允许发送一帧,然后就陷入等待接收方确定信息的过程中,传输效率很低。而滑动窗口流量控制允许一次发送多个帧。
滑动窗口流量控制的工作原理是在任意时刻,发送方都维持了一组连续的允许发送的帧的序号,称为发送窗口同时,接收方也维持了一组连续的允许接受的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。发送方窗口内的序列号代表了那些已经发送但是还没有被确定的帧,或者那些可以被发送的帧。发送端没收到一个帧的确定,发哦是那个窗口就向前滑动一个帧的位置。当发送窗口尺寸达到最大尺寸时,发送方就会强行关闭网络层,直到有一个空闲的缓冲区出来。当接受度按只有当收到的数据帧的发送序号落入接收窗口内才允许将该数据帧收下,并将窗口向前移动一个位置。如果接收到的数据帧落在窗口之外(就是说收到的帧号在接收窗口中找不到相应的该帧号),则一律丢弃。
用一个例子来说明:
可靠传输机制与无差错接受的区别
在数据链路层如果仅仅使用循环冗余码检验差错检测技术,只能做到对帧的无差错接受,即 “凡是接收端数据链路层接受的帧,都能以非常接近 1 的概率认为这些帧在传输过程中没有产生差错”。
注意:现在并没有要求数据链路层向网络层提供“可靠传输”的服务。所谓“可靠传输”,就是数据链路层的发送端发送什么,接收端就接受什么。传输差错可以分为两大类,一类就是比特差错(可以通过CRC来检错),另一类传输差错更复杂,这就是收到的帧并没有出现比特差错,但是出现了 帧丢失(例如发送 1,2,3,收到 1,3)、帧重复(例如发送 1,2,3 ,收到 1,2,2,3)、帧失序(例如发送 1,2,3,收到1,3,2)。这三种情况都属于出现传输差错,但都不是这些帧里有比特差错。
帧丢失比较容易理解,但是帧重复、帧失序的情况比较复杂。
总而言之“无比特差错”和“无传输差错”并不是同样的概念,在数据链路层使用 CRC 检验只能实现无比特差错的传呼是,但这并不是可靠传输。
也许会有人提出:既然会丢失那就是让接收端不管收到还是没收到都给回复,即确认。如果没有接收到回复就再发一次,直到对方确认。对于帧失序只要给发的帧的编号,等到所有帧均接收到再排序。以上说的都是对的,但为什么不采用以上方法?原因有二:1. 以前在数据链路层使用这种方式是因为以前的通信质量太差了,所以确定和重传机制会起到很好的效果,但是如今的通信质量已经大大提高,由通信链路质量不好引起的差错的概率大大降低,再使用这种机制的代价太大,不合算。2. 即时数据链路层能够实现无差错的传输,端到端的传输也可能出现差错,这样得不偿失,还不如把数据链路层做的简单一点,可靠的传输由上层协议来完成。为了更清楚数据链路层的可靠传输移到高层的原因,我们可以先看一下网络层的一个知识。
补充:为什么不管发送窗口多大,只要当接受窗口大小等于 1 时,一定可以保证帧按照顺序接受?
答:因为接受窗口为 1,所以里面有一个唯一的帧序号,不管发送窗口一次性可以发送多少字节的数据,接收窗口只选择接收窗口里的帧序号接受,只有等到该帧,接受窗口才会向后移动,所以按照这样的顺序接受的帧一定是有序的。
怎么去实现可靠传输?
可靠传输指的是发送方发送什么,接收方就受到什么,一般而言,使用确定(发送确认)和超时重传两种机制来共同完成。确认帧是一个没有数据部分的控制帧,只是用来告诉发送方的某一帧已经收到了。有时候,为了提高传输效率,将确认捎带在一个回复帧中,称为捎带确认。
超时重传是指发送方在发送一个数据桢时设置一个超市计时器,如果在规定的时间限制之内没有收到该帧的确认,那么就重新发送该数据帧。导致发送方没有收到确认得的原因有以下两种:1. 当接收方检测到出错帧时,接收方直接丢弃该帧,而不返回确认。2. 该帧在传输过程中丢失。
使用确认和超时重传两种机制实现可靠传输的策略又称为自动请求重发(ARQ)
稍待确认与累计确认有什么区别?
答:
捎带确认:每两个发送数据的站都是通过全双工连接的,每个站既维持发送窗口也维持接收窗口,但是在课本中,为了讲解清楚,仅仅是单方向发送,所以在同一时间某站可能即使发送数据又发送确认,这样就可以将确认放到数据里面一起发过去,这就是捎带确认;
累计确认:还有一种情况是接收方没收到 K 个帧就发送一个 ACK 告知发送方已经正确接受前 (K-1) 个帧并期待第 K 个帧,有人可能会问那发送方在发送第一个帧设计的计时器早就超时了,没错,这种可能性相当大,所以与超市的就要单独发 ACK ,以免发送方一直放松,这就是累计确认。
停止-等待协议
从名称上可以看出,停止-等待协议是基于停止-等待流量控制技术的。从滑动窗口的角度来看就是其发送窗口大小等于 1,接收窗口大小也是 1.
基本思想:发送方传输一个帧之后,必须等待对方的确认才能发送下一帧。如果在规定的实践之内没有收到确认,则发送方超时,并重传原始帧。
有人会问,停止-等待流量控从v行程序制技术(这里是停止-等待流量控制技术而不是停止-等待协议)为什么要一直在等待?为什么不设置一个规定时间?我们来看协议的指定。首先协议需要建立在一定的技术(停止-等待流量控制技术)之上,然后在此技术上需要考虑一切可能突发的不利状况(可以理解:协议 = 技术 + 考虑不利因素,即 停止-等待协议 = 停止-等待流量控制技术 + 不利因素),设定规定时重传就是为了解决这些不利因素。如果不设定时间就会造成死锁,这样就无法推进,在这里可以联想操作系统的死锁,如果没有外力参与打破死锁,就会一直等待下去,而这个外力就是重传计时器。
停止-等待协议会出现的差错主要有以下两大类:
疑问:确认帧需要序号吗?考虑以下条件:假设 a 发送 1 号帧给 b,b收到,但是 b 发送给 a 的确认帧在网路中堵塞了,于是当 a 端的计时器超时后看,a 又重新发送了 1 号帧,此时,b 又收到了一个 1 号帧。就在此时,b 发送的第一个确认帧到达 a,于是 a 发送 2 号帧,但是 b 没有收到,但此时 b 的第二个确认帧到达了 a 端,如果确认帧没有编号,因此 a 认为 b 收到了 2 号帧,这难道不是发生了错误吗?
解析:这个问题的本身在于技术演变,题目的分析也没有错误,很好的说明了需要对确认帧进行编号才能够正常工作。但是由于目前的数据链路层协议是用于点对点的链路上,而在条件固定的链路上,数据的往返时延一般比较稳定,不会出现忽大忽小地大幅度起伏变化。而在这种情况下,如果选择合适大小地超时重传时间,那么对于确认帧没有序号的停止-等待协议也是可以工作的。
因此,在讨论停止-等待协议的原理时,有时也省略了确认帧中的序号。从严格意义上讲,既然协议应当保证在任何不利情况下都能正常工作,那么完整的停止-等待协议的确认帧就应当存在序号。
补充:为什么后退 N 帧协议的发送窗口尺寸 WT W T 必须满足 1<WT≤2n−1 1 < W T ≤ 2 n − 1 ?
答:假设发送的窗口的大小为 2n 2 n ,发送方发送了 0 号帧,接收窗口发送 ACK1(0 号帧已经收到,希望接受 1 号帧,但是 ACK1丢失),接着发送方发送了 1 号帧,接收窗口发送 ACK2( 1 号帧已经收到,希望接受 2 号帧,但是 ACK2 丢失),依次推类,知道发送方发送了第 2n−1 2 n − 1 号帧,,接收方发送 ACK 2n 2 n (丢失),此时不能再发送数据了,因为已经发送了 2n 2 n 个帧,但是一个确认都没有收到,所以过一段时间 0 号帧的计时器会到达预定的时间进行重发,此时发过去接受方认为是新一轮 0 号帧还是旧一轮重传的呢?接收方并不知道,所以很有可能接收方就把新一轮的 0 号帧当作旧一轮的帧接受了,但实际上这个 0号帧是重传的,所以出现了错误,即发送窗口的大小不能是 2n 2 n .
现在假设发送窗口的大小为 2n−1 2 n − 1 ,情况和上面一样,发送方发送 0 ~ 2n−2 2 n − 2 号帧,接收方发送的确认帧都丢失了,如果没有丢失就应该继续传送 2n−1 2 n − 1 号帧,但是丢失了,发送方应该发送 0 号帧,由于这种情况接收方可以判断出来(下一这帧只要不是第 2n−1 2 n − 1 号帧就重传),因此不会发送错误。如果接收方窗口尺寸小于 2n−1 2 n − 1 ,那么就更不会发生错误了。
综上所述,后退 N 帧协议的最大发送窗口是 2n−1 2 n − 1 .
补充:为什么选择重传协议的最大发送窗口大小是 2n−1 2 n − 1 ?
答:现在先假设选择重传协议的最大发送窗口是 W,那么可以一次性发送 0 ~ W - 1 号帧,并且接收方都已经收到了(就是说,这 W 个确认帧都已经发了),但是这 W 个确认帧全部在传输过程中丢失了,此时接收窗口的位置已经移动到 W ~ 2W - 1. 如果发送方再发一轮,这 W 个帧应该落在W ~ 2W - 1上,但是此时的 W 帧是重传的,所以如要正确,就必须满足 2W - 1 是在最大序号 2n−1 2 n − 1 之内,也就是说 2W−1≤2n−1 2 W − 1 ≤ 2 n − 1 ,即 W≤2n−1 W ≤ 2 n − 1 .
由于选择重传协议的最大发送窗口是 2n−1 2 n − 1 还是比较难以理解的。举个例子,假设 n=3 n = 3 ,则 2n−1=4 2 n − 1 = 4 .如果发送窗口和接收窗口为 5. 假设 t1 t 1 时刻发送方发送序号为 0~4 的帧 , t2 t 2 时刻接收方收到序号为 0~4 的帧,但是确认帧在传输过程中丢失了。于是,发送方在 t3 t 3 时刻重新发送帧0,当 t4 t 4 时刻接收方收到帧 0时候,由于帧0 在其接受范围之内, 0 被错误的当作下一个新帧接受,导致协议错误。因此 W≤2n−1 W ≤ 2 n − 1 .
另外一个疑问点:如果不按需接受,交给主机时不是全部乱套了?
答:如果没有按序,正确的接受帧先存入接收方的缓冲区中,同时要求发送方重传出错帧,一旦接收到重传帧之后,就和原先存在缓冲区的其余帧按照正确的顺序发送到主机。所以说选择重选协议避免了重复传输那些本来已经正确到达接收方的数据帧,进一步提高了信道的利用率,但是代价是增加了缓冲空间。