文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
1. 概要
- 在网络中的每一台主机和路由器中都有一个网络层部分。网络层能够被分解为两个互相作用的部分,即 数据平面 和 控制平面。
- 数据平面主要涉及 转发(forwarding),指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作,转发发生的时间尺度很短(通常为几纳秒),因此通常用硬件来实现。
- 控制平面主要涉及 路由选择(routing),指确定分组从源到目的地所采取的端到端路径的网络范围处理过程,路由选择发生的时间尺度长得多(通常为几秒),因此通常用软件来实现。
- 因特网的网络层提供了单一的服务,称为 尽力而为服务(best-effort service),传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽。
1.1 路由器工作原理
路由器体系结构- 一台路由器有着 4 个组件。
输入端口(input port)
- 在这里通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口。
- 控制分组(如携带路由选择协议信息的分组)从输入端口转发到路由选择处理器。
交换结构
- 交换结构将路由器的输入端口连接到它的输出端口,是一个网络路由器中的网络。
- 交换可以用允许方式完成。
- 经内存交换。
- 经总线交换。
- 经互联网络交换。
输出端口
- 输出端口处存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。
路由选择处理器
- 在传统路由器中,它执行路由选择协议,维护路由选择表与关联链路状态信息,并为该路由器计算转发表。
- 路由器使用 转发表 来查找输出端口,使得到达的分组能经过 交换结构 转发到该输出端口。转发表是由 路由选择处理器 计算和更新的(使用路由选择协议与其他网络路由器中的路由选择处理器进行交互),或者转发表接收来自远程 SDN 控制器的内容。
- 路由器使用分组目的地址的 前缀(prefix)与转发表中的表项进行匹配,如果存在一个匹配项,则路由器向该匹配项相关联的链路转发分组。
- 当多个匹配时,该路由器使用 最长前缀匹配规则(longest prefix matching rule)。
- 一旦通过查找确定了某分组的输出端口,则该分组就能够发送进入交换结构,在某些设计中,如果来自其他输入端口的分组当前正在使用该交换结构,一个分组可能会在进入交换结构时被暂时阻塞。
1.1.1 排队
- 在输入端口和输出端口处都可以形成分组排队,排队的位置和程序将取决于流量负载、交换的相对速率和线路速率。
- 随着队列的增长,路由器的缓存空间最终将会耗尽,并且当无内存可用于存储到达的分组时将会出现 丢包(packet loss)。
- 一个输入队列中排队的分组必须等待通过交换结构发送(即使输出端口是空闲的),因为它被位于线路前部的另一个分组所阻塞,这种现象叫做输入的 线路前部阻塞(Head-Of-the-Line,HOL)。
- 当没有足够的内存来缓存一个入分组时,要么丢弃到达的分组(弃尾策略(drop-tail)),要么删除一个或多个已排队的分组为新来的分组腾出空间。
- 在某些情况下,在缓存填满之前便丢弃一个分组(或在其首部加上标记)的做法是有利的,这可以向发送方提供一个阻塞信号,其中运用最广泛的研究与实现是 主动队列管理(Active Queue Management,AQM)算法 和 随机早期检测(Random Early Detection,RED) 算法。
1.1.2 分组调度
- 在这些排队分组中选择一个分组传输,这是 分组策略 的处理。
- 分组策略包含有 先进先出(First-In-First-Out,FIFO)、优先权排队(priority queuing)和 循环和加权公平排队。
- 循环和加权公平排队是一个所谓的保持工作排队,规则在有(任何类的)分组排队等待传输时,不允许链路保持空闲,保持工作的循环规则将立即检查循环序列中的下一个类。
2. 网际协议
2.1 IPv4 数据报格式
IPv4 数据报格式关键字段 | 说明 |
---|---|
版本(号) | 4 比特规定了 IP 协议版本。 |
首部长度 | IPv4 数据报可以包含一些可变数量的选项,故需要 4 比特确定 IP 数据报中载荷。大多数 IP 数据报不含选项,所以一般 IP 数据报具有 20 字节的首部。 |
服务类型(TOS) | 以便使用不同类型的 IP 数据报。 |
数据报长度 | IP 数据报的总长度。IP 数据报理论最大长度为 65535。 |
标识、标志、片偏移 | 与 IP 分片有关。IPv6 不允许在路由器上对分组分片。 |
寿命(Time-To-Live,TTL) | 用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环,每当一台路由器处理数据报时,该字段的值减 1。若 TTL 字段减为 0,则该数据报必须丢弃。 |
协议 | 当一个 IP 数据报到达其最终目的地时使用,指示 IP 数据报的数据部分应交给哪个特定的运输层协议,例如值为 6 交由 TCP,值为 17 交由 UDP。 |
首部检验和 | 检测接收到的 IP 数据报中的比特错误。 |
源和目的 IP 地址 | IP 地址。 |
选项 | 允许 IP 首部被扩展。IPv6 中去除了该字段。 |
数据(有效载荷) | 包含要交付给目的地的运输层报文段。 |
上层协议 | 值 |
---|---|
ICMP | 1 |
IGMP | 2 |
TCP | 6 |
UDP | 17 |
EIGRP | 88 |
OSPF | 89 |
2.1.1 IPv4 数据报分片
- 并不是所有链路层协议都能承载相同长度的网络层分组。例如,以太网能够承载不超过 1500 字节的数据,某些广域网只能承载不超过 576 字节的数据。一个链路层帧能够承载的最大数据量,称为 最大传送单元(Maximum Transmission Unit),MTU 严格地限制着 IP 数据报的长度。
- 会将 IP 数据报中的数据 分片 成两个或更多个较小的 IP 数据报,每个这些较小的数据报都称为 片(fragment)。
- 有分片,那么就有重新组装,IPv4 的设计者感到在路由器中重装数据报会给协议带来相当大的复杂性并且影响路由器性能,因此将数据报的重新组装工作放到端系统中,将标志、标识和片偏移字段放在 IP 数据报首部。
- 发送主机通常将发送的每个数据报的标识号加 1。
- 为了让目的主机绝对相信已收到初始数据报的最后一个片,标志比特被设置为 0,而所有其他片比特被设为 1。
- 偏移字段指定该片应放在初始 IP 数据报的哪个位置。
2.1.2 IPv4 编址
- 主机与物理链路之间的边界叫做 接口(interface),从技术上讲,一个 IP 地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。
- 每个 IP 地址长度为 32 比特(等价为 4 字节),因此总共有 232 个可能的 IP 地址。
- 这些地址通常按 点分十进制记法(dotted-decimal notation)书写。
- 分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点。这些隔离的网络中的每一个都叫做一个 子网(subnet)。
- IP 编址为子网分配一个地址 a.b.c.d/24,其中 /24 记法,有时称为 子网掩码(network mask),指示 32 比特中的最左侧 24 比特定义了子网地址。
- 因特网的地址分配策略被称为 无类别域间路由选择(Classless Interdomain Routing,CIDR)[ RFC 4632 ]。
- CIDR 将子网寻址的概念一般化了,当使用子网寻址时,32 比特的 IP 地址被划分为两部分(a.b.c.d/x),其中 x 指示了地址的第一部分中的比特数,地址的 x 最高比特构成了 IP 地址的 网络 部分,称为地址的 前缀/网络前缀(prefix),一个地址剩余的 32 - x 比特用于区分内部设备,其中所有设备具有相同的网络前缀。
- CIDR 被采用之前,IP 地址的网络部分被限制为长度为 8、16 和 24 比特,这是一种称为 分类编制(classful addressing)的编址方案,具有 8、16 和 24 比特子网地址的子网分别被称为 A、B 和 C 类网络。一个 C 类网络(/24)子网仅能容纳多达 28 - 2 = 254(其中的两个地址预留用于特殊用途)台主机,而 B 类(/16)子网可支持 65534 台主机。
- IP 地址为 255.255.255.255 即广播地址,当一台主机发出一个目的地址为 255.255.255.255 的数据报时,该报文会交付给同一网络中的所有主机。
地址的获取
- IP 地址由因特网名字和编号分配机构(internet Corporation for Assigned Names and Numbers,ICANN)管理。
2.1.3 动态主机配置协议
- 系统管理通常手工配置路由器中的 IP 地址。主机地址也可以通过手动配置,但是目前更多是使用 动态主机配置协议(Dynamic Host Configuration,DHCP)[ RFC 2131 ] 来完成。
- DHCP 允许主机自动获取(被分配)一个 IP 地址。网络管理员能够配置 DHCP 给定主机每次与网络连接时能够得到一个相同的 IP 地址,或者分配一个临时的 IP 地址。
- 除了主机 IP 地址分配外,DHCP 还允许一台主机得知其他信息(它的子网掩码、它的第一跳路由器地址(默认网关)与它的本地 DNS 服务器的地址)。
- DHCP 具有将主机连接进一个网络的网络相关方面的自动能力,所以又常被称为 即插即用协议(plug-and-play protocol)或 零配置协议(zeroconf)。
- 在简单场合下,每个子网将具有一台 DHCP 服务器。如果在某子网中没有服务器,则需要一个 DHCP 中继代理(通常是一台路由器),这个代理知道用于该网络的 DHCP 服务器的地址。
- DHCP 协议的 4 个步骤。
- DHCP 服务器发现,通过使用 DHCP 发现报文(DHCP discover message)完成。
- DHCP 服务器提供,通过使用 DHCP 提供报文(DHCP offer message)向客户做出响应。
- DHCP 请求,客户端通过 DHCP 请求报文(DHCP request message)进行响应。
- DHCP ACK,服务器通过 DHCP ACK 报文(DHCP ACK message)对 DHCP 请求报文进行响应。
DHCP 服务器发现
- 客户在 UDP 分组中向 67 端口发送该报文。
- DHCP 客户生成包含 DHCP 发现报文的 IP 数据报,其中使用了广播目的地址 255.255.255.255,并且使用 " 本主机 " 源 IP 地址 0.0.0.0。
- DHCP 客户将该 IP 数据报传递给链路层,链路层将该帧广播到所有与该子网连接的节点。
属性 | 说明 | 内容 |
---|---|---|
src | 源 | 0.0.0.0,68 |
dest | 目的 | 255.255.255.255,67 |
DHCPDISCOVER | 类型 | |
yiaddr | 向客户推荐的 IP 地址 | 0.0.0.0 |
transaction ID | 事务 ID | 654 |
DHCP 服务器提供
- DHCP 服务器收到发现报文时,做出响应。
- 该报文向该子网的所有节点广播,广播目的地址还是 255.255.255.255。
- 提供的报文还包含有事务 ID、向客户推荐的 IP 地址、网络掩码以及 IP 地址租用期(address lease time)(IP 地址有效的时间量)。通常设置为几小时或者几天。
- 假设 DHCP 服务器的 IP 地址为 222.1.2.4。
属性 | 说明 | 内容 |
---|---|---|
src | 源 | 222.1.2.4,67 |
dest | 目的 | 255.255.255.255,68 |
DHCPOFFER | 类型 | |
yiaddr | 向客户推荐的 IP 地址 | 222.1.2.5 |
transaction ID | 事务 ID | 654 |
Lifetime | IP 地址租用期 | 3600 secs |
DHCP 请求
- 子网中可能存在多个 DHCP 服务器,因此客户需要从一个或者多个服务器提供中选择一个,并向选中的服务器提供用 DHCP 请求报文进行响应,回显配置的参数。
属性 | 说明 | 内容 |
---|---|---|
src | 源 | 0.0.0.0,68 |
dest | 目的 | 255.255.255.255,67 |
DHCPREQUEST | 类型 | |
yiaddr | 向客户推荐的 IP 地址 | 222.1.2.5 |
transaction ID | 事务 ID | 655 |
DHCP server ID | 选中的 DHCP 服务器 | 222.1.2.4 |
Lifetime | IP 地址租用期 | 3600 secs |
DHCP ACK
- 对 DHCP 请求报文进行响应,证实所要求的参数。
属性 | 说明 | 内容 |
---|---|---|
src | 源 | 222.1.2.4,67 |
dest | 目的 | 255.255.255.255,68 |
DHCPACK | 类型 | |
yiaddr | 向客户推荐的 IP 地址 | 222.1.2.5 |
transaction ID | 事务 ID | 655 |
DHCP server ID | 选中的 DHCP 服务器 | 222.1.2.4 |
Lifetime | IP 地址租用期 | 3600 secs |
2.1.4 网络地址转换
- 每个 IP 使能的设备都需要一个 IP 地址,随着子网的大量出现,就需要扩展子网,如果之前 ISP 已经为当前环境的网络(例如家庭)地址范围分配过连续地址,那么想要扩展就可以使用 网络地址转换(Network Address Translation,NAT)。
- NAT 使能路由器对外界的行为如同具有单一 IP 地址的单一设备,所有离开家庭路由器流向因特网的报文都拥有一致的源 IP,且所有进入家庭的报文都拥有同一个目的 IP。
- 家庭网络内的编址具有相同的网络地址(如:10.0.0.0/24),该地址被称为 专用网络(private netword)或者 具有专用地址的地域(realm with private address)。具有专用地址的地域是指该地址仅对该网络中的设备具有意义。
- 如果从广域网到达 NAT 路由器的所有数据报都有着相同的目的 IP 地址,那么它如何将分组转发到特定的内部主机,这里使用了 NAT 转换表(NAT translation table)。
- 表中包含了端口号及其 IP 地址。
2.2 IPv6
- 由于新的子网和 IP 节点以惊人的增长率连接到因特网上(并被分配唯一的 IP 地址),32 比特的 IP 地址空间即将用尽,因此开发了新的 IPv6 协议。
2.2.1 IPv6 数据报格式
IPv6 数据报格式- IPv6 中的变化。
- 扩大的地址容器,IPv6 将 IP 地址长度从 32 比特增加到了 128 比特。引入了一种称为 任播地址(anycast address)的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。(例如,可用于向一组包含给定文档的镜像站点中的最近一个发送 HTTP GET 报文)
- 简化高效的 40 字节首部。舍弃了选项。
- 增加了流标签。
关键字段 | 说明 |
---|---|
版本 | 4 比特字段用于标识 IP 版本号。 |
流量类型 | 8 比特字段与 IPv4 的 TOS 字段含义相似。 |
流标签 | 20 比特用于标识一条数据报的流。 |
有效载荷长度 | 16 比特作为一个无符号整数,给出 IPv6 数据报中跟在定长的 40 字节数据报首部后面的字节数量。 |
下一个首部 | 标识数据报中的内容(数据字段),需要交付给哪个协议(如 TCP 或 UDP)。 |
跳限制 | 转发数据报的每台路由器将对该字段内容减 1。如果跳限制计数达到 0,则该数据报将被丢弃。 |
源地址和目的地址 | IPv6 128 比特地址的各种格式在 [ RFC 4921 ] 中进行了描述。 |
数据 | IPv6 数据报的有效载荷部分。 |
数据报格式与 IPv4 比较
- 分片/重新组装。IPv6 不允许在中间路由器上进行分片与重新组装,如果路由器收到的 IPv6 数据报因太大而不能转发到链路上,则路由器只需丢掉该数据报,并向发送方发回一个 " 分组太大 " 的 ICMP 差错报文。然后发送方能够使用较小长度的 IP 数据报重发数据。
- 首部检验和。因为网络层和数据链路层都进行了检验操作,因此做了删除。
- 选项。这个字段不再是标准 IP 首部的一部分,它并没有消失,而是可能出现在 IPv6 首部中由 " 下一个首部 " 指出的位置上。
2.3 ICMP
- 由 [ RFC 792 ] 定义了因特网控制报文协议(internet control message protocol,ICMP),被主机和路由器用来彼此沟通网络层的信息。ICMP 报文是作为 IP 有效载荷承载的,就像 TCP 与 UDP 一样,当一台主机收到一个指明上层协议为 ICMP 的 IP 数据报时(上层协议编码为 1),分解出该数据报的内容给 ICMP。
- ICMP 报文有一个类型字段和一个编码字段,并且包含引起该 ICMP 报文首次生成的 IP 数据报的首部和前 8 个字节(以便发送方能确定引发该差错的数据报)。
- ICMP 报文并不仅是用于通知差错情况。
ICMP 类型 | 编码 | 描述 |
---|---|---|
0 | 0 | 回显回答(对 ping 的回答)。 |
3 | 0 | 目的网络不可达。 |
3 | 1 | 目的主机不可达。 |
3 | 2 | 目的协议不可达。 |
3 | 3 | 目的端口不可达。 |
3 | 6 | 目的网络未知。 |
3 | 7 | 目的主机未知。 |
4 | 0 | 源抑制。 |
8 | 0 | 回显请求。 |
9 | 0 | 路由器通告。 |
10 | 0 | 路由器发现。 |
11 | 0 | TTL 过期。 |
12 | 0 | IP 首部损坏。 |
网友评论