三个基本问题
数据链路层的三个基本问题
- 封装成帧:必须知道每一帧数据哪里开始,哪里结束,保证每一帧数据的完整。
- 透明传输:当帧的数据部分出现帧头或帧尾标志位的数据时,需要对其进行转义。
- 差错控制:判断传输中是否出现差错。
封装成帧
- 封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。确定帧的界限。
- 首部和尾部的一个重要作用就是进行帧定界。
**用控制字符进行帧定界的方法举例 **
试想:帧还未发送完,发送端出了问题,只能重发该帧,接收端却直接收了前面的“半截子帧”,它会抛弃吗?
答案是会抛弃,接收端直接收有成对的帧头和帧尾的数据。
透明传输
若数据中存在与帧结束符相同的数据,那么计算机会误以为该数据即为帧结束符,而造成错误。
解决透明传输问题
- 发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B)。
- 字节填充(byte stuffing)或字符填充(character stuffing)——接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
- 如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
差错控制
传输过程中可能会产生比特差错:1可能变成0而0也可能变成1.
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。
误码率与信噪比有很大的关系。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
解决方法
循环冗余检验的原理(CRC)
原理说明
- 被除数为101001;根据除数的位数n在被除数后面加 n-1 个0;比如除数四位就在被除数后加三个0;
- 进行的是异或运算,相同得0,不同得1;
- 得到的商可以舍去,我们只要余数;在原来数据101001的后面加上余数001(前面被除数尾部加了多少位商就保留多少位),则实际传输的数据为:101001 001
- 接收端受到数据101001 001之后,除以1101如果商为0,则说明数据传输过程中没有错误,接受;如果商不为0说明传输过程中出现错误,把该数据丢弃;
- 过于除数,是数据链路层的协议决定的,用户不必关心。
帧检验序列 FCS
- 在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。
- 循环冗余检验 CRC 和帧检验序列 FCS并不等同。
- CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
- FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。
小结
仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(accept)。
- “无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”
- 要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。
- 无差别接收只是在数据在路由器之间传输时进行,并不要求路由器确认或重传数据,而是路由器的始端和末端连接的计算机和服务器之间会进行数据的确认或重传。
CRC并不能100%准确,也可能多次错误碰巧造成余数为零