数据链路层使用的信道主要有以下两种类型:
(1)点对点信道
(2)广播信道
使用点对点信道的数据链路层
首先明确一下“链路”和“数据链路”并不是一回事。
所谓链路,指的是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
数据链路除了必须有一条物理线路以外,还必须有一些必要的通信协议来控制这些数据的传输。若把视线这些协议的硬件和软件加到链路上,就构成了数据链路。
点对点信道的数据链路层的协议数据单元为帧
点对点信道的数据链路层在进行通信时的主要步骤:
(1)结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
(2)结点A把封装好的帧发送给结点B的数据链路层。
(3)若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报上交给上面的网络层;否则丢弃这个帧。
三个基本问题
封装成帧
封装成帧就是在一段数据的前后分别添加首部和尾部。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
一个帧的长度等于帧的数据部分长度加上帧首部和帧尾部的长度。
每一种链路层协议都规定了所能传送的帧的数据部分长度上限——最大传送单元MTU。
透明传输
由于帧的开始和结束标记是使用专门指明的控制字符( SOT和EOT),因此,所传输的数据中的任何8比特的组合一定不允许使用和用作帧定界的控制字符,否则就会出现帧定界的错误。
为了解决透明传输的问题,就必须设法使数据中可能出现的控制字符在接收端不被解释为控制字符。具体方法是:发送端的数据链路层在数据中出现控制字符的前面插入一个转义字符(ESC)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。
差错检测
比特在传输过程中可能会产生差错。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER。为保证数据的可靠性,在计算机传输数据时,必须采用各种差错检测措施。目前数据链路层广泛使用了循环冗余检测CRC
M长数据,n位冗余码计算:
用二进制的模2(不进位加法)运算进行2^n乘M的运算,这相当于在M后面添加n个0。得到的(k+n)位的数除以收发双方事先商定的长度为(n+1)的除数P,得出商是Q而余数是R。这个余数R就作为冗余码拼接在数据M的后面发送出去。
接收端把接收到的数据以帧为单位进行CRC检验:把收到的每个帧都除以同样的除数P(模2运算),然后检查得到余数P。
如果传输无差错,则CRC检验后得出的余数R一定是0.
注意:我们现在并没有要求数据链路层向网络层提供可靠传输服务。
点对点协议PPP
PPP协议有三个组成部分
(1)一个将IP数据报封装到串行链路的方法。
(2)一个用来建立、配置和测试数据链路连接的链路控制协议LCP。
(3)一套网络控制协议NCP,其中的每一个协议支持不同的网络层协议。
PPP协议的帧格式
PPP帧的首部和尾部分别为四个字段和两个字段。
首部第一个字段和尾部第二个字段都是标志字段F(Flag)规定为“0x7E”。标志一个帧的开始或结束。因此标志字段就是PPP帧的定界符。
连续两个帧之间只需要一个标志字段。如果连续出现两个标志字段,就表示这是一个空帧,应当丢弃。
首部中第二个字段A规定为“0xFF”第三个字段C规定为“0x03”并无意义。
PPP首部第四个字段是2字节协议字段。
IANA网站公布的定义:
http://www.iana.org/assignments/ppp-numbers/ppp-numbers.xhtml#ppp-numbers-2
RFC1662规定如下填充方法:
(1)把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)
(2)若信息字段中出现了一个0x7D的字节(即出现了转义字符一样的比特组合),则把0x7D转变成2字节序列(0x7D,0x5D)
(3)若信息字段中出现ASCII码的控制字符(即数值小于0x20)则在前面加入0x7D,同时将该字符的编码加以改变。
零比特填充(针对于异步传输的解决方案)
在发送端,先扫描整个信息字段,只要发现5个连续1,则立即填入一个0.因此经过零比特填充数据后的数据,就可以保证信息字段中不会出现6个连续1.
PPP协议的工作状态
PPP链路的起始和终止状态永远是“链路静止”状态。
当用户PC通过调制解调器呼叫路由器的时候,路由器能够检测到调制解调器发出的载波信号,在双方建立了物理层链接之后,PPP就进入“链路建立”状态,其目的是建立链路层的LCP连接。
LCP开始协商配置选项,即发送LCP的配置请求帧。其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。
协商结束后,双方建立了LCP链路,进入“鉴别”状态。只允许传送LCP协议的分组、鉴别协议的分组。若鉴别身份失败,则转到“链路终止”状态,若鉴别成功,则进入“网络层协议”状态。
PPP链路两端的网络控制协议NCP根据网络层的不同协议相互交换网络层特定的网络控制分组。
当网络层配置完毕后,链路进入可进行数据通信的“链路打开”状态。
数据传输结束后,可以由链路的一端发出终止请求LCP分组。