前言

学习完物理层、数据链路层和以太网技术后,我们知道:第一层设备通过广播(broadcast)将数据包传递给同一L1 domain的其他设备,但是不知道具体传递给谁。第二层技术为数据包添加了MAC地址,给交换机添加了交换表以标记主机接口位置,解决了传递冲突的问题。冲突发生并传播的区域称为L2 domain/冲突域。

虽然第二层设备可以通过MAC地址匹配传递到指定的主机上,但是信息的传递还是需要广播整个网络。在小型网络中还好,但是在覆盖全世界的互联网中这样的效率过于低下。

第三层网络层技术就是用于划分不同的广播范围以及寻找传输的最佳路径

这是因为:第 2 层设备(如交换机)必须泛洪(flood)所有广播和组播流量,但第 3 层设备(如路由器)不转发广播。因此,第 2 层设备将局域网分割成多个冲突域,但只有第 3 层设备才能将局域网分割成多个广播域(L3 domain/Broadcast domain)。


网络层的功能与协议

网络层的目的是确定最佳路径进行数据包交换

网络层提供确定将数据包传送到目的地的路径的服务,因此其主要功能是确定最佳路径

网络层有很多协议,例如:IP、ICMP、ARP、RARP等等,其中最主要的协议就是互联网协议(IP, Internet Protocol)。

IP协议主要在网络层的操作如下:

  1. 定义用于网络间传输数据的数据包结构。
  2. 定义用于唯一标识全球网络中主机的寻址方案。
  3. 选择最佳路径,将数据包路由至目的地。

IP协议的头部介绍详见:IP基础认识


IP寻址

IP寻址详见:

【计网】IP基础认识

这里只会做一些补充。

IPv4子网划分

在之前的章节中,介绍过IPv4子网划分的步骤:原网段分析、向主机借位、计算子网地址

我们来看一些子网划分的例子加深对IPv4子网划分的认识:

e.g.1:网络拓扑如图,

网络 192.168.1.0/24 中需要 7 个子网:
1. 子网掩码是多少?
2. 创建了多少个子网?
3. 每个子网中创建了多少个可用主机地址?
4. 子网 #5 的网络地址是多少?
5. 子网 #5 的广播地址是什么?
6. 子网 #5 的范围是多少?
7. 子网 #5 中第 5 个主机地址的 IP 地址是多少?

  1. 我们知道原网络中,192.168.1.0/24的掩码为255.255.255.0,这个网络需要7个子网,那至少需要⌈log27⌉ = 3位借位。故此时网络变成192.168.1.0/27,它的掩码为= 255.255.255.224(11111111.11111111.11111111.11100000)
  2. 因为借了3位,所以会创建23 = 8个子网,其中我们只用7个。
  3. 借了3位后还剩余5位(32-24-3)为主机位,故每个子网的可用主机地址数量为25-2 = 30个主机。
  4. #5在3位借位中表示为101,故此时#5的网络地址为192.168.1.160(10100000)/27
  5. 同理,#5的广播地址为192.168.1.191(10111111)/27
  6. 除去网络地址和广播地址,剩下的就是#5的范围了。192.168.1.161(10100001)/27~192.168.1.190(10111110)/27
  7. 第五位主机的地址表示为192.168.1.165(10100101)/27

于是我们分配7个子网到不同的接口,如下:

我们把所有子网都具有相同的大小和相同数量的主机,每个子网使用相同的子网掩码,并且所有子网中的地址数量都相同的子网划分称为固定长度子网掩码 (Fixed length subnet mask,FLSM)。

可变长度子网掩码(Variable-Length Subnet Mask,VLSM) 是一种子网设计策略,允许所有子网掩码具有可变大小。在VLSM子网划分中,网络管理员可以将IP地址空间划分为不同大小的子网,并根据网络上的个性化需求进行分配。这种类型的子网划分可以更有效地利用给定的 IP 地址范围。

在复杂一点的网络拓扑图中,我们往往会使用VLSM划分子网。

e.g.2: 在如图的网络拓扑中,使用VLSM划分子网。(路由器旁的数字为包含当前路由器在内的所有直接相连的主机及其他设备)

因为前24位都是一样的,我们就把它设为N,所以网络一开始为N.N.N.0/24。主路由器连接着1个设备,而连接的路由器也都是一个单独设备,故最大连接最多为21个连接设备+1个自己)。这就说明我们至少需要2位作为主机位。

