(Data Link Layer) 上一篇我讲到了物理层是传输比特流的,我们也都知道比特的英文是bit,称为位,我们也都知道8位是一字节(Byte)。 所以联系就是传输的比特流来自什么呢?
就是来自数据链路层的“帧”。
这里引出一个概念,类比物理层传输的基本单位是bit, 而数据链路层传输的基本单位为“帧”。
首先我们宏观上知道这层的主要作用,有三点:
- 封装成帧
- 透明传输
- 差错检测
既然这一层传输的基本单位是帧我们就要知道帧长什么样 帧的结构:
帧首部(SOH) | 网络层传下来的数据报(帧数据报) | 帧尾部(EOT) |
---|
就是这么简单
来说一说计算机领域对于透明的理解,拿编程语言来举例,只要你打一串字符串在哪儿加上\n,那么你会输出这两个字符吗?肯定不会,这个意思是换行,计算机遇到这俩字就会换行。 所以总结一下,计算机中“透明”的概念: ==这个东西看着存在,却又实际不存在。== 类比转义字符的机制,就深刻体现了这个概念。
首先我们确定分析的传播方向,是往下传还是往上传。
先分析往下传递的情况,物理层是不管差错的,上层给他啥他原样传播比特流, 但是数据链路层会做一件事,就是在往层传递的时候会加入转义字符ESC,什么是ESC?往下看。
然后分析往上传的情况,往上传是物理层传播到数据链路层,那么数据链路层要区分传上来的比特流哪里是一个帧的开头,哪里是一个帧的结尾。 比如出现这样的情况:
网络层传下来的数据中正好有一个EOT,那么该怎么区分真正的帧尾部呢?
帧首部(SOH) | 网络层传下来的数据报 | EOT | 网络层传下来的数据报 | 帧尾部(EOT) |
---|
这时候SOH到数据报中的EOT是错误的帧; SOH到结尾的EOT是正确的帧。
==数据链路层也是用转义字符解决这个问题的,这个转义字符为ESC。==
比如在这个帧往物理层传输时往数据报中出现的EOT前面加上ESC,那么等到这个帧到达接收方的数据链路层还原回帧的时候就会知道,哦这个EOT前面有ESC,那它不是帧尾部,我还要继续往后识别找到真正的帧尾部。
那么你可能自然而然提出这样一个问题:如果帧数据报中出现了ESC怎么办?
很简单啊,在ESC前再加一个ESC告诉接收方,我这个ESC是数据中的一部分,不是转义字符。这个我们可以类比编程中,我们想输出“\”这个字符,那我们就要输入“\”。
以上就是在数据链路层透明传输的思想。