网络层
PPT 计算机网络(本)2024-11-07 第 3-5 节 智云课堂
IP 地址
[!QUESTION] 为什么要使用两种地址:IP 地址和 MAC 地址
MAC 地址之间的转换非常复杂,对以太网 MAC 地址进行寻址也是极其困难的
在虚拟的 IP 网络上用 IP 地址进行通信非常方便
互联网上的每台主机(或路由器)的每个接口分配一个在全世界唯一的 IP 地址。
[!NOTE]
IP 地址 ::= { <网络号 net-id>, <主机号host-id> }
IP 地址分 ABCDE 五类,普通人只能用 ABC 三类
A 类 net-id 只有一个 byte,然后依次增加
各类 IP 地址的指派范围
[!NOTE] 不使用的特殊的 IP 地址
- A 类网络地址中, 网络号 0 和 127 是保留地址,不指派。
- 0 是网络地址,127 是本地环回测试地址,即广播地址
- B 类网络地址中,网络号 128.0 是被 IANA 保留的,不指派。采用无分类编址(CIDR)时可以指派。
- C 类网络地址中,网络号 192.0.0 是被 IANA 保留的,不指派。采用无分类编址(CIDR)时可以指派。
- 指派主机号时,要扣除全 0 和全 1
- 全 0 和全 1 有特殊含义和用途。
[!NOTE] 如何判断 IP 地址的类别、网络号和主机号
由第一个十进制数进行判断:
1-126 为 A 类
- net-id 的最高位必须是 0
128~191 为 B 类
- net-id 的最高位必须是 10
192~223 为 C 类
- net-id 的最高位必须是 110
一般不使用的特殊的 IP 地址
[!EXAMPLE]
注意路由器端口也在一个网络内,也需要一个 IP 地址
子网划分
一个网络地址下,主机数量可能比较少,主机号有浪费
我们可以将空闲的主机号复用成子网号,相当于在这个网络里又分为了很多个子网
子网划分(subnetting),在网络内部将一个网络块进行划分以供多个内部网络使用,对外仍是一个网络
子网掩码(subnet mask),与 IP 地址一一对应,置 1 表示网络位,置 0 表示主机位
子网掩码 AND 运算得到的网络地址就是子网的网络地址
无分类编址 CIDR
CIDR (Classless Inter-Domain Routing) :无分类域间路由选择
消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,可以更加有效地分配 IPv4 的地址空间
[!NOTE] CIDR 与传统 IP 区别
网络前缀
IP 地址 ::= { <网络前缀network-prefix>, <主机号host-id>}
network-prefix 与 network-id 的区别是,prefix 可以取 0 ~ 32 的任意值,而不是 8 的倍数
地址掩码 (address mask) 和子网掩码一模一样,作用对象和目的变了而已,用来快速获取 IP 对应的网络地址
CIDR 地址块
CIDR 把网络前缀都相同的所有连续的 IP 地址组成一个 CIDR 地址块
地址块的表示:通常是 IP 地址后面跟一个斜杠和数字(例如 192.168.1.0/24
),数字表示网络部分的位数
说白了,一个地址块就是一个网络,🐎 的还以为什么玩意儿这么高级
[!EXAMPLE] 路由聚合 (route aggregation)
IP 地址与 MAC 地址
- IP 地址
- 虚拟地址、软件地址、逻辑地址。
- 网络层和以上各层使用。
- 放在 IP 数据报的首部。
- MAC 地址
- 固化在网卡上的 ROM 中。
- 硬件地址、物理地址。
- 数据链路层使用。
- 放在 MAC 帧的首部。
[!NOTE]
网络层及以上的层级,都以为是用 IP 地址在相互交流,但实际上数据链路层会进一步被加工以用于传输,这里相当于隐藏了下层的复杂度
路由器也只根据目的站的 IP 地址进行转发,所以路由器会有网络层
地址解析协议 ARP
通过网络层的 ARP 协议,我们可以通过机器的 IP 地址找到对应的 MAC 地址
其首先会查询 ARP cache,找不到才另外查找
ARP 工作流程
当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时:
ARP 高速缓存 (ARP cache)
其存放 IP 地址到 MAC 地址的映射表,cache entity 如下
< IP 地址;MAC 地址;生存时间 (Age);类型等 >
超过生存时间的项目都从高速缓存中删除,以适应网络适配器变化
机器可以通过 ARP 请求分组更新自己的 ARP cache
ARP 如何查找 MAC 地址
- 在本局域网上广播发送 ARP 请求分组,路由器不会转发这玩意儿
- 对应的机器将返回单播 ARP 响应分组
ARP 分组封装在以太网帧中传输
[!QUESTION] 2 台主机不在同一个局域网上怎么办?
ARP 只用于解决同一个局域网上的,路由器不会转发 ARP 分组
但是路由器可以接收 ARP 请求分组,返回自己端口的 MAC 地址
然后路由器再向目标网络发送新的 ARP 请求分组,获取目标的 MAC 地址
相当于 cache 存不同局域网机器 MAC 地址时,存的实际是路由器端口的
IP 数据报的格式
首部的前一部分是固定长度,共 4 x 5 = 20 字节,是所有 IP 数据报必须具有的。
第一行 主要记录基本信息
- 版本——占 4 位,指 IP 协议的版本
- 目前的 IP 协议版本号为 4 (即 IPv4)
- 首部长度——占 4 位,可表示的最大数值,一个单位为表示 4 byte
- 因此 IP 的首部长度的最大值是 60 字节。
- 区分服务——占 8 位,一般的情况下不使用
- 总长度——占 16 位,指首部和数据之和的长度,单位 byte
- 因此数据报的最大长度为 65535 字节。
- 总长度必须不超过最大传送单元 MTU(数据链路层)
第二行 主要记录分片信息
- 标识 (identification) ——占 16 位,当一个大的 IP 数据报被分成多个片段(分片)进行传输时,每个片段会包含相同的标识值
- 标志(flag) ——占 3 位,目前只有前两位有意义
- 标志字段的最低位是 MF (More Fragment)。
- MF = 1 表示后面还有分片,MF = 0 表示最后一个分片。
- 与原始数据报首部会不同
- 标志字段中间的一位是 DF (Don't Fragment) 。
- 只有当 DF = 0 时才允许分片。
- 与原始数据报首部一致
- 标志字段的最低位是 MF (More Fragment)。
- 片偏移——占 13 位,指出较长的分组在分片后,某片在原分组中的位置,例如第一个分片是 0
- 片偏移以 8 byte 为一个单位,从数据部分开始计算
- 与原始数据报首部会不同
第三行 主要记录基本信息
- 生存时间——占 8 位,记为 TTL (Time To Live)
- 指示数据报在网络中可通过的路由器数的最大值。
- 协议——占 8 位,指出数据部分使用何种协议
- 以便目的主机的 IP 层将数据部分上交给那个处理过程
- 首部检验和 checksum——占 16 位,只检验数据报的首部,不检验数据部分
- 不采用 CRC 检验码而采用简单的计算方法。
- 将首部按顺序分为一个个 16bit(首部检验和置 0),进行反码算术运算求和,得到 16bit 结果,再取反码,得到首部检验和
- 接收端就反码算术运算求和并取反码,如果结果为 0 则说明正常,否则保留
- 了解即可,基本不考
IP 层转发分组的过程
基于终点的转发
发送方先通过网络掩码检查目标地址是否在本网络,在的话就直接交付,否则就发给路由器
路由器 R1 收到分组后查找转发表,转发表里储存的是前缀与端口的映射关系,所以也需要通过网络掩码检查目标地址的网络地址
具体而言,是将目标地址与转发表里前缀的掩码做 AND 操作,将结果与该前缀做比对
转发表中的 2 种特殊的路由
主机和路由器都有转发表
- 主机路由 (host route)
- 是对特定目的主机的 IP 地址专门指明的一个路由
- 网络前缀就是 a.b.c.d/32
- 放在转发表的最前面
- 默认路由 (default route)
- 不管分组的最终目的网络在哪里,都由指定的路由器 R 来处理
- 用特殊前缀 0.0.0.0/0 表示
最长前缀匹配
使用 CIDR 时,在查找转发表时可能会得到不止一个匹配结果
最长前缀匹配 (longest-prefix matching) 原则:选择前缀最长的一个作为匹配的前缀
网络前缀越长,其地址块就越小,因而路由就越具体
路由器分组转发算法
使用二叉线索查找转发表
二叉线索 (binary trie):一种特殊结构的树,可以快速在转发表中找到匹配的叶节点
从二叉线索的根节点自顶向下的深度最多有 32 层,每一层对应于 IP 地址中的一位
为简化二叉线索的结构,可以用唯一前缀 (unique prefix) 来构造二叉线索
[!EXAMPLE] 用 5 个唯一前缀构成的二叉线索
有五个地址
网际控制报文协议 ICMP
ICMP (Internet Control Message Protocol) 是互联网的标准协议,允许主机或路由器报告差错情况和提供有关异常情况的报告
ICMP 不是高层协议,而是 IP 层的协议
ping
、Traceroute
就是一种 ICMP
ICMP 报文的种类
类型值不用管
ICMP 差错报告报文的数据字段的内容
不应发送 ICMP 差错报告报文的几种情况
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文
对具有多播地址的数据报都不发送 ICMP 差错报告报文。
对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。