磕磕绊绊我来到了网络接口层,从我这几天写笔记的感悟,我觉得把自己很明白的东西清楚的讲给别人才是真的难。
从概述里面我们知道了网络接口层解决的是比较近距离的通讯就像我们三两个人直接对话一样。
在这一篇里面我们要探究下链路层协议一些共有的特征,然后这篇文章主要参考的是谢希人先生的《计算机网络》也就是我们的课本。
我们日常对话吧,至少要有两个人吧这是一种情况,还有一种情况就是三个人及其以上。
反正不管是哪种情况他们要解决的问题就是以下这几点
- 封装成帧
- 透明传输
- 差错检测
另外我觉得还要加上第四点
- 对上层协议的支持
我们分别来谈谈这几点的意思
封装成帧:
封装成帧是什么意思呢?从我们人来讲,不管我们的对话是哪种情况吧,至少你要能听清楚对方说的完整的话吧,我们知道在计算机之间传输的是比特流(可能这么说不对吧不太懂通讯)我们的信息从应用层、运输层、网络层交下来然后以01比特流传输的,比如:
01001011101
但是我们发了两条信息,那就应该是这样的:
0100101110101000011101
假如我们发了三条信息呢?那就会是这样:
010010111010100001110101111101
这计算机还能分出完整的话来吗?当然就不能了啊,于是我们的先辈们发明了封装成帧。封装成帧的意思是:在一个完整的信息前面取几位作为信息开始的标志,在这个完整的信息后面取几位作为信息结束的标志。例如我们以01作为开始位,同时又以01作为结束位,那么上面的例子就变成了:
01001011101
01001011101 01000011101
01001011101 01000011101 01111101
谢希人先生在计算机网络中举的例子是这个:以字符SOH(十六进制是01二进制是00000001)作为帧的开始以字符EOT(十六进制是04二进制是00000100)作为帧的结束,如图:
可能这个时候就会有朋友说了:你那个例子
01001011101
如果这么分割呢?
01001 0111101
如果信息内部也出现标志位的话那就会对信息的传输造成困扰,别急先辈们又发明了:透明传输
透明传输
我们上面提到了透明传输是为了解决标志位在要传输的信息中出现的问题
然后先辈们想到解决方案是字节填充或字符填充:什么是字符填充呢发送端数据插入一个转义字符“ESC”(其十六进制编码是1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。如图:
差错检测
数据在通讯过程中是会产生错误的比如说在一串比特流中0变成1或者1变成0,为了检测出错误然后那帮伟大的探索者们发明了一种叫做循环冗余检验CRC(Cyclic Redundancy Check)的检测技术。
它的做法是这样的:
在要发送的数据M后面添加n个零。得到的(k + n)位的数除以收发双方事先商定好的长度为(n+1)位的除数P,得出商是Q而余数是R(n位,比P少一位)。这种为了进行检错而添加的冗余码常称为帧检验序列FCS(Frame Check Sequence)。接收端把接受到的数据进行CRC检验:把收到的数据都除以同样的除数P(模2运算),然后检查得到的除数R。如果R=0,则数据没有出现差错。
一般的除数P都通过这种方法来产生: