计算机网络原理——数据链路层
数据链路层是OSI模型中的第二层,介乎于物理层和网络层之间,它在物理层提供服务的基础上向网络层提供服务。
数据链路层的作用是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,即使之对网络层表现为一条无差错的链路。
数据链路层的功能
帧同步功能
为了使传输中发生差错后只将出错的有限数据进行重发,数据链路层将比特流组织成以帧为单位传送。帧的组织结构必须设计成使接收方能够明确地从物理层收到的比特流中对其进行识别,也即能从比特流中区分出帧的起始与终止,这就是帧同步要解决的问题。由于网络传输中很难保证计时的正确和一致,所以不能采用依靠时间间隔的关系来确定一帧的起始与终止的方法。以下是几种常用的帧同步方法。
- 使用字符填充的首尾定界符法
用一些特定的字符来定界一帧的起始与终止。为了不使数据信息位中出现与特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据字符前填充一个转义哦内阁制字符(DLE)以示区别,从而达到数据的透明性。但这种方法使用起来比较麻烦,而且所用的特定字符依赖于所采用的字符编码集,,兼容性比较差。 - 使用比特填充的首尾标志法
类似于首尾定界符法,该法以一组特定的比特模式来标志一帧的起始与终止。为了不使信息位中出现的与该特定比特模式相同的比特串被误判为帧的首尾标志,可以采用比特填充的方法,比如采用特定模式01111110,则对信息位中的任何连续出现的5个“1”,发送方自动在其后插入一个“0”,而接收方则做该过程的逆操作。 - 违法编码法
该法在物理层采用特定的比特编码方法时采用。例如,曼彻斯特编码方法,将数据比特编码成“高——低”电平对,或者“低——高”电平对。而“高——高”电平对和“低——低”电平对在该编码方法中是违法的。可以借用这些违法编码序列来定界帧的起始与终止。 - 字节计数法
这种帧同步方法以一个特殊字符表征一帧的开始,并以一个专门字段来标明帧内的字节数。接收方可以通过对该特殊字符的识别从比特流中区分出帧的起始,并从专门字段中获知该帧中随后跟随的数据字节数,从而可确定出帧的终止位置请参考HTTP协议
以下是数字数据通信报文协议DDCMP(Digital Data Comunication Message Protocol)的格式
标志位 | 比特位数 | 备注 |
---|---|---|
SOH | 8 | 标志数据帧的开始 |
Count | 14 | 帧中数据段中数据的字节数,最大长度(214 - 1)* 8 (位) |
Flag | 2 | |
Ack | 8 | |
Seg | 8 | |
Addr | 8 | |
CRC1 | 16 | 对标题部分进行双重校验 |
Data | 8~131064 | 发送的数据。其中位数被计算并写入count中。DDCMP就是靠Count中的数据来确定帧的中止位置的 |
CRC2 | 16 | 对数据部分进行双重校验 |
我写代码时比较喜欢的方法是首尾标志法(当然填充的不是比特而是字节啦),不过这里说的应该算传输层的内容了。所以我们能看到,OSI的分层,在某种意义上有很多重复,这也是它无法取代TCP/IP的一个原因
流量控制功能
由于收发双方各自使用的设备工作速率和缓冲存储空间的差异,可能出现发送方发送能力大于接收方接收能力的现象,若此时不对发送方的速率作适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”,从而造成帧丢失而出错。以下是两种最常用的流量控制方案
- 停止等待方案
发送方发出一帧,随后等待应答信号到达后再发下一帧;接收方每收到一帧后送回一个应答信号,表示愿意接收下一帧,如果接收方不送回应答,则发送方必须一直等待。 - 滑动窗口机制
发送方不等待确认帧返回就连续发送若干帧。
发送方存放待确认的帧到重发表中,应设置待确认帧的最大限度,这一限度被称为链路的发送窗口。重发表是一个连续序号的列表,对应发送方已发送未确认的帧。这些帧的序号有一个最大值,这个最大值就是窗口的限度。所谓发送窗口就是指示发送方已发送但未确认的帧序号队列的界,其上、下界分别成为发送窗口的上、下沿,上、下沿的间距称为窗口尺寸。接收方也有类似的接收窗口,它指示允许接收的帧的序号
发送方每发送一帧后,待确认的数目便加1,每收到一个确认信息后,待确认帧的数目便减1.“窗口”随着数据传送过程中的发展而向前滑动,因而称为滑动窗口的流量控制。
差错控制
差错检测
差错控制是指在数据通信过程中能发现或纠正差错,把差错限制在尽可能小的允许范围内的技术和方法。
信号在物理信道中传输时,线路本身电气特性造成的随机噪声、信号幅度的衰减、频率和相位的畸变、电气信号在线路上产生反射造成的回音效应、相邻线路间的串扰以及各种外界因素都会造成信号的失真。
数据通信中不加任何差错控制措施,直接用信道传输数据是不可靠的。而且,无线通信正在普及,它的错误率比光线干线要高出几个数量级,因而必须要知道如何处理传输错误。差错控制的首要任务就是如何进行差错检测。差错检测应包含两个任务:即差错控制编码和差错校验。数据信息位在向信道发送之前,先按照某种关系附加上一定的冗余位,构成一个码字后再发送,这个过程称为差错控制编码过程。接收端收到该码字后,检查信息位的附加的冗余位之间的关系,以检查传输过程中是否有差错发生,这个过程称为差错校验过程
差错控制方法
利用差错控制编码来进行差错控制的方法基本上有两种:一种是自动请求重发ARQ(Automatic Repeat reQuest),另一种是前向纠错FEC(Forward Error Correction)。
ARQ方式中,接收端检测出有差错时,就设法通知发送端重发,直到正确的码字收到位置。在FEC方法中,接收端不仅能发现差错,而且能确定二进制码元发生错误的位置,从而加以纠正。因此,差错控制编码又可分为检错码和纠错码。检错码指能自动发现差错的编码,纠错码指不仅能发现差错而且能自动纠正错误的编码
几种校验方法
- 奇偶校验码
奇偶校验码是一种通过增加冗余位使得码字中“1”的个数恒为奇数或偶数的编码方式,它是一种检错码。在实际使用中又可分为垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验等几种。
垂直奇偶校验
将要发送的整个信息块分为定长p位的q段,在每一段后面按“1”的个数为奇数或偶数的规律加上一位奇偶位
垂直奇偶校验的编码效率为R = p / (p + 1)
水平奇偶校验
将要发送的整个信息块分为定长p位的q段,对各个信息段相应位横向进行编码,产生一个奇偶校验冗余位
水平奇偶校验的编码效率为 R = q / (q + 1)
水平垂直奇偶校验
同时进行水平奇偶校验和垂直奇偶校验
水平垂直奇偶校验的编码效率为R = pq / [(p + 1) + (q + 1)] - 循环冗余码
奇偶校验码作为一种简单检错码,漏检率太高,在计算机网络和数据通信中,用的最广泛的检错码,是一种漏检率低得多也便于实现的循环冗余码CRC(Cyclic Redundancy Code)例如,代码1010111对应的多项式为X6 + X4 + X2 + X + 1,同样多项式X5 + X3 + X2 + X + 1 对应的代码为101111
CRC码在发送端和接收端校验时,都可以利用事先约定的生成多项式G(X)来得到。k位要发送的信息位可对应于一个(k - 1)次多项式K(X),r位冗余位则对应于一个(r - 1)次多项式R(X),由k位信息位后面加上r位冗余位组成的n = k + r 位码字则对应于一个(n - 1)次多项式T(X) = Xr * K(X) + R(X)
基本数据链路协议
停等协议
空闲重发请求(Idle RQ)也称停等法(Stop and Wait)
停等协议的实现过程如下
- 发送方每次仅将当前信息帧作为待确认帧保留在缓冲存储器中
- 当发送方开始发送信息帧时,赋予该帧一个帧序号,随即启动计时器
- 当接收方收到无差错的信息帧后,即向发送方返回一个与该帧序号相同序号的ACK确认帧
- 当接收方检测到一个含有差错的信息帧时,便舍弃该帧
- 若发送方在规定时间内未收到ACK确认帧,则应重发存于缓冲器中的待确认信息帧
- 若发送方在规定时间内收到ACK确认帧,即将计时器清零,继而开始下一帧的发送
顺序接收管道协议
连续重发请求方案就是指顺序接收管道协议
在这种方案中,接收方只允许顺序接收。而发送方发现前面帧未收到确认信息,计时器已超时,不得不回退重发最后确认序号以后的帧。所以,这种方法又称之为"回退N"(Go-Back-N)策略的重发请求法。
实现方式
- 发送方连续发送信息帧而不必等待确认帧的返回
- 发送方在重发表中保存所发送的每个帧的备份
- 重发表按先进先出(FIFO)队列规则操作
- 接收方对每一个正确收到的信息帧返回一个确认帧
- 每一个确认帧包含一个唯一的序号,随相应的确认帧返回
- 接收方保存一个接收次序表,它包含最后正确收到的信息帧的序号
- 接收方因某一帧出错,则对后面再发来的帧均不接收而丢弃
选择重传协议
选择重传的实现方式如下:
Go-Back-N可能将已正确送到目的方的帧再重传一遍,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可与原来存放于缓冲区的其余帧一并按正确的顺序递交高层。
滑动窗口
为了提高信道的有效利用率,控制发送方的发送速度,并考虑发送方缓冲区大小的因素,要求发送方已发出但尚未确认的帧数目加以限制。此时可以采用基于窗口机制的流量控制方法来限制发送方已发出而未被确认的帧数目。接收方也有类似的窗口,它指示允许接收的帧的序号
- 停等:发送窗口 = 1,接收窗口 = 1
- Go-Back-N:发送窗口 > 1,接收窗口 = 1
- 选择重传:发送窗口 > 1, 接收窗口 > 1
链路控制规程
同步协议与异步协议
异步协议以字符为独立的信息传输单位,在每个字的起始处开始对字符内的比特实现同步,但字符间的间隔时间是不固定的。由于发送器与接收器中近似于同一频率的两个约定时钟,能够在一段较短的时间内保持同步,可以用字符起始处同步的时钟采样该字符中的各比特,而不需要每个比特再用其他方法同步
同步协议是以许多字符或许多比特组织城的数据块——帧为传输单位,在帧的起始处同步,使帧内维持固定的时钟。由于采用帧为传输单位,所以同步协议能更有效地利用信道,也便于实现差错控制,流量控制功能
二进制同步通信协议
面向字符的同步协议是最早提出的同步协议,其典型代表是IBM公司的二进制同步通信BSC(Binary Synchronous Communication)
标记 | 名称 | ASCII码值 | EBCDIC码值 |
---|---|---|---|
SOH | 序始,用于表示报文的标题信息或报头开始 | 01H | 01H |
STX | 文始,标志标题信息的结束和报文文本的开始 | 02H | 02H |
ETX | 文终,标志报文文本的结束 | 03H | 03H |
EOT | 送毕,用以表示一个或多个文本块结束,并拆除链路 | 04H | 37H |
ENQ | 询问,用以请求远程站给出的响应 | 05H | 2DH |
ACK | 确认,由接收方发出的作为对正确接收到报文的响应 | 06H | 2EH |
DLE | 转义,用以修改紧随其后的有限个字符的意义 | 10H | 10H |
NAK | 否认,由接收方发出的作为对未正确接收的报文的相应 | 15H | 3DH |
SYN | 同步,在同步协议中,用以实现节点之间的字符同步,或用于在无数据传输时保持该同步 | 16H | 32H |
ETB | 块终,用以表示当报文分成多个数据块时,一个数据块的结束 | 17H | 26H |
BSC协议的数据块有如下四种格式:
- 不带报头的单块报文或分块传输中的最后一块报文
SYN | SYN | STX | 报文 | ETX | BCC - 带报头的单块报文
SYN | SYN | SOH | 报文 | STX | 报文 | ETX | BCC - 分块传输中的第一块报文
SYN | SYN | SOH | 报头 | STX | 报文 | ETB | BCC - 分块传输中的中间报文
SYN | SYN | STX | 报文 | ETB | BCC
BSC协议中所有发送的数据均跟在两个SYN字符之后,以使接收方能实现字符同步。报头字段用以说明数据报文字段的包识别符号及地址。所有数据块在块终限定符ETX或ETB之后还有块校验字符BCC(Block Check Character)
正、反向监控报文有如下四种格式:
- 肯定确认和选择响应
SYN | SYN | ACK - 否定确认和选择响应
SYN | SYN | NAK - 轮询/选择请求
SYN | SYN | P/S前缀 | 站地址 | ENQ - 拆链
SYN | SYN | EOT
高级数据链路控制协议 HDLC
这里以ISO的高级数据链路控制规程HDLC(High-Level Data Link Control)协议为例,讨论面向比特的同步控制协议的一般原理与操作过程。作为面向比特的数据链路控制协议的典型,HDLC具有如下特点
- 协议不依赖于任何一种字符编码集
- 数据报文可透明传输,用于实现透明传输的“0比特插入法”易于硬件实现
- 全双工通信,不必等待确认便可连续发送数据,有较高的数据链路传输效率
- 所有帧均采用CRC校验,对信息帧进行顺序编号,可防止漏收或重份,传输可靠性高
- 传输控制功能与处理功能分离,具有较大灵活性。
由于以上特点,目前网络设计普遍使用HDLC作为数据链路控制协议。
HDLC的操作方式
所谓操作方式,通俗地讲就是某站点是以主站方式操作还是以从站方式操作,或者是二者兼备。
链路上用于控制目的的站称为主站,其它的受主站控制的站称为从站。
有些站可兼备主站和从站的功能,这种站称为组合站,用于组合站之间信息传输的协议是对称的,即在链路上主、从站具有同样的传输控制功能,这又被称作平衡操作。相对的,那种操作时有主站、从站之分的且各自功能不同的操作,称为非平衡操作。
HDLC中常用的操作方式有以下三种
- 正常响应方式NRM(Normal Responses Mode)
这是一种非平衡数据链路操作方式,有时也称非平衡正常响应方式。该操作方式适用于面向终端的点——点或一点与多点的链路。在这种操作方式中,传输过程由主站启动,从站只有收到主站某个命令帧后,才能作为响应向主站传输信息。响应信息可以由一个或多个帧组成,若信息由多个帧组成,则应该指出哪个是最后一帧。主站负责管理整个链路,具有轮询、选择从站及向从站发送命令的权力,同时也负责对超时、重发及各类恢复操作的控制 - 异步响应方式ARM(Asynchronous Responses Mode)
这也是一种非平衡数据链路操作方式,与NRM不同的是,ARM下的传输过程由从站启动。从站主动发送给主站的一个或一组帧中可包含有信息,也可以是仅以控制为目的而发起的帧。在这种操作方式下,由从站来控制超时和重发。该方式对采用轮询方式的多站链路来说是必不可少的。 - 异步平衡方式ABM(Asynchronous Balanced Mode)
这是一种允许任何节点来启动传输的操作方式。为了提高链路传输效率,节点之间在两个方向上都需要由较高的信息传输量。在这种操作方式下,任何时候任何站点都能启动传输操作,每个站点既可作为主站又可作为从站,即每个站点都是组合站。各站都有相同的一组协议,在任何站点都可以发送或接收命令,也可以给出应答,并且各站对差错恢复过程都负有相同的责任
HDLC的帧格式
HDLC中,数据和控制报文均以帧的标准格式传送。HDLC中的帧类似于BSC的字符块,但BSC协议中的数据报文和控制报文是独立传输的,而HDLC中的命令和响应以同意的格式按帧传输。完整的HDLC帧由标志字段(F)、地址字段(A)、控制字段(C)、信息字段(I)、帧校验序列字段(FCS)、等组成,其格式如下
标志 | 地址 | 控制 | 信息 | 帧校验序列 | 标志 |
---|---|---|---|---|---|
F | A | C | I | FCS | F |
01111110 | 8位 | 8位 | N位 | 16位 | 01111110 |
标志字段为01111110的比特模式,用以标志帧的开始和前一帧的终止。采用“0比特插入法”可以实现数据传输的透明传输,该法在发送端检测除标识码意外的所有字段,若发现连续5个“1”出现时,便在其后添加一个“0”,然后继续发送后面的比特流
因特网的数据链路层协议
SLIP协议
SLIP提供在串行通信线路上封装IP分组的简单方法,用以使远程用户通过电话线和MODEM能方便地接入TCP/IP网络
SLIP是一种简单的组帧方式,使用时还存在一些问题。首先,SLIP不支持在连接过程中动态IP地址分配,通信双方必须事先告知对方IP地址,这给没有固定IP地址的个人用户上Internet网带来了很大的不便;其次,SLIP帧中无协议类型字段,因此它只能支持IP协议;再有,SLIP帧中无检验字段,因此链路层上无法检测处传输差错,必须由上层实体或具有纠错能力的MODEM来解决传输差错问题
PPP协议
为了解决SLIP存在的问题,在串行通信应用中又开发了PPP点到点协议,RFC1661定义了该协议,PPP具有处理错误检测、支持多个协议、允许在连接时刻协商IP地址、允许身份认证等功能,还有其他特性。PPP提供了3类功能
- 成帧:它可以毫无歧义地分割处一帧地起始和结束。其帧格式支持错误检测
- 链路控制:有一个称为LCP(Link Control Protocol)的链路控制协议,支持同步和异步线路,也支持面向字节的和面向位的编码方法,可用于启动线路、检测线路、协商参数,以及关闭线路
- 网络控制:具有协商网络层选项的方法,并且协商方法与使用的网络层协议独立