数据链路层要干的是:解决在一组网络上(一段链路上)传输的问题。
(在第一章我们讨论过数据是如何经过五层传输的,但在本章我们只考虑数据链路层之间传输数据的问题,所以就先想象成是两个链路层之间在直接传输数据)
一、链路与数据链路
1.1 链路
链路就是:一段物理线路,中间没有其他交换结点。
1.2 数据链路
与链路不同, 链路只是一条单纯的物理线路,但是数据链路层目的是解决传输问题,怎么可能只是一条单纯的线路,还需要规定水平方向两个对等实体(两个数据链路层之间)的通信规则,也就是协议。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
所以数据链路层=链路+实现协议的软硬件
数据链路层协议有很多,但是他们都有三个共同的问题。我们来共同学习。
二、数据链路层协议
2.1 协议的共同问题
2.1.1 封装成帧
封装成帧就是把每个数据打包,这样就知道发过来的数据从哪里开始,到哪里结束了。
封装成帧:在帧的数据开始和结尾添加首部和尾部,进行帧定界。(也有不需要帧定界的,有固定的时间间隔也可以)
可以看出一个完整的帧由三部分组成,帧头,帧尾和IP数据报。因此IP数据报部分肯定是占比越大,传输效率越高。但是,每种数据链路层协议都规定了数据部分的长度上限——最大传送单元MTU。
那么是什么在充当帧头帧尾呢?一般都是一些控制字符 ,那万一你规定的控制字符,在数据报中也包含怎么办呢?这与透明传输有关。
2.1.2 透明传输
透明传输:本层对上层交付的数据无任何限制,你给我啥我发啥,啥也不改动。
如果你从键盘输入的话不用考虑以上问题,文本文件不可能在数据报中出现SOH,EOT这种帧定界控制字符。 但如果是一些二进制代码的程序就有可能出现,因为⬇️。数据链路层提前碰到EOT以为数据传输结束,丢弃了后面的部分。
一个程序编译还会由汇编器会进行汇编,那么根据我们学过的汇编知识,我们可以知道,汇编中就是用SOH代表开始,EOT代表程序结束。
这就像我们在C语言中,n是一个字符,但也能做到换行,那么程序是怎么区分两者的呢,那就是转义字符。"\n",前面加了个斜杠就代表换行了,数据链路层也是这么做的,如果数据中出现了SOH,EOT就在前面加个转义字符“ESC”。那么转义字符如果如果也出现在程序中(ESC),那么就在转义字符前面再加一个转义字符。
数据链路层不可能无论对错的就知道发,发过去才知道是错的,那如果这样数据传输效率就大大降低了 ,因此,它还需要进行差错检测。
2.1.3 差错检测
0变成1,1变成0 这是传输过程中出现的比特差错,除了比特错误还有帧丢失,帧重复,帧失序问题,这三个属于传输差错 。
数据链路层进行差错检测,检查的只是比特错误。使用的CRC循环冗余校验,在之前讲过 目录中的十一:循环冗余校验https://blog.csdn.net/M3151549808/article/details/135992764?app_version=6.2.9&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135992764%22%2C%22source%22%3A%22M3151549808%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app
我们通常认为经过差错检测后“凡是接收端数据链路层的帧均无差错”
以前为了通信链路质量不好吧,因此要求数据链路层提供可靠服务,所以对于质量差的无线传输链路,数据链路层协议使用确认重传机制。
但如果是通信质量良好的有线传输链路,本层不用提供可靠服务,如果出了差错要改正,就交给上层协议来完成(例如运输层的TCP协议)
数据链路层信道主要有两种:点对点信道,广播式信道
2.2 点对点信道-PPP协议
上面讲过,以前通信线路质量差,所以采用提供可靠服务的协议HDLC高级数据链路控制(High Level Data Link Control) ,但现在用这个用的少了,使用最广泛的点对点数据链路层协议是不提供可靠服务的PPP点对点协议(Point-to-Point Protocle)。
ISP从互联网管理机构申请到了一些IP地址,给用户使用。PPP协议就是用户与ISP之间的数据链路层协议。
讲到ISP顺便回忆一下服务器
服务器是一种在网络环境中提供计算能力的计算机设备,通常用于为其他设备提供服务。 服务器通过网络为其他计算机(如个人电脑、智能手机、ATM机等)提供计算或应用服务,具有高速的CPU运算能力、长时间可靠运行能力、强大的I/O数据吞吐能力以及高扩展性。
PPPoE是在以太网上运行的PPP协议。
2.3 广播信道-CSMA/CD协议
广播信道很麻烦,所有设备只有一根总线可以用,你用我就不能用,我发到一半发现有人给我发,那咋整?肯定有个人发的被扔了,要么是他的,要么是我的,因为总线只能一个人用。
咱先别急,回忆一下广播式网络:⬇️
2.3.1 计算机是怎么连接到局域网
计算机与外界连接是通过适配器,适配器就是主机箱里的一个网络接口板,也叫网络接口卡,简称“”网卡“
具体硬件怎么实现的自己看⬇️
什么是网卡
其功能包含了数据链路层与物理层两个层次的功能
2.3.2 CSMA/CD协议
1. 什么是CSMA/CD
CSMA/CD协议(Carrier Send Mutiple access/Collision Detection):载波监听多址接入/碰撞检测
这个协议就是为了解决上面的问题: 所有设备只有一根总线可以用,你用我就不能用,我发到一半发现有人给我发,那咋整?
站点通过载波监听解决这个问题
载波监听:边发送边监听。在发送前、中都不停检测信道。
碰撞检测:边发送边检测信道上信号电压的变化情况。一旦发现总线上发生了碰撞就停止发送,过会儿再发。
它俩区别就是碰撞检测是:已经检测出来其他站点在发送,那我就先不发了。也就是用来处理几个一起发情况 。
那为啥载波监听了还会有碰撞检测呢?按理来说,监听了没事儿应该就没事儿啊。
就像在家族群打电话,你听见没人讲话你就赶紧讲,结果另一个人也跟你想的一样,同时跟你一起讲,你觉得没人讲话的时候就是载波监听,你讲了他也开始讲就是发生了冲突。
2. 发生了碰撞-争用期
下图包含了全部的已知信息,怎么求出❓处
1.他们用的是同一根总线,所以无论是A发到D,还是D发到A他们的传输速度是一样的,那么!!D从发送信号后到碰撞的时间=A发送的信号发生碰撞后到D的时间,所以❓处就是中点
(如果是在想不明白就可以这么想:你去学校的路上,碰到了老师正要去你家,而且你俩移动的速度一致,那不就是:你从家到你和老师相遇点的用时=老师从相遇点到你家的时间)🤓
接下来怎么算新的❓处
2.⬇️两个蓝色的线段之间用时已知(题目给了D得知碰撞的时间,D得知碰撞的时间也就是A发送的信号到达D的时间,又知道A0时刻发送),就能求出D发送之后 到A的时刻:那么那么绿色线段用时多久?:一样的
如果无限缩小A、D发送的间隔,让他们同时发,那么就得到了A最多需要2tao得知了碰撞。
3.得知了碰撞后
现在假设有三个站
C发了个特别短的信号到B,发完他就不管了,但是A后面发的才到B,这两个帧就有个是错的,会被扔了,但是他俩自己都觉得没扔,就不会重传,导致:
C:发完了休息
A:发完了我也休息
B自言自语:A/B 你的我扔了,再给我发一个(不可靠协议!!!)
C和A:无人打扰,美美休息中
那咋整?⬇️
4. 退避算法
退避算法规定了争用期为2tao,具体为51.2 us,对于10BaseT的以太网,在争用期可以发送512比特,也就是512bit/8=64B.
最短帧长:64字节,如果没有64个字节,必须填充一些字节进去,避免上述情况 ,以太网还规定了帧间最小间隔9.6us,让接收站点有时间清理前面的缓存。
三、信道利用率
根据上面,我们知道了传播时延是tao,假设发送帧需要T0
要提高利用率就是减少tao(在路上的时间),增大T0(真正用来把帧给对方的时间)
所以就是要减小比值:tao/T0
信道利用率:T0/(T0+tao)