链路层协议可能提供的服务包括:
奇偶校验就是在全部数据的后面在增加一位,作为检验位。如何是偶校验,那么所有位的1
的个位为偶数,如何数据位1
的个数为奇数,那么通过把最后数据位的数据设置0
来使得所有位1
的个数为偶数。奇校验类似。同时还有二维的奇偶校验,假设数据的大小为n*n
,那么二维奇偶校验就是把数据写成一个n*n
的矩阵,然后在矩阵外增一位作为检验位,使之变成(n+1)*(n+1)
的矩阵。二维奇偶校验不仅可以检测到差错同时还可以纠正一位的差错。
将n
比特的数据分成k
比特一组的序列,也就是n%k=0
。一个简单的方法就是把这写k
个比特加起来,用这个和作为差错检测比特。注意这样这能检测不能纠正。
循环冗余检测(CRC)编码也叫做多项式编码。现在假设发送方要发送d
比特的数据。发送方和接收方要协商一个r+1
的比特模式,称为生成多项式,记为G
。规定G
的最左边的一位必须为1
。如下图所示:
对于大小为d
比特的数据,通过计算我们要在后面加上r
比特的数据,得到d+r
比特的数据。
如何发送端计算这r
比特?
答:利用公式 R = ( D ∗ 2 r ) % G R = (D*2^r) \space \% \space G R=(D∗2r) % G。
在接受方如何检验?
答:如果用得到的d+r
比特的数据除以G
没有余数,则说明没有差错,否则就有。
在链路层转发的过程中,有的是点对点的通信协议,如点对点协议(PPP)和高级链路控制协议(HDLC),第二中就是广播链路,在广播链路中存在多路访问问题,比如在一个会议中,在一个时刻,就只能有一个人说话,如果同时由多个人说话,就会导致我们听不清讲的是什么(假设),要解决这个问题就要有一个规定使得,在一个时间段这能有一个人说话。如果多个人说我,我们将这种情况称为碰撞。解决这个问题,有三种常见的方法:信道划分协议,随机接入协议和轮流协议。
其中典型的信道划分协议有时分多路复用(TDM)和频分多路复用(FDM)。如下图
TDM通过将时间分段来实现多路复用,避免碰撞,FDM类此通过将频率分段实现多路复用。假设链路的速率为 R b p s Rbps Rbps,我们通过TDM和FDM将链路分成了 N N N段,那么对应于每一段的速率为 R / N b p s R/Nbps R/Nbps。TDM和FDM的好处是保证了每个信道的速率相同都是 R / N b p s R/Nbps R/Nbps,然而他的主要的缺点是,即使链路中只有一个节点是活跃的,他的速率也是 R / N b p s R/Nbps R/Nbps,没法达到 R R R。
第三种信道划分协议是码分多址(CDMA)。CDMA对每一个节点分配一种不同的编码,不同的结点能过同时传输,并且他们各自相应的接收方仍能正确接收发送方编码的数据比特,而不在乎其他节点的干扰。
主要介绍两种协议ALOHA和具有碰撞检测的载波侦听多路访问(CSMA/CD)。
假设在一个节点发送完报文之前,就能检测到来自其他节点的碰撞。
设 p p p是一个概率,ALOHA的工作流程如下:
根据计算可以得到ALOHA最大的效率是 1 / ( 2 e ) 1/(2e) 1/(2e)。
介绍协议之前我们先来看看载波侦听和碰撞检测这两种技术。
CSMA/CD的运行过程如下:
这个随机时间量的选择,我们希望他能够有下面的特点,在碰撞节点比较少的时候,时间间隔比较短;碰撞节点比较多的时候,时间间隔比较长。
解决上面的这个问题我们用的是二进制指数后退算法。就是当一个帧发生 n n n次碰撞后,他从 { 0 , 1 , ⋅ ⋅ ⋅ , 2 n − 1 } \{0,1,···,2^n-1\} {0,1,⋅⋅⋅,2n−1}里面选择一个 K K K值。当一个帧经历多次碰撞之后, K K K选择的间隔的均值也会变大。对于以太网来说,一个节点等待的时间量是 K ⋅ 512 K·512 K⋅512比特时间(发送 512 512 512比特进入以太网所需时间量的 K K K倍), n n n能够取的最大值在 10 10 10以内。
例子,一个帧经历了一次碰撞后,以相同的概率从 { 0 , 1 } \{0,1\} {0,1}中选择 K K K,发生两次碰撞时,以相同的概率从 { 0 , 1 , 2 , 3 } \{0,1,2,3\} {0,1,2,3}中选取 K K K,然后依次类推,第 n n n次的时候,就是 { 0 , 1 , 2 , 3 , ⋅ ⋅ ⋅ , 2 n − 1 } \{0,1,2,3,···,2^n-1\} {0,1,2,3,⋅⋅⋅,2n−1}。
主机和路由器也具有链路层地址,不过不是他们本身自带,而是他们的适配器(网络接口)具有链路层地址。需要注意的是链路层的交换机并没有网络接口,所以他们并没有链路层地址,这就是说,链路层交换机对主机和路由器来说是透明的,主机和路由器不必明确的将帧寻址到其间的交换机。
链路层地址有多种叫法:LAN地址,物理地址或MAC地址。MAC地址的长度为 6 6 6字节,共有 2 48 2^{48} 248个可能的地址。MAC地址不想一般不会发生变化,即从出厂到报销MAC地址不变。MAC地址通常用xx-xx-xx-xx-xx-xx
的形式来表示,例如24-ff-3a-ff-f3-3f
。在MAC地址中,也存在广播地址ff-ff-ff-ff-ff-ff
,当链路层交换机收到这个地址时,会将他转发到局域网中的所有主机或路由器中。
既然存在网络层地址(IP)和链路层地址(MAC),所以需要在他们之间相互转换,就需要地址解析协议(ARP)。这是因为在链路层,帧是根据MAC地址来传输的,所以要将 I P IP IP地址转化为MAC地址。
在每台主机和路由器中,都有一个ARP表,这张表包含 I P IP IP地址到MAC地址的转换,还包括这个转换持续的时间。
将设现在A要向C发送一个报文,但是在A的ARP表中并没有C的表项,现在就需要ARP协议来转换地址。ARP查询报文和响应报文具有相同的格式,都包含发送和接受方的 I P IP IP地址和MAC地址。ARP查询步骤如下:
ff-ff-ff-ff-ff-ff
,当交换机收到该报文时,将该查询报文,转发到子网内的所有路由器和主机中。同时ARP协议是即插即用的,就是说一个ARP表是自动配置出来的。
如图,当我们想把数据报发送到子网之外时,我们应该怎么办呢?
因为ARP协议只在子网的内部生效,所以但我们去查询一个子网之外的 I P IP IP地址是,我们不会得到任何的响应。
想一下,数据报要到达子网的外部,首先就要经过路由器,然后通过路由器到达目的地。于是我们可以分两步走:
如图是以太网的帧格式:
10101010
,第八个字节是10101011
。前前同步码的前七个字节用于唤醒接受适配器,并且将他们的时钟和发送方的时钟同步(因为适配器不会以精确的速率传输帧,总是会有些漂移),一般来说速率有一下几种10Mbps,100Mbps和1Gbps,但是不会很精确,会有偏差。交换机对于子网中的主机和路由器来说是透明的,这就是说,某主机或路由器向另一个主机或路由器寻址一个帧(而不是向交换机寻址该帧),顺利的将该帧发送进局域网,并不知道某交换机将会接受该帧并将它转发到另一个节点。下面主要看交换机的几个特点。
转发是决定将报文导向那个接口;过滤是决定一个帧是该转发到一个接口还是丢弃。转发和过滤是通过交换机表实现的。一个交换机的表项包含:一个MAC地址,通向该MAC地址的交换机接口,表项放置在表中的时间。举个例子:现在假定目的MAC地址为fa-33-43-5f-2f-53
的帧从交换机的 x x x接口到达,交换机表中的fa-33-43-5f-2f-53
有一下几种可能:
fa-33-43-5f-2f-53
地址的表项。交换机广播该帧。fa-33-43-5f-2f-53
地址的表项与接口 x x x联系起来。过滤即可。fa-33-43-5f-2f-53
地址与接口 y ≠ x y \ne x y=x联系起来。那么将该帧转发到 y y y接口即可。交换机的表项是自动、动态和自治的建立的,即没有来自外部的干预,表项可以自己建立起来。所以交换机也是即插即用的。交换机的自学习通过一下的步骤实现:
主要有三个:消除碰撞,异质的链路和管理。