① 计算机网络(3)| 数据链路层
数据链路层属于计算机网络的低层。数据链路层使用的信道主要是两种类型:
(1)点对点信道 。即信道使用的是一对一点对点通信方式。
(2)广播信道 。这种信道使用的是一对多的光播通信方式,相对复杂。在广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。
首先我们应该了解一些有关点对点信道的一点基本概念。
(1)数据链路 。值得是当我们需要在一条线路上传送数据时,除了有一条物理线路外(链路),还必须有一些必要的通信协议来控制这些数据的传输,若把实现这些协议的硬件和软件加到链路上就构成了数据链路。
(2)帧 。帧指的是点对点信道的数据链路层的协议数据单元,即数据链路层把网络层交下来的数据构成帧发送到链路上以及把接收到的帧中的数据取出并上交给网络层。
点对点信道的数据链路层在进行通信时的主要步骤如下:
(1)结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
(2)结点A把封装好的帧发送给结点B的数据链路层。
(3)若B接收的帧无差错,则从接收的帧中提取出IP数据报上交给上面的网络层;否则丢弃这个帧。
接下来是来介绍数据链路层的三个基本问题,而这三个问题对于各种数据链路层的协议都是通用的。
(1)封装成帧 。指的是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧,从而能够作为数据链路层的基本单位进行数据传输。在发送帧时,是从帧的首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有着明确的规定,且都规定了所能传送的 帧的数据部分 长度上限—— 最大传送单元MTU 。首部和尾部的作用是进行帧定界,帧定界可以使用特殊的 帧定界符 ,当数据在传输中出现差错时,通过帧的帧定界符就可以知道收到的数据是一个不完整的帧(即只有首部开始符而没有结束符)。
(2)透明传输 。从上面的介绍中知道帧的开始和结束标记使用了专门的控制字符,因此所传输的数据中任何与帧定界符相同的比特编码是不允许出现的,否则就会出现帧定界错误。当传送的帧是用文本文件组成的帧时,它的数据部分一定不会出现和帧定界符相同的字符,这样的传输就叫做 透明传输 。为了解决其他类型文件传输时产生的透明传输问题,就将帧定界符的前面插入一个 转义字符ESC ,这种方法称为 字节填充 。如果转义字符也出现在数据中,就在转义字符前面加上一个转义字符,当接收端收到两个转义字符时,就删除前面的那一个。
(3)差错检测 。在现实中,通信链路都不会是完美的,在传输比特的过程当中都是会产生差错的,1变成0或者0变成1都是可能发生的,我们把这样的错误叫做差错检测。在数据链路层中,为了保证数据传输的可靠性,减少差错出现的数量,就会采用各种差错检测措施,目前最常使用的检错技术是 循环冗余校验 。它的原理简单来说就是在被传输的数据M后面添加供错检测用的n为冗余码,构成一个帧数据发送出去。关于n位冗余码的得出方式与检验方式,可以 点击这里进一步了解 。
对于点对点链路,点对点协议PPP是目前使用得最广泛的数据链路层协议。由于因特网的用户通常都要连接到某个ISP才能接入到因特网,PPP协议就是用户计算机和ISP进行通信所使用的数据链路层协议。
在设计PPP协议时必须要考虑以下多方面的需求:
(1)简单 。简单的设计可使协议在实现时不容易出错,这样使得不同厂商对协议的不同实现的互操作性提高了。
(2)封装成帧 。PPP协议必须规定特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确的找出帧的开始和结束的位置。
(3)透明性 。PPP协议必须保证数据传输的透明性。如果说是数据中碰巧出现和帧定界符一样的比特组合时,就要采用必要的措施来解决。
(4)多种网络层协议 。PPP协议必须能够在同一条物理链路上同时支持多种网络层协议(IP和IPX等)的运行。
(5)多种类型链路 。除了要支持多种网络层的协议外,PPP还必须能够在多种链路上运行(串行与并行链路)。
(6)差错检测 。PPP协议必须能够对接收端收到的帧进行检测,并舍弃有差错的帧。
(7)检测连接状态 。必须具有一种机制能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态。
(8)最大传送单元 。协议对每一种类型的点对点链路设置最大传送单元MTU。
(9)网络层地址协商 。协议必须提供一种机制使通信的两个网络层(如两个IP层)的实体能够通过协商知道或能够配置彼此的网络层地址。
(10)数据压缩协商 。协议必须能够提供方法来协商使用数据压缩算法。但PPP协议不要求将数据压缩算法进行标准化。
PPP协议主要是由三个方面组成的:
(1) 一个将IP数据报封装到串行链路的方法。
(2) 一个用来建立、配置和测试数据链路连接的链路控制协议LCP(Link Control Protocol)。
(3) 一套网络控制协议NCP(Network Control Protocol),其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet,以及AppleTalk等。
最后来介绍PPP协议帧的格式:
首先是各个字段的意义。首部中的地址字段A规定为0xFF,控制字段C规定为0x03,这两个字段并没有携带PPP帧的信息。首部的第一个字段和尾部的第二个字段都是标识字段F(Flag)。首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息部分字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而 0x8021表示这是网络层的控制数据。尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS。
接着是关于PPP协议的差错检测的方法,主要分为字节填充和零比特填充。当是PPP异步传输时,采用的是字节填充的方法。字节填充是指当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。而当PPP协议使用的是同步传输时,就会采用零比特填充方法来实现透明传输,即只要发现有5个连续1,则立即填入一个0的方法。
广播信道可以进行一对多的通信。由于局域网采用的就是广播通信,因此下面有关广播通信的讨论就是基于局域网来进行的。
首先我们要知道局域网的主要 特点 ,即网络为一个单位所拥有,且地理范围和站点数目均有限。在局域网才出现时,局域网比广域网有着较高的数据率、较低的时延和较小的误码率。
局域网的 优点 主要有一下几个方面:
(1) 具有广播功能,从一个站点可方便地访问全网。
(2) 便于系统的扩展和逐渐地演变,各设备的位置可灵活地调整和改变。
(3) 提高了系统的可靠性(reliability)、可用性(availibility)、生存性(survivability)。
关于局域网的分类,我们一般是对局域网按照网络拓扑进行分类:
1.星状网: 由于集线器的出现和双绞线大量用于局域网中,星形以太网和多级星形结构的以太网获得了非常广泛的应用。
2.环形网: 顾名思义,就是将各个主机像环一样串起来的拓扑结构,最典型的就是令牌环形网。
3.总线网: 各站直接连在总线上。总线两端的匹配电阻吸收在总线上传播的电磁波信号的能量,避免在总线上产生有害的电磁波反射。
以太网主要有两个标准,即DIX Ethernet V2和IEEE 802.3标准,这两种标准的差别很小,可以不是很严格的区分它们。
但是由于有关厂商的商业上的激烈竞争,导致IEEE 802委员会未能形成一个最佳的局域网标准而制定了几个不同的局域网标准,所以为了数据链路层能够更好的适应各种不同的标准,委员会就把局域网的数据链路层拆成两个子层: 逻辑链路控制LLC子层 和 媒体接入控制MAC子层 。
计算机与外界局域网的连接是通过通信适配器(adapter)来进行的。适配器本来是在电脑主机箱内插入的一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡),这种接口板又称为网络接口卡NIC(Network Interface Card)或简称为网卡。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而适配器和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行的,因此适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。由于网络上的数据率和计算机总线上的数据率并不相同,所以在适配器中必须装有对数据进行缓存的存储芯片。若在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或应当在存储器的什么位置上把局域网传送过来的数据块存储下来。适配器还要能够实现以太网协议。
要注意的是,适配器在接收和发送各种帧时是不使用计算机的CPU的,所以这时计算机中的CPU可以处理其他的任务。当适配器收到有差错的帧时,就把这个帧丢弃而不必通知计算机,而当适配器收到正确的帧时,它就使用中断来通知该计算机并交付给协议栈中的网络层。当计算机要发送IP数据报时,就由协议栈把IP数据报向下交给适配器,组装成帧后发送到局域网。特别注意: 计算机的硬件地址—MAC地址,就在适配器的ROM中。计算机的软件地址—IP地址,就在计算机的存储器中。
CSMA/CD协议主要有以下3个要点:
1.多点接入 :指的是这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。
2.载波监听 :就是用电子技术检测总线上有没有其他的计算机也在发送。载波监听也称为检测信道,也就是说,为了获得发送权,不管在发送前,还是在发送中,每一个站都必须不停的检测信道。如果检测出已经有其他站在发送,则自己就暂时不发送数据,等到信道空闲时才发送数据。而在发送中检测信道是为了及时发现有没有其他站的发送和本站发送的碰撞。
3.碰撞检测 :也就是边发送边监听。适配器一边发送数据一边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。所谓碰撞就是信号之间产生了冲突,这时总线上传输的信号严重失真,无法从中恢复出有用的信息来。
集线器的一些特点如下:
(1)使用集线器的以太网在逻辑上仍然是一个总线网,各个站点共享逻辑上的总线,使用的还是CSMA/CD协议。
(2)一个集线器是有多个接口。一个集线器就像一个多接口的转发器。
(3)集线器工作在物理层,所以它的每一个接口仅仅是简单的转发比特。它不会进行碰撞检测,所以当两个接口同时有信号的输入,那么所有的接口都将收不到正确的帧。
(4)集线器自身采用了专门的芯片来进行自适应串音回波抵消。这样可使接口转发出去的较强的信号不致对该接口收到的较弱信号产生干扰。
(5)集线器一般都有少量的容错能力和网络管理能力,也就是说如果在以太网中有一个适配器出现了故障,不停地发送以太网帧,这是集线器可以检测到这个问题从而断开与故障适配器的连线。
在局域网中,硬件地址又称为物理地址或者MAC地址,这种地址是用在MAC帧中的。由于6字节的地址字段可以使全世界所有的局域网适配器具有不同的地址,所以现在的局域网适配器都是使用6字节MAC地址。
主要负责分配地址字段的6个字节中的前3个字节。世界上凡事要生产局域适配器的厂家都必须向IEEE购买这3个字节构成的地址号,这个地址号我们通常叫做 公司标识符 ,而地址字段的后3个字节则由厂家自行指派,称为 扩展标识符 。
IEEE规定地址字段的第一字节的最低位为I/G位。当I/G位为0时,地址字段表示一个单个站地址,而当I/G位为1时表示组地址,用来进行多播。所以IEEE只分配地址字段前三个字节中的23位,当I/G位分别为0和1时,一个地址块可分别生 2^24 个单个站地址和2^24个组地址。IEEE还把地址字段第1个字节的最低第二位规定为G/L位。当G/L位为0时是全球管理,来保证在全球没有相同的地址,厂商向IEEE购买的都属于全球管理。当地址段G/L位为1时是本地管理,这时用户可以任意分配网络上的地址,但是以太网几乎不会理会这个G/L位的。
适配器对MAC帧是具有的过滤功能的,当适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理,否则就将此帧丢弃。这样做就可以不浪费主机的处理机和内存资源这里发往本站的帧包括以下三种帧:
(1)单播帧:即收到的帧的MAC地址与本站的硬件地址相同。
(2)广播帧:即发送给本局域网上所有站点的帧。
(3)多播帧:即发送给本局域网上一部分站点的帧。
常用的以太网MAC帧格式是以太网V2的MAC帧格式。如下图:
可以看到以太网V2的MAC帧比较的简单,有五个字段组成。前两个字段分别为6字节长的目的地址和源地址字段。第三个字段是2字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议。下一个字段是数据字段,其长度在46到1500字节之间。最后一个字段是4字节的帧检验序列FCS(使用CRC检验)。
从图中可以看出,采用以太网V2的MAC帧并没有一个结构来存储一个数据的帧长度。这是由于在曼彻斯特编码中每一个码元的正中间一定有一次电压的转换,如果当发送方在发送完一个MAC帧后就不再发送了,则发送方适配器的电压一定是不会在变化的。这样接收方就可以知道以太网帧结束的位置,在这个位置减去FCS序列的4个字节,就可以知道帧的长度了。
当数据字段的长度小于42字节时,MAC子层就会在MAC帧后面加入一个整数字节来填充字段,来保证以太网的MAC帧的长度不小于64字节。当MAC帧传送给上层协议后,上层协议必须具有能够识别填充字段的功能。当上层使用的是IP协议时,其首部就有一个总长度字段,因此总长度加上填充字段的长度,就是MAC帧的数据字段的长度。
从图中还可以看出,在传输MAC帧时传输媒体上实际是多发送了8个字节,这是因为当MAC帧开始接收时,由于适配器的时钟尚未与比特流达成同步,因此MAC帧的最开始的部分是无法接收的,结果就是会使整个MAC成为无用帧。所以为了接收端能够迅速的与比特流形成同步,就需要在前面插入这8个字节。这8个字节是由两个部分组成的,第一个部分是由前7个字节构成的前同步码,它的主要作用就是就是实现同步。第二个部分是帧开始界定符,它的作用就是告诉接收方MAC帧马上就要来了。需要注意的是,帧与帧之间的传输是需要一定的间隔的,否则接收端在收到了帧开始界定符后就会认为后面的都是MAC帧而会造成错误。
以太网上的主机之间的距离不能太远,否则主机发送的信号经过铜线的传输就会衰减到使CSMA/CD协议无法正常工作,所以在过去常常使用工作在物理层的转发器来拓展以太网的地理覆盖范围。但是现在随着双绞线以太网成为以太网的主流类型,拓展以太网的覆盖范围已经很少使用转发器,而是使用光纤和一对光纤调制解调器来拓展主机和集线器之间的距离。
光纤解调器的作用是进行电信号与光信号的转换。由于光纤带来的时延很小,并且带宽很宽,所以才用这种方法可以很容易地使主机和几公里外的集线器相连接。
如果是使用多个集线器,就可以连接成覆盖更大范围的多级星形结构的以太网:
使用多级星形结构的以太网不仅能够让连接在不同的以太网的计算机能够进行通信,还可以扩大以太网的地理覆盖范围。但是这样的多级结构也带来了一些缺点,首先这样的结构会增大它们的碰撞域,这样做会导致图中的某个系的两个站在通信时所传送的数据会通过所有的集线器进行转发,使得其他系的内部在这时都不能进行通信。其次如果不同的以太网采用的是不同的技术,那么就不可能用集线器将它们互相连接起来。
拓展以太网的更常用的方法是在数据链路层中进行的,在开始时人们使用的是网桥。但是现在人们更常用的是 以太网交换机 。
以太网交换机实质上是一个多接口的网桥,通常是有十几个或者更多的接口,而每一个接口都是直接与一个单台主机或者另一个以太网交换机相连。同时以太网交换机还具有并行性,即能同时连通多对接口,使多对主机能同时通信,对于相互通信的主机来说都是独占传输媒体且无碰撞的传输数据。
以太网交换机的接口还有存储器,能够在输出端口繁忙时把到来的帧进行缓存,等到接口不再繁忙时再将缓存的帧发送出去。
以太网交换机还是一种即插即用的设备,它的内部的地址表是通过自学习算法自动的建立起来的。以太网交换机由于使用了专用的交换结构芯片,用硬件转发,它的转发速率是要比使用软件转发的网桥快很多。
如下图中带有4个接口的以太网交换机,它的4个接口各连接一台计算机,其MAC地址分别为A、B、C、D。在开始时,以太网交换机里面的交换表是空的。
首先,A先向B发送一帧,从接口1进入到交换机。交换机收到帧后,先查找交换表,但是没有查到应从哪个接口转发这个帧,接着交换机把这个帧的源地址A和接口1写入交换表中,并向除接口1以外的所有接口广播这个帧。C和D因为目的地址不对会将这个帧丢弃,只有B才收下这个目的地址正确的帧。从新写入的交换表(A,1)可以得出,以后不管从哪一个接口收到帧,只要其目的地址是A,就应当把收到的帧从接口1转发出去。以此类推,只要主机A、B、C也向其他主机发送帧,以太网交换机中的交换表就会把转发到A或B或C应当经过的借口号写入到交换表中,这样交换表中的项目就齐全了,以后要转发给任何一台主机的帧,就都能够很快的在交换表中找到相应的转发接口。
考虑到有时可能要在交换机的接口更换主机或者主机要更换其网络适配器,这就需要更改交换表中的项目,所以交换表中每个项目都设有一定的有效时间。
但是这样的自学习有时也会在某个环路中无限制的兜圈子,如下图:
假设一开始主机A通过接口交换机#1向主机B发送一帧。交换机#1收到这个帧后就向所有其他接口进行广播发送。其中一个帧的走向:离开#1的3->交换机#2的接口1->接口2->交换机#1的接口4->接口3->交换机#2的接口1......一直循环下去,白白消耗网络资源。所以为了解决这样的问题,IEEE制定了一个生成树协议STP,其要点就是不改变网络的实际拓扑,但在逻辑上切断某些链路,从而防止出现环路。
虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组,而这些网段具有某些共同的需求。每一个VLAN的帧都有一个明确的标识符,指明发送这个帧的计算机属于VLAN。要注意虚拟局域网其实只是局域网给用户提供的一种服务,而不是一种新型局域网。
现在已经有标准定义了以太网的帧格式的扩展,以便支持虚拟局域网。虚拟局域网协议允许在以太网的帧格式中插入一个4字节的标识符,称为VLAN标记,它是用来指明发送该帧的计算机属于哪一个虚拟局域网。VLAN标记字段的长度是4字节,插入在以太网MAC帧的源地址字段和类型字段之间。VLAN标记的前两个字节总是设置为0x8100,称为IEEE802.1Q标记类型。当数据链路层检测到MAC帧的源地址字段后面的两个字节的值是0x8100时,就知道现在插入了4字节的VLAN标记。于是就接着检查后面两个字节的内容,在后面的两个字节中,前3位是用户优先级字段,接着的一位是规范格式指示符CFI,最后的12位是该虚拟局域网VLAN标识符VID,它唯一的标志了这个以台网属于哪一个VLAN。
高速以太网主要是分为三种,即100BASE-T以太网、吉比特以太网和10吉比特以太网: