数据平面的主要作用是从其输入链路向其输出链路转发数据包;
控制平面的作用是协调路由器的转发动作,使得数据沿着源和目的地址之间的路由器路径进行端到端的发送。
本节主要描述路由器这一网络设备来描述网络层的转发平面。
文章目录
1. 路由器工作原理
在介绍下面内容之前,首先统一以下定义:
- 转发:转发是一个动作,其目的是将分组从一个输入链路接口转移到适当的输出链路接口。
- 路由选择:其目的是确定分组从源到目的地所采取的端到端路径的网络范围处理过程。
- 转发表:通过转发表确定输出链路。
1.1 概念介绍
下图展示了转发平面涉及的几个重要的组件,下面一一进行介绍。
- 输入端口 : 其执行以下功能:
- 实现网络层和底层链路的隔离;
- 与数据链路层进行交互;
- 查询分组的输出端口。
- 交换结构: 将输入端口连接到输出端口,主要包括以下几种结构:
- 经内存交换;
- 经总线交换;
- 纵横式交换
- 输出端口: 接收交换结构的分组,并传输这些分组。
- 路由选择处理器: 属于控制平面的功能,后续在进行介绍。
其中,输入端口、输出端口和交换结构都是由硬件实现的,而路由选择则是有软件实现的,因为对于输入端口、输出端口和交换结构往往都只有纳秒级别的事件去处理到达的数据报,这是软件做不到的,但是路由选择则不用。下面依次介绍这几个组件。
1.2 输入端口
输入端口的完整视图如下图所示,路由器从物理层收到比特流以后会送到数据链路层进行处理,数据链路层剥离帧头和帧尾后,就会将分组送到网络层的队列中等待处理。
这里存在一个问题,一个入分组基于该分组的目的地址交换到输出端口。而IP地址有32位,如果转发表中正对每个目的地址都有一个表项,那么这个表项的数量大约有232个,这显然不可行,为了解决这个问题,学者们提出了对目的地址进行范围划分的方法,然后通过最长前缀匹配规则查找表项。具体过程如下,
前缀匹配 | 链路接口 |
---|---|
11001000 00010111 00010 | 0 |
11001000 00010111 00011000 | 1 |
11001000 00010111 00011 | 2 |
其他 | 3 |
如果有一个分组的目的地址是11001000 00010111 00010110 10100001,该分组的前缀匹配第一项,并且不匹配另外三项,因此该分组由链路接口0进行转发。如果一个分组的目的地址是11001000 00010111 00011000 10101010,可以看出该分组的前24比特与第二项匹配,该分组的前21比特与第三项匹配,根据最长前缀匹配规则,分组由匹配最多的表项对应的链路接口进行转发,这里将由链路接口1进行转发。
1.3 交换结构
交换结构主要包括,基于内存的交换、基于总线的交换和纵横式交换 ,如下图所示。
- 基于内存的交换 它的数据交换完全依靠CPU的软件实现,处理瓶颈主要在接口总线(I/O Bus)和软件效率。如果内存带宽为每秒可写进或从内存读出最多B个分组,则总的吞吐量必然小于B/2。但是该方式不能同时转发两个分组,因为经过共享系统总线一次仅能执行一个内存读或者写。
- 基于总线的交换 它的数据交换是在CPU的调度和控制下,由接口卡彼此交互完成,其处理瓶颈主要在共享总线的带宽。如果多个分组同时到达,每个位于不同的输出端口,除了一个分组外,其他分组必须等待,因为一次只有一个分组能够跨越总线。
- 纵横式交换 纵横式交换机共有2N条总线组成的互联网络,它连接N个输入端口和N个输出端口,每个总线的交叉点由交换结构控制控制开启和闭合。这种方式能够在同一时间内转发多个分组。
很明显第三种方式的效率更高,但是这种方式也存在一个问题,被称为线路前部阻塞HOL ,下图对该问题进行了具体的描述,图中第二个和第三个输出端口的发送缓存中的下一个要发送的缓存分组均要送到第一个输出端口,这个时候如果第二个输入端口正在向第一个输出端口发送分组,则第三个输入端口必须阻塞,但是第三个输入端口的第二个缓存报文是需要发送到第二个输出端口的,并且第三个输入端口与第二个输出端口之间的总线是无竞争的,这就造成了发往第二个输出的报文的阻塞,这就是HOL。
下图是一种扩展的纵横式交换结构,有兴趣的可以查阅资料学习以下之间的差异,其中在多处增加了缓存,可以自行分析这样子做的好处。
1.4 输出端口
下图是输出端口具体描述,基本执行的是和输入端口相反的操作。取出存放在输出端口缓存中的分组并将其发送到输出链路上。包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。
针对输出端口,考虑下面的场景,如果在某一个时刻,n个分组在同一时间 需要发往同一个输出端口,假设分组传输速率相同,交换机以n倍于线路的速度运行,所以一个单位时间后,n个分组将被输出端口,并排队等待处理。在下一个单位时间内,又有分组到达需要发往这个输出端口,为了更好的传输分组,分组调度算法被提出来了。**分组调度的目的就是在排队的分组中选择一个分组来传输。**下面是常见的几种调度算法:
- 先进先出
先进先出就是按照分组到达的输出链路队列的次序来选择分组在链路上传播。如果链路当前正在忙于传输另一个分组,到达输出链路的分组则需要排队,如果此刻没有足够的缓存开容纳该分组,则会利用分组丢失策略确定丢失哪一个分组。 - 优先权排队
在优先权排队规则下,到达输出链路的分组被分类放入输出队列中的优先权类,每个优先权类都有自己的优先队列。当选择一个分组传输时,优先权排队规则将从非空的最高优先级的队列中选择一个分组进行传输,同一个优先级的分组之间的选择通常以先进先出的方式完成。 - 循环和加权公平排队
在循环排队规则下,分组也被放入不同的优先级队列之中。但是,这里不存在绝对的服务优先级,循环调度器在这些分组之间轮流提供服务。加权公平排队规则是一种通用的循环排队规则,目前已经得到普遍认可。
2. IP网际协议
2.1 IPv4数据报
网络层分组被称为数据报,下图所示的是IPv4的数据报格式,其中首部占20个字节。
IPv4数据报的关键字段解释如下:
- 版本号。 这四个比特规定了数据报的IP协议版本,通过查看版本号,路由器能够知道如何解释IP数据报的剩余部分。
- 首部长度。 因为IP数据报可以包含一些可变数量的选项,故需要4比特IP数据报中载荷实际开始的地方,即运输层报文开始的地方。
- 服务类型。 只有在使用区分服务时,这个字段才起作用。用于区分不同的服务。
- 数据报长度。 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
- 标识。占16位,IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
- 标志。占3位,但只有2位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
- 片偏移。占13位,片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。
- 寿命。 用来确保报文不会永远在网络中循环。每当一台路由器处理数据报时,该字段的值减去1,该值变为0时,则丢弃该数据报。
- 协议。占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程,知道使用哪个传输层协议。
- 首部检验和。占16位,这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。这里和传输层不同,传输层协议TCP/UDP校验和是对整个报文段进行的。
- 源地址,占32位。
- 目的地址,占32位。
2.2 IPv4地址和子网掩码
IPv4地址分为有分类的地址和无分类的地址(CIDR)。
其中有分类的地址如下所示,网络根据网络地址的比特数目分为A、B、C、D和E类地址。
A类,B类和C类地址为可分配IP地址(,每类地址支持的网络数和主机数不同。每个网段中的网络地址和广播地址不能分配给主机。D类地址为组播地址。主机收到以D类地址为目的地址的报文后,且该主机是该组播组成员,就会接收并处理该报文。E类IP地址是以“1111”开始,为将来使用保留,主要用于Internet试验和开发。
下面看3个特殊的IP地址:
- 网络地址0
网络地址0不作为IPv4可路由地址。一般的使用场景是:①服务端尝试获取本地动态分配的IP地址时其源地址设置为网络地址0;②配置默认路由时网络地址设置为0,它只存在于本地计算机。 - 回环地址127
回环地址127不作为IPv4可路由地址。回环地址指向由操作系统提供支持的一个私有网络接口,该接口一直存在于操作系统中,其接口流量不会被传递到物理接口。 - 广播地址
广播地址指代网络中所有主机,广播地址分2种:受限广播地址和直接广播地址。受限广播地址的网络部分和主机部分所有位都为1,即255.255.255.255,目的地址是受限广播地址的数据报不会被路由,但会被传递到同一子网中的主机;直接广播地址的主机部分为1,如172.16.0.255,直接广播地址可以被路由,目的地址是受限广播地址的数据报可传递到指定的子网中。
在每一个类别的子网掩码中可以存在相当数目的主机,且该数据是固定的。有些场合使用某一类别的地址但是并不需要这么多的主机地址,这时候CIDR就产生了,CIDR被称为无类别域间路由选择。当使用该方法进行子网寻址时,32比特IP地址被划分为两部分,如下形式:a.b.c.d/x 其中x定义了IP地址的网络部分,也被称为该地址的前缀,即前面提到的最长前缀匹配规则中的前缀。每个子网的前 x 比特都是相同的,CIDR有效的解决了IP不够用的问题,这里不再进行过多的描述。
下面介绍几种常见的子网的计算方式:
1、根据子网数计算子网掩码的位数:
- 将子网数目-1(因为计算机从0开始,到26才是27个)转化为二进制来表示。
- 取得该二进制的位数,为N。
- 取得该IP地址的类子网掩码,将其主机地址部分的前N位置1即得出该IP地址划分子网的子网掩码。
例如:欲将B类IP地址168.195.0.0划分为27个子网,计算其子网掩码:
(1)27-1=26,转化为二进制为11010。
(2)N=5。
(3)B类地址的子网掩码255.255.0.0,将其主机地址前5位置1,即
实际上将主机地址前5位置1,可划分出25-2=30个子网,这里去掉了全0和全1的子网。
2、根据主机数计算子网掩码的位数:
- 将主机数目转化为二进制来表示。
- 如果主机数小于或等于254(注意去掉保留的两个IP地址:主机号全为0表示该网络的网络号,主机号全为1表示该网络的广播地址),则取得该主机的二进制位数,为N,这里肯定N<8。如果大于254,则N>8,这就是说主机地址将占据不止8位。
- 使用255.255.255.255来将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置0,即为子网掩码值。
例如:欲将B类地址168.195.0.0划分成若干个子网,每个子网内有主机700台,计算其子网掩码:
(1)700转化为二进制为1010111100。
(2)N=10。
(3)子网掩码为11111111.11111111.11111100.00000000,即255.255.252.0
3、网络号与主机号的计算
- 将IP地址与子网掩码与则可以获得网络地址;
- 将子网掩码取反再与IP地址进行逻辑与(AND)运算后,得到的结果即为主机地址。
例如:有一个C类地址为: 192.168.1.1,其默认子网掩码为255.255.255.0,欲求其网络地址和主机地址。首先将IP地址 192.168.1.1 转换为二进制:
将子网掩码 255.255.255.0 转换为二进制:
将这两个二进制数进行逻辑与(AND)运算后,得出的结果即为网络地址
将子网掩码取反再与IP地址进行逻辑与(AND)运算后,得到的结果即为主机地址
2.3 DHCP简介
DHCP 全称Dynamic Host configuration protocol, 动态主机配置协议。 它可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务器的IP地址等TCP/IP参数, 简单来说, 就是在DHCP服务器上有一个数据库, 存放着IP地址、网关、DNS等参数。 当客户端请求使用时, 服务器则负责将相应的参数分配个客户端,避免客户端手动指定IP地址等。特别是在一些大规模的网络中。客户端数目较多,使用DHCP可以方便对这些机器进行管理,为客户机提供TCP/IP参数配置,如IP地址、网关地址和DNS服务器等,不仅效率高,而且不存在IP地址冲突的情况现在的无线路由器默认都带有DHCP功能,也就是说一个无线路由器同时也是一个DHCP服务器。
- 手工分配:
根据需求,网络管理员为某些少数特定的主机(如DNS服务器、打印机)绑定固定的IP地址,其地址不会过期; - 自动分配:
为连接到网络的某些主机分配IP地址,该地址将长期由该主机使用; - 动态分配:
主机申请IP地址最常用的方法。DHCP服务器为客户端指定一个IP地址,同时为此地址规定了一个租用期限,如果租用时间到期,客户端必须重新申请IP地址。
DHCP采用客户端/服务器模式,服务器负责集中管理,客户端向服务器提出配置申请,服务器根据策略返回相应配置信息;DHCP报文采用UDP封装。服务器所侦听的端口号是67,客户端的端口号是68。
这里着重描述DHCP将主机连接进一个网络的自动能力。下图描述了DHCP的工作原理,其主要包括四个阶段:
-
DHCP服务发现阶段。即DHCP客户机寻找DHCP服务器的阶段。DHCP客户机以广播方式(因为DHCP服务器的IP地址对于客户机来说是未知的)发送DHCPDISCOVER发现信息来寻找DHCP服务器,即向地址255.255.255.255发送特定的广播信息,并且使用"本主机"的源地址0.0.0.0。网络上每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但是只有DHCP服务才会响应。
-
DHCP服务提供阶段,即DHCP服务器提供IP地址的阶段。在网络中接收到DHCPDISCOVER发现信息的DHCP服务器都会做出响应,它从尚未出租的IP地址中挑选一个分配给DHCP客户机,向DHCP客户机发送一个包含出租的IP地址和其他设置的DHCPOFFER提供信息。
-
选择阶段,即DHCP客户机选择某台DHCP服务器提供的IP地址的阶段,客户机会向选中的服务器提供用DHCPREQUEST请求报文进行响应。
-
确认阶段,即DHCP服务器确认所提供的IP地址的阶段。服务器用DHCPACK报文对DHCP请求报文进行响应。
一旦客户收到DHCP服务器发送的DHCPACK,交互便完成了,yiaddr表示获得的IP地址。
2.4 NAT简介
NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。
这里通过下面的案例简要的分析一下NAT的工作原理。
-
假设主机10.0.0.1需要向服务端IP地址为128.119.40.186发送一个请求,主机10.0.0.1为该请求指派了源端口号3345并将数据发送到LAN中。
-
NAT路由器收到该报文之后,为该数据报生成一个新的源端口号5001,将源IP地址替代为其广域网一侧接口的IP地址138.76.29.7,并将源端口号3345修改为5001。在生成一个新的源端口号时,NAT路由其可以选择一个在当前的NAT转换表中没有出现过的端口,并在NAT表中增加一个表项。
-
Web服务器收到报文后会响应该请求,其目的地址是NAT路由器的IP地址,目的端口是5001。
-
当该响应报文到达NAT路由器时,路由器会在NAT转换表中检索出家庭网络浏览器使用的IP地址10.0.0.1和目的端口号3345,于是,路由器重写该数据报的目的IP地址与目的端口号,并向网络转发该数据报。