网络层
计算机网络
网际协议 IP
地址解析协议 ARP
每一台主机都设有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
- 当主机 A 要想本局域网上的某台主机 B 发送 IP 数据报是,就先在 ARP 高速缓存中查看有无 B 的 IP 地址,如果有就取出其硬件地址。
- 如果没有就向本局域网广播一个 ARP 请求分组,请求分组的内容有本机 IP 地址、本机硬件地址、目标主机 IP 地址。
- 本局域网上所有主机的 ARP 进程都会收到此 ARP 请求分组。
- 主机 B 的 IP 地址与请求的 IP 地址一致,于是收下这个 ARP 请求分组,并向主机 A 发送 ARP 响应分组,这个响应分组中包括本机的 IP 地址和本机的硬件地址。同时,主机 B 也会将主机 A 的 IP 地址和硬件地址写入自己的 ARP 高速缓存。这个响应分组是普通的单播。
- 主机 A 收到主机 B 的 ARP 响应分组后,在其 ARP 高速缓存中写入主机 B 的 IP 地址和硬件地址。
IP 数据报的格式

- 版本:表示 IP 协议的版本。
- 首部长度:首部的长度,单位是 4 字节。
- 区分服务:暂时无意义。
- 总长度:首部和数据之和的长度,单位为字节。
当数据报的总长度超过数据链路层的最大传送单元时就必须进行分片处理。将一个 IP 数据报分成多个分片,每个分片都具有 IP 首部。
- 标识:对分片进行标识,同一个数据报的分片具有同样的标识。
- 标志:占 3 位。最低位记为 MF(More Fragment),MF = 1 表示后面“还有分片”,MF = 0 表示这是多个数据报片中的最后一个;中间一位记为 DF(Don't Fragment),只有当 DF = 0 时才允许分片。
- 片偏移:表示该分片在原分组中的相对位置,片偏移以 8 个字节为偏移单位。
- 生存时间:TTL,表示该数据报在网络中可以被转发的次数,每经过一次转发,这个值减 1。
- 首部校验和:这个字段只检验数据报的首部,不检验数据部分。
- 源地址
- 目的地址
- 可变部分:可变部分中包括用于增加 IP 数据报功能的选项,这些选项一个一个拼起来,中间不需要分隔符,最后用 0 填充为 4 字节的整数倍。
IP 层转发流程
路由器中有路由表,路由表指出到某个网络的下一跳地址。
- 从数据报的首部提取目的主机的 IP 地址 D,得出目的网络地址 N。
- 若 N 与此路由器直接相连,则进行直接交付。
- 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器。否则
- 若路由表中有默认路由,则把数据报传送给默认路由。否则
- 报告转发分组出错。
划分子网
- 在网络内部可以划分子网,可以根据需求将任意位作为子网号。
- 网络号和子网号全部填入 1,主机号全部填入 0 可以得到子网掩码。将子网掩码与的任意 IP 地址按位与,结果如果与网络地址相同则说明这个 IP 地址位于这个子网中。
- 路由器的路由表中必须有子网掩码这一栏,用于更方便地查找路由表。
- 在 IP 转发流程中查找路由表时,对每个网络的子网掩码与目标 IP 按位与,看结果与网络地址是否匹配。
无分类编址(构造超网)
网络前缀
- 无分类域间路由选择(CIDR)消除了传统的网络分类,将网络前缀都相同的连续的 IP 地址组成一个 CIDR 地址块。
CIDR 记法:CIDR 地址块中的地址在 IP 地址后用斜线分隔写上网络前缀所占的位数(128.14.35.7/20)。点分十进制中低位中连续的 0 可以省略(比如 10.0.0.0/10 可以记为 10/10)。
- CIDR 使用 32 位的地址掩码。
- 使用 CIDR 匹配时可能得到不止一个匹配结果,这种情况下取网络前缀最长的网络。
- 使用 CIDR 查询路由表时使用二叉线索。为了提高二叉线索的查询速度,广泛使用了各种压缩技术。
网际控制报文协议 ICMP
ICMP 报文装在 IP 数据报中,作为其数据部分。

- 类型表示 ICMP 报文的类型,主要分为差错报告报文和询问报文。
类型的值 |
ICMP 报文的类型 |
3 |
终点不可达 |
11 |
时间超过 |
12 |
参数问题 |
5 |
改变路由(让主机知道下次应将数据报发送给另外的路由器) |
8 或 0 |
回送请求或回答 |
13 或 14 |
时间戳请求或回答 |
下面几种情况不应发送 ICMP 差错报文
- ICMP 差错报文。
- 后续数据报片。
- 具有多播地址的数据报。
- 具有特殊地址的数据报。
ICMP 询问报文中,回送请求和回答用于测试目的站点是否可达以及了解其有关状态,时间戳请求和回答可以用于时钟同步和时间测量。
互联网的路由选择协议
互联网采用的路由选择协议是分层次的。
内部网关协议 RIP
RIP 协议要求网络中每一个路由器都要维护从它自己到其他每一个目的网络的距离向量。
RIP 协议的特点是:
- 仅和相邻路由器交换信息。
- 交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表。
- 按固定的事件间隔交换路由信息。
路由表包含,目的网络地址,距离,下一跳路由器地址。
交换信息时,将相邻路由器发来的 RIP 报文中所有项目的“下一跳”字段的地址都改为相邻路由器的地址,将“距离”字段的值加 1。如果本机路由表中没有这个网络或者“距离”大于这个值,那么添加新的项目或者用新的项目替换原项目。

内部网关协议 OSPF
路由器定期问候相邻的路由器,当链路状态发生变化的时候,路由器通过洪泛法向本自治系统中所有的路由器发送信息。每个路由器中都保存着全网的拓扑结构图。
OSPF 数据报直接用 IP 数据报传送,OSPF 数据报的格式:

- 版本:当前版本号是 2.
- 类型:分组类型。
- 分组长度:包括 OSPF 首部在内的分组长度。
- 路由器标识符:发送该分组的路由器的接口的 IP 地址。
- 鉴别类型:目前只有两种,0(不用)和 1(口令)。
- 鉴别:不用鉴别时填入 0,口令鉴别时填入 8 个字符的口令。
OSPF 允许管理员给每条路由指派不同的代价,OSPF 根据代价计算最佳路径,而不是仅仅根据跳数。
分组类型:
- 问候:用于发现和维持邻站的可达性。
- 数据库描述:向邻站给出自己的链路状态的数据库中所有链路状态项目的摘要信息。
- 链路状态请求:想对方请求发送某些链路状态项目的详细信息。
- 链路状态更新:用洪泛法对全网更新链路状态。
- 链路状态确认:路由器收到链路更新分组后需要发送确认分组,对于重复的更新分组只需要发送一次确认。
外部网关协议 BGP
每一个自治系统选择至少一个路由器作为“BGP 发言人”,BGP 发言人往往就是 BGP 边界路由器。BGP 刚刚运行时与邻站交换整个 BGP 路由表,只有只需要在发生变化是更新有变化的部分。
BGP 的四种报文:
- OPEN:用来与相邻的另一个 BGP 发言人建立关系,使通信初始化。
- UPDATE:用来通告某一路由的信息,以及列出要撤销的多条路由。
- KEEPALIVE:用来周期性地证实邻站的连通性。
- NOTIFICATION,用来发送检测到的差错。
BGP 报文格式:

- OPEN 报文具有 6 个字段:版本(现在是 4)、本自治系统号(2 字节,全球唯一)、保持时间(2 字节)、BGP 标识符(4 字节,通常是该路由器 IP 地址)、可选参数长度(1 字节)和可选参数。
- UPDATE 报文有 5 个字段:不可行路由长度(2 字节)、不可行路由、路径属性总长度(2 字节)、路径属性、网络层可达信息(包括发出此报文的网络、网络前缀数和 IP 地址前缀)。
- KEEPALIVE 报文只有通用首部。
- NOTIFICATION 报文有 3 个字段:差错代码(1 字节)、差错子代码(1 字节)和差错数据。
IPv6
IPv6 地址增大到 128 位,以下是 IPv6 数据报的格式。

- 版本:协议的版本,对于 IPv6 是 6.
- 流标号:“流”指互联网络上从特定源点到特定终点的一系列数据报,所有属于同一个流的数据报都具有同样的流标号。
- 有效载荷长度:表示 IPv6 数据报除基本首部以外的字节数。
- 下一个首部:当没有扩展首部时,下一个首部字段指出基本首部后面的数据应该移交给哪个高层协议。当出现扩展首部时,下一个首部字段的值表示后面第一个扩展首部的类型。
数据报图中经过的路由器不处理扩展首部。
IPv6 采用冒号十六进制记法,如 68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF,冒号十六进制记法允许零压缩,即一连串连续的零可以为一对冒号所取代,任一地址中只能够使用一次零压缩。
从 IPv4 向 IPv6 过渡
- 双协议栈,在 IPv6/IPv4 路由器中可以将 IPv6 协议转换为 IPv4 协议,也可以反向转换,但是转换之后某些字段不能够再恢复。
- 隧道技术,在 IPv6/IPv4 路由器中将 IPv6 数据报封装为 IPv4 数据报,在另一端再取出 IPv6 数据报。
IP 多播
从 224.0.0.0 到 239.255.255.255 之间的地址作为多播地址,多播地址仅能作为源地址,不能作为目的地址。
网际组管理协议 IGMP
- 当某台主机加入新的多播组时,该主机向多播组的多播地址发送一个 IGMP 报文,本地的多播路由器收到 IGMP 报文后还要讲这种组成员关系转发给互联网上的其他多播路由器。
- 本地多播路由器要周期性地探寻本地局域网上的主机,以便知道这些主机是否还是组的成员,当一个组经过了几次探询后仍然没有一台主机响应,就不再把这个组的成员关系转发给其他的多播路由器。
- 在 IGMP 的询问报文中有一个数值 N,当收到询问时,主机在 0 到 N 之间随机选择发送响应所需经过的时延。同一个组内每一台主机都要监听响应,只要有本组的其他主机先发送了响应,自己就可以不再发送响应。
多播路由选择协议
已经有了多种多播路由选择协议,他们在转发数据报时使用了以下的三种方法。
- 洪泛与剪除:这种方法适合于较小的多播组。路由器转发多播数据报使用洪泛的方法,一个路由器收到一个多播数据报的时候要检查数据报是否是从源点经最短路径的相邻路由器传来的,如果有多条最短路径,选择 IP 地址最小的相邻路由器。这样就可以得出多播转发树,以后就按照这个转发树来转发多播数据报。当某个路由器发现它的下游已不再有组成员,就将它和下游一起剪除。当某个树枝有新增加的组成员时,可以再接入到多播转发树中。
- 隧道技术:这种技术适用于多播组的位置在地理上很分散的情况,经过不支持多播的路由器时,将它封装为单播数据报,再在多播路由器处取出多播数据报。
- 基于核心的发现技术:对一个多播组指定一个核心路由器,给出它的单播地址,将多播数据报直接发送到核心路由器,再由核心路由器向每一个组成员发送这个多播数据报的一个副本。
虚拟专用网 VPN
以下专用地址仅仅用于内部通信,所有路由器对于目的地址是专用地址的数据报一律不进行转发。
- 10.0.0.0 到 10.255.255.255
- 172.16.0.0 到 172.31.255.255
- 192.168.0.0 到 192.168.255.255
当专用网需要分布在很大的范围时就需要构建虚拟专用网,两个专用网之间的数据报首先传送到专用网 A 中一个具有公网 IP 的路由器,该路由器对这个数据报进行加密再封装为新的 IP 数据报。然后传送到专用网 B 中的一个具有公网 IP 的路由器,然后这个路由器还原出原本的 IP 数据报再交付给目标专用地址。
网络地址转换 NAT
NAT 路由器内部有一个 NAT 地址转换表,在转发发送的数据报之前,路由器会根据转换表修改数据报的源地址,在转发接收的数据报之前,路由器会根据转换表修改数据报的目标地址。
多协议交换 MPLS
在 MPLS 域的入口处给每一个 IP 数据报打上固定长度的“标记”,在转发的时候不再上升到网络层,而是直接在链路层根据标记用硬件进行转发。
转发等价类 FEC 是路由器按照同样方式对待的 IP 数据报的集合,同一个 FEC 内的数据报打上的标记是相同的,管理员可以手动设置 FEC 的转发路径来均衡网络负载,这种做法称为流量工程。