互联网是指很多异构的网络由路由器联系起来的一个大网络。在研究这个大网络之前,我们要庖丁解牛,先研究其局部和单元。最小的网络单元就是局域网,局域网是一个单位所拥有,且地理范围和站点数量都很有限。
局域网内的计算机通信不需要路由器,所以不会用到网络层的协议,而是依赖数据链路层。
上图说明了数据链路层在整个互联网体系中的位置。数据链路层的信道分为两种:
- 点对点信道:一对一通信
- 广播信道:一对多的广播通信(使用共享信道协议)
数据链路层的协议数据单元是帧。数据链路层把网络层交下来的数据构成帧,发到链路上,以及把接收到的帧中的数据取出来,交给网络层。
在点到点信道的数据链路层协议上,可以采用简化的三层模型。无论是主机和主机,主机和路由器,或者两个路由器之间,我们都可以看成结点和结点之间的通信。
数据链路层不必考虑物理层是如何实现比特传输的细节,我们甚至可以简单设想,节点A沿着数据链路层的水平方向把帧输出给结点B。
数据链路层的协议有多个,但有三个共性问题。
封装成帧
从上图可以得出以下结论:
- 帧 = 帧首部 + 数据部分 + 帧尾部。
- 首部和尾部是控制信息,由数据链路层封装而成。
- 数据部分存在上限——最大传输单元MTU。可以推断,通信中传输数据必须考虑大小。
帧的首部标志着帧的开始,尾部标志着帧的结束。通过这些控制信息,我们能保证收到一个完整的帧。比如ASCII中的不可打印字符当作首部和尾部。
透明传输
利用转义字符(ESC,十六进制编码0x1B)来解决帧的数据部分包含控制字符的问题
差错检验
信道往往不是理想的,所以通信会带来误差。常用误码率来衡量传输误差。误码率BER(bit error rate)等于错误的比特占全部比特的百分比。
那么我们怎么知道所接受到的帧有没有错误比特呢?这就需要校验机制,目前数据链路层广泛采用循环冗余校验CRC((Cyclic Redundancy Check)。其原理是在帧的数据部分后面加上冗余码(FCS),接受方利用冗余码校验数据部分。具体细节请参考《计算机网络》。
综上,封装成帧和透明传输保证收到完整的帧,差错检验保证收到正确的帧。这三种机制能保证帧的无差错传输,但不能保证可靠传输(发送什么就接收到什么)。造成不可靠传输的原因有两类:
1. 帧中的比特错误
2. 帧重复,帧丢失,帧失序
数据链路层的帧的三种机制只能消除第一种错误,至于第二种则需要确认和重传机制。在早期互联网中,数据链路层曾经保证可靠传输,但随着光纤技术的发展,误码率大大下降,数据链路层就采用了简单的不可靠传输协议,把可靠运输的实现放在了运输层中。实践证明,这样可以提高通信效率。
最后,我们可以看到,计算机网络本质是通信问题,里面包含了很多通信元素:完整,误差,校验,重复,丢失,失序,可靠传输等。