文章目录
- 网络层
- 数据平面和控制平面
- 两者的概述
- 数据平面
- 控制平面
- 控制平面:传统方法
- 控制平面:SDN 方法
- 网络服务模型
- 路由器工作原理
- 通用路由器体系结构
- 输入端口的功能
- 基于目标的转发
- 交换结构
- 内存交换方式
- 总线交换方式
- 纵横式交换方式
- 输出端口的功能
- 何时何处出现缓存队列
- 输入排队
- 输出排队
- 分组调度
- 先进先出
- 优先权排队
- 循环和加权公平排队
- 网络协议:PIv4、寻址、IPv6 以及其它
- IPv4 数据报格式
- IPv4 数据报分片
- IPv4 编址
- IP和子网掩码
- CIDR
- 分类网络
- 特殊地址
- 分配地址
- 获取一块地址(用于组织的子网内)
- 获取主机地址:动态主机配置协议
- 网络地址转换 —— NAT
- 一些术语
- 通用转发和 SDN
- 匹配
- 动作
- 参考资料
网络层
从表面上看网络层的作用:将分组从一台发送主机移动到另一台接收主机。
完成该功能需要两个重要的网络层功能:
- 转发:当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路。
- 路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。
数据平面和控制平面
两者的概述
数据平面
- 数据平面指的是网络层中每台路由器的功能。
- 决定从路由器其中一条输入链路如何转发到另外其中一条输出链路。
控制平面
- 控制平面指的是网络范围内的逻辑。
- 控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。
控制平面:传统方法
每台路由中都包含转发和路由选择两种功能。
在一台路由器中的路由选择算法与在其它路由器中的路由选择算法通信,以计算出它的转发表的值。
这种路由选择功能是由路由选择厂商在其产品中固定写入的。
使用这种方法,每台路由器都有一个与其它路由器的路由选择组件通信的路由选择组件。
路由选择算法有:LR、DV 算法。
控制平面:SDN 方法
在 SDN 中将路由选择和转发进行了物理上的分离,即路由选择设备仅执行转发,而远程控制器计算并分发转发表。
网络服务模型
网络层能可能提供的某些服务:
- 确保交付:确保分组能够到达目的地。
- 具有时延上界的确保交付:能够确保分组在规定时间内交付。
- 有序分组交付:确保分组以发送的顺序到达目的地。
- 确保最小带宽:确保最低传输速率。
- 安全性:网络层能够在源加密所有数据报并在目的地解密这些分组,从而对所有运输层报文段提供机密性。
尽力而为服务:该服务传送的分组既不能保证以它们的发送顺序被接收方接收,也不能保证它们最终能交付等,其实尽力而为就是啥也不能保证,全凭运气,“尽力而为” 不过只是一种委婉的说法罢了。
路由器工作原理
通用路由器体系结构
输入端口的功能
线路端接:
- 物理层
- 输入链路的入口,接收 Bit 级。
数据链路处理:
- 数据链路层
- 协议、拆封
查找、转发、排队:
- 在输入端口中的转发表查找合适的输出端口,这便是“匹配”。
- 找到输出端口后,发送该分组进入交换结构,这便是“动作”。
- 转发的方式:
- 基于目标的转发:仅仅依赖于 IP 数据报的目标 IP 地址(传统方法)。
- 通用转发:基于头部字段的任意集合进行转发。
基于目标的转发
这种风格的转发表,路由器用分组目的地址的前缀与该表中的表项进行匹配。若存在一个匹配项,则路由器向与该匹配项相关联的链路转发分组。
最长前缀匹配规则:
当存在同时与多个表项成功匹配时,以最长的那个匹配项为最终目的。
最长前缀匹配:在路由器中经常采用 TCAMs(ternary content addressable memories) 硬件来完成
-
内容可寻址:将地址交给 TCAM ,它可以在一个时钟周期内检索出地址,不管表空间有多大
-
Cisco Catalyst 系列路由器 : 在 TCAM 中可以存储多达约为1百万条路由表项
交换结构
交换结构位于一台路由器的核心部位,因为正是通过这种交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口中。
有三种交换方式,如图所示:
内存交换方式
略…
总线交换方式
略…
纵横式交换方式
略…
输出端口的功能
- 当数据报从交换机构的到达速度比传输速率快就需要输出端口缓存。
- 由调度规则选择排队的数据报进行传输。
何时何处出现缓存队列
假设输入和输出链路的传输速率是相同的,为 RlineR_{line}Rline(单位:每秒分组数),交换结构传输速率为 RswitchR_{switch}Rswitch。
输入排队
若 RswitchR_{switch}Rswitch 比 RlineR_{line}Rline 快 NNN 倍,则会出现输入排队。
某一时刻,左上角和左下角的首个分组都需要传输到右上角输出端口,现在假设左上角分组正在传输,过程中左下角也需要传输,但此时到右上角的输出端口的通道已经被左上角占用了,因此会造成左下角阻塞,即便左下角后面的分组不需要传输到右上角,而是其它端口,例如右中间输出端口,尽管如此也会被阻塞,这样因为前部阻塞而造成的输入队列叫做输入队列交换机中的线路前部阻塞(Head-Of-the-Line, HOL)。
如果队列达到上限,则可能将出现丢包。
输出排队
若 RswitchR_{switch}Rswitch 比 RlineR_{line}Rline 快 NNN 倍,并且 N 个输入端口的目的地都为同一个相同的输出端口,交换机以 3 倍于线路速度的速度运行,则会出现输出排队。
同一时刻,三个输入端口同时发送给同一个输出端口(因为交换机的速度是线路的三倍,所以输入端不阻塞),当一个单位时间过后,右上角收到了来着三个输入端口的三个分组。接着又到达了两个新的分组,其中之一要传输给右上角的输出端口。
输出端口中的这些分组形成了一个输出队列,如果达到了上限,则有的包可能会被抛弃,从而迎接新的包。
当输出队列达到上限,又有新的分组到达时,如何选择队列中需要被丢弃的包,或者是丢弃新来的包,这都取决于分组调度。
分组调度
先进先出
略…
优先权排队
略…
循环和加权公平排队
略…
网络协议:PIv4、寻址、IPv6 以及其它
IPv4 数据报格式
表项 | 比特数 | 说明 |
---|---|---|
版本 | 4 bit | 规定了数据报的 IP 协议版本 |
首部长度 | 4 bit | 确定 IP 数据报中数据实际开始的地方(因为 IPv4 数据报可包含一些选项) |
服务类型 | 8 bit | 区分不同的 IP 数据报 |
数据报长度 | 16 bit | IP 数据报的总长度(首部+数据),单位字节 |
标识、标志、片偏移 | 16、3、13 bit | 用于 IP 分片 |
寿命(TTL) | 8 bit | 当 IP 数据报每经过一台路由器时,该值减一,若 TTL 为 0,则表示该数据报必须丢弃 |
协议 | 8 bit | 指示 IP 数据报的数据部分应该交给哪个特定的运输层协议,例如 6 表示给 TCP,17 就给 UDP |
首部检验和 | 16 bit | 用于帮助路由器检测收到的 IP 数据报中的比特错误 |
源和目的 IP 地址 | 32 bit | 当某源生成一个数据报时,它在源 IP 字段中插入它的 IP 地址,在目的 IP 地址字段中插入其最终目的地的地址,这通常由 DNS 查找来决定目的地址 |
选项 | 32 bit | 该字段允许 IP 首部被扩展。(为了节约开销) |
数据 | 32 bit | 实际数据 |
选项: 若将首部扩展,则数据报首部会变长,故不能预先确定数据字段从何处开始。其次有些数据报要求处理选项字段中的信息,故而导致一台路由器处理一个 IP 数据报所需的时间变化可能很大。因此该字段也基本不用,IPv6 已经去掉该字段。
一个 IP 数据报总长为 20 字节(假设无选项字段)
IPv4 数据报分片
最大传送单元 MTU: 一个链路层帧能承受的最大数据量叫做最大传送单元。作用是限制路由器之间传送 IP 数据报的长度。
将 IP 数据报中的数据分片成两个或更多个较小的 IP 数据报,用单独的链路层帧封装这些较小的 IP 数据报,然后通过输出链路发送这些帧。每个这样的较小数据报称为片。
片到达目的的运输层以前都需要重新组装,其片组装的工作在端系统中进行。
如果收的数据报是片的话,要确定何时收到了最后一片,并且如何重新组装形成最初的数据报。
- 当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。
- 发送主机通常将它发送的每个数据报的标识号增加 1。
- 当某路由器对一个数据报分片时,其中将初始化数据报的源地址、目的地址、标识号字段。
- 当目的地从同一台发送主机收到一系列数据报时,它能够检查数据报的标识号以确定那些数据报实际上是数据报片。
- 数据报的最后一个片的标志被设置为了 0。
为了让目的主机确认是否丢失一个片,使用偏移字段指定该片应放在初始 IP 数据报的哪个位置。
IPv4 编址
IP和子网掩码
- IP 地址长度:32 比特
- 总共有 2322^{32}232 个 IP 地址
- IP 地址常用电分十进制:即地址中的每个字节都用十进制表示,各字节间用点分开。
- IP 地址:223.1.1.0/24
/24
表示高 24 位是子网掩码,定义了网络号。
CIDR
- 当使用子网寻址时,32比特的IP地址被分为两部分。
- 格式:
a.b.c.d/x
- 高 x 位构成 IP 地址的网络部分,也常被称为前缀。
- 一个组织通常被分配一块连续的地址,即具有相同的前缀的一段地址。
- 剩下的 32-x 位用于区分该组织(即子网)内部设备的,其中所有设备都具有相同的网络前缀。
分类网络
A类、B类和C类为三种不同网络规模的网络提供单播地址。D类用于组播网络,E类地址范围是为未来或实验性目的保留的。
Class | 前缀位 | 网络地址位数 | 剩余的位数 | 网络数 | 每个网络的主机数 |
---|---|---|---|---|---|
A类地址 | 0 | 8 | 24 | 128 | 16,777,214 |
B类地址 | 10 | 16 | 16 | 16,384 | 65,534 |
C类地址 | 110 | 24 | 8 | 2,097,152 | 254 |
D类地址(群播) | 1110 | 未定义 | 未定义 | 未定义 | 未定义 |
E类地址(保留) | 1111 | 未定义 | 未定义 | 未定义 | 未定义 |
分类 | 前缀码 | 开始地址 | 结束地址 | 对应CIDR修饰 | 默认子网掩码 |
---|---|---|---|---|---|
A类地址 | 0 | 0.0.0.0 | 127.255.255.255 | /8 | 255.0.0.0 |
B类地址 | 10 | 128.0.0.0 | 191.255.255.255 | /16 | 255.255.0.0 |
C类地址 | 110 | 192.0.0.0 | 223.255.255.255 | /24 | 255.255.255.0 |
D类地址 (群播) | 1110 | 224.0.0.0 | 239.255.255.255 | /4 | 未定义 |
E类地址 (保留) | 1111 | 240.0.0.0 | 255.255.255.255 | /4 | 未定义 |
子网掩码和IP地址进行“与”运算可以得到其网络号。
特殊地址
https://www.rfc-editor.org/rfc/rfc3330
分配地址
要知道两点:
- 一个组织是如何得到一个地址块的。
- 一个设备(一台主机)是如何从某个组织得到的地址块中分配到一个地址的。
获取一块地址(用于组织的子网内)
网络管理员可以与 ISP 联系,由该 ISP 给分配。
那么 ISP 的地址块又从哪儿获取呢?
答:由 ICANN 分配。
获取主机地址:动态主机配置协议
当一个主机接入网络时,会去 DHCP 服务器获取一个 IP 地址,该地址可能是临时的,也可以是由网络管理员固定分配给你的。
当一台设备被 DHCP 分配地址的过程:
- DHCP 服务器发现(discover):客户端需要找到 DHCP 服务器,这可通过 DHCP 发现报文来完成。客户发送 UDP 分组向 67 端口发送该发现报文,该 UDP 分组封装在一个 IP 数据报中。使用广播目的地址
255.255.255.255
来发送,源IP使用0.0.0.0
。 - DHCP 服务器提供(offer):DHCP 服务器收到一个 DHCP 发现报文时,需要向客户端做出响应,该响应报文向该子网的所有节点广播(因为子网中可能存在多个 DHCP 服务器,该客户会选择其中一个最优的)。
- DHCP 请求(request):客户从一个或多个 DHCP 服务器中选择一个,并向选中的服务器提供用 DHCP 请求报文进行响应。
- DHCP ACK:DHCP 服务器用 DHCP ACK 报文对 DHCP 请求报文进行响应。(当客户收到该报文后,交互便完成了)
网络地址转换 —— NAT
NAT 就是一种将一个 IP 通过路由器转换为另一个 IP 的技术,NAT 解决了 IPv4 的 IP 地址数量的不足,地址分为公网IP和私有IP,一个设备想要上网就必须需要一个公网IP,但 IPv4 给每个设备分配一个公网 IP 显然不够,因此一个组织可以只一个公网IP,其子网使用私有IP,子网内的设备可以相互通信,但无法与外网的设备通信,如果想要和外网通信就需要一个公网IP,但前面说过了 IPv4 的地址数量不足以给每个设备都分配一个公网 IP。
因此当私有IP向访问外网时,NAT 可以将私有IP转换通过路由器转换为公网IP,反之当外网设备想和内网设备进行通信时,就通过路由器转换为私有IP。
图中:
[1] -> [2] 是内网访问外网。
[3] -> [4] 是外网访问内网。
一些术语
- 单播(unicast):是指在计算机网络的传输中,目的地址为单一目标的一种传输方式。
- 多播(英语:multicast,又称群播,中国大陆也译作组播):是计算机网络中的一种群组通信,它把信息同时传递给一组目的计算机。
通用转发和 SDN
回顾基于目的转发的步骤:
- 先查找目的IP地址,此乃“匹配”。
- 如何将分组发送到特定输出端口的交换结构,此乃“动作”。
现在采用一种 “匹配加动作”,其中能对协议栈的多个首部字段进行“匹配”,这些首部字段是与不同层次的不同协议相关联的。其中“动作”包括但不限于:将分组转发到一个或多个输出端口、负载均衡、重写首部字值,阻挡或丢弃分组。
在通用转发中,转发表不再是“地址+输出端口”的简单转发表了,而是“匹配+动作”表,该表由远程控制器计算安装和更新(远程控制器和 CV 打交道)。
因为能够使用网络层或链路层源和目的地址做出转发决定,因此下图中的转发设备被称为“分组交换机”,而不是第三层的“路由器”或第二层的“交换机”。
匹配加动作转发表在 OpenFlow 中被称为“流表”:
- 首部字段值集合
- 计数器集合
- 当前分组匹配流表项时所采取的的动作集合
OpenFlow 是一个得到高度认可和成功的标准,它已经称为匹配加动作转发抽象、控制器以及更为一般的 SDN 革命等概念的先驱。
匹配
如下图所示,是分组中的 11 个首部字段和入端口ID,该ID能被 OpenFlow 中的匹配加动作规则所匹配。
OpenFlow 的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。
入端口是指分组交换机上接收分组的输入端口。
如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个。
动作
每个流表项都有零个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。如果存在多个动作,它们以在表中规定的次序执行。
以下动作可能是最重要的:
- 转发
- 丢弃
- 修改字段
参考资料
- 分类网络