目录
一.数据链路层概述
1.信道分类
2.链路和数据链路
3.数据链路层的基本问题
(1)封装成帧:
(2)差错检测:
(3)透明传输/可靠传输(取决于所用教材和资料,谢希仁老师的教材是透明传输):
数据链路层还没有牵扯到多个网络互连的问题,第三章主要研究的是在同一个局域网中,分组怎样从一个主机传送到另一个主机,中间并没有路由器的转发。
点对点信道:
即一对一的通信方式。
广播信道:
即一对多的广播方式。
链路:
从一个节点到相邻节点的一段物理线路。中间没有任何的交换节点。
数据链路:
在链路上加上实现通信协议的硬件和软件就叫数据链路。
发送方发送一段数据时,数据从应用层开始往下传输,每层对该段数据都会执行不同的操作,然后交付给下一层。
而数据链路层就是给网络层交付下来的数据单元添加帧首部和帧尾部将其封装成帧。如图:
这里有一个小概念:帧的数据部分长度上限,即最大传送单元MTU,这个MTU实际就是帧去掉帧头和帧尾的数据部分。也就是整个IP数据报(就是网络层协议数据单元)。
所以在后面进行网络层计算有关分片的问题时,要切记如果题目告诉的是MTU,要想获取IP数据包中的数据部分就需要减去固定首部。
传输过程中可能会出现误码,比如比特0变成比特1。
发送方在发送之前,基于待发送的数据和检错算法计算出检错码。并封装在帧尾。接收方主机收到后,利用检错码和检错算法判断是否出现误码,此为差错检测。
目前数据链路层广泛使用了循环冗余检验CRC检错技术;除了CRC检验技术,奇偶校验也需要了解一下。
在此提醒两个检错技术的一些小细节:
首先是关于CRC检错技术,其中FCS指的是帧检验序列即添加在数据后面的冗余码,不要把它和CRC搞混。其次如果计算时告诉了接收到的数据,那么冗余码已经算出来了,冗余码的位数取决于除数P,从个数上来说即比P少一位,从二进制角度来说(二进制最低位是0),位数即是最高位。对除数P取余,余数为0就没有差错,反之则有,但无法精准判断错误。 最后就是除数P,一般除数P用多项式来表示,位置对应的是二进制位,1表示多项式中有X的对应该位的次方,0表示没有,在多项式中不写,最低位的1就表示1(因为在二进制中最低位就是0,x的0次方就是1)。比如1101,转换为多项式应该为。
其次是奇偶校验,奇偶校验无法检验偶数个错位。原因很简单,这种检错技术本来就是靠观察初始的比特和结果的比特的奇偶性是否一致来判断是否出错。如果有奇数个比特1,出现偶数个错误(即比特0变成比特1)时,那么结果还是奇数(因为奇数加偶数还是奇数)。同样地,如果有偶数个比特1,出现偶数个错误,结果还是偶数(因为偶数加偶数还是偶数)。简单来说,就是偶数个错位不会使奇偶性发生变化。由此可知,奇偶校验无法检验偶数个错位。
这两个检错技术都只能检错,但是无法纠错。
透明传输:
指数据链路层应该对上层传输的数据不加任何修改或解释,即上层发送的数据在传输过程中应该原封不动地传输到接收方,不添加额外的控制字符或其他转义机制。这样可以确保上层协议对传输的数据不受影响,使数据链路层的传输对上层来说是透明的。
简单来说就是数据链路层仅对网络层传下来的协议数据单元添加帧头和帧尾,除此之外不做任何操作。
帧头和帧尾有一个很重要的作用,就是帧定界,我们可以利用帧定界符来判断接收到的数据是否为一个完整的帧。
结合透明传输的概念我们来思考一个问题:根据透明传输的规则,不对传输的数据进行任何的更改或解释,而接收方凭借帧定界符来判断接收到的是否为一个完整的帧,那么如果传输的数据里面某个字节的二进制码恰好和帧定界符的二进制码恰好一样呢?
为了更好地理解整个过程,我们只画出帧头和帧尾中的帧定界标志,如图:
很明显可以看到,当出现上述问题时,透明传输的方式就出现了问题。所以透明传输时,数据中任何8比特的组合一定不允许和用作帧定界控制字符的比特编码一样。
那么怎样才能解决透明传输的问题,思路就是让接收方“知道”数据中出现和帧定界标志一样的字节并不是真正的帧定界标志。具体办法就是发送方发送数据前,在数据部分出现和帧定界标志一样的字节前插入转义字符“ESC”(该字符的十六进制编码为1B,十进制编码为27,二进制编码为00011011)。接收端的数据链路层在把数据送往网络层前会删除插入的转义字符。
这时候大家可能会有疑问,那如果数据里出现的是转义字符呢?
答案是一样的,仍然在转义字符前插入转义字符,这样接收方就只会删除前面的那个转义字符。
那么这种插入转义符的方式还属于透明传输吗?
从理论上来讲,这已经违背透明传输不允许修改或解释数据的规则了。
但实际上,尽管这种方式会在传输过程中对数据进行修改,但它是通过约定俗成的机制来处理特殊情况,而不是对数据进行实际的修改或解释。
因此,尽管这种处理方式会在数据中插入一些特殊字符,但它们仍然可以被认为是数据的透明传输的一种方式。
以上插入转义字符的方法我们叫做字节填充(字符填充),这是面向字节的物理链路使用的方式。
如果是面向比特的物理链路,那么就要用比特填充的方式。即在发送端先扫描整个信息段,只要有5个连续的比特1,就立即插入一个比特0,这就是零比特填充。
可靠传输:
指数据链路层上的数据传输应该是可靠的,即保证数据能够正确无误地传送到接收方。为了实现可靠传输,数据链路层使用了各种差错检测和纠正技术,如循环冗余检验(CRC)、帧序列号和确认应答机制等。这些技术可以检测和纠正传输过程中出现的错误,以确保数据的完整性和准确性。
可靠传输部分放在后面专门进行讨论。