首先要明确一个问题,链路层干了什么事情?链路层的作用是什么?
物理层是解决了实际的连线问题,传输的是比特位,链路层就是规定一次发送多少个01,这就是帧。
链路层的作用有三个
1:封装成帧
2:透明传输
3:差错检测
在物理层搭建好的时候,人们提出链路层这个概念后,就有各种各样的协议腾空出世,在众多的协议中有一种要以太网的协议脱引而出,这个协议放在后面介绍。现在我们将一讲另一种形式。
那还是要讲讲数据传输的形式。在链路层数据传输有俩种方式
一:点对点。
二:广播
A:点对点
如图,结点a和结点b传输数据,链路层接过网络层下传的数据,经过处理(封装为帧),交给物理层,物理层传输数据到结点b,结点b收到数据后,将数据一层一层上传最后到网络层。互联网采用分层的好处就是在与每一层干的事情不影响别的层,链路层不必考虑物理层怎么实现,在物理上是如上这样传输的,但是在逻辑上就可以简单的看为,结点a的链路层直接和结点b的链路层直接交流。
封装成帧——就是规定多少个01为一组
就是在一段数据前后加上一个标记为,说明这几个数据是一个帧,接受放就能根据这些标记点,分辨帧,帧的头部放一些控制信息,比如里面数据是什么那个协议,比如里面放的是ip协议的数据。 要发送的数据放在帧的数据部分。头部+数据=帧的长度。规定了一个帧的数据的最大长度——MTU,那为了传输的效率,就要尽量的让数据部分大于头部的长度。
帧的形式:
那在数据流里怎么规定一帧是有多少个数据,也就是说怎么来规定一个帧?
规定在帧的和结尾都有一个特殊的字符来标示就好了,帧开始用SOH,帧结束用EOH。那这样就可以约束一个帧了,发送方西安发送一个SOH表示帧开始,帧结束的时候发送EOH,标示帧结束,接收方收到数据,如果有SOH,但是没有EOH,则就丢弃这个帧,若是SOH,EOH都有就表明这是一个完整的帧,则收下这个帧。
那现在出现了一个问题,标示一个帧是用两个字符来标示的,那如果传送的数据里面有这俩特殊字符怎么办?怎么还继续标示一个完整的帧?
这就是透明传输解决的问题。
透明 传输就是不管发送方发送的是什么数据,都可以按照原样没有差错的通过数据链路层传送出去。
那解决的方法就是 在数据里面出现的控制符不被解释为控制符号。具体就是在数据中出现的控制符号前面加上一个转义字符(“ESC”)如果转义字符也出现在数据中,那就继续在前面再加一个转义字符。接收方在接受的时候删掉之前添加的这些转义字符就好。这有个专业的名词——字符填充或者字节填充。
那请在思考一个问题?——传送的时候要是出现了差错怎么办,接收方如是收下这些个错误的数据,那这就大错特错了。必须要采取一个措施来针对这些事。
此时,,差错检测就千呼万唤始出来
这种差错检测的方法有好几种,现在主要采用的 循环冗余检验法 ,在这里就不介绍了,总之,采用这种方法能检测出来数据有没有出现差错,接受方收到这个帧,采用这种方法若是检测出出现了差错,则就丢掉这个帧,反之,则接受。但是需要注意的是,在链路层没有机制能实现出现差错的帧重新发送,这不是数据链路层该干的事情,但是我们可以这样认为,因为在接收方全都收到了发送方发的数据,至于丢不丢掉这个帧是接收方的事情,发送方并不知道,在发送方看来,我发送的数据你接收方全部都接受了,所以这实现了无差错传输,即就是凡在接收端数据链路层接受的帧无差错。
在点对点传输形式中 ppp(point-to-point Practical是用的最广泛的协议
我们知道上网要联入一个ISP才可以上网。ppp协议就是用户在和ISP进行通信的时候所使用的数据链路层协议。
ppp协议的特点:
简单——这个很明了不用解释,当然是越简单越好
封装为帧,——这本就是数据链路层实现的基本问题
透明传输,——这本就是数据链路层实现的基本问题
差错检测 ——这本就是数据链路层实现的基本问题
各种网络协议——要能传送各种的协议,要不然他的功能太单一
各种的链路网络——因为物理层的链路形式有多种。
检测链接状态——要有一种机制来检测链路的状态,比如一段链路出现发生故障,要过多长时间重新发送。
最大传送单元(MTU)
网路地址协商——要有一种机制能确保两个实体知道彼此的网络层地址
数据压缩协商——传送的越小越好,越快嘛
那ppp协议中还包含了LCP和NCP
LCP(Link Control Protocol):配置和测试数据链路连接的链路层控制协议
NCP:(Network Control Protocol):网络控制协议
ppp协议的数据帧格式如下:
那ppp协议在用户和ISP中是怎么工作的呢?
当用户通过拨号接入ISP中,就建立了一条用户到IS的物理连接,因为IP地址是动态分配的,用户要向ISP申请一个ip地址,,那就是当用户向ISP发送一系列的链路控制协议ICP分组(封装为多个ppp数据包)就建立LCP连接,这些分组就回送给用户一些PPP参数,接下来还要建立网络配置,网络控制协议NCP给接入的用户非配一个临时的IP地址,这样个人电脑就成互联网上的一个有IP地址的主机。当用户通信完毕后,NCP释放网络层连接,收回原来分配出去的IP地址,然后释放链路层的连接,最后释放物理层的连接。 ppp链路的开始和结束都是链路静止的。
B:广播
广播就是在一个局域网上传输是一对多的形式,在同一个局域网中,存在a,b,c,d四台主机,a要发送数据给d,其实在一个局域网上的b,c,d都能接受到,这就是广播的形式。
局域网有三种连线方式
1,星形网——连接在集线器上
2: 环形网——直接连接在总线上
3:总线网——直接连接在总线上
以太网的帧的形式:
头部的长度固定为18字节,数据的长度最短为46字节,最长为1500字节,所以整个帧最短为64字节,最长为1518字节,如果数据很长,那就要分割为多个帧发送。
以太网也是一种局域网,在链路层刚提出的时候,会用各种各样的局域网,也会有各种各样的协议,在这些协议中, **以太网协议**被广泛应用。
以太网规定为了适应各种各样的局域网,它将以太网划分为俩个子层,逻辑链路控制——LLC(Logical link control)和媒体接入控制——MAC(Medium Access Control)但是随着发展,LLC层被逐渐废弃
那一个局域网中一个电脑要向一个电脑发送数据,就想a给b打电话,起码要知道b的电话号码,并且b这个号码是唯一的,这样才能打通电话,那现在就是怎么用一串数字来表示一个计算机。以太网规定,联入互联网的设备都有一个适配器(也叫做网卡),适配器都有一个唯一的数字来表示,这也就是这个设备的唯一标示。
发送数据的时候,在数据包的头部放入发送方mac地址,接收方的mac地址,还有各种版本控制信息,在数据部分放入数据,通过广播的形式发送,同一个局域网上的所有设备都能接受到这个数据包,然后检测头部信息中接受方的地址是不是发送给自己的,若是,则接受,反之,丢弃。
适配器在接受和发送数据包的时候不使用CPU,CPU可以处理别的事情,当适配器收到有差错的帧的时候,就丢掉,而不用通知CPU,适配器接受正确的帧的时,就使用中断来通知计算机,交给上一层。计算机的硬件地址就在适配的ROM中。这样就利用广播的特性实现了一对一的通信。
为了是以太网尽可能的简单规定了一下几点:
1:以太网不先建立就可以发送数据,这不像ppp协议一样,先是建立连接,然后再才是通信,网卡对发送的数据不编号,也不要求对方回发ACK(确认),以太网提供的是不可靠的交付,如果运输层要求对出现差错的帧重新传送,则以太网并不知这个是重传的帧。
2:使用曼切斯特编码(即就是用一个周期的特殊的波形来表示0和1)波形的变化就说明有数据在传输,反之,就没有。
既然以太网是用总线的方式连接在一块的。那在同一时刻,总线上不可能有俩计算机同时发送消息。那计算机怎么知道总线现在有没有计算机在发送数据?
在这里采用了CSMA/CD协议——载波监听多点接入/碰撞检测(Carrier Sense Multiple Access with Collision Detection)。
CSMA/CD协议的基本要点
1:多点接入: 说明这是总线型网络,很多计算机以多点接入的方式连接在总线上,
2:载波监听: 利用电子技术检测总线上有没有其他计算机在发送数据,其实就是检测信道上的波形有没有变化。无论在发送前,还是发送中,亦或是发送后,每个设备都要必须不停的检测信道。如果没有设备发送,则获得发送权,反之,则要等待信道为空闲发送。在发送中检测信道是为了及时发现有没有其他站的发送和本站发送碰撞。这就是碰撞检测
3:碰撞检测: 也就是边发送边检测 ,网卡检测信道上的信号电压的变化情况,当好几个设备同时都在发送数据,总线上的信号电压变化比较大,当大于一定的值的时候,就可以认为总线上至少有俩站在发送数据,发生了碰撞。总线上的传输的信号就会产生严重的失真,无法从中恢复出有用的信息来,因此,一旦发生碰撞检测,网卡就要立即停止发送,等待一段时间后继续发送。
那具体是要等待多上时间才继续发送呢?
以太网使用截断二进制指数退避算法实现,大体的概念就是在让发送碰撞的站在停止发送数据后,并不是等待信道变为空闲后就立即发送数据,而是**推迟**
一个随机数时间,时间到了后继续发送。那要下一次还是没有发送成功呢,规定,发送16次后还是没发送成功,就认为出现了错误。
那各位有没有想过,发生碰撞的检测的前提是已经发送了数据,然后发生了碰撞,那既然都发送了数据,为什么还发生了碰撞检测?
因为信道有延迟,电磁波传输速率是有限的,比如a发送数据给b,要经过5µs,此时b发送数据给a,因为数据要等待5µs才可以,按在b看来,此时信道就是空闲的,特别很开心的发送数据,然后就碰撞了。那a发送的数据最迟要经过 总线端到端的往返传播时延 能到达b。 有一个最小的帧间最小间隔为9.6µs。
很明显,在CSMA/CD协议时,一个帧不可能同时发送数据和接受数据,但是必须一边发送一遍监听信道,所以,使用这种协议的以太网不可能进行全双工通信而只能进行双向交替通信(半双工通信)
总结:
1:网卡将上一层的数据包放在mac数据包里面,经过一系列的精加工(发送方的mac地址,接收方的mac地址,等)放入网卡的缓存中,准备发送
2:检测信道:若是检测信道为空闲,并且在9.6µs内保持信道空闲,则发送。反之,等待。
3:发送中不断的检测信道,有没有发生碰撞,若是没有,则没有发生碰撞,若是发生了碰撞,就立即停止发送数据,并按规定发送人为干扰后,网卡就执行退避算法,若是传了16次不成功,就停止发送上一层报告出现了错误。
以太网有好几种连线方式下面就说说这个
开始就直接连接在总线上。不过后来啊,集线器出现了,集线器采用星形网。因为集线器还是使用电子器件来模拟实际电缆线的工作,整个系统还是一一个传统以太网运行,使用的还是CSMA/CD协议。而且,有好几个接口,集线器工作在物理层,因为它是个连线的嘛。只是简单的转发数据,收到1就转发1,也不缓存,要是几个接口发生了碰撞,那所有的接口都不能收到正确的帧。
随着发展,出现了以太网分组交换机,工作在链路层。它每个接口都直接和一个主机或者另一个以太网交换机连接,而且以全双工方式,同时连通多对接口,使得多对主机能够直接通信,相互通行的主机都是独占媒体,无碰撞的传输数据。,而且它还是缓存,当一个接口的主机比较繁忙时,还能缓存数据。它有一个交换表(地址表)里面存放着连接在它上面的主机的接口号,它采用自学习的算法自动建立这个表(后面讲)而且呢,转发速度比较快,因为采用了专门的芯片。
以太网交换机的自学习的算法。
交换了两帧后的交换表
它的这样的,A向B发送数据,刚开始的时候表是空的,交换机就用广播的形式发送数据,每个设备都能收到数据包,然后看头部里面的接受方是不是自己的mac地址。此时以太网交换机就记下A主机在一号接口。B发送数据给A,以太网交换机查找表发现了A在一号接口,就讲这个数据数据包从一号接口发送出去,并且它发现交换表里面没有B,就记下B 在二号口,如此一来,就知道所有的主机的接口了,这个表也就完善了。
但是有时候为了增加一些网络的可靠性,在使用以太网交换机的时候,往往会添加一些冗余的链路,那这样可能就会导致以太网交换机 在网络中的某个环路中无限的重复,为了防止这样的情况,规定不该表网络的实际拓扑结构,但是逻辑上则切段了某切链路,使得一台主机到其他主机都是无环路的树状结构,而从消除兜圈子。拓扑排序就是消除图的环路的算法。
以太网交换机没有采取CSMA/CD的协议,并且还是双全工的方式工作的,因为不会产生碰撞嘛。但是它还是继续采用了以太网的帧结构。