数据链路层的基本概念
数据发送的模型
主机H1向H2发送数据
每一次经过一次路由器,路由器都会进行解释,数据会从物理层到数据链路层再网络层到路由器,路由器解析完后看看这数据应该走哪一个接口出去,然后再对数据进行封装,然后从网络层到数据链路层到物理层发给下一个路由器进行接收
数据链路层的信道类型
点对点信道:这种信道使用一对一的点对点通信方式,比如两台主机直接由一条网线进行连接起来的,这就是点对点信道
广播信道:这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。如果是一个集成器给很多主机连接,那么这种就是广播信道
链路与数据链路
链路link
是一条点到点的物理线路段,中间没有任何其他的交换结点。就比如一条网线,一条链路只是一条通路的一个组成部分。
数据链路data link
除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
现最常用的方法是使用适配器即网卡来实现这些协议的硬件和软件。
一般的适配器都包括了数据链路层和物理层这两层的功能。
帧
数据链路层传送的就是帧,帧有帧头和帧尾
数据链路层像个数字管道
常常在两个对等的数据链路层之间画出一个数字管道,而在这条数字管道上传输的数据单位是帧。
数据链路层的三个基本问题
封装成帧
透明传输
差错控制
封装成帧
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。确定帧的界限。
首部和尾部的一个重要作用就是进行帧定界。
MTU就是最大传输单元,以太网最大传输单元不能超过1500个子节
这个帧就好比如我们说话,帧比喻成一句话一句话,一句话我们知道这句话的开头,这句话的结尾,帧也是在前面加了头,后面加了尾,确保这个帧传输的完整性
比如:接收端只接收到帧的开头或者只接收到结尾的一段,接收端都会抛弃着不完整的帧的
透明传输
传输使用的都是可打印字符的(键盘能打出来的),而帧头和帧尾使用的是不可打印的字符
若传输的数据是ASCl码中“可打印字符(共95个)”集时,一切正常。
若传输的数据不是仅由“可打印字符”组成时,就会出问题,
用字节填充法解决透明传输的问题
发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B)。
字节填充(byte stufing)或字符填充(character stuffing):接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
如果转义字符也出现数据当中,那么应在转义字符前插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
差错控制
传输过程中可能会产生比特差错:1可能会变成0而0也可能变成1。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。
误码率与信噪比有很大的关系。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
循环冗余检验CRC
在数据链路层传送的帧中,广泛使用了循环冗余检验CRC的检错技术。
在发送端,先把数据划分为组。假定每组k个比特。
假设待传送的一组数据M=101001(现在k=6)。我们在M的后面再添加供差错检测用的n位冗余码一起发送。
冗余码的计算
用二进制的模2运算进行2^n乘M的运算,这相当于在M后面添加n个0。
得到的(k+n)位的数除以事先选定好的长度为(n+1)位的除数P,
得出商是Q而余数是R,余数R比除数P少1位,即R是n位。
然后将这个余数R填写在M后面添加的n个0的位置上,
检验:使用k+n的数(就是本来的那个需要传输的数字加上余数后的数字)除以除数P,如果余数是0,证明传输没有出差错,余数不是0就是出差错
例如:
被除数和除数之间相除的时候,上下相减的时候,相同得0,不同得1
还有这里除数是数据链路层协议定义好的,网卡之间知道除数是什么的
需要传输的数据:101001
除数:1101
两个相除得:001
最后传输的数据是101001001
帧检验序列FCS
在数据后面添加上的冗余码称为帧检验序列FCS(Frame Check Sequence)。循环冗余检验CRC和帧检验序列FCS并不等同。
CRC是一种常用的检错方法,而FCS是添加在数据后面的冗余码。
FCS可以用CRC这种方法得出,但CRC并非用来获得FCS的唯一方法。
接收端对收到的每一帧进行CRC检验,
若得出的余数R=0,则判定这个帧没有差错,就接受(accept)。
若余数R0,则判定这个帧有差错,就丢弃。
但这种检测方法并不能确定究竟是哪一个或哪几个比特或者哪一个路由器出现了差错。
只有经过严格的挑选,并使用位数足够多的除数P,那么出现检测不到的差错的概率就很小很小。
缺点
仅用循环冗余检验CRC差错检测技术只能做到无差错接受(accept)。
无差错接受是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。
要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。考虑:帧重复、帧丢失、帧乱序的情况,但是CRC不处理这些问题
CRC是一种无比特差错,而不是无传输差错的检测机制
OSI/RM模型的观点:数据链路层要做成无传输差错的!但这种理念目前不被接受!
使用点对点信道的数据链路层
PPP协议使用场合
需要向别人申请IP地址
现在全世界使用得最多的数据链路层协议是点对点协议PPP(Point-to-Point Protocol)。
用户使用拨号电话线接入因特网时,一般都是使用PPP协议。
PPP协议应该满足的要求:
简单(这是首要的要求)
封装成帧
透明性
多种网络层协议:支持很多的协议,能区分不同协议
多种类型链路:支持光纤,网线,同轴电缆
差错检测
检测连接状态:连接不上报具体的错
最大传送单元
网络层地址协商:不同的用户给可用的IP地址
数据压缩协商:将数据进行压缩
PPP协议有三个组成部分
数据链路层协议可以用于异步串行或同步串行介质。
它使用LCP(链路控制协议)建立并维护数据链路连接。负责账号的验证之类的
网络控制协议(NCP)允许在点到点连接上使用多种网络层协议
PPP协议帧格式
协议里面的内容就是告诉接收端,信息部分里面的东西代表的是什么,有下面的这些字段:
标志字段F=0X7E(符号“0x”表示后面的字符是用十六进制表示。十六进制的7E的二进制表示是01111110)。
地址字段A只置为0xFF。地址字段实际上并不起作用。因为PPP本来就是点对点的,而这个A就是写接收端的地址,使用实际没有用.
控制字段C通常置为0x03。
PPP是面向字节的,所有的PPP帧的长度都是整数字节。
字节填充
问题:信息字段中出现了标志字段的值,可能会被误认为是“标志”,怎么办?
将信息字段中出现的每个 0x7E 字节转变成为 2 字节序列(0x7D, 0x5E)。
若信息字段中出现一个 0x7D 的字节, 则将其转变成为 2 字节序列(0x7D, 0x5D)。
若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变。
零比特填充方法
前面使用PPP协议的时候,传输的时候传输的都是字节字节地传输,现在用在SONET/SDH 链路,是一段一段比特流地传输
PPP 协议用在 SONET/SDH 链路时,是使用同步传输(一连串的比特连续传送)。这时 PPP 协议采用零比特填充方法来实现透明传输
在发送端,只要发现有 5 个连续 1,则立即填入一个 0。接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续 1 后的一个 0 删除.为什么这样呢?
因为头部和尾部以示区别地7E二进制就是01111110,里面如果需要传输的话就会被误认为是字段F,表示结束或者开始的,所以就在五个1后面加一个0来区分开来
不使用序号和确认机制(所有的数据链路层都不使用)
PPP 协议之所以不使用序号和确认机制是出于以下的考虑:
- 在数据链路层出现差错的概率不大时,使用比较简单的 PPP 协议较为合理。
- 在因特网环境下,PPP 的信息字段放入的数据是 IP 数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。
- 帧检验序列 FCS 字段可保证无差错接受。
PPP协议的工作状态
当用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接。
PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。
这些分组及其响应选择一些 PPP 参数,和进行网络层配置,NCP 给新接入的 PC机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。
通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。
使用广播信道的数据链路层
局域网的特点与优点
局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。
局域网具有如下的一些主要优点:
具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
便于系统的扩展和逐渐地演变,各设备的位置可灵活调整和改变。
提高了系统的可靠性、可用性和生存性。
共享通信的媒体
-
静态划分信道:频分复用,时分复用,波分复用,码分复用
这种静态划分接入的方式,每一次接入一台电脑,就需要人工分配一个频分或者时分等等,这样很不方便
-
动态媒体接入控制(多点接入):
随机接入(主要被以太网采用!)
认识以太网
最初的以太网是将许多计算机都连接到一根总线上。当初认为这样的连接方法既简单又可靠,因为总线上没有有源器件。
总线上的每一个工作的计算机都能检测到 B 发送的数据信号。由于只有计算机 D 的地址与数据帧首部写入的地址一致,因此只有 D 才接收这个数据帧。 其他所有的计算机(A, C 和 E)都检测到不是发送给它们的数据帧,因此就丢弃这个数据帧而不能够收下来。
但是这种接法,在这条总线上,同一时间只能有一个发送端一个接收端,
还有就是如果B和D进行通讯,但是A自己修改网卡,将他们之间发送的数据进行全部接收,这样就会造成安全隐患
以太网使用CSMA/CD协议
也叫载波监听多点接入/碰撞检测
CSMA/CD 表示 Carrier Sense Multiple Access with Collision Detection。
多点接入表示许多计算机以多点接入的方式连接在一根总线上。
载波监听是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。 那什么时候发呢?就是随机一个时间后在进行发送
“载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。
碰撞检测就是计算机边发送数据边检测信道上的信号电压大小。
当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。
当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。
所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”。
检测到碰撞后
在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。
每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。
电磁波在总线上的有限传播速率的影响
当某个站监听到总线是空闲时,也可能总线并非真正是空闲的。
A 向 B 发出的信息,要经过一定的时间后才能传送到 B。
B 若在 A 发送的信息到达 B 之前发送自己的帧(因为这时 B 的载波监听检测不到 A 所发送的信息),则必然要在某个时间和 A 发送的帧发生碰撞。
碰撞的结果是两个帧都变得无用。
由上面的图,如果是在极限的情况下,就是A发送的数据很接近B的时候,但是B还没接收到,这时B检测到信道是空闲的,所以开始发送数据,发了一会就发现碰撞,停止发送,A检测到碰撞的时间就接近2t(两倍的端到端往返时延)(所以以太网一般不超过100米)
使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)。
每个站在发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。
这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率。
首先
重传次数 1 2 3 4
k 1 2 3 4
r 0-1 0-3 0-7 0-15
随机时间 r*2t
所以这个整数集合会越来越大,那么这两个重传所需要的时间相同的可能性就越来越小