本章概要 本章主要介绍用于服务器端的数据链路层和网络层的技术,以及使用这些技术时的设计要点。 最近这几年,和网络相关的基础技术并未取得较大发展,不过倒是变得越发纯粹和简练了。然而,用于服务器端和客户端的刀片服务器和虚拟化技术等却在日新月异地进步,人们追求的网络形式也在不断发生变化。我们要好好理解这些技术和规格,设计出最符合客户需求的逻辑结构,以灵活应对这些变化。 2.1 数据链路层的技术 数据链路层在物理层的上方提供了一种能够正确且稳定地传输比特流的结构。物理层仅仅负责将比特流转换成信号并传递给线缆,既不知道信号会发往何处,也不在意 某一位是否会在某处丢失。数据链路层则刚好能够弥补物理层的这个短处,它能生成通往相邻 设备的逻辑传输路径(数据链路),检查出其中的传输错误并将错误修复,从而确保物理层的可靠性。 2.1.1 数据链路层是物理层的帮手 数据链路层是用于确保物理层可靠性的层。数据链路层中的“数据链路”表示由它生成的、和相邻设备(节点)之间的逻辑传输路径。 为了判断应针对哪个节点生成数据链路以及生成的数据链路中是否有位缺失,数据链路层会对数据进行封装处理,确保物理层的可靠性。在数据链路层进行的这种数据封装处理叫作成帧,封装之后的数据叫作帧。在数据链路层定义了成帧的各种方式。数据链路层位于网络层和物理层之间,是从下往上数的第二层。发送信息时,数据链路层将来自网络层的数据(数据包)封装成帧后交给物理层;接收信息时则对来自物理层的比特流做一个和成帧恰好相反的处理,然后交给网络层。 图2.1.1 在数据链路层将数据封装成帧 用以太网标准进行成帧处理 下面,我们来看看承担着数据链路层核心作用的封装处理“成帧”具体是怎么一回事。 数据链路层和物理层是同甘共苦、休戚与共的关系,成帧的规格也和二者紧密相连。以往有令牌环网、帧中继、PPP等林林总总的各式规格,不过现在我们只需记住以太网(IEEE802.3)这一个就够了,接下来本书将为你讲解以太网(IEEE802.3)是如何进行成帧处理的。 图2.1.2 通过封装成帧确保位不会丢失 以太网的成帧规格可粗略划分为EthernetⅡ(DIX)和IEEE802.3这两种。IEEE802.3是将EthernetⅡ改良之后根据IEEE标准制定出来的,但实际上大多数数据通信使用的还是EthernetⅡ规格。EthernetⅡ的帧格式已经保持20多年没变了,是一种非常简约而又容易理解的格式。EthernetⅡ给数据(数据包)添加前导码、帧头和FCS(Frame CheckSequence,帧校验序列)。 前导码相当于发送帧的信号 前导码是一个8字节(64位)的位数组,相当于一个“我要发送帧了哦”的信号。它和“10101010……(中间省略)……10101011”的位数组一定是一样的。对方看到这个特别的位数组之后就能知道即将会接收到帧。 帧头决定将信息发至何处 帧头由三个字段构成,分别为目的MAC地址、源MAC地址和类型。 目的MAC地址/源MAC地址 那么,发送数据时应生成一个始于何处终于何处的数据链路,又要发送怎 样的数据呢?这些都由帧头定义。在以太网中,一般会用一个长度为6字节(48位)、叫作MAC地址的识别信息去识别节点。发送数据的节点在目的MAC地址里写入目的节点的MAC地址,这便是数据链路的终点;在源MAC地址里写入本机MAC地址,这便是数据链路的起点。 类型 类型决定数据部分的数据包使用何种协议,网络层协议决定这里的具体数值是多少。下表中列出了部分具有代表性的协议类型代码。 表2.1.1 具有代表性的协议类型代码 数据即IP数据包 这里说的数据指的是从网络层发来的数据包。有时候也可将其视为LLC(LogicalLinkControl,逻辑链路控制)数据,不过EthernetⅡ中并没有LLC子层的处理。 因此,我们可以认为数据即IP数据包。帧能够传输的数据长度默认最大值为1500字节①,这个最大值叫作MTU(MaximumTransmissionUnit,最大传输单元)。当数据长度超过1500字节时,必须对整个MTU进行数据分段和封装,然后再转发到节点。关于MTU的内容将在3.1.1.3节中详细说明。 ① 我们也可将默认最大值设置成大于1500字节的数字。默认最大值大于1500字节的帧叫作巨型帧。 用FCS检查数据错误 FCS(FrameCheckSequence,帧校验序列)字段用来检查数据是否发生了错误。发送方在发送信息时会对帧头和数据进行一定的计算(校验和计算,又称CRC,即循环冗余校验),并将计算结果添加到FCS中去。接收方在接收信息时会再次进行同样的计算,得出的值如果和FCS中添加的值一致,则认为帧是正确无误的。如果不一致,则会认为数据在传输过程中发生了错误,于是将数据丢弃。FCS就是这样在数据链路中起着错误控制的作用。 图2.1.3 以太网的帧格式非常清晰,容易理解 图2.1.4 用Wireshark分析以太网帧的画面 看前24位就能知道网卡的运营商 MAC地址是由48位构成的独一无二的识别信息,在以太网中扮演着数据链路起点和终点的角色。它的具体写法如E0-CB-4E-C1-53-CB、00:0c:29:43:5e:be,每经过8字节就用一个连字符或冒号隔开,用十六进制表示。 MAC地址的前24位和后24位有着不同的含义。前24位是由IEEE管理的独一无二的运营商编码,叫作OUI(OrganizationallyUniqueIdentifier,组织唯一标识符)。看这部分我们就能知道通信节点的网卡是哪家运营商提供的。顺便提一句,下面的网页中有OUI的公开信息,排除故障时不妨参考一下。 URLhttp://standards.ieee.org/develop/regauth/oui/oui.txt(截至2014年1月的信息) 另外,预先在Wireshark的CaptureOptions→NameResolution中勾选EnableMACnameresolution选项,MAC地址的运营商编码就能自动转换成运营商名。这个功能意想不到地方便,笔者经常使用。 图2.1.5 Wireshark可将运营商编码自动转换成运营商名 后24位是运营商内部管理的独一无二的编码。由IEEE管理的独一无二的前24位和由运营商管理的独一无二的后24位,这两个要素使MAC地址成为了世界上独一无二的地址。 图2.1.6 MAC地址中的每段24位都代表着不同的意思 特殊的MAC地址 以太网中的所有通信都是一对一的形式吗?并不一定。一般情况是这样的:所有节点共享一根线缆(传输媒介),同时生成大量的逻辑传输路径(数据链路)与众多的对象互通信息。以太网按通信方式划分为单播、广播和多播三种帧类型,比较常用的是单播和广播。 单播 单播是一对一的通信,这应该很容易理解吧。MAC地址基本上都是独一无二的,因此对应某个节点可以只生成一条数据链路,源MAC地址和目的MAC地址指的就是这两个节点的MAC地址。在现代以太网的环境中这种通信所占的比例很大,电子邮件和互联网的通信就属于这种通信类型。 图2.1.7 单播是一对一的通信 广播 广播是一对多的通信,这里所说的“多”是指同一个网络中的所有节点。 如果某个节点发送了广播信息,那么所有的节点都会收到该信息。广播能够波及的范围叫作广播域。广播的源MAC地址就是发送节点的MAC地址,目的MAC地址则比较特殊,稍微有点不同,写出来是FF-FF-FF-FF-FF-FF的形式,用位表示的话全部都是1。 举一个比较典型的广播通信的例子,那就是ARP(AddressResolutionProtocol,地址解析协议)。我们来看下ARP大致的工作原理。假设节点A要对节点B进行单播,可是节点A并不知道节点B的MAC地址,为了弄清这个地址节点A就要用到广播,通过广播向所有节点发问“请告诉我节点B的MAC地址是多少”,弄清了之后再和节点B进行单播通信。关于ARP的内容将在2.1.3节中详细说明。 图2.1.8 广播是针对所有节点一气呵成地发送信息 多播 多播是一对多的通信,看起来似乎和广播差不多,但这里的“多”指的是特定小组(多播组)中的节点。如果某个节点发送了多播信息,那么这个小组中的所有节点都 会收到该信息。多播的源MAC地址就是发送节点的MAC地址,目的MAC地址则比较特殊,稍微有点不同。多播MAC地址前面第8位的I/G(Individual/Group)位是1。用于广播的MAC地址(FF-FF-FFFF-FF-FF)也算作多播MAC地址的一部分。如果要对应多播IPv4地址,那么前25位是“0000000100000000100111100”。如果换算成十六进制,那么就是在“01-00-5E”后面的一位加个“0”。“01-00-5E”是管理互联网上全球IP地址的ICANN所拥有的运营商编码。后23位是将多播IP地址(224.0.0.0~239.255.255.255)从后往前数的23位复制了一下。多播用于视频发布和证券交易所的应用程序。使用广播时,所有节点都会被强制性地收到信息。相比之下,使用多播时只有启动了该应用程序的节点才会收到信息,信息流动量的效率更高。 图2.1.9 多播是针对特定的组对象发送信息 图2.1.10 IPv4多播的MAC地址是在IP地址的基础上生成的 2.1.2 数据链路层的关键在于L2交换机的运作 在数据链路层运行的设备种类繁多,不过我们只要掌握了L2交换机,基本上就能应对所有的网络环境了。“交换机”在网络设备的世界里是个常用术语,○○交换机的○○部分代表OSI参考模型的层,表示它们是根据哪一层的信息去切换转发地址的。转发地址的切换叫作“交换”,L2交换机根据数据链路层(L2)的信息,也就是MAC地址的信息对帧进行L2交换。 表2.1.2 有各种各样的交换 2.1.2.1 交换MAC地址 接下来,我们来看看L2交换机是如何进行L2交换的。 L2交换机是根据内存中的MAC地址表对帧进行交换的。MAC地址表由端口和源MAC地址的信息构成,看地址表就能知道哪个节点连接着哪个端口。L2交换机主要有三项职责——登记收到的帧的端口和源MAC地址、将来路不明的MAC地址进行泛洪处理、删除不再需要的信息。 利用MAC地址表进行交换 假设节A和节点B是双向通信的①,我们来看看MAC地址表在这里是如何派上用场的。 节点A将数据包封装成帧并传递给线缆,目的是发给节点B。这部分还只是在进行单播发送,源MAC地址是节点A的MAC地址,目的MAC地址是节点B的MAC地址。 图2.1.11 节点A向节点B发送单播帧 ① 这里的假设有一个前提,那就是节点A已知节点B的MAC地址。在实际情况中节点A一般并不知道节点B的MAC地址,所以节点A要先通过ARP广播确定节点B的MAC地址之后才能开始通信。 交换机收到帧后,将节点A的端口号和源MAC地址作为新的条目添加到MAC地址表中去。MAC地址表一开始是空的,从空表的状态开始学习帧并不断添加新的数据。 图2.1.12 将节点A登记到MAC地址表中去 由于交换机并不知道节点B的MAC地址是多少,所以会将帧复制并发送给不与节点A相连接的所有端口。这种把帧同时发送给多个端口的现象叫作泛洪,是一种“我不知道是哪个MAC地址,所以干脆发给所有对象再说!”的应对方法。顺便提一句,广播 的MAC地址FF-FF-FF-FF-FF-FF不会成为源MAC地址,因而不会被写入MAC地址表。也正因如此,广播经常会被泛洪。 图2.1.13 通过泛洪处理将信息发给所有端口 节点B收到帧之后认定这是发给自己的帧,为了回应节点A,也会生成一个帧并传递给线缆。这时候,源MAC地址是节点B的MAC地址,目的MAC地址是节点A的MAC地址。节点B之外的节点C和节点D会判断出这是和自己无关的帧然后将其丢弃。 图2.1.14 真正有关系的节点B会给出回应 交换机收到帧后,会将节点B的端口号和MAC地址登记到MAC地址表中。 这样,节点A和节点B的MAC地址表就建成了。根据MAC地址表中的登记内容,发给节点A的帧会被马上转发到1号端口。MAC地址表生成之后,节点A和节点B之间的帧转发就不会影响到其他节点,能够高效快速地进行了。 图2.1.15 建立MAC地址表 图2.1.16 其他节点不会参与节点A和节点B之间的通信 MAC地址表建好之后,里面的条目并非是一直保留下去的。一直保留下去的话,内存再大也会不够用,而且节点一旦转移到别处去,与之对应的条目也就不起作用了。 因此,与端口相连的线缆被拔掉时,条目会被删除;超过一定时间未收到帧时,条目也会被删除。从条目生成到条目被删除的时间叫作老化时间,思科Catalyst交换机的老化时间默认值为300秒(5分钟),当然这个时间是可以修改的。 图2.1.17 将不再需要的条目删除 查看MAC地址表 我们来实际看看下图中所示的L2交换机即Switch1的MAC地址表。 图2.1.18 方便确认MAC地址表的连接图例 这里我们使用思科Catalyst交换机来确认。Catalyst交换机可通过命令showmacaddresstable去查看MAC地址表。 图2.1.19 Catalyst交换机中的MAC地址表示例 MacAddress指节点的MAC地址,Ports指连接的端口号。其他几个要素也在这里解释一下:Vlan将在下一个小节里详细说明,广播和泛洪只会针对同一VLAN发送信息;Type指MAC地址的类型,通过帧动态学到的内容为DYNAMIC型,超过老化时间条目就会被删除;STATIC表示是本机静态设置的或是系统上已占用的MAC地址,不会被自动删除。 2.1.2.2 通过VLAN将广播域分隔开 广播能够波及的范围叫作广播域。用来搜索单播发送目的节点的APR是通过广播发送的,我们不妨认为广播域就是能够直接收发帧的范围。广播针对所有节点一气呵成地发送信息,似乎挺方便,然而帧会被发送到不相干的节点那里,从通信流量的角度来看效率并不高。这时候我们就要用到VLAN(VirtualLAN,虚拟局域网),它是交换机所拥有的一项功能,能够将广播域分隔开,有利于提高通信效率。 有些人会把VLAN叫作网段、网络或LAN(LocalAreaNetwork,局域网),称呼不同,但意思是完全一样的,我们不必太在意,知道他们指的是VLAN就可以了。 图2.1.20 在同一个VLAN中,所有节点都会收到广播信息 图2.1.21 通过VLAN将广播域分隔开 VLAN由数字构成 VLAN能将广播域分隔开,这听起来似乎挺复杂,不过VLAN的本质其实就是代表VLANID的一些数字,其原理只是将VLANID的数字分配给各个端口,由此去识别端口而已。Catalyst交换机最多可以支持4096个VLANID,其中有几个已被系统保留,用于特殊的目的。机型和OS版本不同,实际上能够使用的VLANID范围和个数也就不同,这点大家一定要仔细确认。 表2.1.3 有些VLANID已被系统占用,不能使用 那么,我们应该如何设置VLAN呢?这个也并不复杂。VLAN只有两种设置方法,不是端口VLAN就是打标VLAN。下面就详细说明这两种设置方法。 端口VLAN设置是让端口和VLAN一一对应 正如其名,端口VLAN是将VLAN分配给端口的设置方法,有静态设置(静态VLAN)和动态设置(动态VLAN,根据基本规则的要求动态地进行设置)之分,以使用前者的环境居多。动态VLAN一般仅用于CCNA、CCNP等思科公司的测试中,本书只讲解静态VLAN。 静态VLAN会将VLANID分配给端口。将VLANID分配给各个端口,就完成了对一台交换机的逻辑划分,也就完成了对广播域的划分。举个例子,将VLAN1和VLAN2分配给端口之后,VLAN1所属终端的广播域和VLAN2所属终端的广播域就不一样了,VLAN2不会收到VLAN1发出的广播,也不会收到ARP,二者之间无法进行直接通信。如果要让VLAN1和VLAN2之间产生通信,必须通过L3交换机或路由器等L3设备进行中转才行。 设置端口VLAN时也可以跨交换机进行,但必须注意一点,那就是有多少VLAN就得准备多少端口和线缆去连接交换机。 图2.1.22 基于端口设置VLAN 打标VLAN 正如其名,打标VLAN是给VLAN打上标签的设置方法。打上标签?乍一听你也许会觉得丈二和尚摸不着头脑,但实际上它只是给帧打上一个包含VLAN信息的标签而已。有两种打标方法,一种是能够传输非以太网帧的ISL方式,另一种是只能传输以太网帧的IEEE802.1Q方式。现在的网络环境大多是以太网,因此打标VLAN大多采用IEEE802.1Q方式,IEEE802.1Q也是IEEE委员会制定的打标VLAN的标准规格,而ISL我们只能在CCNA、CCNP等思科公司的测试中见到。本书只讲解IEEE802.1Q。 图2.1.23 通过IEEE802.1Q为VLAN打标 端口VLAN必须是一个端口对一个VLAN,所以如果要跨交换机进行设置以促成同一VLAN内节点之间的通信,那么有多少VLAN就要准备多少端口和线缆。但是,这种情况在可扩展性上会发生问题,假设有1000个VLAN,那么我们就得准备1000根线缆和1000个端口,无论是布线还是设置都极其耗时费力,端口再多也会有不够的时候。 这时候我们就要用到打标VLAN。交换机端口发送信息时给帧打上一个含有VLAN信息(VLANID)的VLAN标签,目的端口收到帧时先卸掉标签,然后再交给需要该信息的节点。通过打标VLAN能够识别收到了哪个VLAN的帧,所以只需一根线缆和一个端口 即可,布线也十分简单。使用打标VLAN时,相连的两台设备必须能够识别出同样的信息才行,因此两边设置的VLANID务必要统一。 最近,打标VLAN不止用于交换机之间的连接,也越来越多地用在虚拟环境(VMware环境)中。在虚拟环境中,隶属于各种VLAN的虚拟机共存于一个物理服务器中,通过虚拟交换机出现在网络上。连接L2交换机时,针对需要连接的端口,我们必须要设置该虚拟机所属的所有VLAN,这时候就要用到IEEE802.1Q了。 在虚拟环境中,虚拟机隶属于一个叫作端口组的虚拟交换机端口设置组,通过vSwitch(虚拟交换机)连到网络上。假设虚拟机分别隶属于叫作VLAN10和VLAN20的端口 组,那么映射到vSwitch上的vmnic(物理网卡)就隶属于VLAN10和VLAN20。vSwitch给VLAN10和VLAN20打上标签,将与vmnic连接的交换机端口划分到打标VLAN。用vSwitch进行的标签处理叫作VST(VirtualSwitchTagging,虚拟交换机标记)。 另外,对思科Catalyst交换机而言,打标VLAN一般会称为trunk,而对他生产商生产的机器而言,trunk则指的却是链路聚合功能以及由该功能衍生出来的逻辑端口。二者很容易混淆,请大家务必区分清楚。关于链路聚合的内容将在4.1.1.1节中详细说明。 图2.1.24 使用端口VLAN时,如果VLAN要跨交换机会非常麻烦 图2.1.25 使用打标VLAN时,只需一根线缆和一个端口即可 图2.1.26 虚拟环境中也经常会用到打标VLAN 使用打标VLAN时应统一本征VLAN 我们在设置打标VLAN时要注意本征VLAN的存在。设有IEEE802.1Q的端口并非对所有的VLAN都会打标,有一个VLAN是除外的,那就是本征VLAN。 这里的关键在于要保持相邻设备的本征VLAN一致。也许你会想,如果是不打标的VLAN就可以不用在意嘛,然而实际情况却并非如此。假设一边的本征VLAN是VLAN1 而另一边的本征VLAN是VLAN3,那么它们会分别映射不同的广播域,二者之间就无法进行通信了。所以我们不仅要保持两边的VLANID一致,还要保持两边的本征VLAN也一致才行。 Catalyst交换机的默认本征VLAN是VLAN1,当然我们也可以修改这一默认设置。另外,只有在使用CDP(CiscoDiscoveryProtocol,思科发现协议)的前提下,才能自动检测出两边设备的本征VLAN不一致并发出警告信息“%CDP-4-NATIVE_VLAN_MISMATCH”。关于CDP的内容将在5.1.4.1节中说明。 本征VLAN在虚拟环境中的原理也一样。如果我们在端口组的VLANID中选择“无(0)”,那么隶属于该端口组的虚拟机的帧就不会被打标。不被打标也就等同于本征VLAN。而如果在这里设置VLANID,那么vSwitch就会给该VLANID打标。 图2.1.27 有一个VLAN不会被打标 图2.1.28 两边的本征VLAN如果不一致就无法正常通信(以ARP为例) 图2.1.29 在虚拟环境中也要注意本征VLAN 2.1.3 ARP将逻辑和物理关联到一起 在网络的世界里只有两个概念是表示地址的,一个是前面一直在讲的MAC地址,另一个则是IP地址。MAC地址是硬件被赋予的物理地址,在数据链路层(L2)中发挥作用。IP地址则是由OS设置的逻辑地址,在网络层(L3)中发挥作用。这两个地址如果步 调不一致就会乱套,务必让它们彼此协调配合才行。ARP(AddressResolutionProtocol,地址解析协议)就是能让这两个地址保持协调的存在,它在物理和逻辑之间起着桥梁的作用。 图2.1.30 ARP是物理和逻辑之间的桥梁 2.1.3.1 ARP通过IP地址查询MAC地址 ARP是物理和逻辑之间的桥梁,这听起来似乎非常高深,不过它实际上只是将IP地址和MAC地址关联起来而已,并没有进行什么复杂的处理。 我们知道,收到来自网络层的IP数据包之后,节点必须将其封装成帧并传递给线缆。然而,刚刚收到IP数据包时节点并不清楚该如何对它进行封装,因为节点虽然知道源MAC地址就是本机的MAC地址,却不知道目的MAC地址是什么。这时候就要用到ARP了。ARP先去查看IP数据包的目的IP地址,如果是同一网段的节点,ARP就去查询该IP 地址的MAC地址;如果是不同网段的节点,ARP就去查询默认网关的MAC地址。默认网关相当于一个通往非本地网段的出口,如果数据包是发给非本地的其他网段而且并不清楚目的IP地址,那么它就会被发给默认网关。这里说的“网段”指的是IP地址的所属范围,会在2.1.1.2节中另外详细说明。在目前这个阶段,我们可以认为广播域和VLAN是同一个意思。 这里请记住一点:ARP是通过IP地址去查询MAC地址的。 图2.1.31 ARP将两个地址关联到一起 ARP的原理很简单 ARP的原理很简单,非常容易理解。请想象一下这个场景:你大声地(广播)问大家“某某某是哪位啊?”,于是某某某回答“我就是某某某啊!”。 这个“某某某是哪位啊?”的提问叫作ARPRequest(ARP请求)。“某某某”的部分就是从网络层发来的数据包中目的地的IP地址。ARP请求通过广播散发出去,同一 VLAN中的所有节点都会收到该请求。 图2.1.32 ARP不知道应将信息发往何处,于是大声询问所有节点 图2.1.33 只有真正相关的节点给出回应 针对ARP请求返回的这个“我就是某某某啊!”的回应叫作ARPReply(ARP回复)。在同一VLAN(广播域)的所有节点中,只有一个真正拥有对象IP地址的节点会做 出回应。其他的节点因为与己无关,会将收到的信息丢弃。ARP回复不需要使用广播,它通过单播将信息发给发送ARP请求包的节点。 图2.1.34 通过广播和单播查出对方节点的MAC地址 以太网的数据部分中包含着诸多的地址信息 ARP在以太网的数据部分写入了很多地址信息,并以此将MAC地址和IP地址关联起来。由于操作(Operation)和地址之外的数据都是固定不变的,因此本书只介绍操 作和地址这两项内容。 图2.1.35 ARP在数据部分写入了很多信息 ARP请求的操作代号是1。请求时,节点将源MAC地址和源IP地址设置为本机地址,将目的MAC地址设置为00-00-00-00-00-00(因为尚不清楚实际地址是什么), 将目的IP地址设为欲查询其MAC地址的节点的IP地址。ARP请求采用广播的形式,收到广播的所有节点都会去查看目的IP地址,但是只有真正拥有该IP地址的节点才会给出ARP回复,拥有其他IP地址的节点则会将收到的信息丢弃。 ARP回复的操作代号是2。回复时,节点将源MAC地址和源IP地址设置为本机地址,将目的MAC地址和目的IP地址分别设置为发送了ARP请求的节点的MAC地址和IP地址。ARP回复采用单播的形式,向发来ARP请求的节点返回信息。收到ARP回复的 节点查看源MAC地址和源IP地址的部分后,就能知道对方的MAC地址是多少,而知道MAC地址之后就可以开始通信了。将MAC地址和IP地址关联起来的表叫作ARP表。 图2.1.36 数据部分将MAC地址和IP地址关联到一起 通过高速缓存控制通信流量 读到这里,想必各位已经能够了解ARP在通信中的重要作用了。对于通信来说,ARP是基础中的基础。正是因为通过ARP查询出发送目的地的MAC地址,通信才得以成 立。 然而ARP有着致命的弱点,那就是“以广播发送为前提条件”。由于一开始发送方并不知道对方节点的MAC地址,使用广播也算是一种必然的选择。然而广播会向同一 网段中的所有节点都发送数据,是一种效率很低的通信。假设VLAN中有1000台节点机,那么通信就会流向这1000台机器,假如每台节点机通信时都发送ARP,那么仅ARP通信流量就会充斥于整个VLAN。原本MAC地址和IP地址就不会频繁发生变化,于是人们为ARP开发出了可暂时存储条目的高速缓存功能。 ARP查询到对方节点的MAC地址后,会在ARP表中添加新的条目并将其暂时保存。在暂时保存期内ARP不会发送信息,超过一定时间(时限)之后则会删掉该条目并发送ARP请求。时限因OS而异,Windows7是10分钟,思科公司的设备则为4个小时,当然,这些默认时限都是可以修改的。 图2.1.37 ARP将信息发给所有节点,但只能收到其中一台节点机的回应,效率极低 图2.1.38 通过高速缓存功能提高效率 更换设备时要注意ARP高速缓存 高速缓存功能在减少ARP的通信流量上发挥着巨大的作用,但它并非是完美无缺的。有了这项功能,实时性就会差强人意,这是拥有高速缓存功能的所有协议相通的一 个致命弱点。当IP地址或MAC地址发生变化时,ARP表依然保留着旧的信息,因此只有等保留的条目超过时限后,ARP再重新学习一遍新地址才能重新开始通信。 那么,节点的MAC地址或IP地址会频繁发生变化吗?不会。在大多数情况下MAC地址和IP地址都是一直不变的,因此,一般情况下我们不必在意ARP的这个弱点, 需要注意的是更换设备的时候。例如,网络打印机突然出故障而不得不换掉了,这时候IP地址还是不变的,但MAC地址会变,然而打印机周边的节点并不知道MAC地址的这个变化,还是会去查看ARP表,试图和已经不存在的MAC地址通信,直到表中该条目的时限到来为止(超过时限之后才能重新开始通信)。要想解决这个问题就得使用GARP,关于GARP的内容将在2.1.3.3节中详细说明。 图2.1.39 MAC地址一变就无法通信了 2.1.3.2 抓取ARP包,观察它的写法 下面两张图是我们抓取到的ARP请求包和ARP回复包的实例。 ARP请求为广播发送,所以目的地址为FF-FF-FF-FF-FF-FF,此外我们还能看到数据部分写入了很多地址信息;ARP回复为单播发送,所以目的地址为发来ARP请求的节点的MAC地址,我们能看到该数据部分也同样写入了很多地址信息。 图2.1.40 ARP请求是通过广播发送的 图2.1.41 ARP回复是通过单播发送的 2.1.3.3 有几个特殊的ARP ARP包是支撑TCP/IP通信初期阶段的非常重要的帧,这里发生问题就会无法进行通信。为了防止出现这样的情况,人们设计了几个特殊的ARP用来及时更新周边的信息(MAC地址表和ARP表等),它们统称为GARP(GratuitousARP,无故ARP),下面我们就来详细说明GARP。 OS通过GARP能在MAC地址发生变化时发出通告 GARP是一种特殊的ARP,它会在数据部分的源IP地址和目的IP地址中写入本机地址。 GARP肩负着双重责任,一个是检查是否存在相同的IP地址,另一个则是更新相邻设备的表。 检查是否存在相同的IP地址 在公司或学校的网络环境中,我们可能会不经意就设置了和别人一样的IP地址。这时候OS会弹出报错信息警告我们IP地址冲突,提醒我们去修改IP地址,这个报错就是基于GARP的信息判断出来的。IP地址设置好之后OS并不急于马上反映出来,而是发出ARP请求去检查周边是否存在设有相同IP地址的节点。如果收到GARP,OS就认为设有相同IP地址的节点确实存在,弹出报错信息;如果没有收到GARP,OS才会去反映前面设置好的IP地址。 图2.1.42 通过GARP检查是否存在IP地址冲突 更新相邻设备的表 这里所说的表指的是ARP表和MAC地址表,二者都是通过GARP获得更新的,不过形式稍微有些不同。 首先我们来看GARP是如何更新ARP表的。当设备因发生故障或EoS(EndofSupport,终止支持)等原因需要更换成新机器的时候,旧的MAC地址会被新的取代。然而,周边的节点即使拥有新机器的ARP条目也不会去自动更新MAC地址,而是继续沿用旧的信息,结果导致通信无法完成。这时候就要用到GARP。新的机器在对接或启动时会发出GARP通告①,声明原来的MAC地址已变,而收到GARP的节点就会去更新该ARP条目。 图2.1.43 通过GARP更新ARP条目 ① 也有些设备并不发出GARP通告,遇到这种情况时我们 需要自己去清空周边节点的ARP表。--- 接下来,我们看看GARP是如何更新MAC地址表的。 这里以虚拟环境中的GARP为例进行说明。虚拟软件拥有实时迁移功能,它能够在不造成停机(虚拟机)的前提下对物理服务器进行实时迁移,这在Xen中叫作XenMotion,在VMware中叫作vMotion。执行实时迁移时,虚拟机会从一台物理服务器移动到另一台物理服务器,然而L2交换机并不知道这一情况,于是虚拟机移动之后会发出GARP①。L2交换机在收到GARP后,会去查看该GARP的源MAC地址,并更新MAC地址表,使迁移之后的物理服务器能够维持正常通信。 图2.1.44 通过GARP追踪实时迁移之后的虚拟机 ① VMware的vMotion采用的是RARP(ReverseAddress ResolutionProtocol,反向地址转换协议)。协议虽然不同,原理却是一样的,RARP也会去更新MAC地址表。
图解服务器端网络架构——2.1 数据链路层的技术
书名: 图解服务器端网络架构
作者: [日] 宫田宽士
出版社: 人民邮电出版社
译者: 曾薇薇
出版年: 2015-4
页数: 376
定价: 79.00元
装帧: 平装
丛书: 图解入门系列
ISBN: 9787115388179