注意:这里log22 = 1,但是存在网络地址和广播地址,故最少需要4个地址 => 2位主机位。

我们把这些设备划分子网,把后2位做主机位,此时子网掩码均为32-2 = 30。故我们可以这样分配:

当然这里因为只把2位作为主机位,我们还可以分配26 = 64个子网。我们这里只用了其中的5个,此时拓扑图为(分配顺序不重要):

 

我们划分好主路由相连的主机和路由器后,我们只是将它们组成了一个网络,但对每个子路由的子网还没划分,还需要逐个划分它们。

我们从左到右,从上到下按照0-4编号。主路由器为Router0。对于Router1的子网,它的主机分组中最大的为12个连接,⌈log212⌉ = 4,它的主机位有4位,子网掩码为255.255.255.240,此时分为两个子网可以分为:192.168.1.32(0010xxxx)/28,和192.168.1.48(0011xxxx)/28。

注意,这里我们没有划分0000和0001,因为分配这两个网段很有可能和之前分配的网段重复。

对于Router3,它还连着一个子路由器,它们都应该在同一个网络中。连接数最大为⌈log226⌉ = 5, 它们的主机位有5位,子网掩码为255.255.255.224,子网可以分为:192.168.64/27和192.168.1.96/27.


对于Router2,它有60个主机,同理,需要6位主机位,子网掩码为255.255.255.192。子网可取192.168.1.128/26.


至此,我们分配了10个网段,基于VLSM的子网划分就完成了。

我们现在是将一个大网划分为一个个子网,相反,如果我们也可以把很多个子网合成为一个超级网络,我们把这个过程称为超网(Supernetting).

超网的主要目标是简化或总结网络路由决策,以最小化匹配路由时的处理开销以及路由表上路由信息的存储空间。因为路由信息在每个路由器上,现在整合在一起有利于决策最佳路径。例如:我们现在有两个子网192.168.0.0/24192.168.1.0/24两个子网,我们与借位相反的,还一位可以将它们组成一个超网,这个超网包含了这两个子网(和其他子网)。此时这个超网是192.168.0.0/23。


IPv6地址分类

我们在之前的章节中只简单介绍了IPv6的结构,我们知道了它是一组128位的二进制数,用8组4位的16进制数表示。我们把这种形式称为十六进制冒号式(colon hexadecimal)。

IPv6中用前64位表示接口的网关,称为子网前缀(Subnet prefix),后64位表示主机识别字段,称为接口ID(interface ID)。

IPv6地址和IPv4一样,用地址/前缀长度的形式写出。例如:2001:D3:0:2F3B:2AA:FF:FE28:9C5A/64

IPv6地址也做了一些分类,它们分别是:

  • 单播地址(Unicast):寻址到单播地址的数据包只能传送到一个设备上(one interface)。
  • 多播地址(Multicast):一个组播地址可标识多个接口。向组播地址发送的数据包会传送到该地址所标识的所有接口上。
  • 任播地址(Anycast):任播地址可标识多个接口。寻址到任意播送地址的数据包会被传送到单个接口,即该地址所标识的最近接口。最近接口的定义是路由距离最近。

链路本地单播地址(Link-local unicast)由节点在与同一链路上的相邻节点通信时使用,链路本地地址总是自动配置的,链路本地前缀为 FE80::/10,接口标识符为 64 位。

全局单播地址(Global unicast addresses)在 IPv6 互联网上是全局可路由和可到达的。全局单播地址通常包括:48 位全局路由前缀,范围从 2000::/3 开始。16 位子网 ID,最多允许 216 = 65,536 个子网,以及64位的接口ID。

在全局路由前缀中,又分为服务商、ISP、站点前缀等。

IPv6 多播(组播)地址(multicast addresses)的前缀是 FF00::/8。除前8位外,多播地址还包括其他结构,用于标识其标志(Flag)、范围(Scope)和多播组ID。多播地址不能用作源地址。多播是 IPv6 网络中广播地址的替代。

其中比较常用的是,链路本地范围全节点 (link-local scope all-nodes)(FF02::1)全路由器组播地址(all-routers multicast address)(FF02::2) 用于组播到本地所有的主机,或组播到所有的路由器上。

被请求节点组播地址(solicited-node multicast address) (FF02::1:FF:0/104) 用于无状态地址自动配置和邻居发现过程,它通过后24位(它的低 24 位为单播或任播地址的低 24 位)确定主机是否接收这个组播,即它们的被请求节点组播地址相同。

