复习的笔记,如有错误欢迎指正
数据链路层,什么是数据链路呢,一条网线(物理线路)我们叫做一个链路,在上面加上相关的协议,就称他为一个数据链路。在数据链路上传输的基本单位我们称之为:帧
数据链路层的三个基本问题:
1、封装成帧:给数据部分加入帧头和帧尾,区分一个完整的数据帧
2、透明传输:如果真中间出现了SOH或者EOT这样的开始或结束符,就会收到一个错误的数据帧,为了解决这个问题,在数据中遇到他们的时候给他们加上转义字符:
3、差错控制:运用一些算法来对传送的数据帧内容进行检测,防止因噪声出现错误(CRC循环冗余校验)
数据链路中,不同的协议有不同的帧格式:
使用点对点信道的数据链路层:常见的PPP协议
就进行两点之间的通信
使用广播信道的数据链路层–以太网:目前比较常用的,CSMA/CD协议,带冲突检测的载波侦听多路接入
计算机都连接到一根总线上,以此来进行相互之间的通信。两头是接着两个电阻,这样这五个计算机就可以相互进行通信,他是基于广播信号的,每次通信的时候要先发送广播,所有的计算机都能收到他要请求通信的消息,然后要与他通信的计算机给他回复,然后两人开始通信,其他的计算机不接受他们发送的数据
PPP协议:
7E字段代表的是帧头和帧尾,和上面说的类似,如果数据中出现了这个字段我们要对他加以区分:两种方法,一个用于同步,一个用于异步,同步就是以一个数据帧为为传输的基本单位,异步就是指以字节为传输的基本单位。
零比特填充:
7E,写成二进制就是01111110,有六个连续的1,防止出现这样的情况,我们每当出现了5个1的时候就给他加一个0,这样就让他变成了
01111110 -> 011111010
在接收端收到之后,每遇到5个1就去掉一个0;
字节填充
1、在异步传输的链路上,数据传输以字节为单位,PPP帧的转义符定义为0x7D,并使用字节填充。
2、把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E)。
3、若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D,0x5D)。
以太网CSMA/CD协议:
再来看这个图;载波侦听就是说每次在想要发送信息的时候要先看一下当前的总线上是不是有计算机正在相互通信,如果有就暂时不发送数据,等结束后在发送。碰撞检测就是说当前,如果A1跟A3发送数据,A2同时也要跟A5发送数据,那么会出现下面的情况
两个信号发生了碰撞(电压的摆动值超过了一定的限制),数据失真没办法在使用,这时候就得执行一个算法等待一段时间后在重新发送;
引入一个定义
单程端到端传播时延记为τ(tao)
争用期:发送数据帧的计算机,经过2τ的时间就可以知道发送的数据帧是否发生了碰撞;
这时候就发现了一个问题,就是传送的数据帧的长度,如果这个数据帧过短,那么很可能他已经发送完了,但是还没有发生碰撞,在传输的过程中,发生了碰撞,这个时候发送数据的计算机无法感知到刚才自己发送的数据因为发生碰撞传输失败了,所以我们就得规定数据帧的最短长度:
通常2τ = 51.2μm;对于10Mb/s的以太网,就是512bit;就是64字节。
所以如果发生了冲突,就一定是在发送前64字节之前
由于检测到冲突就停止发送,这时候已经发送的数据一定是小于64字节的
以太网规定最短有效帧长度是64字节,凡是小于64字节的帧,都是因为冲突导致的无效帧;
二进制退避算法
那么发生冲突之后等待多久在重新进行发送呢?
定义参数k = Min【重传次数,10】
每次从集合【0,1 … , (2 k - 1)】中随机取一个数记为r,重传的时间就是r倍的争用期(2τ)
当重传次数到达16次,就向上层报告传输失败,丢弃该数据帧
以太网帧格式
还做了一些规定来看这个帧是否有效:
帧的长度不是整数个字节
检验FCS序列有差错的
去掉帧头帧尾,数据字段不在46-1500字节之间的,MAC帧的长度在64-1518字节之间(因为首部尾部一共是18个字节)
对于错误的数据帧就会直接丢掉,以太网不会负责重传丢弃的帧
信道利用率
极端的情况:如果没有发生碰撞,而且一直在传输,那信道的利用率是100%;
如果没有发生碰撞,并且成功的完成了一次发送:
由此也可以看出,T0越大,利用率越高,也就是说传输的数据帧不要太短;
网卡
上面说的封装数据帧,拆帧;数据帧的差错校验,介质访问控制都是由网卡来进行的,并且在生产的时候就对每一块网卡有一个全球唯一的MAC地址,前3个字节是分配给每个组织(公司)的,后面3个字节是生产网卡的公司自己设定的;
拓展以太网
集线器:跟总线的作用差不多,连接多台计算机进行相互通信:
这样连接,可以让更多的计算机进行相互通信,并且距离也有所增加,但是相应的,也带来了更大的冲突域;为了解决这个问题,出现了网桥;网桥现在好像已经不怎么用了,介绍一个他的升级版,交换机
在第一次要进行通讯的时候,还是以广播的形式发送,然后发送给所有的接口,这时候交换机就会维护一个交换表,记录这个计算机连接的是哪一个接口,在下一次发送的时候,查询这个交换表,然后给相应的接口转发这个数据,这样就可以避免每一次都要把帧转发给所以的计算机;下面是一个交换表的例子:
来源:CSDN
作者:鬼鬼@L
链接:https://blog.csdn.net/Mr_Ghost812/article/details/104023698