从表面上看网络层的作用:将分组从一台发送主机移动到另一台接收主机。
完成该功能需要两个重要的网络层功能:
每台路由中都包含转发和路由选择两种功能。
在一台路由器中的路由选择算法与在其它路由器中的路由选择算法通信,以计算出它的转发表的值。
这种路由选择功能是由路由选择厂商在其产品中固定写入的。
使用这种方法,每台路由器都有一个与其它路由器的路由选择组件通信的路由选择组件。
路由选择算法有:LR、DV 算法。
在 SDN 中将路由选择和转发进行了物理上的分离,即路由选择设备仅执行转发,而远程控制器计算并分发转发表。
网络层能可能提供的某些服务:
尽力而为服务:该服务传送的分组既不能保证以它们的发送顺序被接收方接收,也不能保证它们最终能交付等,其实尽力而为就是啥也不能保证,全凭运气,“尽力而为” 不过只是一种委婉的说法罢了。
线路端接:
数据链路处理:
查找、转发、排队:
这种风格的转发表,路由器用分组目的地址的前缀与该表中的表项进行匹配。若存在一个匹配项,则路由器向与该匹配项相关联的链路转发分组。
最长前缀匹配规则:
当存在同时与多个表项成功匹配时,以最长的那个匹配项为最终目的。
最长前缀匹配:在路由器中经常采用 TCAMs(ternary content addressable memories) 硬件来完成
内容可寻址:将地址交给 TCAM ,它可以在一个时钟周期内检索出地址,不管表空间有多大
Cisco Catalyst 系列路由器 : 在 TCAM 中可以存储多达约为1百万条路由表项
交换结构位于一台路由器的核心部位,因为正是通过这种交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口中。
有三种交换方式,如图所示:
略…
略…
略…
假设输入和输出链路的传输速率是相同的,为 R l i n e R_{line} Rline(单位:每秒分组数),交换结构传输速率为 R s w i t c h R_{switch} Rswitch。
若 R s w i t c h R_{switch} Rswitch 比 R l i n e R_{line} Rline 快 N N N 倍,则会出现输入排队。
某一时刻,左上角和左下角的首个分组都需要传输到右上角输出端口,现在假设左上角分组正在传输,过程中左下角也需要传输,但此时到右上角的输出端口的通道已经被左上角占用了,因此会造成左下角阻塞,即便左下角后面的分组不需要传输到右上角,而是其它端口,例如右中间输出端口,尽管如此也会被阻塞,这样因为前部阻塞而造成的输入队列叫做输入队列交换机中的线路前部阻塞(Head-Of-the-Line, HOL)。
如果队列达到上限,则可能将出现丢包。
若 R s w i t c h R_{switch} Rswitch 比 R l i n e R_{line} Rline 快 N N N 倍,并且 N 个输入端口的目的地都为同一个相同的输出端口,交换机以 3 倍于线路速度的速度运行,则会出现输出排队。
同一时刻,三个输入端口同时发送给同一个输出端口(因为交换机的速度是线路的三倍,所以输入端不阻塞),当一个单位时间过后,右上角收到了来着三个输入端口的三个分组。接着又到达了两个新的分组,其中之一要传输给右上角的输出端口。
输出端口中的这些分组形成了一个输出队列,如果达到了上限,则有的包可能会被抛弃,从而迎接新的包。
当输出队列达到上限,又有新的分组到达时,如何选择队列中需要被丢弃的包,或者是丢弃新来的包,这都取决于分组调度。
略…
略…
略…
表项 | 比特数 | 说明 |
---|---|---|
版本 | 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 字节(假设无选项字段)
最大传送单元 MTU: 一个链路层帧能承受的最大数据量叫做最大传送单元。作用是限制路由器之间传送 IP 数据报的长度。
将 IP 数据报中的数据分片成两个或更多个较小的 IP 数据报,用单独的链路层帧封装这些较小的 IP 数据报,然后通过输出链路发送这些帧。每个这样的较小数据报称为片。
片到达目的的运输层以前都需要重新组装,其片组装的工作在端系统中进行。
如果收的数据报是片的话,要确定何时收到了最后一片,并且如何重新组装形成最初的数据报。
为了让目的主机确认是否丢失一个片,使用偏移字段指定该片应放在初始 IP 数据报的哪个位置。
/24
表示高 24 位是子网掩码,定义了网络号。a.b.c.d/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 分配地址的过程:
255.255.255.255
来发送,源IP使用 0.0.0.0
。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] 是外网访问内网。
回顾基于目的转发的步骤:
现在采用一种 “匹配加动作”,其中能对协议栈的多个首部字段进行“匹配”,这些首部字段是与不同层次的不同协议相关联的。其中“动作”包括但不限于:将分组转发到一个或多个输出端口、负载均衡、重写首部字值,阻挡或丢弃分组。
在通用转发中,转发表不再是“地址+输出端口”的简单转发表了,而是“匹配+动作”表,该表由远程控制器计算安装和更新(远程控制器和 CV 打交道)。
因为能够使用网络层或链路层源和目的地址做出转发决定,因此下图中的转发设备被称为“分组交换机”,而不是第三层的“路由器”或第二层的“交换机”。
匹配加动作转发表在 OpenFlow 中被称为“流表”:
OpenFlow 是一个得到高度认可和成功的标准,它已经称为匹配加动作转发抽象、控制器以及更为一般的 SDN 革命等概念的先驱。
如下图所示,是分组中的 11 个首部字段和入端口ID,该ID能被 OpenFlow 中的匹配加动作规则所匹配。
OpenFlow 的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。
入端口是指分组交换机上接收分组的输入端口。
如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个。
每个流表项都有零个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。如果存在多个动作,它们以在表中规定的次序执行。
以下动作可能是最重要的: