数据链路
链路是从一个节点到相邻节点之间的物理线路(有线或无线) 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。
点对点信道
通信的主要步骤:
- 节点a的数据链路层将网络层交下来的包添加首尾分装成帧。
- 节点a将封好的帧发送给节点b的数据链路层。
- 若节点b收到的帧无差错则从收到的帧中提取出数据,否则将该帧丢弃。
广播信道
局域网的优点:
- 具有广播功能。
- 便于系统的扩展和演变。
- 提高了系统的可靠性、可用性、生存性。
静态划分信道、动态媒体接入控制。
以太网的两个主要标准。
三个基本问题
封装成帧
封装成帧就是在一段数据的前后分别加上首部和尾部。首部和尾部的一个重要作用就是帧定界。每一种链路协议都规定了所传输的帧的数据部分的最大长度——最大传输单元MTU。
透明传输
透明传送数据:不管什么样的比特组合的数据,都能按照原样没有差错的通过数据链路层。
“透明”表示某个存在的事物看起来好像不存在一样。
当传输文件为非ASCII的文本文件时如果数据中的某个字节的二级制代码恰好为控制字符,数据链路层就会错误的把部分帧收下。
解决透明传输的问题是:发送端数据链路层在数据中出现控制字符“SOC”和"EOT"时在SOC和EOT前插入一个转义字符“ESC”,接收端的数据链路层把数据送往网络层之前删除这个转义字符,这叫字符填充或字节填充。
差错检测
在传输过程中可能产生比特差错,即0变成1,1变成0 。传输错误的比特占所有传输的比特总数的比率称之为误码率BER。误码率与信噪比有很大关系。
循环冗余检验CRC
生成步骤
(1)、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。
(2)、将信息码左移R位,相当于对应的信息多项式C(x)*x的R次方。
(3)、用生成多项式(二进制数)对信息码做除,得到R位的余数即冗余码。
(4)、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
循环冗余检验CRC和帧检验序列FCS并不是同一概念。CRC是检错方法,FCS是冗余码。
接收方:冗余码除以除数,余数不为零则该帧有差错丢弃该帧,余数为零可能出错但出错概率小。
缺点:这一种检测方法不知道哪个比特出错。
无比特差错与无传输差错
- 比特差错:帧内部比特位出现错误,可以通过帧的FCS(方法:CRC检验)序列保证无比特差错。
- 传输差错:帧丢失、帧重复、帧失序。
- 在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。(来自CSDN)
点对点协议PPP
特点:
- 简单
- 封装成帧
- 透明性
- 多种网络层协议
- 多种类型链路
- 差错检测
- 检测连接状态
- 最大传送单元
- 网络层地址协商
- 数据压缩协商
不需要的功能
- 纠错
- 序号
- 流量控制
多点线路:只支持点对点链路通信
半双工或单工链路:只支持全双工链路
三个组成部分:
- 一个将IP数据报封装到串行链路的方法。
- 一个链路控制协议。
- 一套网络控制协议。
帧格式
首部和尾部分别为4个字段和两个字段。
首部:
首部中的标志字段F(Flag),规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110),标志字段表示一个帧的开始。
首部中的地址字段A规定为0xFF(即11111111)。
首部中的控制字段C规定为0x03(即00000011)。
尾部:
尾部中的第一个字段(2个字节)是使用CRC的帧检验序列FCS。
尾部中的标志字段F(Flag),规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110),标志字段表示一个帧的结束。
注:标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果连续出现两个标志字段,就表示这是一个空帧,应当丢弃。(来自CSDN)
为点对点信道的透明传输提供的解决方案
异步传输
当PPP使用异步传输时,它把转移符定义为0x7D,并使用字节填充。
RFC1662规定了如下填充方法:
- 把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)。
- 若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把转义字符0x7D转变为2字节序列(0x7D,0x5D)。
- 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列的(0x7D,0x31)。
由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在接收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
同步传输
当PPP使用同步传输时,使用零比特填充。
零比特填充的具体方法:
- 在发送端先扫描整个信息字段(通常使用硬件实现,但也可以用软件实现,但是会慢一些)。
- 只要发现有5个连续的1,则立即填入一个0。
- 接收端在收到一个帧时,先找到标志字段F以确定帧的边界,接着再用硬件对其中的比特流进行扫描,每当发现5个连续1时,就把5个连续1后的一个0删除,以还原成原来的信息比特流。
因此通过这种零比特填充后的数据,就可以保证在信息字段中不会出现连续6个1。
(来自CSDN)