计算机网络——链路层②
交换局域网
我们此前研究过使用路由器组成路由局域网的各种理论,现在,我们将研究由链路层交换机组成的局域网。
链路层寻址与地址解析协议
主机和路由器具有链路层地址,这看起来相当多余,因为它们已经具有一个全球唯一(不考虑NAT)的网络层地址了。 这是出于两个理由:
- 链路层和网络层单独寻址允许相同的链路层部件承载不同的网络层协议;
- 链路层地址几乎不可变,因此不需要重新配置。
本节我们将介绍链路层地址和其用处。
MAC地址
主机或路由器的每一个接口(即适配器)具有链路层地址。 原则上讲,链路层交换机的接口不具有这个地址,因为它们不需要被寻址。 交换机透明地执行转发帧的工作,主机和路由器不必明确地寻址到交换机。 实际上,交换机上需要运行一些其他协议(比如防止环路的生成树协议,STP),所以许多链路层交换机接口也有自己的链路层地址。
链路层地址有多种称呼,如物理地址(Physical address)和MAC地址。 对绝大多数局域网(包括以太网和802.11无线局域网)而言,MAC地址为6个字节,通常表示为六个短横线分隔的十六进制数。 设定上MAC地址是永久的,但实际上存在修改它的软件方法。 这里值得注意的是,MAC地址作为链路层的一部分存在,任何使用TCP/IP协议栈的网络,都必须规定链路层地址,这种地址并不是以太网或WiFi特有的。
局域网的正常工作要求同一交换局域网内不同设备的MAC地址必须不同,正如我们此前看到的,在网络层(第三层)搭建的网络不需要使用MAC地址进行寻址。 这和IPv4地址的要求不同,加上其巨大的取值范围,人们暂时还不关心MAC地址耗尽的问题。
MAC地址分为前三字节和后三字节,前三字节由制造商向电气电子工程师学会(Institute of Electrical and Electronics Engineers,IEEE)申请,后三字节由厂商分配。
适配器的MAC地址具有扁平结构,与IP地址的层次结构不同。 从MAC地址并不能判断出一个设备位于哪个子网,相对地,一般情况下,无论设备位于何处,这个地址都不会改变。
当适配器需要向目的适配器发送一个帧时,其通过ARP找到目的适配器的MAC地址,然后把地址插入帧中,发送到局域网上。 对于交换机组成的交换局域网,交换机接收到这个帧后,决定如何转发这个帧。
MAC地址使用个体/群组位(I/G bit)识别一个地址代表单个适配器(单播)还是一组适配器(组播)。
组播地址中最特别的一个是全一的地址FF-FF-FF-FF-FF
,这个地址对应所有接收端,称为广播地址。
地址解析协议
地址解析协议(Address Resolution Protocol,ARP)是一个工作在网络层和链路层之间的协议。 这个协议负责执行从IPv4地址到MAC地址之间的转换,IPv6使用邻居发现协议(Neighbor Discovery Protocol,NDP)执行此功能。 这一协议的报文内容根据链路层协议不同而不同,因为不同的链路层协议可能具有不同的MAC地址约定。
ARP使用ARP表(ARP table)工作。 这张表有三个字段:IP地址,MAC地址和存活时间(TTL)。 进行地址查询非常简单,只需要检查IP地址,然后取出MAC地址即可。 存活时间通常为20分钟,如果20分钟后一个表项还未使用,则将它删除。
现在我们考虑如何填充ARP表。 加入ARP表中没有请求的IP地址,那么请求方,即请求MAC地址一方,会在链路层上直接构造一个特殊的ARP分组。 ARP分组需要包括发送方和接收方的网络地址和物理地址。 请求方填入发送方的IP和MAC地址和接收方的IP地址,但是接收方的物理地址为止,因此使用广播地址。 这个地址会向经过交换机被广播到所有相连的接口上。 收到的主机检查其IP地址,如果相同,则构造回复。 对ARP协议,其请求和回复具有相同的格式,因此被请求方也需要填充上述四个参数。 幸运的是,在ARP请求含有请求方的MAC地址和IP地址,因此被请求方可以填充这些参数。 请求方收到回复,即可填充ARP表。
发送数据到子网之外
我们此前提到过,我们只要求交换局域网内的MAC地址唯一,而此前的ARP解析直接工作在链路层上,不含有网络层信息,因此不能被路由器转发。 这两种困难导致ARP只能在一个子网(即路由局域网)中工作,而不能跨越路由器将数据传输到子网之外。
子网是一个网络层概念,因此转发到子网之外显然需要借助网络层手段,实际上,这正是通过路由表实现的。
此前介绍路由表时提到过,路由表中含有网关(Gateway)字段,这一字段可以用来跨越子网。
网关是指连接多个网络的硬件设备,在我们的讨论中,通常指的就是路由器。
如果匹配的IP地址在同一子网中,这一字段通常用0.0.0.0
(IPv4)或::
(IPv6)表示。
网络层在将数据报交付给链路层的时候,首先检查目的IP地址对应路由表中的网关,如果在同一子网内,那么通知链路层直接选择使用ARP解析得到的接收方MAC地址。 相对地,如果不在同一子网内,那么通知链路层使用ARP解析得到网关的MAC地址,将帧交给网关。 网关(即路由器)收到此帧后,根据网络层数据进行路由,得出目的地的MAC地址(无论是使用接收方还是继续使用网关地址),再封装成帧,如此往复,直至发送到接收方。
值得注意的是路由器的两个端口之间可能不使用相同的链路层协议,比如家用路由器就同时支持以太网和802.11 WiFi。 幸运的是,只要仍使用TCP/IP协议栈,那么MAC地址的形式就是相同的,只是路由器必须使用不同的结构来封装链路层帧。
以太网
我们将研究现在在有线局域网中占有绝对优势的以太网。 其竞争者,如令牌环、FDDI或ATM已基本退出市场。
早期以太网使用总线型结构,以同轴电缆总线连接各个节点。 这种局域网是广播局域网,所有传输的帧将到达所有总线上的适配器,因此也会出现碰撞问题。 此时以太网使用二进制指数回退的CSMA/CD多路访问协议解决碰撞。
之后,以太网使用集线器(Hub)实现星型拓扑。 所有节点使用双绞铜线连接至集线器,集线器,作为一种物理层设备,把任何接收到的比特转发给所有连接的节点。 显然,这种结构也会导致碰撞。
到现在,以太网使用交换机替代了集线器。 交换机利用缓存把所有连接转换成点对点的连接,因此不再需要使用特别的以太网协议来避免碰撞。 我们将在之后仔细研究交换机。
以太网帧由以下几个部分依次构成:
- 前同步码(Preamble),8个字节。前七个字节为
10101010
,最后一个字节为10101011
。交替出现的10
是用来进行时钟同步的。 - 目的地址和源地址,各6个字节。
- 以太网类型(EtherType),两个字节,指明数据使用的协议类型,如ARP对应
0x0806
。 - 数据,至多1500字节。
- CRC,4个字节。
以太网提供无连接的、不可靠的服务。 在发送数据之前,两个适配器并不在以太网层面进行握手。 以太网除了最基础的CRC校验,当校验失败时,适配器就会丢弃该帧,但不发送任何否定确认,也不进行重传。
以太网并不是单一的协议,而是一族使用统一帧格式的协议,包括链路层和物理层协议,的统称。
这些协议具有眼花缭乱的各种缩写,典型如10GBASE-T。
绝大部分以太网技术已经被IEEE标准化为802.3 CSMA/CD。
这些以太网协议的命名按照以下规律进行:
首先是标准的名义速率,如果没有单位则是Mbps;
然后是传输方式,BASE
表示基带(Baseband),即信号不进行调制,还可能是BROAD
(宽带)或PASS
(带通);
最后是物理媒体,T
表示双绞铜线(Twisted pair)。
之后还有表示编码方式和物理信道数的额外字符,具体内容参见此页面。
链路层交换机
现在我们来研究传统链路层交换机的工作原理,这种交换机仅工作在第二层,也不使用SDN。
链路层交换机的作用就是接收链路层帧,然后把它们转发到对应的出口链路。 这种转发是透明的(Transparent),网络中的主机和路由器不会意识到交换机的存在,也不会主动寻址到交换机。 和路由器类似,交换机也在出口链路处使用队列来缓存暂时不能转发的帧。
利用出口链路的缓存,交换机保证同时只在一条链路上发送一个帧。 考虑到大部分链路都是全双工的,即发送和接受互不干扰,且都是点对点的,只要两端都保证同时只发送一个帧,就不会发生碰撞。
交换机只有两个功能:转发(Forwarding)和过滤(Filtering)。 顾名思义,转发交换机决定表示把一个帧发送给哪个出口链路,而过滤表示交换机决定是否丢弃一个帧。
交换机的决策是通过交换机表(Switch table)完成的,这个表有时也叫转发表,容易和网络层的转发表混淆。 交换机表含有三个字段:一个MAC地址、通向该地址的接口的物理编号和表项放置在表中的时间。 不难看出其字段实际上和网络层转发表几乎一致,只是MAC地址替代了IP前缀。
交换机对于其接收到的每一帧,利用目的地址根据交换机表做出如下决策:
- 若目的地址不在表项中,则向除了接收到该帧的链路之外的所有链路转发该帧,这种行为称为洪泛;
- 若目的地址在表项中,且目标链路和接收到该帧的链路相同,那么过滤(即丢弃)该帧;
- 若目的地址在表项中,且目标链路和接收到该帧的链路不同,那么向目标链路转发该帧。
交换机以自学习的方式构造交换机表。
- 首先,交换机表为空;
- 然后,每当在某个接口接收到某个帧,交换机就会把这个帧的发送端MAC地址、接口编号和当前时间放在交换表中;
- 如果经过一段时间后,交换机没有再从这个端口接收到同一地址的帧,就把这一项删除。
交换网络和路由网络
路由器和链路层交换机都是分组交换机的一种,一个工作在第三层,利用网络地址进行转发,一个工作在第二层,使用物理地址进行转发。 交换机和路由器都能形成局域网,但是它们各有优劣。
交换机是即插即用的,即其转发表是自动学习的,不需要人工干预。 由于工作在链路层,其转发和过滤效率较高。 然而,链路层不提供防止环路的服务,因此必须用某种方式将网络拓扑限制为一棵树。 有一些协议可以自发地让网络实现这种配置,自然,让交换机通信意味着其必须具有物理层地址。 大型的交换网络需要大型的ARP表,这将产生可观的流量。 同时,交换网络也不为广播风暴提供任何保护。
路由器需要较复杂的配置,但复杂的路由选择算法可以防止环路的出现。 即使错误的配置导致环路,IP首部的TTL字段也可防止分组循环。 同时,路由器,由于工作在网络层,可以实现多种链路层协议的路由,比如跨越以太网和WiFi的路由,而交换机仅能在一种链路层上工作。
出于折衷的考虑,商家推出了第三层交换机这种具有部分或全部路由器功能的交换机。 这种交换机和路由器的区别在于其主要使用硬件而非软件进行路由,因此效率更高,同时这种交换机通常也只支持一种链路层协议。
如同前几章所述,使用SDN的可管理交换机也可工作在多个层上。
虚拟局域网
使用交换机构成的局域网有几大缺点:
- 缺乏流量隔离:广播流量将到达整个网络,诸如ARP之类的合法请求或交换机毒化导致的大量洪泛流量会到达整个局域网中的所有主机,不利于性能或安全;
- 交换机使用率低:通常交换机具有很多接口,如果一个局域网中只有几个主机,那么大量的接口不会被使用;
- 用户管理困难:若需要移动局域网则必须重新布线。
这些问题可以被使用虚拟局域网(Virtual LAN,VLAN)的交换机解决。 在基于端口的VLAN中,交换机的端口由网络管理员划分为几个分组,每个分组构成一个VLAN。 这个VLAN中的主机彼此相互通信,其他接入同一交换机但是不在同一VLAN中的主机不会感知到它们的存在。 特别地,这个VLAN构成一个广播域,即所有广播只会在同一个VLAN中被转发。
通过合并交换机并配置虚拟局域网就可以解决第二个问题。 虚拟局域网的配置可以被网络管理员任意修改,因此第三个问题也容易解决。
当然,完全隔离几个虚拟局域网会导致局域网之间无法通信,解决这种问题的方法是分配一个供所有VLAN使用的端口,然后在其上连接一个路由器。
如果要拓展虚拟局域网怎么办呢? 最简单的方法就是直接在某个接口上接上另一个交换机。 但这种方法会导致每一个虚拟局域网都必须接上新的交换机,而不能让新的交换机同时为多个VLAN提供服务,除非为每个VLAN接一根线。
一种更具有拓展性的方法称为VLAN干线连接(VLAN trunking)。 交换机上一些特殊接口被配置为干线端口,发送到任何VLAN的帧都会经过干线转发到其他交换机。
IEEE使用802.1Q作为以太网帧格式的拓展来区分一个帧到底是属于哪个VLAN的。
这种帧格式在以太网类型之前依次附加了标签协议标识符和标签控制信息,共4字节,通称VLAN标签(VLAN tag)。
标签协议标识符有两个字节,表示这个帧启用了802.1Q拓展,其值固定为0x8100
。
标签控制信息中包含一个12比特的VLAN标识符字段,用来表示这个帧属于哪个VLAN。
VLAN不仅可以通过端口定义,也可以通过MAC甚至IP地址定义,甚至可以跨越IP路由器。