【计算机网络】第四章:网络层(上)
本篇笔记课程来源:王道计算机考研 计算机网络
【计算机网络】第四章:网络层(上)
- 一、网络层的功能
- 1. 基本概要
- 2. 功能总览
- 二、IPv4
- 1. IPv4 数据报
- 2. IPv4 地址
- 3. 子网划分与子网掩码
- Ⅰ. 基本概念
- Ⅱ. 默认设置
- Ⅲ. 主机发送 IP 数据报的过程
- Ⅳ. 路由器转发 IP 数据报的过程
- 4. 无分类编址 CIDR
- 5. 路由聚合
- 6. 网络地址转换 NAT
- 7. 地址解析协议 ARP
- 8. 动态主机配置协议 DHCP
- 9. 网际控制报文协议 ICMP
- 三、IPv6 地址
一、网络层的功能
1. 基本概要
- 网络层为传输层提供服务,将传输层的数据帧封装成 “IP 数据报”。网络中的路由器根据 IP 数据报首部中的源 IP 地址、目的 IP 地址进行 “分组转发”。因此,网络层实现了 “主机到主机” 的传输
- 数据链路层为网络层提供服务,将网络层的 IP 数据报(分组)封装成帧,传输给下一个相邻结点(实现相邻节点的传输)
2. 功能总览
- 异构网络互联
- 异构:每个网络的拓扑结构不同、物理层与数据链路层的实现不同、主机类型也各不相同
- 接入网络的每台主机至少拥有一个 IP 地址
- 通常,路由器的每个接口都需要分配一个 IP 地址(最新技术标准已经取消了这个强制要求)
- 实现互联的设备:路由器(Router),在 TCP/IP 文献中,路由器也称为网关(Gateway)
- 异构:每个网络的拓扑结构不同、物理层与数据链路层的实现不同、主机类型也各不相同
- 路由与转发
- 路由:
- 各个路由器之间相互配合,规划 IP 数据报(分组)的最佳转发路径
- 各个路由器需要运行 “路由协议”,最终生成各自的 “路由表”
- 转发:
- 一台路由器,根据自己的 “转发表”,将收到的 IP 数据报从合适的接口转发出去
- 转发表是精简版的路由表,更精简的数据结构有助于快速检索
- 路由:
- 拥塞控制
- 拥塞
- 原因:网络上出现过量分组,超负荷,引起网络性能下降
- 现象:网络上的分组数增加,但吞吐量反而降低
比如路上车多了,就会堵车
- 拥塞控制方法:
- 开环控制(静态的方法):部署网络时,就提前设计好预防拥塞的方法,一旦网络系统开始运行,就不再修改
- 闭环控制(动态的方法):动态监视网络状态,及时发现哪里发生拥塞,并将拥塞信息传递给相关路由器(如:通过 ICMP),相关路由器及时调整 “路由表”
- 拥塞
二、IPv4
- IP 协议(Internet Protocol,网际协议)是互联网的核心。
- ARP 协议用于查询同一个网络中的【主机 IP 地址,MAC 地址】之间的映射关系
- ICMP 协议用于网络层实体之间相互通知 “异常事件”
- IGMP 协议用于实现 IP 组播
1. IPv4 数据报
- IP 数据报也称为 IP 分组,格式如下:
- 首部包括:固定部分(20 B),可变部分(0 ~ 40 B)
- 版本:占 4 bit,用于区分网络层使用的 IP 协议版本(v4、v6)
- 首部长度:占 4 bit,表示 IP 数据报首部占多少字节,以 ×4B 为单位
- 区分服务:占 8 bit,不用管一般用不到
- 总长度:占 16 bit,表示 IP 数据报总共占多少字节(涵盖首部、数据部分),以 ×1B 为单位
- 标识:占 16 bit,由 IP 数据报的 “源主机” 生成,通常是自增序列
- 标志:占 3 bit
- 最低位 MF(More Fragment):
MF=1
表示后面还有分片,MF=0
表示这是最后一个分片 - 次低位 DF(Don‘t Fragment):
DF=1
表示不允许被分片,DF=0
表示允许被分片 - 最高位不管
- 最低位 MF(More Fragment):
- 片偏移:占 13 bit,表示数据部分在 “被分片前” 的位置,以 ×8B 为单位
- 生存时间:占 8 bit,常记为 TTL
- 是数据报在网络中可通过的路由器数的最大值
- TTL 的初始值通常由源主机设置;
- 每经过一个路由器,路由器就将 TTL 减 1,如果 TTL 减到 0,就直接丢弃分组,并向源主机发送 ICMP 报文
- 协议:占 8 bit,用于说明当前数据报为哪个协议服务(TCP 是 6,UDP 是 17)
- 首部校验和:占 16 bit,
- 每个路由器仅校验首部,而不校验数据部分
- 如果该字段设为全 0,表示不用校验
- 校验和的计算方法与 UDP 相同
- 源地址、目的地址:各占 32 bit,IPv4 地址,字面意思。
- 最大传送单元(MTU):一个数据链路层数据帧能承载的最大数据量。以太网的
MTU = 1500 B
。 - 分片问题
- 实际传输过程中,“数据部分” 的长度受下一段链路的最短 / 最长帧长限制,如果一个 IP 数据报的总长度超出了下一段链路的 MTU,就需要将 “数据部分” 分片。
- 每个分片都是一个可以被单独转发的 IP 数据报,都包含首部
- IP 数据报的 “分片” 可能在源主机、或任何一个路由器中发生
- 只有目的主机才会对分片进行 “重组”
- 各分片有可能乱序到达目的主机
- 由于首部的 “片偏移” 字段是以 ×8B 为单位,因此,除了最后一个分片外,其他每个分片的数据部分必须是 8B 的整数倍
- 实际传输过程中,“数据部分” 的长度受下一段链路的最短 / 最长帧长限制,如果一个 IP 数据报的总长度超出了下一段链路的 MTU,就需要将 “数据部分” 分片。
2. IPv4 地址
- IPv4 协议发明于 1981 年。地址位数为 32 位(232 ≈ 42亿),IP 地址资源由 ICANN(互联网名字和数字分配机构)进行分配。
- IP 地址的两级结构:<网络号, 主机号>
- IP 地址有 32 bit,8 bit 一组,分为 4 组,每组用十进制表示
- 最初的 IP 地址分配要求每台主机、每个路由器接口被分配的 IP 地址都是全球唯一的
- 从属于同一个网络的所有主机、路由器接口的 IP 地址 “网络号” 都相同
- 网络号不定长,可根据前几个比特判断类别(A、B、C、D、E),从而推测出网络号占几位
- 路由器和路由器连接的接口可以不分配 IP 地址,但路由器和其他节点连接的接口必须分配 IP 地址
- 当一台新主机接入网络时,需要给它分配一个 IP 地址,并配置 “默认网关”(网关就是路由器)
- 特殊的 IP 地址
- 这些特殊地址 不能 指派给网络中的任何一台主机或路由器 “私用”
- 如下表中,当网络号确定,主机号全 0、全 1 不可被私用。说明,如果一个网络中,主机号占 NNN bit,那么这个网络中,最多支持 2N−22^N-22N−2 台主机和路由器
- 下表中已被确定的网络号或主机号记为 YYY
网络号 主机号 作为分组 源地址? 作为分组 目的地址? 代表的含义 YYY 全 0 ❌ ❌ 表示整个网络本身(只能用于路由表、转发表) YYY 全 1 ❌ ✅ 向网络号为 YYY 的网络广播 IP 分组 0 YYY ✅ ❌ 表示本网络中主机号为 YYY 的主机 全 0 全 0 ✅ ❌ 本网络上的主机(会在 DHCP 协议中使用) 全 1 全 1 ❌ ✅ 向本网络广播 IP 分组 127 非全 0 或非全 1 的任何数 ✅ ✅ 环回自检地址。表示一台主机本身,用于本地软件环回测试
3. 子网划分与子网掩码
Ⅰ. 基本概念
- 子网划分
- 是初代 IP 地址的升级版,子网划分前是两级结构,子网划分后是三级结构:<网络号,子网号,主机号>
- 原理:假设有一个 IP 地址段,原网络号不变(不能动),原主机号占 nnn bit,那么可以将前 kkk bit 划出来作为子网号,用剩余的 n−kn-kn−k bit 作为主机号,这样就能划分出 2k2^k2k 个子网(每个子网包含的 IP 地址块大小相等)
- 每个子网中,主机号不能分配为全 0 / 全 1(子网本身和子网广播地址)
- 子网掩码
- 子网掩码为 32 bit,子网地址(网络号 + 子网号)有 nnn 位,子网掩码的高 nnn 位就为 1,低 32−n32-n32−n 位为 0
- 用子网掩码、IP 地址 逐位与,算出 <网络号,子网号>(可合称为 “网络前缀”)。只有网络前缀相同的 IP 地址,才归属于同一个网络(或子网)
- 如果一个网络内部进行了子网划分,那么这个网络中的每台主机、每个路由器接口都需要配置 IP 地址、默认网关、子网掩码
- 如果一台路由器支持子网划分技术,那么在它的转发表中,需要包含 <目的网络号,子网掩码,转发接口>
- 子网掩码的 CIDR 记法:比如
255.255.255.0
有 24 个 1,就记为IP/24
Ⅱ. 默认设置
- 默认子网掩码
- 如果一个传统网络(A、B、C 类)内部没有进行子网划分,那么可以将对应此网络的转发表项设置为 “默认子网掩码”
- A 类默认
255.0.0.0
、B 类默认255.255.0.0
、C 类默认255.255.255.0
- 默认路由
- 默认路由(默认转发表项)设置全 0
0.0.0.0
:<目的网络号全 0,子网掩码全 0> - 在路由转发表中,如果所有表项都不匹配,那么将从 “默认路由” 转发出去
- 默认路由(默认转发表项)设置全 0
Ⅲ. 主机发送 IP 数据报的过程
- 判断目的主机和本机是否属于同一网络
- 检查本机 IP 地址和目的 IP 地址的网络前缀是否相同(需要用本机配置的子网掩码 “逐位与”)
- 若网络前缀相同,说明目的主机和本机属于同一个网络
- 若网络前缀不同,说明不属于同一个网络
- 将 IP 数据报封装成 MAC 帧并发送到链路上
- 如果目的主机与本机属于同一个网络,就通过 ARP 协议找到目的主机的 MAC 地址,再将 IP 数据报封装成帧,并将帧发送给目的主机
- 如果目的主机与本机不属于同一个网络,就通过 ARP 协议找到默认网关的 MAC 地址,再将 IP 数据报封装成帧,并将帧发送给默认网关
Ⅳ. 路由器转发 IP 数据报的过程
- 路由器的某个接口收到一个 IP 数据报
- 对 IP 数据报首部进行校验,并从中找到目的 IP 地址
- 查 “转发表”
- 转发表的表项包含 <目的网络号,子网掩码,转发接口>
- 检查目的 IP 地址与每个表项能否匹配(将目的 IP 地址、子网掩码 “逐位与”,匹配表项中的目的网络号)
- 至少 “默认路由” 表项一定是可以匹配成功的(兜底)
- 转发
- 根据查转发表的结构,将 IP 数据报从匹配的接口转发出去
- 如果匹配的 “转发接口” 和该 IP 数据报的入口相同,就不用再把 IP 数据报转发回去
4. 无分类编址 CIDR
- 无分类编址(Classless Inter-Domain Routing,CIDR),即无类别域间路由选择。
- 传统 IP 地址分配方案分配不灵活,利用率低,为缓解 IP 地址耗尽,于 1993 年推出 CIDR
- CIDR 取消了 IP 地址传统的 A/B/C/D/E 分类,IP 地址块分配更灵活,利用率更高,一定程度上缓解了 IP 地址耗尽
- CIDR 的 IP 地址 = <网络前缀,主机号>,其中网络前缀不定长
- CIDR 记法:
192.168.1.1/24
,表示在这个 IP 地址中,网络前缀占 24 位,主机号占 8 位
- 定长子网划分:与传统的子网划分技术同理
- 在一个 CIDR 地址块中,把主机号前 kkk bit 抠出来作为定长子网号,这样就能划分出 2k2^k2k 个子网(每个子网包含的 IP 地址快大小相等)
- 缺点:每个子网都一样大,不够灵活,IP 地址利用率低,浪费有限的 IP 地址资源
- 变长子网划分
- 在一个 CIDR 地址块中,划分子网时,子网号长度不固定(每个子网包含的 IP 地址块大小不同)
- Tips:点对点链路是一个最小的子网,至少需要保留 2 bit 作为主机号(2 个接口 + 全 1 + 全 0 = 4 个 IP)
- 优点:子网划分更灵活,且方便地址资源的分层级管理
不管是定长还是变长,在每个子网中,主机号全 0、全 1 的 IP 地址不能分配给特定节点私用。
- 变长子网划分技巧:利用类似于 从根到叶构造二叉哈夫曼树
- 原始 CIDR 地址块作为根节点(假设可以自由分配的主机号占 hhh bit)
- 每个分支节点必须同时拥有左右结点,左 0、右 1(反过来也行)
- 每个叶子节点对应一个子网,根据根节点到达叶子节点的路径来分析子网对应的 IP 地址块范围
- 整棵树的高度不能超过 h−1h-1h−1(因为即便最小的子网叶至少要保留 222 bit 主机号)
5. 路由聚合
- 路由聚合:对于一个路由转发表,如果几条路由表项的转发接口相同,部分网络前缀相同,那么可以将这几条路由表项聚合为一条。这种地址的聚合称为路由聚合,也称构成超网。
- 路由聚合与 CIDR 搭配使用:
- 采用 CIDR 技术后,路由器转发一个 IP 数据报在查转发表时,由于 “路由聚合”,一个 IP 地址在转发表中可能会匹配多个表项,此时应使用最长前缀匹配原则
- 优点:可以减少路由表的大小,表更小,查询更快
- 缺点:可能会引入额外的无效地址
6. 网络地址转换 NAT
- 网络地址转换(Network Address Translation,NAT)
- 传输层的端口号
- IP 地址 + 端口号确定一个特定的进程
- 网络层实现了 “主机到主机” 的通信。网络层在 IP 数据报的首部,指明源 IP 地址、目的 IP 地址
- 传输层实现了 “端到端”(进程到进程)的通信,传输层在 TCP(或 UDP)报文段的首部,指明源端口、目的端口
- 私有 IP 地址(内网 IP)
- 只允许分配给局域网内部的节点,不允许分配给互联网上的节点
- 每个局域网内部都可以自行分配这些私有 IP 地址
- 私有 IP 地址是可复用的,只要求局域网内唯一,不要求全球唯一
常用私有 IP:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
- 公网 IP 地址(外网 IP / 全球 IP 地址)
- 通常由 ISP 提供,全球唯一
- 公网 IP 是一个局域网与外界通信时所需使用的 IP 地址
- NAT 路由器
- 作用:转发 IP 数据报时,进行内网 IP、外网 IP 的相互转换
- NAT 表:记录地址转换关系
<内网 IP:端口号>
⇔<外网 IP:端口号>
- 一个 IP 数据报
- 从内网转发到外网,会更改源 IP 地址、源端口号
- 从外网转发到内网,会更改目的 IP 地址、目的端口号
- NAT 路由器包含传输层的功能(因为端口号是传输层的概念),普通路由器仅包含网络层及以下的功能
7. 地址解析协议 ARP
- MAC 地址:
- 总共 48 bit,是网络适配器出厂时分配好的,全球唯一
- 一台主机至少有一个网络适配器(网线插口背后的芯片),因此主机至少有一个 MAC 地址
- 一台路由器有多个转发接口,每个接口背后都是一个网络适配器,因此路由器有多个 MAC 地址
- 以太网 MAC 帧:
- 在类型的位置,
0x0800
表示是 IPv4 的 PDU,0x0806
表示是 ARP 的 PDU
- 在类型的位置,
- ARP 协议的作用:在一个局域网内部,可以通过 ARP 协议查询到一个 IP 地址对应的 MAC 地址
- ARP 表(ARP 缓存):
- 每台主机、每台路由器都有自己的 ARP 表
- ARP 表是一个数据结构,用于记录 <主机 IP 地址,MAC 地址> 之间的映射关系
- 需要定期更新 ARP 表项
- ARP 请求分组:
- ARP 请求分组封装进 MAC 帧(广播帧),帧目的地址全 1,源地址为请求发送方 MAC 地址
- ARP 请求分组内容:
- 我是谁?——请求方的 IP 地址、MAC 地址
- 我想找谁?—— 响应方的 IP 地址
- ARP 响应分组:
- ARP 响应分组封装进 MAC 帧(单播帧),目的地址是请求方 MAC 地址,源地址是响应方 MAC 地址
- ARP 响应分组内容:响应方的 IP 地址、MAC 地址
- ARP 分组格式,共 28 B
8. 动态主机配置协议 DHCP
- 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是应用层协议,使用 UDP 提供的服务,给网络层所需要的参数进行初始化
- DHCP 的作用:给刚接入网络的主机动态分配 IP 地址、配置默认网关、子网掩码等网络相关的参数
- DHCP 使用客户 / 服务器模型(C/S)
- 客户 UDP 端口号为 68,服务器 UDP 端口为 67
- DHCP 客户:新接入网络的主机(希望获得 IP 地址等配置)
- DHCP 服务器:负责分配 IP 地址的主机,管理一系列 IP 地址池。在家庭网络中,通常由家庭路由器兼职 “DHCP 服务器”
- 在一个大型网络中可以有多台 DHCP 服务器
- DHCP 协议步骤:
- 客户 → 服务器:DHCP 发现报文
- 携带信息:客户主机的 MAC 地址(还可以提出对 IP 地址租用期的要求)
- 网络层:源 IP 地址为
0.0.0.0
,目的 IP 地址为255.255.255.255
(广播 IP 数据报) - 链路层:源 MAC为客户的 MAC 地址,目的 MAC 为全 1(广播帧)
- 服务器 → 客户:DHCP 提供报文
- 携带信息:给客户分配的 IP 地址、租用期、子网掩码、默认网关
- 网络层:源 IP 地址为 DHCP 服务器的 IP 地址,目的 IP 为
255.255.255.255
(广播 IP 数据报) - 链路层:源 MAC 为服务器的 MAC 地址,目的 MAC 为客户的 MAC 地址(单播帧)
- 客户 → 服务器:DHCP 请求报文
- 携带信息:客户机确认要使用的 IP 地址
- 网络层:源 IP 地址为
0.0.0.0
,目的 IP 地址为255.255.255.255
(广播 IP 数据报) - 链路层:源 MAC为客户的 MAC 地址,目的 MAC 为全 1(广播帧)
- 服务器 → 客户:DHCP 确认报文
- 携带信息:与报文 2 类似(图片参考报文 2)
- 网络层:源 IP 地址为 DHCP 服务器的 IP 地址,目的 IP 为
255.255.255.255
(广播 IP 数据报) - 链路层:源 MAC 为服务器的 MAC 地址,目的 MAC 为客户的 MAC 地址(单播帧)
- 客户 → 服务器:DHCP 发现报文
9. 网际控制报文协议 ICMP
- 网际控制报文协议(Internet Control Message Protocol,ICMP)属于网络层,ICMP 报文封装在 IP 数据报中,IP 协议为 ICMP 协议提供服务。
- ICMP 可以让主机或路由器互相报告网络中发生的差错和异常情况
- ICMP 报文的常见类型:
- 差错报告报文:
- 终点不可达:
- 路由器告诉发送方:“目的 IP 地址不可到达”(道路不通)
- 目的主机告诉发送方:“目的端口号不存在,我这边没有对应进程”
- 时间超过
- 路由器告诉发送方:“你的 IP 数据报到我这里 TTL = 0,被我丢了”(路程太远)
- 目的主机告诉发送方:“你的 IP 数据报被分片了,规定时间内没到齐,我已全部丢弃”
- 参数问题
- 告诉发送方:“你的 IP 数据报首部参数不合法,或首部校验出错”
- 改变路由(重定向)
- 路由器告诉发送方:“对于这个目的网络,下次你让另一台路由器帮你转发,路径会更短”
源点抑制(2012年后已废弃):告诉发送方:“网络发送拥塞,丢包了,求求你发慢点”
- 终点不可达:
- 询问报文:
- 回送请求(Echo Request)和回送回答(Echo Replay):比如
ping
命令,用于询问目的主机是否在线 - 时间戳请求(Timestamp Request)和时间戳回答(Timestamp Reply):比如
traceroute/tracert
、自动设置时间,请求和回答都是时间戳。
- 回送请求(Echo Request)和回送回答(Echo Replay):比如
- 差错报告报文:
- 不必反馈 ICMP 差错报文的情况
- 若携带 ICMP 差错报告报文的 IP 数据报出错,不再反馈 ICMP 差错
- 若 IP 数据报被分片,则无论几个分片出错,都只反馈一次 ICMP 差错
- 若 IP 数据报的目的地址为多播地址,不反馈 ICMP 差错
- 若 IP 数据报的源地址为特殊地址(如
127.x.x.x
、0.0.0.0
),则即便发生 IP 数据报异常也不反馈 ICMP 差错
三、IPv6 地址
- IPv6 于 1998 年诞生,地址有 128 位,能彻底解决 IP 地址不够用的问题。
- IPv6 格式:
- 一般的未压缩格式:相较于 IPv4 的点分十进制记法,IPv6 采用冒号十六进制记法:16 位一段,记录为十六进制,段间以冒号分隔
2001:0db8:85a3:0000:0000:8a2e:0370:7334
- 第一种压缩记法:去除每个分段的前导零
2001:db8:85a3:0:0:8a2e:370:7334
- 第二种压缩记法:用双冒号
::
替代连续出现的多个 0,一个地址只能出现一次双冒号,否则会产生歧义
2001:db8:85a3::8a2e:370:7334
- IPv6 地址资源分配:
- nnn 位前缀,128−n128-n128−n 位接口标识符
- 支持无分类编址 CIDR,因此各层级可以灵活划分子网
- IPv6 因为地址空间很大,所以可以划分为更多的层次
- IPv6 支持即插即用(IP 地址自动配置),通常以主机自身的 MAC 地址作为接口标识符
- 可以不使用 DHCP,如果 IP 地址安全性要求较高也支持使用 DHCP 统一管理 IPv6 地址
- IPv6 地址的分类:
地址类型 二进制前缀 说明 未指明地址 00...0
(128 位),可记为::/128
表示 “无地址”,类似 IPv4 的 0.0.0.0
环回地址 00...01
(128 位),可记为::1/128
类似 IPv4 的 127.0.0.1
多播地址 11111111
(8 位),可记为FF00::/8
发送到一组主机 本地链路单播地址 1111111010
(10 位),可记为FE80::/10
局域网内通信,不会被路由器转发 全球单播地址 除上诉四种外的其他所有 IPv6 地址 - 三类 IPv6 目的地址:
- 单播(unicast):传统的点对点通信
- 多播(multicast):一点对多点的通信,数据报发送到一组计算机中的每一台(比如:网络会议)
- 任播(anycast):
- IPv6 新增的一种类型
- 任播的终点是一组计算机,但数据报只交付其中的一台计算机,通常是距离最近的一台计算机(比如:多个 DNS 服务器共享一个任播地址)
- 任播地址没有固定的前缀,通常由地址管理机构预先统一分配