我们之前学到了后64位为接口ID,它是 IPv6 地址 64 位前缀的唯一标识符。它由扩展唯一标识符 (EUI)-64 地址派生的 64 位接口标识符。除此之外,还可以随机生成和通过MAC地址转换。

通过MAC地址转换的步骤为:

  1. 在MAC地址中间(6段十六进制数的中间)插入FF:FE。
  2. 将MAC地址中第一个byte(前两个十六进制)的倒数第二个位取反。
  3. 组成一个新的EUI-64地址。

e.g. MAC为C6-46-7B-E7-B0-9B

  1. 插入FF:FE得:C6-46-7BFF:FE-B0-9B
  2. 将第一个byte的倒数第二个位取反:1100 0110 -> 1100 0100 => C4
  3. 组成EUI-64地址得:C446:7BFF:FEE7:B09B

但是因为MAC地址唯一表示了一台设备,为了用户的网络隐私,接口ID通常会随机生成。


邻居发现协议——NDP

在IPv6中,将ICMP协议中特殊的四种信息定义为邻居发现协议(Neighbor Discovery Protocol, NDP)。

ICMPv6 Message Type Description
路由器请求Router Solicitation (RS) 133 当一个主机启动时会发送一个RS去获取网络信息。
路由器接收Router Advertisement (RA) 134 RA 包含用于链路确定或地址配置的前缀、建议的跳数限制值、MTU 值等。RA 可定期发送,也可作为对 RS 信息的回应发送。
邻居请求Neighbor Solicitation (NS) 135 由主机发送,用于确定邻居的链路层地址(MAC)。用于验证邻居是否仍然可达。
邻居接收Neighbor Advertisement (NA) 136 对 NS 消息的回应。

邻居发现 (ND) 这个过程用于:

  • 确定邻居的链路层地址(MAC)和其可达性。
  • 确定链路上的路由器和网络信息(子网/前缀信息等)。

一台主机刚启动的时候,它连接进入网络,但是还不知道它的网络是怎么样的,此时它会发送一个RS请求,它会发送到所有路由器上。

路由器接收到它的RS,会发送一个RA用于给出网关、前缀等等信息。

这样主机就得到了这个网络的前缀,于是它的IPv6地址就可以自动配置了。我们称这样配置的IPv6为无状态自动配置(Stateless autoconfiguration),因为它并不是存储在路由器上配置的。

我们还不知道生成的这个IPv6有没有被别人用过,因为此时接口ID可以是随机生成的。这时就需要使用邻居请求(NS)了。

重复地址检测(Duplicate Address Detection, DAD)是为了确保在无状态自动配置过程中,其他设备在使用自动配置地址。主机会主动向该请求节点组播地址(FF02::1:FFxx:xxxx, Solicited-node multicast address of H1,xx:xxxx为主机的接口ID的后24位)发出NS。

如果节点以 NA 消息回应请求,则表示 IPv6 地址已被使用,主机需要手动配置。


IP路由

第三层将整个网络分成了很多子网/广播域,不同广播域之间如何沟通呢,需要使用IP路由(IP routing)。(L3 domain1 <-> L3 domain2)

路由(route)是指导数据包转发的路径信息,通过路由可以确认转发IP数据包的路径。

我们可以把路由的过程分为两部分:

  1. 路径确定:是路由器用来选择数据包到达目的地路径中的下一跳(Next Hop),并决定将接收到的数据包从哪个端口发送到目的地的过程。这一过程也称为数据包路由(routing the packet)。
  2. 数据包交换:在一个接口上接受数据包并将其转发到另一个接口的过程。在此过程中,路由器需要将数据包重新封装到输出接口的数据链路帧中。

在路由确定,即决定下一跳的过程中,路由器会根据它的路由表(routing table)进行前递选择。

如果在路由表中有匹配的下一跳已经在路由表中,数据包会被转发到与该表项相关联的端口。如果不匹配,则检查路由表中的下一个条目。如果目标地址与路由表中的任何条目都不匹配,路由器会检查是否已设置默认路由。如果存在默认路由,数据包就会转发到相关端口。 如果没有默认路由,数据包就会被丢弃。通常会向发送设备发回一条 ICMP 信息,说明目的地不可达。

这个过程与L2设备中桥接的过程很类似,我们来比较桥接表和路由表的区别。

