三个基本问题如下
- 数据有没有被正确的传送到指定位置?
- 对于连续的数据比特流接收方如何将其划分为一段一段的数据?
- 如何保证数据不会因为下层的错误而导致接收方接收错误的数据,即错误的数据如何识别?
问题一
点对点通信中,指向性的通信,可以认为最终数据传输到了指定位置问题二
对于网络层传下来的一段一段的数据包,如果数据链路层直接转为数据比特流给物理层发送,在接收方,物理层接收了比特流,给了上层数据链路层,数据链路层是没办法识别的,也就是数据之间的界限会消失。为了解决这个问题,很自然的做法就是给上层传下来的数据在不影响数据内容的前提下,加上独一无二的控制信息,使得数据链路层可以从连续的比特流中识别出单个的数据。也就是给数据加上首部和尾部(事实上只一个首部或尾部就可以实现分割数据的目的)即可。
这就是将上层的数据封装成帧。
但是这样会引出一个新的问题,数据的分割实现了,是通过加上独一无二的控制信息实现的。但是这个独一无二的信息也并非是绝无仅有,它在比特流中的表示仍然是8位的二进制组合(如01111110),也就是说,这个8位的二进制组合完全有可能会出现在要传送的数据中。因此对于数据要做一些改动。
如果数据中存在结束标识,在结束标识的前面加上另一个特定二进制组合,这就像学习编程语言中会接触到的转义字符,每当遇到一个转义字符,就意味着这个起转义作用的二进制组合后的下一个二进制组合要识别成数据标识。那如果数据恰好是起转义作用的二进制组合呢?那就在其前面再加一个起转义作用的二进制组合。
如下图
假设帧开始符为SOH(指代,而非三个字母),结束符为EOT,转义字符为ESC
发送方数据链路层将数据处理成上图的样子,发送给接收方,接收方数据链路层反向操作,取出原有数据。这就实现了数据透明传输,即无论数据内容是什么,都可以通过数据帧传输。
到这儿问题二可以说是解决了
问题三
如何保证数据不会因为下层的错误而导致接收方接收错误的数据,也就是差错检测。
通信链路不可能总是理想的,也就是说比特在传输过程中可能会产生差错,1变为0,0变为1都有可能,这就是比特差错。
一段时间内传输错误比特数与总传输比特数的比值称为误码率(BER)。
误码率即使再小也不可能接近于0 ,假设现有一传输链路的误码率为,即每传输个bit会出现一个bit的错误。看起来已经足够小了。
但是换算一下,才大,如今网络上传送的数据远不止这一点。因此找到一种无差错传输的方式很有必要,第一步要实现差错检测。
差错检测的方式有多种,如CRC循环冗余检验,奇偶校验。
语雀内容
差错检测实现了,当数据链路层接收到数据发现有差错时,就丢弃该数据。没有差错就收下该数据。
但是这仅仅只实现了帧的错误检测。保证接收到的单个帧一定是对的,但是要实现可靠的传输还不够,因为无法从全局来看,帧与帧之间的顺序是否是对的,对于接收到错误的帧丢弃之后,如何让发送方再发送一份。接收了重复帧如何处理都没有实现。
在OSI模型的观点中,提供可靠传输,帧接收的确认与重传(帧丢失),编号机制(保证帧顺序,重复)都是由数据链路层实现。但是现在链路的通信链路质量提高了,可能引起的差错数量降低了,因此现有方案是区别对待。
对于传输质量较好的有线传输链路,数据链路层不使用确认和重传机制,即不提供可靠传输,如果出现差错就交给上层(TCP)处理。
而对于传输质量较差的无线传输链路,数据链路层使用确认和重传机制,提供可靠传输。