相比于网络层,数据链路层的内容多而且很杂,因为同时涉及到一些物理和网络的东西,甚至内容很冗杂.因为一些原因,这篇文章将主要以对比为主,而不是完全树形展开,方便各位看官理解.
这篇我估计要写上整整两天......太多了......各位看官尤其是同学们,来个赞/收藏/关注呗
1.关于数据链路层
1.1基本功能
数据链路层是教学模型的第二层,承接网络层发来的PDU,然后进行封装成为"帧"(frame),然后遵从一些协议,在逻辑上向对应的对等层实体进行发送.总体上来说,实现的就是帧在一段链路或者一个网络内部两个点之间的传递,相比于物理层更加封装了一些/
在实际上在各个层的传输都需要不断地封装和不断地解封装,才能最终传递到我们想要的位置上.
而在逻辑上,我们视为这样子即可
这就是我们所谓的逻辑",后面其他层的传输都会遵循整个逻辑的说法进行讲解,这里先简单说一下捏.
1.2帧,数据链路,链路
这三个是数据链路层的三个基本概念,因此这里说明以下
(1)链路:
链路其实严格来说,指的是两个相邻点之间传输的那条链路,物理信道. 严格来说这是物理层应该考虑的概念,事实上这确实是物理层的传输范围.数据链路层的传输范围相比于链路扩大了不少.
(2)数据链路层:
从范围上讲,数据链路是从一个点到另一个点上的所有链路,还有负责实现通信协议的硬件和软件.这也就是数据链路能成为一个层的原因,它需要依托完整的数据链路这一结构,来对帧进行传输和发送.
(3)帧,以及封装成帧
frame的形成就是对于上层中发送过来的数据单元进行封装,加上数据链路层需要的一些头部和尾部的信息.这些信息用来标注地址,控制来源,检测误差,帧定界等等
我们以点对点协议的帧来作为例子
(整个帧的具体细节会在下面的点对点协议中进行解释)不同的协议规定了不同的数据格式,也就是不同的帧.
2.关于传输的重要问题
众所周知,在数据链路层传输会经过很多不同的部分,会经过许多不同的信道和节点,在这个过程中很容易会造成数据丢失,数据误差或者是次序混乱等等问题.所以我们需要考虑的一共是三个主要问题:透明传输,误差检测,可靠传输,这些将在后面一一解释.
2.1.透明传输
举个例子,我们平时在写代码的时候,字符串肯定是少不了的东西.
众所周知,如果我们想要表示字符串(这里以语法相对比较严格的高级编程语言为例子)
"这是一段信息,里面是什么无所谓"
其他的东西先不说,为了和语言的其他东西做出一定的区分,我们需要加上一个开始符号,加上一个截止符号,来声明这个东西是一段信息. 我们的透明在这里的"见不到"的意思,也就说内部信息我们完全不需要关心,只需要在乎截止和开始符号出现在什么地方,然后我们对其进行处理.
但是,如果内部出现了和起止符号相同的东西,编译器对这个字符串的识别就会出现混乱.而透明传输这个要求就是,编译器可以不用去管内部是什么东西,换句话说,不必担心紊乱问题.
类比一下ppp结构的F字段,其实是一样的道理.对于帧的传递,我们也要避免对于内部的出现错误识别,让数据链路层放心地使用起止符号,作为一个识别对象.
对于字符串来说,内部出现的和"一样的字符,我们会使用转义字符来处理.
而对于数据链路层传递的帧来说,传输的数据内部如果出现起止符号,则需要发送方在发送之前先对数据做出一些检查,然后接收方根据双方的一些约定,对数据进行重新处理,回归到原本的状态.这样就保证数据在发送和接收的过程中,不会发生因为截止符识别产生的紊乱.
严格的定义是:数据链路层对上层传输来的数据没有任何传输上的限制
对于帧的透明传递实现,我们有两种办法.
2.1.1.字节填充
字节填充的别名也叫字符填充,其使用方法就是在敏感字节的前面加上转义符号.
在传输过程中,对于加上了转义符号的敏感字节,会将其作为一个数据而忽略.
然后接收方在接收到数据的时候,会检查一遍内部的数据载荷,从中找到转义符号并且剔除.
如图所示,第一个和最后一个flag是起止符,是有效的分割位点.而esc作为转义符号
(因为esc本身也是一个运送接收过程中的关键字,所以如果原本的数据中出现了esc字段,是也要进行处理的)
2.1.2.比特填充
比特填充更像是细化以后的字节填充处理
我们举出这个例子,这个例子其实是ppp协议里面对于透明传输的处理方式
我们可以看到,这个协议的起止符号是01111110,我们要对网络层数据单元进行处理,也就是不要出现六个连续的1.
处理方法如下,在发送数据的时候,对内部的比特串子进行检测,如果检测到五个连续的1,那么就紧随其后加上一个0.
在接收完成,需要处理数据的时候,如果检测到五个连续的1,就把下一个的0给剔除掉.
因为双方已经约定俗成,所以这个操作是完全可能,不会出什么岔子的
2.2.差错检测
误码是传输过程中一个很容易出现的问题,尤其是经过的信道越多,收到的干扰甚至恶意篡改也是存在的,所以在这里的差错传输我们主要指的是一些误码(即因为某种原因,在传输过程中1变成0,0变成1的情况发生),至于分组丢失等等,是交给后面的可靠传输来进行解决的
2.2.1,奇偶验证
奇偶验证其实原理非常简单,单独设置一个位置,设置传输时候的1的个数是奇数还是偶数,或者记录0的也可以
一旦某个1或者0发生了突变,两个人的奇偶性质都会发生改变,和一开始的记录情况不符合,因此接收方就知道这个传输发生了错误.
这个方法很简单,但是有个很致命的错误,就是如果一次变化的是两个
就检测不出来,发生漏检的情况,因此我们更多还是使用另一个方法
2.2.2冗余循环验证(CRC)
循环冗余验证我们最常用的方法之一,核心思路就是双方约定一个多项式函数,然后根据这个函数得到一个除数,数据的计算结果拼接上这个除法的余数结果以后,将其发送给接收方.
接收方同样进行计算,如果接收方对于这个复合数据的除法结果为0,则代表没有发生错误.
1.双方先确定一个G(x)多项式函数,我们需要从多项式函数中获取两个信息,根据各个次项的系数得到一个二进制的除数,以及得到最高次项的次数n
(另外补充一点,这个约定的多项函数必须包含零次项,也就是1)
这个多项式的计算结果就是:除数为10111,最高次项为4
2.由于已知最高次为4,所以要现在原本的数据后面加上0000,最高次项数目个0
我们假设
则我们现在构建的被除数就是101001+0000
所以我们可知道除数为10111,所以我们计算余数结果为101
又因为101只有三位,而最后的冗余码要和最高次项一致,所以必须0101
则最后我们得到的一个,用来传输的数据为101001+0101
其中一个这个0101,加在数字的末尾,就是我们所说的冗余码
3.接收方接到数据以及冗余码,然后用除数进行模2除法运算,如果最终得到的结果为0,那么就代表最终结果是可行的.否则则认为最终的结果出了些差错
补充:奇偶校验也好,CRC也好,本质只能纠错,如果想要更好的纠错只能使用一些其他手段,比如海明码等等操作.
2.3可靠传输
一般来说,数据链路层负责实现的是网络层对于分组的传输,作为物理层和网络层的中间部分,数据链路成需要实现的是数据的传输的具体逻辑.为此,它向上提供了两种服务方式
1.不可靠传输:这种传输的特点是,如果某个分组在接收方那边被检测出了一些错误,那么这个分组就会被直接抛弃.这种不可靠传输的方式主要用于一些有线链路,有限链路的误码和丢包概率都很低,所以相比于稳定传输,检测错误消耗的成本反而更大
2.可靠传输:和上面相反,如果错误,接收方就会要求发送方重传这个数据包,这也就是无线链路常用的方法.这样的重传方式保证了发送数据和接收数据是完全一致的,所以称之为可靠传输
注意这两种传输不仅仅应用于链路层,上面的网络层的ip协议也会参考这些,甚至是后面的CSMA/CA协议中为了稳定,也同样需要一些协议实现可靠传输.
可靠传输在这里我们主要介绍三种方法,也就是常用的三种协议:停止等待协议,回退n帧协议,选择重传协议
这三种协议的算法肥肠重要
2.3.1,停止-等待协议
停止等待协议的核心是一个停止等待的机制:当发送方发送一个数据包以后,不会继续发送数据,而是等待接收方的一个反馈数据包/超时重传.
在这里我们将发送方和接收方的数据分成两个类型
发送方的数据被称之为:数据分组DATA
接受方则需要返回一个确认的信息,这种信息被称之为:确认分组ACK,和否认分组NAK.
(1)对于一般的情况来说,大致的处理方法就是:发送方发送data以后,接收方会根据这个数据分组是否正确,而返回NAK或者ACK.如果接收方接收到的是ACK,那么发东方就可以放心传递下一个数据分组.
(2)对于数据分组发生丢失的情况
数据分组发生丢失的情况,其实很简单,这也是最开始就被考虑到的问题情况之一
RTO被称作超时重传时间,一旦超过这个时间没有接收到ACK,那么发送方就会试图重新发送一次数据分组.
(3)关于确认分组发生丢失的情况
确认分组发生丢失的情况,其实在处理方法这个角度上来说,和正常的数据分组丢失是一样的.都是在超出一段时间以后,进行重传.
但问题是这样可能会造成接受方多次接受同样的数据分组.
这样的处理方法就是为数据分组加上编号,如果接收方检测到了接收到的数据分组已经接收过一次了,就将其丢弃而不是加入缓存,然后直接返回确认分组即可.
(4)当确认分组迟到
这张情况指的是,确认分组到达的时间已经远远高于RTO,这样造成的结果就是发送方已经重传了一个数据分组,但是后面马上就接到了上次的ACK.
这个时候发送方自然是遵循停止等待的原则,继续发送下一个数据分组.
但是紧随其后,由于发送了两次数据分组,所以会接收到两个ACK,为了避免这种重复,对于确认分组同样进行了编号处理.如果发送方得到了相同的ACK,就直接丢弃不再进行处理
另外对于停止等待协议,我们可以通过某种方式确定它的信道利用率,如图所示
TD:数据分组传输延时
RTT:往返传播延时
TA:确认分组传播延时
信道利用率则可以直接用上面的公式计算.
2.3.2,回退n帧协议
汝可知滑动窗口算法?
其实可以从这个角度进行理解,停止等待协议一次是发送一个数据分组,回退n帧协议需要在发送端维护一个滑动的窗口.而接收方则在接收部分维持一个长度为1的滑动窗口.\
如图所示,在该图中,滑动窗口为5
这里先说明一下窗口时怎么样工作的
先说发送窗口:发送窗口的长度一定,每次需要进行发送操作的时候,都会把窗口内的所有数据分组全部都按照顺序发送一遍,因为窗口的长度为n,所以这里称之为回退n帧协议.
发送窗口时刻检测自己窗口内部的第一个数据分组,如果这个数据分组确认成功发送,那么窗口会顺次移动.这也就保证了滑动窗口完全划过的地方,一定是已经确认成功发送的
再说接收窗口,接收窗口中长度为1,所以我们可以只关注这一个,如果发送过来的数据在读取的时候,和当前窗口内部的东西匹配,则发送该数据分组确认的确认分组,并且移动窗口.如果不匹配,则返回上一个数据分组的确认分组.
此时,发送分组如果接收到的是已经确认的确认分组,则知道某一个过程中出现了问题,将窗口内的东西完全重传.
下面我们举个具体的案例来进行处理.
这里举例一个有差错的情况
发送窗口选择发送的数据分组为56701这五个分组,然而在传输过程中第五个分组就发生了很强的错误问题导致抛弃.则后面传来的6701都不能进行匹配,这样就会导致连续发送4个上一个数据分组对应的ACK.而接受方不仅因为没有得到5的确认分组,所以无法移动,而且连续收到了四个4的确认分组,这就说明出现了误差,发送方会对56701这五个数据包进行重新传递.
另外这里需要补充额外的两点:
累计确认:有的时候,接收方不一定要对每个数据包都进行返回确认分组的操作,比如说连续确认玩3456,这个时候可以直接返回一个6的确认分组,在回退n帧协议下,就会认为前面的数据都已经确认完毕了.
发送窗口的大小时有限制的:发送窗口的大小最大不能超过用来标识数据包编号的二进制范围
例如本案例中,数据包一共时给了8个编号01234657,需要三个比特位置,所以n=3.
如果发送窗口太大,则会导致传输的数据里面存在编号一样的内容,会导致无法判断这个分组的新旧问题.
其实上面的停止等待协议也是一类变种,只不过发送窗口为1.
2.3.3选择重传协议
回退n帧协议有一个问题就是,如果发生丢包,误码等等现象过多的时候,效率可能还不如最开始的停止等待协议有用.原因在于每次都要重新发送一整个发送窗口的内容.
对于这个东西,我们的处理方法是:阻止了发送窗口对于重复ACK的识别,重传完全使用RTO的机制.
并且对于接收窗口来说,我们也会使用一定长度的接收窗口来处理这种事情.
这里需要明确一个事情就是: 我们上面已经大致阐述过了,窗口滑动的机制主要就是看窗口内部第一个数据包是不是被识别过了(这个识别对于发送窗口来说,指的是接收方已经得到对应数据包的ACK.而对于接收分组来说,则代表了确认接收到了这个分组.)
所以说 : 选择重传协议, 是在双方都遵循这个滑动机制的基础上, 再基于RTO实现的一种机制,接收方相比上一个协议内容,可以接收确认一部分数据包.而不匹配的数据包直接丢失,等待经过RTO以后,等待发送方对于数据的重新传递.
举个例子,是这样的传递.
例如再发送的过程中,会遇到这种情况,随着窗口的滑动,发送窗口一次可以发送2345
这个时候因为某种原因数据包2发生了丢失,但是接收窗口此时仍然可以接收345数据包并且返回对应的一些ACK,此时发送窗口中迟迟没有接收到2的ack
等待一段时间以后,发送窗口就会重传2这个数据包,而不是全部重传,这就是所谓的选择重传
另外注意:选择重传也需要权衡两个窗口的大小,同样是为了避免新旧分组发生的混乱问题.
3.ppp协议:
ppp协议(point to point protocol)是当下使用最为广泛的一种数据链路层传输协议,在这里拿出来单独进行解释的主要原因就是,阐述一个协议到底是在干什么.
ppp协议规定了一系列点与点之间进行对话和交换数据的流程,数据的格式,透明传输的支持等等内容.提供了一系列的标准方法
3.1.PPP协议构成
LCP:链路控制协议LCP,用于建立,配置以及测试数据链路链接的协议
对于各种协议数据进行封装发成帧的办法
NCP:网络层的控制协议
3.2.ppp的数据帧
ppp的数据帧是非常典型的一类数据帧,所以这里我们将其拿出来单独进行一些解释.
首先起止部分的F就是截止符号,这个部分对于PPP协议来说,透明传输的实现为字节填充/字节填充
AC两个字段对于ppp没什么作用
FCS是用来进行CRC冗余检错的冗余码字段
4.以太网:
(ethernet)是一种局域网实现技术,同时也是一种局域的有线网络技术,平时我们常说的"拉一根网线"就是在干这个.在windows上使用指令ipconfig即可检测自己的各个网络状态,其中就会有关于以太网的选项.
以太网也好,虚拟局域网也好,传播范围就是一个网络内部与两个节点之间的任意交换,这也就是数据链路层需要实现的机制,所以在这里我们会重点介绍一下这两种网络内容....
4.1共享式以太网
4.1.1:共享式以太网的原理
共享式以太网的原本逻辑可以当成我们在其他课程中学过的总线,即一个站点发送的数据,其他站点都可以监听到,反之,同一时刻只能有一个站点在总线上发送信息.其实这就是引入了一个我们肥肠需要考虑到的问题:媒体的接入控制
如图所示,我们要避免这种数据包发生碰撞的情况,协调一下发送和接收部分.
在前面我们介绍过一些复用机制,这些被称作静态接入控制,不得不承认这些也是一种可用的方法:
对于这个,我们称之为静态划分信道.
而共享式以太网和其他等等网络需要面对的是一种称之为:随机接入的接入方式,不能确定是哪个媒体在发送,也不确定是否会发生碰撞.他们的分类是这样子的
(其中受控接入分为集中控制和分散控制,也是一种动态的处理方式,集中控制采用一种轮询的手法,每次都单独给一个站点发送数据的权利,根本上避免了碰撞.分散控制则是形成了一个单向的循环网络...............不过这两种方法和我们后面要说的协议内容关系不大,所以这里不加以解释了)
以上的媒体接入控制(medium access control),就是MAC.
另外,所谓的共享以太网有两种实现方式:
总线 集线器
集线器我们会在下方的扩展部分进行一定的解释,现在只需要知道的是,它是一种在物理结构上做出一定改进的总线,也遵从共享以太网络的MAC协议.
4.1.2:MAC地址和Adaptor(网卡/适配器)
先说MAC地址,MAC的全称为媒体接入控制,因此又被称之为硬件地址/接口地址,是数据链路层中唯一性标识接口的地址.
对于我们的个人用户来说,每个设备代表一个MAC地址.对于一些交换机来说,每个接口代表一个MAC地址...................
每个主机发送的帧中,都必须携带标识发送方和接收方的MAC地址,因此在进行接收的时候,每个接收方都会对帧中的"接收方"字段和自己的MAC地址进行一个简单的匹配,来判断这个东西是不是属于自己的数据包.
再说网卡/适配器,网卡和适配器起到的功能处理物理层中讲述的串行并行转化以外,还要实现数据层和物理层的功能等等.用户如果想要接入局域网,则必须要有自己的网卡.
网卡同时也负责接收数据包,如果使用抓包工具wireshark的话,可用看到有一个混合模式的适配器,这个模式就代表着"照单全收",只要是到达了这个网卡的,无论是否匹配本机,都会进行读取.(当然这个是后话了)
4.1.3:碰SMA/CD协议
CSMA/CD被称为碰撞检测协议,在共享以太网中,用来处理和规避可能会产生的碰撞.
CS:载波监听,MA:多址接入,CD:碰撞检测
4.1.3.1协议基本原理:
CSMA/CD协议大致就是分成两个部分
1.载波监听:在发送数据之前,发送方会监听一段时间的信道空闲,在这里为96个比特,如果在这期间总线都空闲状态,则发送方开始发送数据
2.碰撞检测:在发送过程中,由于总线是有一定长度的,所以不可避免地会有碰撞的情况产生,如果发送方一旦接收到碰撞,就会暂时执行一个回避算法.等一段时间以后,再重新执行载波监听
如图所示:
4.1.3.2争用期
再说明神魔是争用期之前,我们先来说说为什么经过载波监听以后,仍然会发生这种碰撞情况.
原因在于总线的长度,和传输是需要物理时间的
如此图所示,B检测到了空闲,并且发送了数据,但是在这个数据还没有被C监听到的的时候,C也完成了自己的96比特的监听,也开始上传数据,这就导致了在总线线路上的碰撞.这是物理因素,无法避免,所以我们只能考虑其他的处理方法.
在碰撞监听中我们的处理方法就是回退,数据包"回避"返回原本的位置,这样让发送方能知道自己的数据发生了碰撞,从而回退一段时间以后再开始监听数据.
如图所示算是一种情况
我们假设总线两端距离最远的两个部分是A和D,单独进行传输的时候,需要耗费的时间为.
我们把上面的图给极端化一下:
假设碰撞就发生在D点上,那么A检测到碰撞所需要的最长时间无疑就是两倍的链路往返时间
也就是2
这个时间也叫争用窗口.为什么要引入这个概念,其实这个也是一个RTO类似的概念
如果一个站点超过这个时间仍然没有收到回退信息,那么就代表这个数据包没有发生碰撞之类的.可以继续放心进行下一个传递了.
4.1.3.3最大最小帧长
最大最小帧长这个概念其实是两个要求:
首先帧长太短的话,如果发生碰撞可能会导致无法检测到
帧长不能过长,可能会无限制地占据总线,导致其他站点无法顺利发送
这里只给出计算方法:
(1)最小帧长:争用期*传送速度
(2)最大帧长:由协议进行控制
4.1.3.4回退算法
回退算法:每次监听到碰撞以后,站点需要通过某种算法计算出一个差不多的时间间隔作为一个回退时间.回归完以后,重新进行载波监听.
(具体的算法放在下面了......................)
4.2对换式以太网
总线式以太网带来的问题就是必须要处理碰撞问题,包括后面的无线网都要处理这个问题.
而对换式以太网解决了,这个问题
4.2.1.对换式以太网的基本原理
对换式以太网是使用交换机(switch)来替代集线器来实现以太网,这个结构本身是有多个接口的网桥, 所以实现了双工通信,避免了碰撞.
其实看图来说,这个东西很像是电话交换机
因为这个玩意连协议都没有了,所以无论是自学习算法也好,交换机在链路层的扩展也好,我们将在下面的部分进行处理.
4.3以太网的扩展
以太网毕竟是局域网,所以传播的范围很有限.所以在可行的情况下`,我们不得不对这个东西进行一些物理和数据链路层面的扩展.
(调制解调器是在物理范围上扩展的,相当于延长了空间上的传播范围,不过整个就不在我们的考虑范围之内了)
在这里我们主要使用集线器和交换机等等进行扩展,并且会研究单发帧和广播帧在两种不同的结构中进行传递的过程,还有碰撞域和扩展域的结果.
4.3.1:总线以及集线器
总线我们上面介绍的已经很明白了
集线器在实际原理的方面,和正常的总线是没有什么区别的,在现在已经基本取代了早期的纯总线了
相比于纯总线,主要的优点在于不会因为一个点的故障或者短路导致整个网络全部崩溃,这一点在纯总线的过程中时有发生.
在发送帧的时候,集线器的处理机制肥肠简单,无论是单播还是广播帧,都是交给集线器,然后发送给除了发送方以外的所有端口,让那些节点自己去处理能否进行接收.
另外使用集线器,可以在物理层上扩展一个网络
4.3.2:网桥以及交换机
在说交换机之前,我们先聊聊神魔是网桥,还有网桥的自学习算法机制等等.因为交换机本质是大号的网桥,而不是什么网桥的集合体.
首先说为什么要产生网桥:网桥的本质是在数据链路层对于局域网扩展的一种手段,相比于集线器,网桥通过"存储缓存"的机制,就能够完全避免碰撞.
网桥的基本工作原理:
网桥作为链接两个网络的中间部分,其内部自带一个表,这个表记录着节点的MAC地址,以及对应的接口方向,如图所示:我们会在后面通过自学习算法来生成这样一个表格
网桥的传播逻辑可以分为两种:我们这里画图举例
(1)对于单播帧来说,会有三种情况
1.两个不同碰撞域内的站点相互发送信息,并且网桥没有记录的时候,举例A->C
这时候,网桥的表中没有MAC地址为C的记录,所以也不知道C是在哪个端口对应的碰撞域里面
这个时候网桥会做两件事情,第一件事情就将这个信息广播到处理发送接口以外的任何接口上,让各个碰撞域以及其内部的集线器自己进行处理和匹配
另外一件事情就是记录发送者所在的接口位置,如图所示,A的接口为0,记录在网桥中.
(在这里要补充个一个内容,其实应该是放在下面去解释的,这里的每个碰撞域都视为有一个集线器,发出的时候是先发送到集线器,接收的时候也是集线器先接收到,这就保证了内部是一个优先进行广播的过程,当然下面会进行详细解释啦.)
2.对于可以查询到记录的情况,进行单播帧发送
还是举例A->C这个过程
我们假设网桥已经知道C的位置,则发送到网桥以后就会直接把数据精确地发送到端口1,然后内部的CD都能接收到这个数据,D将其丢弃,C将其接收
同样的,因为集线器得到这个数据帧的B,也会将其丢弃
3.能查询到记录,但是和发送方在一个端口方向上
如图所示的内容:中 C向着D发送一个数据帧,而且网桥中已经有这个记录,传播方向就是发送方向
这种情况下,网桥就会将其丢弃,然后碰撞域内自己进行处理
(2)对于广播帧来说
网桥会很自然地传播到所有的接口上,至少在广播帧上来说,交换机和集线器的实现效果是一模一样的,但是原理不同,网桥得益于存储缓存机制,可以让其进行双工通信,不用担心碰撞
(3)网桥的生成树算法STP
对于一些广播帧还有一些特殊的单播帧,可能会发生如下情况
我们假设两个碰撞域之间存在两个网桥
我们以广播帧为例子,这可能会导致这个帧在这个循环网桥上反复进行移动
我们的处理方法就是STJ生成树算法,网桥之间通过传递STP数据包来形成一个拓扑的最小生成树结构,如果出现了环路,就会关闭网桥的相应接口
(当然这个也不需要了解的太细致啦....差不多就行)
4.3.3:两种对于帧的发送进行对比
其实上面的两个模块已经把这个解释的很清楚了,这里就简单做个总结
1.对于集线器来说,实现的效果就是无脑广播,然后让各个站点的网卡自己实现MAC地址的匹配等等操作.核心仍然是一个集线器,遵循CSMA/CD协议
2.对于交换机来说,实现的是查表自学习,并且实现了缓存机制实现双工通讯,不担心碰撞,也无需担心上述协议的实现
4.3.4:扩展域和碰撞域
碰撞域:
上面其实说了很多关于什么是碰撞域,这里终于可以详细解释一下了
碰撞域从字面意义上来讲,就是这个区域内会避免出现碰撞,或者说碰撞会影响到这个区域内的数据传输. 而在实际上,主要是被集线器链接起来的部分,都是一个碰撞域
有时候被集线器链接的两个碰撞域,则会形成一个更大的碰撞域
所以说碰撞域的扩展,依靠的是集线器的链接.
广播域:
广播域很简单,就是广播帧能达到的区域
集线器和交换机都能起到扩展广播域的效果,这里就不多久加赘述了
4.4.以太网的帧格式
(不少很重要,后面有机会再进行补充)
5.虚拟局域网
(这部分我甚至不知道要不要说了,,,,,,因为主要想说的只有一个CSMA/CA协议)
5.1.虚拟局域网的概念
虚拟局域网是区别于以太网的另一种局域网实现方式,说白了就是wifi
IEEE在1999年推出了标准802.11,这就是我们最广泛使用的局域网之一
802.11局域网分成两个主要类型,有固定基础设施的802.11局域网
固定设施的局域网拥有一个固定接入点AP,这个是中心的基站,这种局域网的最小服务单元被称作基本服务集(BSS),而具体通信的范围则被称作基本服务区(BSA)这个服务区的范围一般不会很大,10m-100m不等
如图所致,差不多就是这样子的一个结构
一个BSS是可以孤立的,也可以通过以太网等等方式完成扩展,这样就形成了一个扩展的服务集合
另一种无基础设施的802.11无线网则没有ap这种东西,而是由一些对等的点组成的.数据在这种自组织网络中进行传输.这种网络的优点在于可以快速构建.
另外还有一些物理层,网络层等机制,这里我们就不加以任何阐述了,因为过于复杂,有兴趣的同志可以自己寻找文档.
5.1CSMA/CA协议
由于一些原因,我们在这里不使用CD协议来处理碰撞和回退算法了,在虚拟局域网中我们是用另一种很相似的协议CSMA/CA协议,我们在这里主要聚焦于CA(碰撞避免操作)
5.1.1为什么不继续试图用碰撞监听CD协议
其实归根到底的原因,还是因为物理介质发生了改变,想要在无线网卡上实现碰撞检测本身就是一件很难的事情,而且会因为传播过程中信号因为种种原因造成干扰,甚至可能是检测不到碰撞
5.1.2无线网络的两种不同的媒体接入方式
两种不同的媒体接入方式,是我们处理碰撞问题的方法
第一种被称作点协调功能PCF,也就是我们最开始介绍的一种名为"集中控制"的处理方法,将数据的发送权轮流交给某个站点,根本上避免了碰撞,提供的是无争用的服务,可惜这种方式很少用
第二种就是我们在这里使用分布式协调功能,必须通过协议CA来争取信道的发送权力,这也是802.11必须实现的方式.(也是我们接下来谈论的基础)
5.1.3协议的前置知识
在说明下面的处理方式之前,我还是要确定一点
CSMA/CA提供的仍然是可靠服务,所以我们需要一个确认机制来保证数据能够平稳到达接收方,在这里我们使用停止等待机制来实现可靠服务
5.1.3.1帧间间隔
无论是对于发送方还是接收方来说,在发送自己的数据分组的时候必须要持续检测信道空闲一段时间.而这个空闲时间和以太网不通用,是根据自身要发送的帧来确定需要多长时间.
更高优先级的帧等待时间越短
更低级的帧等待时间更长
借此来实现一个时间上的错位,并且这个等待时间不包括信道忙的时刻.可以把这个时间理解为一个倒计时,倒计时根据帧的优先级而有长有短,但是只有在信道空闲的时候才能走,负责倒计时将被冻结
这个时间段我们称之为帧间间隔IFS,
一般来说,我们最常用的帧间间隔有两种
5.1.3.2虚拟载波监听
虚拟载波监听,是我们用来检测信道是否处于空闲的方法.其实现原理其实也蛮简单的
就是当一个站在发送信息的时候,在这个帧中会携带一个字段,这个字段会声明该次发送会占用多少时间.其他站得到这个信息以后,会调整自己内部的网络分配向量NAV,这个东西可以理解为每个站内的计时器.
通过得到了其他人的持续时间并且记录在自己的倒计时内,就不每次都进行查询了,而是等待倒计时满,就开始认为信道空闲
嘛,简单来说就发送者告诉其他人自己还要用多久,然后其他人就开始拿着秒表等待还需要多少时间
(注意空闲不代表可以发送了,还有自己的退避算法和帧间间隔时间需要等待.)
5.1.3.3退避算法
我们不可能只等待一个帧间间隔,CA采用了一种完全不同的机制,不是检测碰撞,而是避免碰撞
除非一个数据帧不是在上一个数据帧结束以后紧随其后发送的,都要执行一段时间的退避,然后才开始帧间间隔的等待.
我这边举个通俗点的例子:在一段连续的时间里,除了第一个发送的数据帧,剩下的数据帧在发送的时候都需要执行退避算法(先执行对应的帧间间隔,然后再执行一次退避算法的时间)
至于退避的时间不太好整,会有一些奇奇怪怪的随机算法
5.1.4协议的基本工作原理和流程
我们对这个过程经过逐一讲解:
首先发送站检测一段时间的数据空闲,因为它是第一个开始传递数据的帧,所以不需要进行退避算法,等待空闲时间以后,开始执行DIFS帧间间隔.
帧间间隔执行完成以后,就开始发送对应的数据帧(在此期间为信道忙,所以其他站的发送和倒计时被冻结了,在这里也可以看到,帧间间隔也是一种信道忙的状态!!!!)
发送完成,等待一个SIFS,然后发送一个确认分组,此时就恢复信道空闲的一个状态.
这时候首先根据要发送的数据,执行一个DIFS.然后根据回退算法执行一个随机的退避时间,然后,才能发送下一个数据帧.