同样是匹配后转发到指定端口,与Switching不同的是,当路由表中无匹配项时会先检查有无默认项,如果有默认项则匹配默认项端口,如果没有默认项则会被舍弃。Switch中则是会广播。这是因为路由器对比交换机它不会主动广播,而是要控制广播的范围。

对于IP路由,我们分为子网内路由(Intra-subnet communication)和子网间路由(Inter-subnet communication)。

子网内路由

子网内路由比较简单,即目的主机与源主机位于同一子网内/广播域内。此时的Next Hop即为目的主机,转发到目的主机。

但此时因为解封装时,第二层通过MAC地址寻址,我们现在只知道目的主机的IP地址,还需要知道目的主机的MAC地址。

获取目的主机的MAC需要通过地址解析(address resolution):

  • IPv4中使用ARP协议
  • IPv6中使用邻居发现

地址解析协议(Address Resolution Protocol, ARP)可以将IP地址映射到MAC地址。

源主机会先广播一个ARP请求,询问广播域中拥有目的主机的IP地址。目的主机收到ARP请求后,会回复一个ARP应答,告诉源主机自己的MAC地址。此时ARP会将这个映射记录到源主机的ARP表中,以便将数据包封装成以太网帧。

如图为PC1寻求PC3的MAC地址的过程。

但对于IPv6,则采用之前提到的邻居发现协议,直接发送ICMP请求。

IPv6 节点的地址解析过程包括交换 "邻居请求"(Neighbor Solicitation)和 "邻居接收"(Neighbor Advertisement)报文,以解析给定目的地的链路层地址(link-layer address)和链路上的下一跳地址(next-hop address)。发送主机在适当的接口上发送多播 "邻居请求 "信息。Neighbor Solicitation(邻居请求)报文的组播地址是从目标 IP 地址导出的请求节点组播地址。邻居请求信息在源链路层地址选项中包含发送主机的链路层地址MAC。

注意,此时目标主机可以广播本地链路所有主机告知自己的MAC地址,也可以选择只单独回复源主机。

子网间路由

如果 IP 通信是在不同 IP 子网的主机之间进行,称为子网间通信。源主机会通过本地子网中称为默认网关/子网标记(default gateway)的路由器将所有数据包发送到另一个网络。

此时的Next Hop = Gateway

默认网关用于主机与其他网络上的主机通信。默认网关的 IP 地址必须与源主机位于同一网络子网。默认网关通常是与源主机连接到同一物理网段的路由器接口的 IP 地址。

此时下一跳的物理地址即默认网关的物理地址同样可以通过ARP或是邻居发现协议找到。


路由过程

我们已经了解了IP路由的基本知识,现在到了实战如何进行IP路由了。总结来说,在每一步中我们只需要做两件事:

  1. 检查目的主机和源主机是否在同一子网(前缀、网关检查)。
  2. 找到Next Hop。同一子网则为目的主机,子网间则为默认网关。

例如:

源主机IP:192.168.1.11/24  MAC:02-60-8C-11-11-11

目的主机:192.168.2.77/24  MAC:?

第一步先判断是否在同一子网内:192.168.1.11 AND 255.255.255.0 = 192.168.1.0

192.168.2.77 AND 255.255.255.0 = 192.168.2.0 不在同一子网

第二步找到网关,这里是192.168.1.33/24,它的MAC地址通过ARP得到为02-60-8C-33-33-33,数据包将会传递到默认网关处。

数据包通过路由器,前往下一跳。

从Router1中,数据包通过路由表传递到它的另外一个接口,Next Hop = 172.16.0.44/16。

在两个路由器之间,通过路由表传输到Router2的接口上,Next Hop = 172.16.0.55/16。

在Router2中,数据包继续传递到它的另一个接口,Next Hop = 192.168.2.66/24。

最后,Router2 发现目标主机网络是直接连接的。Router2可以直接将数据包从接口转发到目标主机。

值得注意的是:

  1. 在IP路由过程中,源主机和目的主机的IP不会改变,改变的只是每一跳中的源MAC和目的MAC。
  2. 路由器接口接收帧时,会提取目的主机的 MAC 地址。对该地址进行检查,以确定帧是直接发送到路由器接口,还是属于广播。否则,该帧将被丢弃,因为此时它的目的主机是L2 Domain中的其他设备。

后记

本章记录了第三层网络层技术的相关知识,包含网络层介绍、IP基础知识与IP路由。

这里的一切都有始有终,却能容纳所有的不期而遇和久别重逢。
最后更新于 2023-10-24