【计算机网络高分笔记】第三章:数据链路层
标签(空格分隔):【计算机网络】
第三章:数据链路层
第三章:数据链路层
3.1 数据链路层的功能
3.2 组帧
3.3 差错控制
3.3.1 检错编码
3.3.2 纠错编码
3.4 流量控制与可靠传输机制
3.4.1 流量控制
3.4.2 可靠传输机制
3.4.3 滑动窗口机制
3.4.4 停止-等待协议
3.4.5 后退N帧(GBN)协议
3.4.6 选择重传(SR)协议
3.4.7 发送缓存和接受缓存
我的微信公众号
大纲要求:
数据链路层功能
组帧
差错控制
检错编码
纠错编码
流量控制与可靠传输
流量控制、可靠传输与滑动窗口机制
停止-等待协议
后退 N 帧(GBN)协议
选择重传(SR)协议
介质访问控制
信道划分介质访问控制:频分多路复用、时分多路复用、波分多路复用、码分多路复用的概念和基本原理。
随机访问介质访问控制:ALOHA 协议、CSMA 协议、CSMA/CD 协议、CSMA/CA 协议
轮询访问介质访问控制:令牌传递协议
局域网
局域网的基本概念与体系结构
以太网与 IEEE 802.3
IEEE 802.11
令牌环网的基本原理
广域网
广域网的基本概念
PPP
HDLC协议
数据链路层设备
网桥的概念和基本原理
局域网交换机及其工作原理
考点和要点分析
核心考点:
流量控制与可靠传输机制、CSMA/CD原理,特别是争用期和截断二进制指数退避算法
网桥的概念和基本原理
组帧机制和差错控制机制,特别是循环冗余码和海明码
基础要点:
数据链路层的概念和功能
帧的概念,了解帧的 4 种组帧方法,掌握其中带位填充的首尾标志法
帧的概念,了解帧的 4种组帧方法,掌握其中带位填充额首尾标志法
差错控制的基本概念和方法
流量控制的基本概念和可靠传输机制
4 种信道划分介质访问控制的基本概念
3 种可靠传输协议以及 HDLC 协议和 PPP
数据链路层各层设备的基本工作原理和其他各层设备的区别
3.1 数据链路层的功能
数据链路层 在物理层所提供的服务的基础上 向网络层提供服务,即将原始的、有差错的物理线路改进成为逻辑上无差错的数据链路,从而向网络层提供高质量的服务。它一般包括 3 种基本服务:无确定的无连接服务、有确定的有连接服务、有确定的无连接服务(不存在无确定的有连接服务)。
具体而言,数据链路层的主要功能如下:
链路管理:负责数据链路的建立、维持和释放,主要用于面向连接服务。
帧同步:接收方确定收到的比特流中一帧的开始位置和结束位置。
差错控制:用于使接收方确定收到的数据就是由发送方发送的数据。
透明传输:不论数据是什么样的比特组合,都应当能够在链路上进行传输。
问,什么是帧定界?
答:当两个主机之间互相传送消息时,网络层的分组必须将封装成帧,并以帧的格式进行传送。将一段数据的前后分别添加首部和尾部,就够成了帧。首部和尾部中含有很多控制信息,这些信息的重要作用之一就是确定帧的界限,这就是帧定界。
例如,在 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 体系结构中,数据链路层的流量控制被转移到传输层,因此没有必要再数据链路层设置流量控制。
3.2 组帧
问:为什么组帧时及要求加首部,也要加尾部?而报文切割成分组只加首部?
答:因为在网络中是以帧为最小单位进行传输的,所以接收端要正确地收到帧,必须要清楚该帧再一串比特流中是从哪里开始再哪里结束(因为接收端接收到的时一串比特流,没有首部和尾部不能正确的区分帧)。而分组(也称为 IP数据报)仅仅是包含在帧的数据部分,所以不需要加尾部来定界。
为什么要组帧?直接传送比特流不就可以了?还免去了帧同步、帧定界、透明传输等问题。但是反过来思考,万一传送的比特流出错了怎么办?那就得重新传输全部的比特流,组帧的优点就在于,如果传输出现了错误,只需要重新发送错误的帧即可,这相对于增加帧同步、帧定界、透明传输问题是值得的。组帧不能随意组合,需要让接收方看懂才行,这就需要依据一定的规则将网络层递交下来的分组组装成帧。
四种组帧方法:字符计数法、字节填充的首尾界符法、比特填充的首尾标志法、物理编码违例法。
字节计数法:用一个特殊的字符来表示一帧的开始,然年后用一个计数字段来表明帧包含的字节数。当目的主机接收到该帧时,根据此字段提供的字节数,便可以知道该帧接受位和下一帧的开始位。如下图
从上图中可以看出,计数字段提供的字节数包含自身所占的一个字节。
缺点:如果计数字段在传输过程中出错,接收方就无法判断所传输帧的结束位,当然也无法知道下一帧的开始位,这样就无法帧同步。由于此原因,字符计数法很少被使用。
字符填充的首尾界符法:
首先讨论首尾界符法,由 C 语言知识我们直到 ASCII 码是 7 位编码,可以组成 128 个不同的ASCII码,但是可以打印的字符(可以从键盘上输入的字符)只有 95 个,那么当传送的帧是文本文件(都是由键盘输入的)时,就可以在剩下的 33 个控制字符里选定 2 个字符作为每一帧的开始和结束,我们选定 SOH 和 EOT 分别作为帧开始符和帧结束符,这样接收端只需要判断这两个控制字符出现的位置就可以准确地分割成帧,如下图。
注意: 字符 SOH 代表 Start of Header(首部开始),而 EOT 表示 End of Transmission(传输结束)。 SOH 和 EOT 都是 ASCII 中的控制字符,SOH 的十六进制编码是 01, 而 EOT 的十六进制编码是 04。不要与一位 SOH 是 ‘S”O”H’ 三个字符,同样也不要误以为 EOT 是 ‘E”O”T’三个字符。
缺点:首尾界符法对于帧数据文件是文本文件完全没有问题。但是还有一种情况,假如帧传输的数据不是文本文件,即真传输的数据可能包含种植字符,就不能仅仅使用控制字符来进行帧定界了,否则会导致错误的定界,而仅仅把一部分帧收下,例如
在这种情况下,采用首尾界符法便会仅仅收下前小半段数据。
如此看来,首尾界符法是不严谨的,因此出现了字符填充的首尾界符法,其方法是,当数据中出现字符 “EOF” 或者 “SOH” 时,就将它们转换成另外一个字符,而这个字符是不会被错误解释的。但是所有字符都可能在数据中出现,于是就将数据中出现的字符
“SOH” 转换成 “ESC” 和 ‘x’ 两个字符;
“EOF” 转换成 “ESC” 和 ‘y’ 两个字符;
而当数据中出现控制字符 “ESC” 时,就将其转化为 “ESC” 和 ‘z’ 两个字符。
这种转换方法能够在接收端将收到的数据正确地还原为源来的数据,其中 “ESC” 是转义符,它的十六进制编码为 1B.如下图:
在接收端只需要按照上述规则进行相反的转化,便可以还原原来的数据。
问:为什么在谢希仁的教材中和上述转换方法不一样?
答:教材上是将 EOT 转换成 ESC EOT 等。其实解决透明传输的方法由很多种,只要合理即可,即与接收方约定一种方式,可以在创新的情况下不一定非要与教材一致。
比特填充的首尾标志法:比特填充的首尾标志法是使用 01111110 作为帧的开始和结束的标志,这样看来似乎帧定界的问题便解决了,单位体随着而来,如果帧的数据部分含有 01111110 怎么办?透明传输依然是一个问题。
解决方法如下:在 01111110 中拥有 6 个连续的 ‘1’,只要数据帧检测到有 5 个连续的 ‘1’,便马上再其后面插入 ‘0’,而在接收方对该过程实施逆操作,即每次收到 5 个连续的 ‘1’,自动删除后面紧紧跟随的 ‘0’,以恢复数据。这样的方法又称为零比特填充法。
我们来模拟这这个过程:
原始数据: 0110101111110010111111011 数据中两次出现了 01111110.
零比特填充后的数据:01101011111 0 1001011111 0 1011,其中加粗部分表示填充的 0.
接收方收到数据后,遇到 5 个连续的 ‘1’ 删除后面的 ‘0’ ,便可以得到原始数据。
物理编码违例法:物理编码违例法是利用物理介质上编码的违法标志来区分帧的开始与结束,例如,在曼彻斯特编码中,码元 1 编码成高-低电平,码元 0 编码成低-高电平,而高-高和低-低点公平在编码中是无效的,可以用来作为帧的起视标志和结束标志。
注意:
在使用字节填充的首尾界符法时,并不是所有形式的帧都需要开始符和帧结束符,如 MAC 帧便不需要帧结束符。因为以太网在传送帧时,各帧之间还必须要有一定的间隙,所以,接收端只要找到帧开始定界符,其后面的连续到达的比特流就都属于同一个 MAC 帧,可见,以太网不需要使用帧结束定界符,也不需要使用字节插入来保证透明传输。
PPP帧用来及逆行帧定界的字段是 Ox7E. 1B是普通帧透明传输的处理,即转义字符 “ESC” 的十六进制编码。
3.3 差错控制
3.3.1 检错编码
检错编码:通过一定的编码和解码,能够在接收端解码时检查出传输的错误,但不能纠正错误。常见的检错编码具有有奇偶校验码和循环冗余校验码(CRC).
奇偶校验码:在信息码后面加一位校验码,分奇校验和偶校验。
奇校验:添加以为校验码之后,保持整个码字里面的 1 的个数是奇数。接收端收到数据之后就校验数据里面 1 的个数,如果检查到奇数个 1 ,那么认为传输过程中没有出错,如果检查到偶数个 1 ,则说明传输过程中数据发生了改变,要求重发。
偶校验:添加一位校验码之后,保持整个码字里面的 1 的个数是偶数。接收端收到数据之后就校验数据里面 1 的个数,如果检查到偶数个 1 ,那么认为传输过程中没有出错,如果检查到奇数个 1 ,则说明传输过程中数据发生了改变,要求重发。
当数据中有一位发生变化时,奇偶校验码能够检测出来,但是不知道是哪一位发生了错误。如果数据中有两位数据发生了编码,那么奇偶校验码检测不到数据出错。所以它的检错能力是有限的。
奇偶校验码在实际使用中又分为垂直奇偶校验、水平奇偶校验与水平垂直奇偶校验。上述内容属于水平奇偶校验。
循环冗余校验码(CRC):适当选择多项式 G(x)G(x) ,在计算机二进制信息 M(X)M(X) 的长度确定时,余数与 CRC 码出错位的对应关系是不变的,可以使用余数作为判断出错位置的依据而纠正编码。检错方式:将受到的 CRC 码与 G(x)G(x) 相除,如果余数为 0 ,那么数据正确。如果余数不为 0 ,那么可以判断出错的位置。
举个例子:试计算 10110010000/11001.
计算技巧:在除法过程中,进行异或运算,无视进位;上商的规则是看余数的首尾,如果为 1,则上 1,如果为 0 ,则上 0;当部分余数的位数小于除数的位数时,该余数便是最后的余数。
可以得到 10110010000/11001 余数为 1010.
CRC码进行检错的重要特征
1. 具有 r 检测位的多项式嫩能够检测出所有小于或者等于 r 的突发错误
2. 长度大于 r + 1 的错误逃脱的概率为 12r.12r.
注意:1. 循环冗余码仅能做到无差错接受。 2. CRC 具有纠错功能。但是在计算机网络中一般发现错误直接重传,因此在默认情况下,CRC为检错码而不是纠错码。
3.3.2 纠错编码
纠错编码:在接受端不仅能够检查出错误,而且还能够就成检查出来的错误。常见的纠错码是海明码。
海明码:又称为汉明码,他是在信息字段中插入若干位数据,用于监督码字的哪一位数据发生了变化,具有一位纠错能力。假设信息位有 k 位,整个码字的长度就是 k + r 位,每一位的数据只有两种状态,因此有 r 位数据就有 2r2r 种状态。如果每一种状态就代表一个码元发生了错误,有 k + r个码元,就要有 k + r 种状态来表示,另外还要有一种状态来表示数据正确的情况,所以 2r−1≥k+r2r−1≥k+r 才可以检查出一种错误。
海明码求解步骤:
确定校验码的位数 r .2r≥k+r+12r≥k+r+1.
确定校验码的位置。第 i 个校验码处于位置 PiPi 处,PiPi 对应的位置为 2i−12i−1 , i=0,1,2.... i=0,1,2.....
确定数据的位置。
求出校验位的值。
例:D = 101101 的海明码。
首先确定 r ,易得 r = 4。
M1M1
M2M2
M3M3
M4M4
M5M5
M6M6
M7M7
M8M8
M9M9
M10M10
P1P1
P2P2
1
P3P3
0
1
1
P4P4
0
1
如何求取 PiPi 的值?
首先把 D 所在位置的 MiMi 的二进制写出来:
M3M3
3
0011
M5M5
5
0101
M6M6
6
0110
M7M7
7
0111
M9M9
9
1001
M10M10
10
1010
假设出错位是 e1,e2,e3,e4e1,e2,e3,e4, 可以知道:
e1=M1⊕M3⊕M5⊕M7⊕M9e1=M1⊕M3⊕M5⊕M7⊕M9
e2=M2⊕M3⊕M6⊕M7⊕M10e2=M2⊕M3⊕M6⊕M7⊕M10
e3=M4⊕M5⊕M6⊕M7e3=M4⊕M5⊕M6⊕M7
e4=M8⊕M5⊕M9⊕M10e4=M8⊕M5⊕M9⊕M10
把数据带入可以得到
当海明码没有错误信息时,e1,e2,e3,e4e1,e2,e3,e4 必须都等于 0,因此等式右侧的值也全部为 0,由于异或符号的特性,PiPi 等于 MiMi 位置上 ii 的二进制数上为 1的位置上的对应的 D 相应位置上求异或。
可以得到 P1=P2=P3=0,P4=1P1=P2=P3=0,P4=1
海明码的校验:
直接写出错位 e1,e2,...,eme1,e2,...,em 与 M1,M2,...,MNM1,M2,...,MN 之间对应关系,计算出e1,e2,...,eme1,e2,...,em 的值。
写出 em,em−1,...,e1em,em−1,...,e1 对应的十进制的值,这个值便是出错的位数,取反便可以得到正确的编码。
补充:
1.海明码如果要检测出 d 位错误,需要一个海明距为 d + 1 的编码方案;如果要纠正 d 位错误,需要一个海明距为 2d + 1 的编码方案。
理解:首先,什么是码距?码距指的是两个bima’zi码字的不一样的程度,就是把码距对其之后,有几位不同,码距便是多少。码距又称为海明距。例如,码字 110 和 111 的码距便是 1. 什么是海明距为 1 的编码方案?一个编码方案一般对应许多码字,而定义许多码字的海明距只需要看最小的即可。例如,某个编码方案中有码字 110、001、111,尽管 110 和 001 的码距为 3,但是110 与 111 的码距为 1.我们取 1 即可。
海明码得纠错能力恒不大于检错能力。
为什么误码率与信噪比有关?
因为信噪比越高,失真自然会越小,到达接受端之后得波形得变化就会很小,误码率自然变低。
公式 L−1=D+C,D≥CL−1=D+C,D≥C
其中 L 为编码方案,D 为检错位数,C 为纠错位数。
如果要纠正 d 位错误,意味着至少检测出 d 位错误,代入即可以得到 L - 1 = d + d ,即 L = 2d + 1;瞳孔里,如果要求检测出 d 位错误(默认纠错为 0 ,即 C = 0),代入得 L = d + 1.
3.4 流量控制与可靠传输机制
3.4.1 流量控制
申明:流量控制与可靠传输机制其实是属于传输层的功能。
- 流量控制就是要控制发送方发送数据的速率,使得接收方来得及接受。一个基本的方法就是由接收方来控制发送方的数据流。
- 常见的两种方式:停止-等待流量控制和滑动窗口流量控制。
1. 停止-等待流量控制:这是流量控制中最简单的形式。停止-等待流量控制的工作原理就是发送方发出一帧,然后等待应答信号到达之后再发送下一帧;接收方每收到一帧之后,返回一个应答信号,表示可以接受下一帧,如果接收方没有收到应答信号,则发送方必须一直等待。
2. 滑动窗口流量控制,在停止-等待流量控制中每次只允许发送一帧,然后就陷入等待接收方确定信息的过程中,传输效率很低。而滑动窗口流量控制允许一次发送多个帧。
滑动窗口流量控制的工作原理是在任意时刻,发送方都维持了一组连续的允许发送的帧的序号,称为发送窗口同时,接收方也维持了一组连续的允许接受的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。发送方窗口内的序列号代表了那些已经发送但是还没有被确定的帧,或者那些可以被发送的帧。发送端没收到一个帧的确定,发哦是那个窗口就向前滑动一个帧的位置。当发送窗口尺寸达到最大尺寸时,发送方就会强行关闭网络层,直到有一个空闲的缓冲区出来。当接受度按只有当收到的数据帧的发送序号落入接收窗口内才允许将该数据帧收下,并将窗口向前移动一个位置。如果接收到的数据帧落在窗口之外(就是说收到的帧号在接收窗口中找不到相应的该帧号),则一律丢弃。
用一个例子来说明:
3.4.2 可靠传输机制
可靠传输机制与无差错接受的区别
在数据链路层如果仅仅使用循环冗余码检验差错检测技术,只能做到对帧的无差错接受,即 “凡是接收端数据链路层接受的帧,都能以非常接近 1 的概率认为这些帧在传输过程中没有产生差错”。
注意:现在并没有要求数据链路层向网络层提供“可靠传输”的服务。所谓“可靠传输”,就是数据链路层的发送端发送什么,接收端就接受什么。传输差错可以分为两大类,一类就是比特差错(可以通过CRC来检错),另一类传输差错更复杂,这就是收到的帧并没有出现比特差错,但是出现了 帧丢失(例如发送 1,2,3,收到 1,3)、帧重复(例如发送 1,2,3 ,收到 1,2,2,3)、帧失序(例如发送 1,2,3,收到1,3,2)。这三种情况都属于出现传输差错,但都不是这些帧里有比特差错。
帧丢失比较容易理解,但是帧重复、帧失序的情况比较复杂。
总而言之“无比特差错”和“无传输差错”并不是同样的概念,在数据链路层使用 CRC 检验只能实现无比特差错的传呼是,但这并不是可靠传输。
也许会有人提出:既然会丢失那就是让接收端不管收到还是没收到都给回复,即确认。如果没有接收到回复就再发一次,直到对方确认。对于帧失序只要给发的帧的编号,等到所有帧均接收到再排序。以上说的都是对的,但为什么不采用以上方法?原因有二:1. 以前在数据链路层使用这种方式是因为以前的通信质量太差了,所以确定和重传机制会起到很好的效果,但是如今的通信质量已经大大提高,由通信链路质量不好引起的差错的概率大大降低,再使用这种机制的代价太大,不合算。2. 即时数据链路层能够实现无差错的传输,端到端的传输也可能出现差错,这样得不偿失,还不如把数据链路层做的简单一点,可靠的传输由上层协议来完成。为了更清楚数据链路层的可靠传输移到高层的原因,我们可以先看一下网络层的一个知识。
互联网使用的 IP 是无连接的,因此其传输时不可靠的。这样容易使得人们感到互联网很不可靠,那么为什么当初不把互联网的传输设计成为可靠的?
答:这个问题很重要。打个比方:邮局寄送的平信很像无连接的 IP 数据报。每封平信都可能走不同的传送路径,因此平信也不保证不丢失。当发现收信人没有收到寄出的平信时,找邮局索赔时没有用的,邮局会答复:平信不保证不丢失,如果担心丢失,请您寄挂号信。但是大家并不会将所有信件都是用挂号信的方式基础,这是因为丢失平信的概率不大,况且挂号信的成本较高。总之,尽管寄平信可能会丢失,但是绝大多数信是平信,因为平信方便,实惠。
在我们生活中,传统的电信网的最主要的用途之一就是进行电话通信,普通的电话机很简单,只有电话功能,电信公司就不得不把电信网设计的非常好,进而保证用户通话时质量。但是电信公司却付出了很大的代价,例如使用昂贵的程控交换机和网管系统。
当时,在数据传输的过程中,对于哪部分应该负责数据传输的可靠性,工程师们有两个意见 :其一,主张像电信网络一样由网络负责数据传输的可靠性;其二,主张用户的主机负责数据传输的可靠性。第二种思路更容易实现,因为具有智能的主机使得计算机网络和电信网络有两个重要的区别。
即时传送数据的因特网有一些缺陷,例如导致比特差错或者分组丢失,但是具有智能的终端主机仍然有办法实现可靠的数据传输,例如能够及时的发现错误并通知发送方重新发送刚才出错的数据。
即时网络可以实现 100% 的无差错传输,端到端的数据传输仍然有可能出现差错。
例如,假设主机 A 像 主机 B 传送一个文件。文件通过一个文件系统存储在主机 A 的硬盘中,主机 B 也有一个文件系统,用来接收和存储从主机 A 发送过来的文件。应用层使用的应用程序现在就是文件传送程序,这个程序一部分在主机 A 运行,另外一部分在主机 B 运行。
现在讨论文件传送的大致步骤:1. 主机 A 的文件传送程序调用文件系统将文件从硬盘中独处,然后文件系统将文件传递给文件传送程序。2. 主机 A 请求数据通信系统将文件 B 传送给主机 B,这里包括使用一些通信协议和数据文件划分为适当大小的分组。3. 通信网络将这些文件逐个传送给主机 B。 4. 在主机 B中,数据通信协议将收到的文件传递给文件传送应用程序在主机 B 与运行的那部分。5. 在主机 B中,文件传送程序请求主机 B的文件系统将受到的数据写入主机 B的硬盘中。
以上步骤中,存在一些使得数据受到损伤的因素。例如:1. 虽然文件源来是正确地写在主机 A 的硬盘上,但是在读出后文件就出现了差错(例如在磁盘存储系统中的硬件出现了故障)。2. 文件系统、文件传送程序或者数据通信系统的软件在对文件中的数据进行缓存或者复制的过程中都有可能出现故障。 3. 主机 A 或者主机 B 的硬件处理器胡总和存储器在主机 A 或者 B 进行数据缓存或复制的过程也有可能出现故障。4. 通信系统在传输分组时有可能产生检测不出来的比特差错,甚至丢失某些分组。5. 主机 A 或者 B 都有可能在进行数据处理的过程中突然崩溃。
以上可以看出,即时一个简单的文件传送任务,即时通信网络可以 100% 无差错传输,并不能保证文件从主机 A 硬盘到主机 B 硬盘的传送也是可靠的。也就是说,花费很多的财力将网络做的非常可靠,对于计算机网络的数据传输而言是得不偿失的。那么既然终端设备内具有只能,就应该把网络设计的简单一些,从而让具有只能的终端设备来完成:“传输变得可靠”的任务。
因此,计算机网络的设计者采用了一种策略,便是“端到端的可靠传输”,这便是在传输层使用面向连接的 TCP,它可以保证端到端的可靠传输。只要主机 B 的 TCP 发现传输数据有差错,就告诉主机 A 将出现差错的那部分数据重传,直到这部分数据正确传送到主机 B为止。而 TCP 发现不了数据错误的概率是非常小的。
采用以上的建网策略,即可一将使网络部份价格便宜和灵活可靠,又可以保证端到端的可靠性传输,可以想象,将互联网的范围稍稍扩大,即扩大到主机中的传输层。由于传输层使用了 TCP,使得端到端的数据传输变得可可靠,因此这样扩大了范围的因特网就成了可靠地网络。“互联网提供的提供的数据传输是不可靠的”或“互联网提供的数据传输是可靠的”这两种说法都可以在文献中找到,但是关键在于如何界定互联网的范围。如果说互联网提供的数据传输不可靠,那么这里的互联网指的时不包括主机在内的网络(仅有物理层、数据链路层和网络层);如果说互联网提供的数据传输是可靠的,那么这里的互联网包含主机的传输层。
3.4.3 滑动窗口机制
只有在接受窗口向前滑动时(与此同时也发送了确定),发送窗口才有可能向前滑动。
可靠传输机制包括 停止-等待协议、后退 N 帧协议和选择重传协议。从滑动床阔的层次上看,这三种协议知识在发送窗口和接收窗口的大小上有所区别。
停止-等待协议:发送窗口大小 = 1,接收窗口大小 = 1.
后退 N 帧协议:发送窗口大小 > 1,接收窗口大小 = 1.
选择重传协议:发送窗口大小 > 1,接收窗口大小 > 1.
当接受窗口大小等于 1 时,一定可以保证帧按照顺序接受。
补充:为什么不管发送窗口多大,只要当接受窗口大小等于 1 时,一定可以保证帧按照顺序接受?
答:因为接受窗口为 1,所以里面有一个唯一的帧序号,不管发送窗口一次性可以发送多少字节的数据,接收窗口只选择接收窗口里的帧序号接受,只有等到该帧,接受窗口才会向后移动,所以按照这样的顺序接受的帧一定是有序的。
3.4.4 停止-等待协议
怎么去实现可靠传输?
可靠传输指的是发送方发送什么,接收方就受到什么,一般而言,使用确定(发送确认)和超时重传两种机制来共同完成。确认帧是一个没有数据部分的控制帧,只是用来告诉发送方的某一帧已经收到了。有时候,为了提高传输效率,将确认捎带在一个回复帧中,称为捎带确认。
超时重传是指发送方在发送一个数据桢时设置一个超市计时器,如果在规定的时间限制之内没有收到该帧的确认,那么就重新发送该数据帧。导致发送方没有收到确认得的原因有以下两种: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 号帧,这难道不是发生了错误吗?
解析:这个问题的本身在于技术演变,题目的分析也没有错误,很好的说明了需要对确认帧进行编号才能够正常工作。但是由于目前的数据链路层协议是用于点对点的链路上,而在条件固定的链路上,数据的往返时延一般比较稳定,不会出现忽大忽小地大幅度起伏变化。而在这种情况下,如果选择合适大小地超时重传时间,那么对于确认帧没有序号的停止-等待协议也是可以工作的。
因此,在讨论停止-等待协议的原理时,有时也省略了确认帧中的序号。从严格意义上讲,既然协议应当保证在任何不利情况下都能正常工作,那么完整的停止-等待协议的确认帧就应当存在序号。
3.4.5 后退N帧(GBN)协议
后退 N 帧协议基于滑动窗口流量控制技术。如果采用 n 个比特对帧进行编号,其发送窗口尺寸 WTWT 必须满足 1
补充:为什么后退 N 帧协议的发送窗口尺寸 WTWT 必须满足 1
现在假设发送窗口的大小为 2n−12n−1,情况和上面一样,发送方发送 0 ~ 2n−22n−2 号帧,接收方发送的确认帧都丢失了,如果没有丢失就应该继续传送 2n−12n−1号帧,但是丢失了,发送方应该发送 0 号帧,由于这种情况接收方可以判断出来(下一这帧只要不是第 2n−12n−1 号帧就重传),因此不会发送错误。如果接收方窗口尺寸小于 2n−12n−1,那么就更不会发生错误了。
综上所述,后退 N 帧协议的最大发送窗口是 2n−12n−1.
3.4.6 选择重传(SR)协议
选择重传协议也是基于滑动窗口流量控制技术的。它的接受窗口尺寸和发送窗口尺寸都大于 1,以便能够一次性接受多个帧。如果采用 n 个比特对帧机型编号,为了避免接受端向前移动窗口后,新接收窗口与旧接收窗口产生重叠,发送窗口的最大尺寸应该不超过序列号范围的一般:WT≤2n−1WT≤2n−1.当发送窗口取最大值时,WR=WT=2n−1WR=WT=2n−1(大部分情况都是发送窗口等于接收窗口并且都等于 2n−12n−1,因为在这种情况下可以达到最大效率),此时,如果 WTWT 取大于 2n−12n−1 的值,可能造成新、旧接收窗口重叠。
基本思想:如果某一帧出错,其后续帧先存入接收方的缓冲区中,同时要求发送方重新传输出错帧,就和原先存在缓冲区的其余帧一起按照正确的顺序送到主机。选择重传协议避免了重复传输那些本来已经正确到达接收方的数据帧,进一步提高了信道利用率,代价是增加了缓冲空间。
补充:为什么选择重传协议的最大发送窗口大小是 2n−12n−1?
答:现在先假设选择重传协议的最大发送窗口是 W,那么可以一次性发送 0 ~ W - 1 号帧,并且接收方都已经收到了(就是说,这 W 个确认帧都已经发了),但是这 W 个确认帧全部在传输过程中丢失了,此时接收窗口的位置已经移动到 W ~ 2W - 1. 如果发送方再发一轮,这 W 个帧应该落在W ~ 2W - 1上,但是此时的 W 帧是重传的,所以如要正确,就必须满足 2W - 1 是在最大序号 2n−12n−1之内,也就是说 2W−1≤2n−12W−1≤2n−1,即 W≤2n−1W≤2n−1.
由于选择重传协议的最大发送窗口是 2n−12n−1 还是比较难以理解的。举个例子,假设 n=3n=3 ,则 2n−1=4 2n−1=4.如果发送窗口和接收窗口为 5. 假设 t1t1 时刻发送方发送序号为 0~4 的帧 ,t2t2 时刻接收方收到序号为 0~4 的帧,但是确认帧在传输过程中丢失了。于是,发送方在 t3t3时刻重新发送帧0,当t4t4时刻接收方收到帧 0时候,由于帧0 在其接受范围之内, 0 被错误的当作下一个新帧接受,导致协议错误。因此 W≤2n−1W≤2n−1.
另外一个疑问点:如果不按需接受,交给主机时不是全部乱套了?
答:如果没有按序,正确的接受帧先存入接收方的缓冲区中,同时要求发送方重传出错帧,一旦接收到重传帧之后,就和原先存在缓冲区的其余帧按照正确的顺序发送到主机。所以说选择重选协议避免了重复传输那些本来已经正确到达接收方的数据帧,进一步提高了信道的利用率,但是代价是增加了缓冲空间。
3.4.7 发送缓存和接受缓存
发送窗口与发送缓存的区别:
接收窗口与接受缓存的区别:
从上图中可以看到,在接收窗口中,按序到达的且没有被交付给主机的帧被放到接受缓存(接收窗口外的那一部分的接受缓存,一下所述的接受缓存都是指这里)里(因为已经发送过确认帧了,仅仅是等待主机的应用程序来取),而不是接收窗口里面。那些不是按序到达的数据且没有错误的帧一定是要放在接受窗口里面,因为这些帧不能直接给主机,而是放在接受缓存的帧是要给主机的,等到缺少的帧到达之后,在一起放到接受缓存中,这一点注意区分。
发送窗口的大小不一定等于接受窗口的大小(但是在通常情况下是等于的)。
当计算机的两个进程(同一个机器中或者两台不同的机器中)进行通信时,如果发送进程将数据直接发送给接受进程,那么接受与发送两个动作是非常难协调的。因为计算机的动作十分快,如果在某一时刻接受进程开始执行接受的动作,但是发送进程的发送动作稍微晚一点或者早一点,这都会导致接受失败(在收发双方事先没有及逆行同步的情况下,发送时刻不可能精确的吻合)。
综上所述,在计算机进程之间的通信中,广泛使用缓存。缓存就是izai计算机的存储器中设置一个临时存放数据的空间。发送进程将想要发送的数据先写入缓存,然后接受进程在合适的时机独处这些数据。缓存很好的解决发送速率和接受速率不一致的矛盾,还可以很方便地进行串并转换,即比特流串行写入并行读出,或并行写出串行读出。缓存也可以称作缓冲或者缓冲区。