数据链路层的基本作用
· 数据链路层需要解决如何把数据从一个节点传输到下一个节点。
· 如下图,无论是局域网还是互联网,每个节点之间的数据传输都要通过数据链路层来完成。
· 总的来说,数据链路层实现相邻节点之间的通信,为网络层提供服务。
· 如上图,H1到H2之间所经过的网络可以是多种不同类型的,不同的链路层可能采用不同的链路层协议。
· 数据链路层使用的信道标准通常为点对点信道和广播信道:
使用点对点信道的数据链路层
· 链路(Link):一条无源(不修改数据,只传输)的点到点的物理线路段,中间没有任何交换节点,一条链路只是一条通路的一个组成部分(整条通路包含多条链路)。
· 数据链路(Data Link):除了物理链路外,还需要通信协议来控制数据传输。简单来说就是在物理链路的基础上加上协议软件。现在的主流方法都是通过适配器(网卡)来实现这些协议的硬件和软件,一般的适配器包括了数据链路层和物理层这两层功能。
· 帧(Frame):数据链路层传送的基本单位,可以看到,网络层的IP数据报到链路层中封装成帧,然后通过物理层传输,到达下一个节点后,再在链路层中解封,取出IP数据报交给网络层。
· 数据链路层就像一个数字管道,它不需要关心物理层如何实现比特传输。
· 既然要完成上面这些工作,那数据链路层就要解决三个基本问题:封装成帧、透明传输、差错控制。
· 封装成帧(Framing):
就是在一段数据的前后添加首部和尾部,从而构成一个帧。
首部和尾部的重要作用就是帧定界,用于描述帧的开始和结束。当数据是ASCII码组成的文本时,可以采用特殊的帧定界符来作为首部和尾部,如控制字符(Start of Header,SOH)和(End of Tail,EOT)用于表示开始和结束。
帧的数据部分必须小于等于最大传输单元(Max Transport Unit,MTU),这是因为通路上的不同链路对数据的大小限制不一样,为了防止传输失败,必须要小于等于MTU。
· 透明传输:
如果数据中的某个字节恰好出现了SOH或EOT,就会导致数据链路层找到错误的帧边界,从而破坏了帧的完整性。
为了解决这个问题,我们就需要对数据链路层传输的数据做透明处理,无论什么数据都可以被传输。
字节填充:可以在特殊字符前面添加一个字节ESC,这样数据链路层就不会解析错误了。这对于网络层是透明的,因为网络层不会得知数据被修改了。
· 差错检测:
注意,是检测,不是控制,控制意味着既要检测也要纠正,而在链路层中纠正错误成本比较高,因此我们只做检测。
循环冗余检验(CRC):在发送端先把数据划分为组,每组k个比特,然后在每组后面添加供差错检测用的n位冗余码,然后一起发送出去。
冗余码计算方式:
- 假设一组有k=6个比特,设某一组为M=101001。
- 选择一个生成多项式,如x^3+x^2+1,其对应的二进制表示为1101,因为x^3和x^2系数为1,而x的系数为0,最后一位为1。这样就可以确定除数为1101。
- 然后,因为生成多项式最高次项为3,因此需要在M后面补3个0以便后续除法。所以确定被除数为101001000。
- 然后进行除法运算,计算过程如下。
- 得到的余数001即可作为冗余码。
然后把原始数据拼接上冗余码一起发送出去即可。
然后接收方只需要使用相同的生成多项式对收到的数据进行除法操作检验即可,如果余数为0则接受,不为0则拒绝。如上述例子的检验为R=101001001/1101=0,则接受。
我们把添加上去的冗余码称为帧检验序列(Frame Check Sequence,FCS)。
注意区分CRC和FCS,CRC是一个完整的校验方法,而FCS只是一个冗余码。
值得注意的是,单纯使用CRC检测技术不能实现"无差错传输"或"可靠传输"。因为CRC只是一个检测技术,并没有控制错误发生的时候要如何纠正!
数据链路层为网络层提供无差错的服务,因为有差错的都被直接拒绝了。
点对点协议 Point-to-Point Protocol
· 对于点对点的链路,目前使用最广泛的数据链路层协议是PPP协议,早在1994年就成为了互联网的正式标准。
· 用户与ISP之间建立一条虚拟的"直接"链路。
· PPP协议是一个面向连接的协议,是一个不可靠的协议。
· PPP协议应该满足的要求:
简单:越简单越易于维护,就越可靠。
封装成帧:规定特殊字符作为帧定界符。
透明性:保证数据传输的透明性(不会因为数据中包含帧定界符而导致帧被破坏)。
多种网络协议:在同一条链路上要支持多种网络层协议。
多种类型链路:能在多种类型的链路上运行,如串口链路、电话线、移动电话、光纤等。
身份验证功能:顾名思义。常用PAP(简单,安全性不高)和CHAP(复杂,安全性高)。
差错检测:能检测错误但不修改,因此PPP协议是不可靠协议。
检测连接状态:能及时自动检测出链路是否正常工作。
最大传输单元:必须设置MTU,一般为1500字节。
网络层地址协商:提供机制让通信的两个网络层实体可以通过协商知道彼此的网络层地址。
数据压缩协商:提供机制协商一种数据压缩算法。
· PPP协议不需要的功能:
纠错:本身链路可靠性比较高,如果加上纠错成本就会增加很多。
流量控制:接收方控制发送方的流量,防止接收方缓存溢出。不需要,每个节点接收到数据很快就转发出去了。
序号:用于进行可靠传输时对分片进行编号,以便重传。纠错都不用了,就更不需要序号了。
多点线路:即一个发送方多个接收方,很明显不用,不然就不叫点对点了。
半双工或单工通信:效率很低,不需要。
· PPP协议由三个部分组成:
一个将IP数据包封装到串形链路的方法。
链路控制协议(Link Control Protocol,LCP)。
网络控制协议(Network Control Protocol,NCP)。
· PPP协议帧的组成如下:
首部字段:
- Flag:固定为0x7E,用于指示帧的开始。
- Address:目标地址,只设置为0xFF,即全1,即广播地址。
- Control:控制字段,只设置为0x03,表示无序号的信息帧。
- Protocol:协议,标识信息部分封装的网络层协议类型,用于实现多路复用。
信息部分:不超过MTU的IP数据报。
尾部字段:一个用于检测差错的帧校验序列字段FCS,一个结束Flag,和首部一样,为0x7E。
· 链路控制协议(LCP):
封装在一个PPP的LCP分组中,可以看到,Protocol的地方填写了LCP的代码0xC021。
职责:建立、配置、维系、确认并终止链路。不同的CODE表示不同的操作。
· 网络控制协议(IPCP):
用于承载IP分组的链路:
· PPP的透明传输问题:
异步传输:使用一种特殊的字符填充法,如前面介绍的在特殊字符前面加上一些字符防止被识别错误。
同步传输(一连串比特连续传送):采用零比特填充。
· PPP协议的工作状态流程图:
使用广播信道的数据链路层
· 局域网的主要特点是网络为一个单位所拥有,可以是一个人、一个家庭、一个公司等,它的地理范围和站点数目很有限。
· 局域网拓扑结构:
· 共享信道带来的问题:若多个设备在共享信道上同时发送数据,则会造成彼此干扰,导致发送失败。
· 采用静态划分信道的方式(频分、时分、波分、码分复用)解决?不行,需要在信道上有一个管理机去分配,难以实现。
· 采用动态媒体接入:
随机接入:多个主机同时发送数据,随机选一个先发送。
受控接入:多点线路探询(Polling),或轮询。
· 以太网的两个标准:
DIX Ethernet V2: 世界上第一个以太网产品的规约。
IEEE 802.3: 第一个IEEE的以太网标准。
二者其实只有很小的差别,且可以互相兼容,因此可以将802.3局域网称为以太网。
但是严格来说,以太网应该指的是符合DIX Ethernet V2标准的局域网。
· 为了让数据链路层更好的适应多种局域网标准,就把局域网的数据链路层拆分为2个子层:
逻辑链路控制(Logic Link Control,LLC),放置与传输媒体无关的内容。
媒体接入控制(Medium Access Control,MAC),与传输媒体有关的内容。
不管采用何种协议的局域网,对LLC子层来说都是透明的。
现在,由于TCP/IP体系经常使用的局域网是DIX Ethernet V2而不是802.3,因此LLC层的作用已经不大了,很多厂商生产的适配器上就只安装了MAC协议而没有LLC协议。
· 网卡:
又称网络适配器(Adapter)、网络接口卡(Network Interface Card,NIC)。
主要作用有:
- 进行串、并行转换。
- 对数据进行缓存。
- 在计算机操作系统上安装驱动程序。
- 实现以太网协议。
· CSMA/CD协议:
最初的以太网是将多台计算机都连接到一根总线上,这样易于实现广播通信,既简单又可靠。
在广播信道中,为了实现一对一通信,可以将接收站的硬件地址写入帧首部中目的地址的字段中,仅当数据帧中的目的地址与适配器的硬件地址一致时才可以接收该数据帧。
总线通信有一个很明显的缺点,就是多个站点同时发送时,会产生碰撞和冲突,导致发送失败。
为了解决这个问题,CSMA/CD协议就诞生了。该协议为载波监听多点接入/碰撞检测(Carrier Sense Multiple Access with Collision Detection):
- 多点接入(MA):多台计算机以多点接入的方式连接到一条总线上。
- 载波监听(CS):每一个站在发送数据前先检测总线上是否有其他计算机在发送数据,如果有则暂时不发送,否则发送。
- 碰撞检测(CD):计算机边发送数据边检测信道上信号电压大小。因为当几个站同时在信道上发送数据时,总线上的信号电压摆动值会增大(互相叠加),当摆动值超过一定阈值时,就认为总线上有至少两个站在发送数据。当检测到碰撞后,就立即停止发送,然后等待一段随机时间再重新开始发送。
检测碰撞需要多长时间?
从图中可以看到,A要经过2\tau - \sigma的时间才能检测到发生碰撞,是B发送数据时和A第一次发送发生碰撞。
所以,A需要单程传播时延的2倍时间才能检测到碰撞,即t=2\tau。
我们把以太网端到端往返的时间t=2\tau称为争用期,或碰撞窗口。最先发送帧的站,最多经过t=2\tau就可以检测到数据是否发生了碰撞,经过这段争用期还没检测到碰撞,后面就可以放心大胆地发送数据了,因为此时其他站都会检测到信道被占用,不会发送数据。
对于10Mb/s的以太网来说,争用期t=51.2 \mu s,计算下来争用期内可以发送512bit,即64字节的数据。所以我们可以说,若前64字节都没发生冲突,那后面就绝对不会发生冲突。
这就是为什么我们需要设置最大帧长度,比如我们设置为64,那第一个帧若正常发送,后面都可以发,若检测到碰撞,那后面的帧就不发了。
随机等待时间如何计算?
截止二进制指数算法:
举个例子:
如何保证所有站点都能收到碰撞信号?
- 如下图,B与A发生碰撞时,B可能只发送了几个bit的数据就停止了,非常少,这个信号是非常弱的,那在网络远端的站点,如A,可能就无法收到B的数据,导致检测不出来碰撞。
- 要解决这个问题,很简单,让B人为的发出一个干扰信号即可。
帧间最小间隔:设置为9.6 \mu s,相当于发送96bits的时间。这个时间指的是一个站检测到信道是空闲时,再等待9.6微妙的时间再发送,这样做是为了让刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。
值得注意的是,CSMA/CD协议是半双工通信的,即双向交替通信。
由于争用期期间碰撞的可能性的存在,整个以太网的平均通信量远小于其最高通信数据率。
最后总结一下CSMA/CD协议:
· 为了通信方便,降低成本,快速获得市场认可,以太网采取了两个重要措施:
采用较为灵活的无连接工作方式:
- 不必先建立连接再发送;
- 不必为数据帧编号,不要求对方回应确认;
- 所以以太网提供的是不可靠的服务,即"尽最大努力交付";
- 检测到差错直接丢弃,纠错交给高层;
- 使用CSMA/CD协调总线上的多个站点。
发送的数据采用曼切斯特编码:
- 优点:自同步
- 缺点:所占频带宽度比原始基带信号增加了一倍。
· 以太网最初通过一条总线连接所有站点,但稳定性很差,一旦总线发生故障,所有站点都会瘫痪。
· 因此,在1990年,IEEE制定出采用双绞线的星形以太网10BASE-T标准802.3i。
该标准使用无屏蔽双绞线,星形拓扑结构,集线器采用了大规模集成电路,因此总体可靠性显著提高。
值得注意的是,10BASE-T的通信距离稍短,每个站点到集线器的距离不超过100米。
这个标准奠定了以太网在局域网中的统治地位,它具有很高的性价比。
· 集线器很像一个多接口的转发器,它工作在物理层:
使用集线器来组网,虽然物理上是一个星形结构,但逻辑上仍然是一个总线网络,各工作站仍然使用CSMA/CD协议。
· 以太网信道利用率:
之前我们在学习CSMA/CD协议的时候就知道,每个站点发送前要经过争用期,这样就导致一个帧的平均发送时长其实很长。
成功发送一个帧需要占用的时间为T_0+\tau,除了本身时间之外,还多一个单程端到端时延。
我们定义\alpha = \tau / T_0为信道的利用率,很明显:
- a越小,表示一发生碰撞就能很快检测出来,并立即停止发送,故信道利用率很高。
- a越大,表示争用期所占比例增大,每发生一次碰撞就浪费许多资源,故信道利用率很低。
所以,我们肯定希望a越小越好:
- 当数据率一定时,以太网的连线长度要受到限制,否则\tau会过大。
- 以太网的帧长不能太短,否则T_0会太小。
信道利用的最大值:
- 理想情况下的极限信道利用率为:
- 据统计,以太网利用率达到30%就已经是重载,很多网络资源都被碰撞消耗掉了。
- 所以,无论是总线还是集线器,以太网的利用率都非常低。
· 以太网MAC层的硬件地址:
MAC地址在生产网卡的时候被固化在网卡的ROM中,因此,MAC地址也叫物理地址或硬件地址,与物理网络有关。
每个以太网MAC地址都是全球唯一的。
MAC地址由48位构成,通用名称是EUI-48,理论上若每天用1000W个,4W年都用不完。
前三字节(高24位)为组织唯一标识符,由管理机构向厂家分配,后三字节(低24位)为扩展唯一标识符,由厂家自己指定,但要保证无重复。
帧中的目的MAC地址分为3类:
- 单播(unicast):一对一。
- 多播(multicast):一对多,目的地址始于01:00:5e:......。
- 广播(broadcast):一对全体,目的地址全1,即ff:ff:ff:ff:ff:ff。
网卡在接收到帧之后,会先用硬件检查该帧是否是发往本站的,如果是则收下。所有网卡都至少能识别单播和广播地址。以混杂模式(promiscuous mode)工作的网卡不会做判断,来什么收什么。
· 以太网MAC帧的格式:
我们知道以太网有两个标准,DIX Ethernet V2和IEEE 802.3。最常用的MAC帧是DIX Ethernet V2的格式的。
MAC帧由目的地址、源地址、类型、数据、帧校验序列组成。然后,在物理层会在头部插入8个字节的前同步码和帧定界符。
类型字段和PPP帧一样,实现复用,用于标识上层用的是什么协议。
当IP数据报的长度小于46字节时,会在数据字段后加入整数字节的填充字段以保证以太网MAC帧长度不小于64字节。
若遇到无效帧则直接丢弃即可:
扩展的以太网
· 在物理层扩展以太网:
使用光纤:用光纤把网卡连接起来。
使用集线器:将多个以太网段连成更大的、多级星形网络。
- 碰撞域:顾名思义,会产生碰撞的网络区域,碰撞域越大碰撞几率越高。
- 广播域:网络中任何一台设备发出的数据都能被其他设备接收。
- 既然区域变大了,那碰撞概率和广播风暴都会变多,这不是我们所希望的,所以希望缩小区域,但是我们又不希望放弃扩大区域带来的扩大地理范围的好处。
- 早期使用网桥,现在使用交换机(Switch)来解决这个问题,交换机工作在数据链路层。
- 使用了交换机之后,就可以实现在扩大地理范围的同时,碰撞区域不会随之变大。可以看到,整个广播域包含了3个碰撞域,每个碰撞域之间互不影响。
- 除此之外,连接到交换机的用户是独享带宽,这样就变相增加了总容量。
- 除此之外,交换机以全双工的方式工作,同时具有并行性(多台主机同时通信),以及支持多种速率的接口。
- 交换机有2种工作方式:
- 交换机在收到一个帧时,会先查找MAC地址表,根据帧中的目的MAC地址进行转发、丢弃或广播。
· 交换机通过自学习算法进行自动维护MAC地址表的过程如下:
存储:
- A向B发送一帧,该帧从接口1进入交换机。
- 交换机收到帧后,先检查地址表,此时没有查到应从哪个端口转发给B。
- 交换机把这个帧的源地址A和对应的接口1写入地址表。
转发帧:
- 交换机向除接口1外所有接口广播这个帧。
- 只有B的站的MAC地址与该帧目的地址相同,故B接收,CD丢弃该帧。
再存储:
- 此时B向A发送一帧,查地址表,发现已经有A的端口了,直接转发。
- 同时,把B的MAC地址与对应的端口写入地址表。
考虑到有时候可能要在交换机的接口更换主机,所以设置了一个有效时间,过期的项目会被自动删除。
交换机的自学习算法使其可以即插即用,我们也通常说交换机具有记忆功能。
总结一下:
做个简单的练习:A->B时,S1先记录A-1,同时通过5号端口与S2通信,让S2同步记录A-5;C->E时,S1先记录C-2,同时S2同步记录C-5;E->A时,S2先记录E-1,同时S1同步记录E-5。
回路问题:若两台交换机通过两个端口连接起来,就会产生回路问题。两台交换机会因为不断广播而不断循环发送这个帧,最终给网络的稳定性造成影响。
交换机采用生成树协议(Spanning Tree Protocol,STP)来解决这个问题。基本思想是不改变拓扑结构的情况下,在逻辑上切断某些链路,使得一台主机到其他所有主机的路径是无环路的树状结构,从而消除兜圈子现象。
· 虚拟局域网(VLAN):
我们刚刚通过交换机扩大了广播域,这虽然提升了地理距离,但是当交换机进行广播的时候,会对整个广播域的所有交换机进行广播,这样其实对其他交换机还是存在不少干扰的。
因此,我们希望在不减小广播域的前提下,减小广播的范围,所以我们提出了虚拟局域网VLAN。
如图,我们把原本9台计算机的大广播域通过VLAN划分为3个小广播域,那此时B1进行广播的时候就只能广播给VLAN2中的B2和B3,VLAN1和VLAN3的计算机不会接收到广播。
虚拟局域网可以有效限制接收广播信息的工作站数,使得广播不会因为传播过多的广播信息(即广播风暴)而引起性能恶化。改善了性能、简化了管理、降低了成本、改善了安全性。
建立VLAN有多种方式(补充):
构成VLAN的方式:
- 在原始的MAC帧上面添加一个长度为4字节的标记字段,其中包含了VLAN标识符,用于指示能接受该帧的VLAN。
- 这个字段的添加由交换机负责维护,因此上层用户是感觉不到的。
构成VLAN之后,如果我还希望某些情况下不同VLAN可以通信,那就需要让网络层来解决这个问题了,需要用到三层交换机或者路由器。
高速以太网
· 我们把速率超过100Mb/s的以太网称为高速以太网(100BASE-T)。IEEE于1995年定义100BASE-T为高速以太网的正式标准,代号为IEEE 802.3u。
· 其特点是:
以全双工的方式工作,故不需要碰撞检测,即不需要使用CSMA/CD协议。
MAC帧的形式仍然是802.3的标准,没变。
最短帧长保持不变,但是一个网段的最长电缆减少到100米。
· 吉比特以太网:
允许在1Gb/s下以全双工/半双工两种方式工作。
MAC帧的形式仍然是802.3的标准。
半双工下仍需碰撞检测CSMA/CD,全双工下不用。
其物理层标准如下:
在半双工下要进行碰撞检测,但是网速1Gb/s那么快,传输64字节的数据几乎是一瞬间完成的事情,这样检测起来就很麻烦,因此吉比特以太网提出了两种技术解决这个问题:
- 载波延伸:最短帧长仍为64字节(保持兼容性),同时把争用期增大为512字节。凡是小于512字节的MAC帧,都会在尾部填充一些特殊字符以达到512字节,接收端要删除这些填充后才能向高层交付。
- 分组突发:如果有很多短帧要一起发送的话,一直做载波延伸很浪费资源和时间,因此我们提出分组突发。当很多短帧一起发送时,第一个短帧先载波延伸,随后的短帧即可一个个发送,只留必要的帧最小间隔即可。思想就是把多个短帧拼在一起构成一个长帧。
· 10Gb/s的以太网和更快的以太网:
除了速度提升之外,与1Gb/s以太网还是有不少区别的。
与10Mb/s,100Mb/s,1Gb/s以太网的帧格式完全相同。
保留802.3标准的最小、最大帧长,以便升级。
不再使用铜线而只使用光纤作为传输媒体。
只工作在全双工工作方式,不需要使用CSMA/CD进行碰撞检测。
· 端到端的以太网传输:
以太网的工作范围已经从局域网,实现到了城域网、广域网,从而实现端到端的传输。
这种工作方式的好处是:技术成熟、互操作性好、价格便宜、采用统一的以太网帧,方便管理。
· PPPoE:
以太网没有用户鉴别的功能,当ISP要用以太网接入互联网的时候,就必须解决这个问题。
PPPoE(PPP over Ethernet,即在以太网上运行的PPP),利用PPP协议的用户鉴别功能解决用户身份的问题。
常见的PPPoE接入方式有:
PPPoE将PPP帧封装到以太网中: