计算机网络,上一节课,遇到了八万个概念,简直看都看不过来。整理起来实属麻烦,所以我决定每一章,并不是整理所有知识点,整理大概和框架和重点知识点。课本刚好也是每一章节就是一个网络层次,也蛮容易理清楚滴。
第三章 数据链路层
数据链路层の任务
数据链路层 是在物理层提供的服务基础之上,为网络层提供服务,最基本的功能就是将网络层中来的数据 可靠地传输到相连的节点的目标主机。主要作用就是将物理层中可能会出现的错误的物理连接改造成==逻辑上无差错的数据链路==,在网络层来看只要是数据链路层上来的数据就是100%正确的。
有关概念
- 结点: 主机和路由器
- 链路:网络中两个结点之间的物理通道,传输介质主要有 双绞线、光纤,电磁波等。
- 数据链路:网络中两个结点之间的逻辑通道,光有物理通道(链路)是不够的,我们还需要一定的协议。将实现这些协议的软件和硬件加到链路上就构成 数据链路层,这就是 网络适配器干的活。
- 帧:数据链路层上的传输数据的数据单元,在第一章节概述讲到,数据链路层会将网络层中的ip数据报封装成 帧

数据链路层就负责通过链路将数据从一结点发送到另一个结点。
数据链路层的功能
数据链路层为了完成本层的任务,立下了如下flag.
- 为网络层提供服务, 无确认无连接服务, 有确认无连接服务, 有确认面向连接服务。
- 链路管理 ,即 连接建立 ,维持,释放(对于有连接)
- 组帧。
- 流量控制。
- 操作控制(帧错/位错)
重点
本章中,我们需要终点学习的知识。
- 数据链路层 点对点信道和广播信道 特点,以及在点对点信道上使用的ppp协议和在广播信道中使用的 CSMA/CD协议
- 数据链路层的三个基本问题: 封装成帧 ,透明传输、差错检测(CRC)
- 以太网 MAC层的mac地址
- 适配器,转发器,集线器,网桥,以太网交换机 ,他们的作用和使用场合
封装成帧和透明传输
封装成帧
封装成帧 :就是从网络层中的数据报,加头和加尾(帧首部,帧尾部),就构成了一个帧。
帧头部和尾部的作用何在呢? ta们包含很多控制信息:
- 帧定界符(SOH,EOT),如果将长度不定的ip数据报混合在一起,我们就无法将他们分离开来了,所以帧定界是非常重要的。
- 差错控制信息
- 流量控制信息
- 物理地址信息
帧同步:接受方能够从接收到的二进制比特流中读取到 帧的起始和结束。
帧长:帧首部+数据部分+尾部的总长度
我们在c语言中,字符串中含有一个 '\0'
,它就是为了标记字符串结尾的。这里的帧开始符(SOH 十六进制编码 01),帧结束符(EOT 十六进制编码 04)就是其这个作用的。
透明传输
所谓透明,就是上层服务使用下层服务,但是却感受不到下层的存在。
由于组装成帧的时候,使用了一些控制信息,但是传输的数据恰好是 控制信息咋办呢? 就以 帧定界符为例子。传输的数据恰好有(04)H,如果链路层不做出处理,那么此帧就出错了。那我们规定 网络层中不能有 (04)H,如果遇到就替换掉,把这件事交给网络层来做,这就不叫透明传输了。
组帧方法
-
字符计数法,我们不适用控制符了,在帧首部使用一个数据空间来存储当前帧的长度。虽然我们可以通过此方法确定帧的边界,但是如果帧首部的数据丢失呢?我们该如何确定后面的数据那个属于此帧,和下一个帧的首部在哪?
-
字符填充法,c语言想要输出 回车 咋办?
\n
使用 转义字符\
。在帧里也有 转义字符ESC
(1B)H, 数据部分中有 控制符号时就在前面加上转义字符来标记这不是正真的控制符 。等到接受方收到数据的时候,去掉ESC就好了。 -
零比特填充法: 口诀
5110
,使用本方法 ,帧定界 头尾都一样 二进制是01111110
一共6个1- 在发送端,扫描数据部分,发现连续的五个1就填入一个0
- 接受端,通过
01111110
确定帧边界,遇到5个1就去掉后面的0.
这个方法非常 简单,发现连续的五个1就填入一个0这就导致数据分布不可能有连续的6个1 ,无法和控制符重复。
-
违规编码法
差错检测
通信链路不是完美的,总有会出现差错的地方。如果我们无法确定一个帧出错或者没有出错,正所谓牵一发而动全身,那么在此比特流上后面的帧我们都无法判断是否出错了。
差错有两种:
- 位错 , 比特位出错 0变1 1变0
- 帧错,丢帧,重复,失序
位错解决办法
- 检错编码
- 奇偶检验码
- 循环冗余码 CRC
- 纠错编码 海明码
检错编码 ,只能看出有错误,纠错编码可以看出哪里有错误
这里重点介绍 CRC.
奇偶检验码
奇偶校验码非常简单,但是我个人感觉不是很妥(主要是都能看懂了,一定不咋地,ahh)
奇偶校验码,是由 n-1是信息源(要传输的数据) 和1位校验元(可以是0,可以是1,这里假设为1),组成 。这里还分成两种
- 奇数校验码 ,如果是1的个数是奇数,就在前面加上1,不是就加0
- 偶数校验码,如果是1的个数是偶数,就在前面加上1,不是就加0
用此方法,只能看出错了奇数个的,如果偶数个位同时出错,那就无法检测出来了。
循环冗余码
模2运算
这里涉及到的运算 都是 模2运算,其实也没啥特别的地方,与四则运算相同,模2运算也包括模2加法、模2减法、模2乘法、模2除法四种二进制运算,不产生进和退位的运算。加减就是按位异或 。
-
模2加法:
0+0 =0,1+0 =0+1 =1,1+1=0
没有进位 按位加即可例如 1110+1111=0001
-
模2减法 :
0-0 =0,1-0 =0-1 =1,1-1=0
和加法一样,按位减法即可例如 1110-1111=0001
-
模2乘法:
0x0 = 1x0 =0x1 =0,1x1=1
,和普通乘法一样 ,按位相乘 再相加即可,无需考虑进位的问题 -
模2除法:乘法的逆运算,计算口诀是 位数不够商0,反之商1,按位减法,最后一次位数不够时,取余数。
CRC算法
CRC,循环冗余检验 算法如下:
在发送端,一个帧k bit数据,现在假设传送数据M为6位(k=6) 我们在发送端和接收端规定一个 长度位 n+1位的除数p
发送端:
- 对数据M乘以 2^n (左移,相当于后面加n个0)
- 现在计算M/p,求出余数 R(n位)
- M=R+M,发送端发送出去
接收端:
- 接受数据M, 计算 M/p,求余数R
- 如果R等于0 那么数据正确,帧保留,如果不等于0 则错误,帧丢弃!
- 检测数据正确 ,那么对数据右移3位
补充:
- p要求最高位和最低位必须为1
- 在发送端 ,用于检测是否出错的余数R叫做帧检错序列 FCS
- R的位数一定比P的少一位,因为模二运算除法位数够了商1
注意: CRC无法左到100%确定数据没有发生错误,也就说余数为0,但是数据出错的可能还是存在的。但是这样的情况的概率非常小,可以忽略不记。
我们这个除数P,我们可以用 生成多项式生成,例如 P(x)=X3 +X2+1 对于 1101 ,
- 规则就是 X3 对应 最高位(第四位),有这一项 ,
- X2 同理,
- 但是没有 X1 所以第二位为0,X0=1 ,最低为为1
当然p不是只有4位的,这里最低位位一定为1 ,所以多项式有一个常数1
数据链路层如果仅仅使用CRC,只能检查数据是否出错,更具上述算法我们可以认为, 凡是接收端收到的数据都是正确的,但这不是可靠传输,可靠传输为发送端发啥,接收端就收到啥。
点对点信道 PPP协议
PPP の强大功能
PPP(point-to-point Protocol)协议目前数据链路层中最广泛的点对点协议,以前还有个 HDCL ,现在不常用了。
PPPOE你一定听说过,就是ISP(互联网移动提供商 ,电信联通这类的) ,就是所谓拨号上网,pppoe后面章节会讲到 现在之说前面的三个p.
目前ppp协议不是简单的数据链路层协议了,已经具有其他层的功能。我们仅从数据链路层来看 ppp协议应该满足数据链路层的所有条件:
- 简单
- 封装成帧且透明 这里ta采用的是 使用帧定界符 (7E)H,并且使用 比特填充法做到透明传输
- 支持多种链路类型,可以同步OR异步,可以串行或者并行,可以是高速或者低速,在物理上,可以电也可光
- 支持多种上层协议,比如说 IP 和IPX
- 差错检测
当然ppp还多完成了一些任务
- 身份验证,pppoe
- 检测连接状态
- 网络层地址协商,可以分配ip
- 规定了最大传送单元,MTU.这里不是最大帧的长度而是最大数据部分的长度
PPPの的组成
- 将网络层中传来的数据报封装成帧的方法
- 网络控制协议 NCP,
- 建立、验证、检测的数据链路连接的链路控制协议LCP,
NCP相当于交通法律,来控制可以跑啥车,LCP 负责修路。
PPP先介绍到这里吧,这里还有许多没说。
广播信道 CSMA/CD 协议
广播信道就可以进行一对多的通讯,这里我们讨论局域网里的广播信道。
局域网
-
网络为一个单位所拥有,且地理范围和站点数据有限
-
局域网要有以下特点
-
具有广播功能,从一个站点可以很方便的访问局域网
-
便于系统的扩展,可以灵活的调整
-
提高系统的可靠性和生存性以及可用性
-
-
局域网可以按照网络拓扑分类 星状 ,环状,总线
广播信道の困难
广播信道,其实面临大的问题是,如何让多个用户共享使用 信道,当然前面第二章讲到的方法, 时分复用,频分复用,码分复用等,我们称它们为 静态划分信道,但是ta们的代价对局域网来说太过昂贵。
我们这里主要介绍 动态媒体接入控制 ,又叫多点接入(multiple access) ,特点就是 信道并非是固定分配给用户,主要有如下几种方法
- 随机接入 ,所有用户都可以随时发消息,但是会发生碰撞,所以要对碰撞处理
- 受控接入,用户不能随时的发消息,必须服从一定的控制,经典代表是 探询(轮询)
我们这里介绍几个名词:
碰撞:对于 随机接入来说,一个信道只能传输一个信号,如果两个用户同时随机的发消息,信号被叠加,那么接收方就看不出这是啥信号了。这就叫碰撞,就好比两个人同时说话,第3个人听不清他们分别在说啥。
监听:用于广播信道是共有一个信道,所以一个用户发消息,其实所有的用户都可以收到,监听就是在描述用户在看本信道的空闲状态。
一个用户发消息,信道上所用用户都可以接受,用户如何判断消息如何是自己的消息呢,其实很简单,只需要看发送的目的(mac物理地址)地址就好了,如果目的地址和自己的地址一样就接受,不一样就丢弃。
这里重点说明 CSMA/CD 协议
CSMA/CD 适用于 通信 在有线连接之上局域网
CSMA/CA 适用于通信在无线连接之上的局域网
CSMA/CD
从名字入手
我们先了解一下 CSMA的这些字母的含义
CS :载波监听,发送数据的站要检测总线上是否有其他的计算发送数据
MA: 多点接入(multiple access)
CSMA的主要思想就是 空闲就直接传输数据不必等待直接发送数据,忙就监听,直到空闲再次发送数据 ,如果冲突了(发送了碰撞,导致接受方无法收到正确的消息,接受方没有返回消息),就空闲一段时间重复前面的过程,知道收到了接收方的回复。
大概了解 CSMA就了解一下 CSMA/CD ,CD的含义就是碰撞检测,那么CA呢碰撞避免。
CSMA/CD工作原理
碰撞检测
更具前面的铺垫,那么可以推断出CSMA/CD是半双工的信道(无法同时发送数据和接受数据)
主要要点:
- 多点接入
- 载波监听,不管是否发送数据,都要和检测信道
- 碰撞检测, 边发送边监听
- 使用 曼切斯特编码,保证了每一个码都有一次变换,使用曼切斯特编码的好处就是可以方便的提取同步信号来。
我们再次回顾一下,CSMA的大致思路:
SMA的主要思想就是 空闲就直接传输数据不必等待直接发送数据,忙就监听,直到空闲再次发送数据 ,如果冲突了(发送了碰撞,导致接受方无法收到正确的消息,接受方没有返回消息),就空闲一段时间重复前面的过程,知道收到了接收方的回复。
这里忽视了一个重要的问题,就是传播延迟。
假设 A站点发送了数据到B站点, 在数据还没有到B站点之前,B也发送了数据到 A站点,因为共用一个信道,所以在之后的一个时间里一定有这两个信号一定会发生碰撞。两个结点都这样了,多个结点还不爆炸?
看上图,竖轴为时间,正方向向下。假设 数据从A到B要 τ 时间,如果在A发送数据δ时间后,B发送了数据 ,那么信号就在 τ-δ
时间 发生了碰撞,碰撞就是两个信号的叠加,这就会导致在此信道上原本只能出现0和1信号,却出现了 2(超出了信号的范围)。
由于共有一个信道 ,所以A,B都会收到碰撞后的信号(第三方 C或者其他用户都可以收到),但是由于延时的存在 B和A都到 碰撞之后的信号时间不同,B在 T=τ
知道碰撞了,A呢? T=2τ-δ
时间。
那么A最晚何时知道自己发送的数据发生了碰撞,T=2τ
,也就是说 A发送的数据刚到B家门口,B就发送了数据。
换一句话说,A如果发现在 T=2τ
时间内,自己的数据都没有发送碰撞,那么数据就一定发送出去了!
T=2τ
就是所谓的争用期 。
如果检测到碰撞就立即停止传输数据,准备重新发送数据。
重传机制
如果检测碰撞就立马再次重发,那么大家都这样干,就会一直碰撞下去。
正确的做法就是,大家先休息一些时间后,再去发送,休息的这段时间就叫退避时间。基本的退避时间为 2τ(如果小于2τ,就会和自己发送的信号发送冲突)。
我们取一个离散集合 [0,1,2k-1] (k= 0 1 2 3 ) ,随机取出一个数 r, 那么本次规避的时间就是 r*2τ
,如果重传的次数达到 16此,就说明现在网络太卡了,重传失败。
最小传输帧
这里我们就可以得出一个结论,帧的传输时延至少要两倍于信号在总线中的时延(就是 一次都没发生冲突,不存在 重传)。
帧的传输时延=帧长/传输速率
那么更具前面两句话,就可以得出,最小帧长 =传输速率*2τ
。
以太网规定最小帧长为·64字节,也就是512bit,如果帧长小于 64字节,那么一定是碰撞导致无效帧。
强化碰撞
这个其实举一个非常生动的例子,就是多个人在同时说话(发生碰撞),其中一个人想要大家安静,那么就 嘘(强化碰撞) 一声,大家就安静了。
对于站点发现碰撞了,就立刻停止传输数据,还要发送一段人为的干扰信号(32bit 或者 48bit)
信道利用率
假设10Mbit/s ,有10个设备,那么一个设备的平均带宽是 1/Mbit/s ?
在 CSMA/CD 协议下, 然则不是这样,因为有冲突的存在,浪费了一定的带宽。
结语
当然,还有一些知识点:
- 以太网 MAC层的mac地址
- 适配器,转发器,集线器,网桥,以太网交换机 ,他们的作用和使用场合
书上讲的非常详细了,这里暂时不补充了。