网络层
概述
- 概念:
- 负责转发数据报:并不是针对两个节点之间的
- 确定数据报的转发路径
- 核心:网络层 不提供可靠传输服务 和 流量控制 服务:尽力而为
- 单位:==数据报==
- 功能
- 异构网络互连:将物理层和数据链路层不同的网络用统一的协议互联起来
- [IP 协议](# IP 协议):[IPv4](# IPv4) [IPv6](# IPv6)
- [ARP 协议](# ARP 协议):映射
IP地址到MAC地址 - [DHCP 协议](# DHCP 协议):主机能够自动获取
IP地址
- 路由选择:选择开销最小的路径转发分组
- [路由选择协议](# 路由选择协议):(1) RIP 协议 (2) OSPF 协议 (3) BGP 协议 (前两个协议是 自治系统内 协议,最后一个协议是 自治系统间 协议)
- 分组检测:反馈给源路由器分组的相关信息(分组是否到达目的地,分组是否丢失)
- [ICMP 协议](# ICMP 协议)
- 分组转发:[路由器](# 路由器):将分组从一个路由器转发到另一个路由器去
- 异构网络互连:将物理层和数据链路层不同的网络用统一的协议互联起来
- 细节:网络层以下都是 点对点 传输 <-> 传输层以上都是 端对端 传输
数据交换
数据交换的原因
网络中计算机间需要实现数据通信和资源共享
如何实现数据通信和资源共享:
每台主机之间需要进行通信
主机两两之间建立链路直接数据交换导致链路数量太多
主机都接在一个交换设备上进行数据交换,会导致吞吐量过大时交换设备无法很好地进行数据交换
主机和多个交换设备组合在一起构成交换网络
因此交换网络中需要按照一定的交换方式进行数据的交换,不能够在随意地进行数据的交换了
图示

数据交换方式
报文交换
概念:动态选择线路发送报文
- 动态选择线路:根据网络状况选择最优的转发路径
- 报文 = 目的地址 + 源地址 + 数据
优点
无需建立连接:节省建立连接的时延
提高线路可靠性:不会因为某条路径故障导致数据的重发或者发送失败,可以选择另一条路径发送
提高线路的利用率:通信双方不会长时间占用某条线路
多目标服务:报文可以同时发送给多个目的站点
能够同时发送吗?
缺点
- 具有存储转发的时延
- 报文大小不确定,交换设备需要预备较大的存储空间
- 具有存储转发的时延
分组交换
发送方式
数据报交换
概念:==无需建立连接==,==动态选择线路==发送==分组==
实际上和分组交换完全是一个概念
动态选择线路:采取路由算法选择最优的转发路径
分组:
概念:报文按照规格划分成大小基本相等的切片
特点
①每个分组都需要附带必要的控制信息:==目的地址 + 源地址 + 控制信息==
②每个分组选择的路径不一定相同
③==每个分组占用全部带宽==
交换过程
- 每个分组携带目的地址的分组传输到交换设备上
交换设备查找路由表,找到分组携带的目的地址对应的转发接口
重复多次这个过程,直到分组传输到目的主机
优点:
无需建立连接
线路利用率较高
没有单点故障
交换设备不需要较大的存储空间
全双工通信
缺点
- ==存储转发时延==
- 不保证可靠性
额外控制信息开销
- 分组可能丢失或者失序
==网络拥塞==
虚电路交换
概念:源主机和目的主机建立==虚电路==;==所有分组==按==次序==通过该虚电路从源主机发送到目的主机
- 虚电路:
- 源主机到目的主机建立的逻辑连接(物理上并不存在)
- 路径节点维护一张虚电路表,每张虚电路表记录每个虚电路号对应的转发接口
- 分组:
- 基本概念和数据报交换一致;携带的内容不同
- 分组携带==虚电路号==不携带目的地址
- 所有分组携带的虚电路号是一样的
- 虚电路:
交换过程:
- 源主机向目的主机发送请求,目的主机应答后开始传输分组
- 每个携带虚电路号的分组传输到交换设备上
- 交换设备查找维护的虚电路表,找到分组携带的虚电路号对应的转发接口
- 重复多次这个过程,直到分组传输到目的主机
优点
- 保证可靠性
- 没有分组失序问题
- 虚电路号相对目的地址开销小
- 全双工通信
缺点
单点故障
==连接的建立和拆除需要时间==(网络延迟)
特点:虚电路建立的连接并不是专用的(和电路交换区分开)
物理意义上的链路在逻辑上可能是多条虚电路;即某部分物理链路可能被多个虚电路共用;所以通信是全双工
流水线问题

IP 协议
IPv4
IPv4 数据报格式
整体格式

详细格式

版本:规定 IP数据报 采用的 IP 协议的版本;便于路由器解析数据报后面的部分
首部长度
含义:表示 ==IP 数据报首部的长度==( 固定部分 和 可变部分 )
特点:
使用 4 位比特 进行表示单位大小的数量
单位大小是 ==4B==
单位大小的数量最少为 5
解释:数量 * 单位大小 = 首部长度 (最短长度 20B 最长长度 60B)
区分服务
含义:区分不同类型的数据报
特点:
前面 3 bit 是优先权字段
中间 4 bit 用于设置数据报需要的服务:最小时延、最大吞吐量、最高可靠性和最小费用
注:每个数据报只能够选择其中一项服务;如果都不选择,那么默认是一般服务
最后 1 bit 置为 0
总长度
- 含义:表示 IP数据报 的长度( 包括 首部 和 数据部分)
- 特点:
- 使用 16 位比特表示单位大小的数量
- 单位大小 ==1B==
- 注意:数据链路层的
MTU不会达到 2^16^ - 1 B:通常会进行分片
标识:
IP数据报分片后每个分片具有的统一标识符标志:
- (1) 最高位不使用
- (2) 中间位表示是否是最后一个分片 (0 表示最后一个分片 & 1 表示还有分片)
- (3) 最低位表示是否允许分片 (0表示允许分片 & 1 表示禁止分片)
片偏移:
表示:每个分片之间的相对位置
计算方式:
(1)
IP数据报 - 首部大小 = 数据部分大小(2) 数据部分拆分成多个数据部分再分别加上一个首部形成分片:每个分片 尽可能 接近 MTU 大小 (以太网中的 MTU = 1500B)
(3) 如果最后一个分片的大小不是 8 的倍数:前面所有分片的大小都需要重现调整
生存时间:(1) 数据报每经过一个路由器生存时间就会减1 (2) 生存时间为0时,该数据报被丢弃
目的:防止数据报没有找到合适的路径进行转发,始终在交换网络中循环
协议
含义:上层协议采用协议号 (可能不是传输层的协议)
注意:
UDP:17TCP:6OSPF:89ICMP:1IGMP:2DHCP:67RIP:520
首部校验和
含义:检测数据报是否出错
计算过程:
(1) 将首部所有字段相加 (首部校验和字段除外)
(2) 最后的结果如果溢出就执行 回卷 操作
(3) 将最后的结果取反码就作为首部校验和字段
填充:用于填充首部部分,将首部部分的大小补为 4B 的整数倍
可选字段:用来支持测量,排错以及安全措施
IPv4 编址
IP 地址分类(二级IP地址)
IP地址
概念:全世界唯一的 32位 标识符;标识路由器或者主机的接口
表示方法
- 二进制表示
- 点分十进制(dotted-decimal notation):将每 8bit 转换成十进制表示
分类 IP 地址

- 特殊 IP 地址
| 网络号 | 主机号 | 作为IP分组源地址 | 作为IP分组目的地址 | 用途 |
|---|---|---|---|---|
| 全0 | 全0 | 可以 | 不可以 | 表示主机上的所有 IP 地址 |
| 特定值 | 全0 | 不可以 | 不可以 | 表示子网本身 |
| 特定值 | 全1 | 不可以 | 可以 | 直接广播地址 |
| 全1 | 全1 | 不可以 | 可以 | 受限广播地 |
| 127 | 任意 | 不可以 | 不可以 | 环回自检;用于软件测试 |
(1) 127 开头的 IP 地址只能够作为环回自检地址;但是能够使用的只有 127.0.0.1
- 优点:
- 便于 NIC 组织分配 IP 地址;只需要根据网络号进行分配就行,不需要考虑主机号;主机号由得到网络的机构自行分配
- 路由器转发表中只需要保存网络号,而不需要记录主机号(全0),节省表项数量
- 缺点:不够灵活,造成 IP 地址浪费
NAT转换
公有 IP 地址:可==直接==用于互联网连接的 IP 地址 (利用
python的 pystun3 可以查看NAT相关信息)#coding=utf-8
import stun
if __name__ == "__main__":
nat_type, external_ip, external_port = stun.get_ip_info() # 东北大学校园网 NAT
print("NAT 类型: " + nat_type) # Restric NAT
print("NAT IP: " + external_ip) # 210.30.193.143
print("NAT 端口: " + str(external_port)) # 54320
pass私有 IP 地址
概念:不能直接用于互联网连接的 IP 地址,只能用于局域网连接
目的:(1) 实现网络安全 (互联网中的任何主机都是不可以直接访问私有 IP 地址的) (2) 节省 IP 地址 ( 不同私网中的私有 IP 地址可以重复使用 )
私有地址
分类 地址范围 网段个数 IP 地址数量 A类 10.0.0.0 ~ 10.255.255.255 1 256 x 256 x256 B类 172.16.0.0 ~ 172.31.255.255 16 16 x 256 x 256 C类 192.168.0.0 ~ 192.168.255.255 256 256 x 256 思考:网段个数是怎么算的?
注意:网段个数不是私有 IP 地址的数量
NAT转换 (Network Address Translation)
原因:私有 IP 地址不能够被外界访问,某些情况下外界需要对私有网络进行访问
实现:
普通的路由器中安装
NAT软件 (没有安装 NAT 软件的路由器是无法实现 NAT 穿越的)NAT路由器 至少具有一个 全球唯一的 IP 地址 && 维护一张NAT转换表 (包含 IP 地址 + 端口号)私网中的主机需要访问外界时:
NAT路由器会查找转换表,将 ==私有IP地址 + 端口号== 转换成 ==公有IP地址 + 端口号==外界主机需要访问私网时:
NAT路由器会查找转换表,将 ==公有IP地址 + 端口号== 转换成 ==私有IP地址 + 端口号==
特点:
NAT 路由器在转发分组时一定会改变 源 IP 地址 (正常的分组在转发过程中只会更改
MAC地址不会更改IP地址)==节省公有 IP 地址== :每个私网中都是可以重复使用这些私有 IP 地址的;例如,局域网1使用 172.16.1.1,那么局域网2仍然可以使用 172.16.1.1
NAT路由器没有自学习的能力:如果接收的公网 IP 地址在转换表中并不存在,那么会直接抛弃
细节:
NAT路由器的唯一IP地址是通过ISP的 [DHCP 协议](#DHCP 协议) 获取的- NAT 路由器会 运行一个 DHCP 服务器 用于给私网中的每个用户分配临时性的 IP 地址
子网划分(三级IP地址)
原因:
IP 地址空间的==利用率有时很低==
申请者申请网络(A类 B类 C类..)可能实际连接的主机数量并没有达到最大容纳的主机数量
剩余的主机数又不能够被其他申请者使用,导致空闲浪费
两级 IP 地址不够灵活
没有办法根据实际主机的数量划分网络 IP 地址
概念:
基本概念:使用 ==网络号 + 部分主机号== 细分一个完整的网络
特点:
完整的网络进行划分之后,==对外仍然表现为一个网络==;即路由器是不知道这个网络进行了划分
子网号:在分类 IP 地址的基础上划分子网:子网号是不可以全 0 全 1 的 & 在 CIDR 基础上是可以的
- 全 0 子网号:导致该子网的网络地址和主网络的网络地址冲突
- 全 1 子网号:导致该子网的广播地址和主网络的广播地址冲突
主机号:和二级 IP 地址一致==不能够全0全1==
- 全0:表示第一个子网
- 全1:表示当前子网的广播地址
目的:更好的利用 IP 地址

定长划分子网
概念:借用==位数一定==的主机号来细分网络
特点:
划分方式
- 明确需要划分的子网数量 k
- 记子网号的位数为(从主机号中借用的位数)n
- 两个变量满足不等式 k ≤ 2^n^ - 2(分类 IP 地址的基础上是需要减去无法使用的子网 & CIDR 是不需要减去无法使用的子网)
- 利用该不等式计算出子网号的位数

变长子网划分
- 概念:借用的==主机号位数可变==
- 特点:
- 每个子网的子网掩码都不一样
- 每个子网能够容纳的最大主机数量也不一样;==借用位数越多会导致最大主机数容量越小==
- 划分方式

划分后的变化
子网掩码:每个子网的==子网掩码都是不一样的==
广播地址:==每个子网都有自己的广播地址==
00 111111 ;01 111111;10 111111;11 111111;都是不可以使用 的
点分十进制:仍然按照 8bit 划分;这样得到的子网地址结尾就可以不是 0 了
注意:上述只是演示变长子网的划分过程,如果采用分类 IP 地址划分子网,上述非常多的子网是无效的,如果采用 CIDR 技术划分子网是没有问题的
子网掩码
概念:一串 1 + 一串 0 组成(32bit)
所有的 1 对应 网络号 + 子网号
所有的 0 对应 主机号
牢记子网掩码的目的就是为了提取网络号部分就能够理解
目的:从 IP 地址中提取出 ==网络号 + 子网号==;获取每个子网的 IP 地址
子网 IP 地址计算方式
- 获取==主机 IP 地址==和==子网掩码==
- 子网如果没有进行划分:默认的子网掩码是 255.0.0.0(A类) 255.255.0.0(B类) 255.255.255.0(C类)
- 子网如果划分之后:子网掩码会发生变化
- 主机 IP 地址 和 子网掩码进行 ==与运算==
- 因为 1 对应 网络号 + 子网号,所以在与运算之后,这两部分都被提取出来了
- 因为 0 对应 主机号,所以在与运算之后,这部分就是 0 了
- 获取==主机 IP 地址==和==子网掩码==
分组转发
- 利用 ==IP 地址 + 子网掩码== 判断源主机和目的主机是否在==同一子网(网段)==内
- 如果在同一子网内,那么源主机==直接==将分组交付给目的主机
- 如果不在同一子网内,执行==间接交付==的操作
- 路由器接收源主机提交的分组,根据路由表将分组交付给下一个路由器(间接交付)
- 最后一个路由器将分组==直接交付==给目的主机
- 利用 ==IP 地址 + 子网掩码== 判断源主机和目的主机是否在==同一子网(网段)==内
直接交付和间接交付比较
- 直接交付:
- 形式:(1) 源主机直接将分组交付给目的主机 (2) 最后一个路由器将分组交付给目的主机
- 判断条件:两台设备==必须在同一子网==内
- 如果是形式1,那显然两台主机在同一子网内
- 如果是形式2,那么判断地是最后一个路由器和目的主机是否在一个子网内,而不是源主机和目的主机
- 注意:直接交付不涉及路由器(形式2虽然有路由器参与但是仍然如此认为)
- 间接交付:
- 判断条件:至少涉及两个以上的路由器
- 注意:间接交付包含直接交付
- 细节
- 图示

- 直接交付:
无分类编址方法(CIDR)
引入:分类 IP 地址 + 子网划分 仍然不够灵活,网络号部分始终是固定的,考虑将网络号部分变为随机的,增加灵活性
概念:(无类别域间路由选择 Classless Interdomain Routing)
基本思想:取消按照固定的网络号对 IP 地址进行分类;使用 ==网络前缀==对 IP 地址进行“分类”
网络前缀:
- 概念:相当与 ==任意长度== 的网络号;剩余的就是主机号
- 记法:192.168.0.0 / 20;网络前缀是 20bit
CIDR 地址块:具有 ==相同的网络前缀== 的 IP 地址组成 CIDR 地址块
相当于分类 IP 地址中的类型
图解

超网
概念:多个 ==CIDR 地址块== 聚合 在一起形成的网络 (称为地址聚合 Address Aggregation)
目的:多个子网合并在一起形成超网,只需要在==转发表中存储一个网络前缀==和对应转发的路由器
多个子网的网络前缀中可能存在大量相同的比特位,不使用聚合技术,那么转发表中就会存储每个子网的网络前缀和对应转发的路由器,增大了路由表的存储开销
聚合方式:从最高位开始直到==第一个不相同的位之前( 不包含不相同的位 )==出现为止 -> 作为超网的网络前缀
图解

CIDR 地址块 和 超网 的区分
- CIDR地址块 是相同网络前缀的==不同主机的集合==
- 超网 是不同网络前缀的==子网的集合==
CIDR 子网划分:子网号是可以==全 0 全 1==的
优点:使用 CIDR 划分子网能够得到==更多的子网数==相比于传统的分类地址
原因:使用==最长前缀匹配技术==能够==避免二义性==,所有和主网络冲突的信息都会被发送到对应的 CIDR 地址块
做题注意事项:如果题目中没有明确指明是否采用 CIDR 技术,我们需要根据问题进行推测,如果问的是最大子网数,那么显然采用 CIDR 划分子网显
然得到的子网数更多,也就是不用 -2,还有一点就是如果用于表示网络号的比特位数不是8,16,24,那么肯定是采用的 CIDR
最长前缀匹配
- 引入:
- 每个分组都会携带目的 IP 地址
- 进入路由器转发的时候,可能会出现多个==相同的 IP 地址==(网络前缀不一样)
- 此时就需要根据最长前缀匹配选择合适的 IP 地址进行转发
- 概念:多个相同 IP 地址出现时,选择 ==符合条件==的且 ==最具体的 IP 地址==
- 图解:132.19.237.5 如何转发

- 引入:
IPv6
IPv6 数据报格式
- 引入:
- IPv4 地址已经被分配耗尽;利用 NAT 和 CIDR 技术也无法改变地址消耗殆尽的现状
- ST-2 协议被舍弃,未能够成为 IPv5 协议
- 基本格式:基本首部 + 有效载荷
- 基本首部:长度固定为40B (区别于 IPv4 是不固定的,只是最小长度为 20B)
- 有效载荷:
IP数据报的数据部分 - 图示

- 详细格式
- 图示

特点:
快速 处理和转发数据报:因为许多字段从基本首部中移除,路由器不需要再对多余的内容作处理
IPv6 支持 即插即用 :不需要配置 DHCP 协议
支持 QoS
对比
新增
地址扩大:IPv6 地址从 32 位(4B)扩大到 ==128位==(16B)
流标签:标识属于同一个流的数据报
减少
IPv6 地址不可以在 路由器处 进行分片仅可以在 主机处 分片:删去==标志,标识,片偏移==字段
IPv6 地址删去==校验和==:保证数据报的快速处理 (数据链路层和传输层已经存在差错控制)
IPv6 地址删去==首部长度==:基本首部长度是固定的 40B
修改
- IPv6 ==有效载荷长度==:仅包括数据部分,不包括首部长度(IPv4 的总长度是包含首部的)
- IPv6 地址==优先级==字段 – IPv4 ==区分服务== 字段
- IPv6 跳数限制字段 – IPv4 生存时间字段
- IPv6 ==下一个首部==字段 – IPv4 ==协议==字段
- IPv6 将==选项==字段放入==有效载荷==字段中
问题:为什么 IPv6 地址是 128 bit,但是数据报中字段只有 32 bit?
表示形式:冒号十六进制记法
- 例子:2408:842e:d10:24c6:49f4:a398:e7cf:86e1
- 特点:
- 每个单元 4 个十六进制数;共 8 个单元
- 如果单元内 4 个十六进制数全为 0,那么可以将 4 个 0 简化为 1 个 0
- 如果多个连续单元内 4 个十六进制数全为 0 ,那么可以将多个单元合并成一对冒号
地址类型
- 单播地址:二级分类地址中的 ABC 类地址
- 广播地址:二级分类地址中的 特殊 IP 地址
- 多播地址:二级分类地址中的 ==D 类地址==
过渡策略
- 双栈协议:每台主机和路由器同时配置 IPv4 和 IPv6 协议
- 隧道技术(Tunneling):
- IPv6 数据报经过使用 IPv4 协议的路由器时
- 路由器 将 IPv6 数据报放入 IPv4 数据报的数据部分 然后转发
- 目的主机可以得知这是 IPv6 数据报会进行拆卸
IPv6 多播
基本内容
概念
- 内容:
- 源主机发送给==多个特定==用户数据
- 数据报在传输过程中==仅存在一份==
- 数据报在到达离特定用户最近的路由器时==复制一份==发送给用户
- 重复上述过程,直到所有特定用户都收到数据
- 区别
- 广播技术:对网络(子网)中所有主机发送数据报,多播只对网络中的多个特定用户发送数据(相当于一个组内的用户)
- 单播技术:点对点的传输,需要在源主机处复制多份需要发送的数据,然后再进行传输,多播在源主机处只需要一份数据
- 特点
- 减少主干网络出现堵塞的情况,提高传输数据的效率
- ==组内的主机==可以分散在不同的局域网内,只需要提供==多播路由器==就可以实现
- 内容:
多播地址
引入:
- 源主机需要向组内多个特定用户发送数据,显然需要 IP 地址才能够确定组内用户所在的位置
- 显然不可能使用组内用户自己的唯一 IP 地址,那样就变成了单播传输
- 显然需要组内用户需要一个共同的多播地址才能将数据发送给组内用户
概念:组内所有主机被分配一个==相同的多播地址==,标记为同一个组
特点:
- 多播地址是二级分类地址中的 ==D 类地址==;但是并非所有 D 类地址 都可以作多播地址
- 多播地址只能够==作目的地址==,不能够是源地址
- 多播数据报==采用 UDP 协议==,尽最大努力交付(不提供差错检查和流量控制等功能)
- 多播数据报==不产生 ICMP 错误报文==
多播方式
因特网范围内多播:因特网范围内的多播在进入局域网之后仍然需要采用硬件多播
硬件多播
- 引入:局域网之间相互传播数据报需要使用 MAC 地址(数据链路层),因此多播地址仍然需要对应的 MAC 地址
多播 MAC 地址
* 前 6 个十六进制数固定为 ==01-00-5E== * 后 6 个十六进制数根据多播地址的后 ==23== 位进行映射 * 问题:多播地址还剩下 5 位没有被使用,这意味着两个不同的多播地址可能会映射成相同的 MAC 地址,因为这 5 位可能不同 * 解决方式:组内用户在接收多播数据报时仍需要在 ==IP 层==采用==软件==进行过滤
IGMP 协议
IGMP 协议
- 概念:多播路由器能够==明确==组内==存在的主机==
- 工作过程:
- 想要加入组内的主机向组播地址==发送 IGMP 报文==;声明自己想要加入组内
- 组播路由器接收到 IGMP 报文后==通知其余所有的组播路由器==组内新的成员关系
- 组播路由器==周期性==测试组内的主机,查看是否还是组内成员;如果该组内没有一个成员响应,认为该组是不活跃的;
- 组播路由器认为==组不活跃==后,不会再将组内成员关系发送给其他组播路由器
- 特点:
- ==不能==明确组内存在的==主机数量==
- ==不能==明确各主机所在的==局域网==
组播路由选择协议
概念:找到从源主机到组内各成员的路径
特点:形成==组播转发树==
组播转发树:
避免图形结构造成数据报在路由器之间循环
不同的多播组,生成的组播转发树也不同
相同的多播组,不同的源主机,生成的组播转发树也是不同的
一个多播组内可以有多个源主机吗?
路由选择算法
- 链路状态选择算法
- 距离向量选择算法
- 协议无关的组播算法
移动IP
引入:每台主机都具有全球唯一的 IP 地址,如果主机发生移动进入另一个局域网中,需要和其他局域网通信,显然这台主机和局域网的网络号是不同的,
根本不可能和外界通信,这时就需要借助移动 IP 技术
MAC 地址和 IP 地址的联系和区别?
概念:每台主机进入其他局域网中时,都会被分配一个==转交地址==用于和外界通信
术语
- 移动结点:具有永久 IP 地址的移动设备
- 归属代理(本地代理):主机 IP 地址==所属的局域网==
- 外部代理(外地代理):主机进入的==新的局域网==
- 永久地址(归属地址,主地址):主机被分配的全球唯一的 IP 地址
- 转交地址:主机在新的局域网被分配的==临时 IP 地址==
通信过程
- 主机进入新的局域网,新局域网分配给主机==临时 IP 地址==(转交地址)
- 新局域网此时根据主机的永久 IP 地址找到主机的原来所在的局域网,==向其提交临时 IP 地址==
- 其他主机向本主机通信时,数据报首先发送到本主机原来所在的局域网,原局域网==根据登记的临时地址找到本主机现在所在的局域网,转发数据报==
- 主机离开当前局域网,再次进入新的局域网,获得新的临时 IP 地址,并且==覆盖之前的临时 IP 地址==,同样需要在原局域网进行登记
- 主机回到原局域网,原局域网==注销其临时 IP 地址==,也通知主机之前所在的局域网注销临时 IP 地址
网络层协议
ARP 协议
引入:数据链路层在封装帧时,需要得到 ==目的 IP 地址对应的 MAC 地址==
概念(Address Resolution Protocol 地址解析协议):获取目的 IP 地址的 MAC 地址
获取方式:
ARP 高速缓存:==IP 地址 和 MAC 地址的映射==
广播 ARP 请求分组
前提:ARP 高速缓存中没有目的 IP 地址对应的 MAC 地址
过程描述:
判断 ==目的 IP 地址== 和 ==源 IP 地址== 是否存在 ==一个网段==
①网段相同:广播 ARP 分组(源 IP 地址,目的 IP 地址,源 MAC 地址,广播 MAC 地址(全F))给其他主机
- ==目的主机==接收到广播就会向源主机==返回自己的 MAC 地址==
- 源主机接收到目的主机的 MAC 地址后,就将其==封装==在数据链路层的==帧==中
②网段不同:广播 ARP 分组(源 IP 地址,目的 IP 地址,源 MAC 地址,默认网关 MAC 地址)给路由器
- ==路由器==接收到广播就会向源主机==返回自己的 MAC 地址==
- 源主机接收到路由器的 MAC 地址后,就将其==封装==在数据链路层的==帧==中
路由器之间传送数据时同样需要下一个路由器的 MAC 地址:==路由器和路由器之间同样需要使用 ARP 协议==
- 路由器拆卸 IP 数据报,==替换 源 MAC 地址==(路由器自己的 MAC 地址) 和 ==目的 MAC 地址==(使用 ARP 获得下一个路由器的 MAC 地址)
- 路由器封装 IP 数据报,==MAC 地址发生了变化,但是 IP 地址始终没变==
数据到达目的主机所在局域网时,获取 ==目的主机的 MAC 地址==
细节:
- ARP 高速缓存会定时更新
- ARP 广播分组和响应分组是封装在 帧结构 中传输的
- MAC 地址在传输过程中在不断地变化但是 IP 地址始终没有发生变化
- ARP 是 即插即用 的:不需要人工手动配置
DHCP 协议
引入:主机连接到互联网之前需要==获取==自己在网上的 ==IP 地址==
注:路由器基本都配置了 DHCP 服务器 (可以手动关闭路由器的
DHCP服务器)概念:基于传输层==UDP== 协议,采用 ==客户端 / 服务器== 方式,客户端和服务端通过 ==广播== 方式进行交互
获取方式
静态配置:网络管理员==手动配置==各台主机的 IP 地址,默认网关,子网掩码等信息
动态配置
概念:允许主机==自动获取 IP 地址==等信息,也允许网络管理员进行配置
过程
新进入网络的主机 广播 DHCP 发现报文
注意:报文的目的地址是广播地址 255.255.255.255 ;源地址是 0.0.0.0(主机在没有分配到 IP 地址之前都是采用默认 0.0.0.0 的 IP 地址)
DHCP 服务器收到广播后再次 广播 DHCP 提供报文
- DHCP 提供报文 = 发现报文的 ID + 推荐的 IP 地址 + 子网掩码 + IP 地址租用时间
- 采用广播的原因:DHCP 服务器不知道客户端的 IP 地址是什么,因为客户端还没有采用推荐的 IP 地址(√)
主机 回应 DHCP 请求报文(此时主机还没配置 IP 地址)
DHCP 服务器 广播 DHCP 确认报文 (主机配置 IP 地址)
细节:
网络管理员可以让用户在每次连接时 获取相同的 IP 地址,也可是临时性的 IP 地址
注:
DHCP协议不代表每次获得IP地址都是不一样的DHCP协议端口号是 ==67==

ICMP 协议
- 概念(控制报文协议):路由器和主机利用该协议用于彼此沟通有关数据报的信息
- 报文格式:==类型字段 + 编码字段 + 相关 IP 数据报的前 8 个字节==(8个字节 = 版本号 + 首部长度 +区分服务 + 总长度)
- 核心:执行差错报告 (
ICMP报文也可以执行拥塞控制,但是传输层中已经实现了,实践中就很少再用了) - 报文类型
- ICMP 差错报文
- 终点不可达:路由器无法交付数据报
- 源点抑制:路由器因堵塞丢弃数据报 (执行拥塞控制)
- 时间超过:路由器收到 TTL=0 的数据报
- 参数问题:路由器收到首部字段出问题的数据报
- 改变路由:路由器认为有更好的路径发送数据报
- ICMP 询问报文
- 回送请求和回答报文
- 时间戳请求和回答报文
- 掩码地址请求和回答报文
- 路由器询问和回答报文
- ICMP 差错报文
- 不发送差错报文
- 差错报文如果出错,不会再发送差错报文进行提示
- 源 IP 地址如果为组播地址,不发送差错报文
- 特殊 IP 地址,不发送差错报文
- 对第一个分片的数据报片的后续所有分片都不发送差错报文
路由选择协议
基本概念
概念:选择 “最佳” 的路径转发分组
注意:最佳路径会跟随网络状况变化,只是相对合理的选择
算法分类
第一种分类方式
集中式路由选择算法(Centralizied Routing Algorithm):集中式算法必须得知所有节点的 连通性 和所有链路的 开销 (代表:链路状态算法 Link State)
注:每个路由器都拥有整个网络信息 或者 逻辑集中式选择控制器具有整个网络信息
分散式路由选择算法(Decentralizied Routing Algorithm):没有节点拥有所有链路开销的信息甚至每个节点都没有最低开销 (代表:距离向量算法 Distance Vector)
注:更加适合 每路由器控制 的计算方式
第二种分类方式
- 静态路由算法(Static Routing Algorithm):
- 概念:通常是网络管理员 手动配置 路由器中的转发表
- 优点:(1) 简便可靠 (2) 安全性较高 (3) 适用于网络拓扑变化不大的网络(不会经常有节点进入或者退出网络)
- 缺点:路由转发表更新慢
- 动态路由算法(Dynamic Routing Algorithm)
- 概念:随着 网络拓扑结构 和 流量负载变化 而改变路由选择的算法
- 优点:(1) 路由转发表更新快 (2) 更快适应网络拓扑变化
- 缺点:(1) 算法复杂,增加网络负担 (2) 产生路由 选择循环 路由振荡 的问题
- 静态路由算法(Static Routing Algorithm):
第三种方式
负载迟钝(Load-Insensitive Algorithm):现在的所有路由选择协议都是负载迟钝的
负载敏感(Load-Sensitive Alogorithm):早期的 ARPAnet 协议是负载敏感的
自治系统(Autonomous System)
- 概念:处于同一个
ISP中的 路由器 和相连的 链路 构成 - 特点:每个自治系统都拥有全局唯一的 AS 号:由
ICANN区域注册机构唯一分配 - 细节:
- 概念:处于同一个
内部网关协议
- 统称:自治系统内部域间路由 (Intra-Autonomous System Routing Protocol)
RIP 协议
协议(Routing Information Protocol 路由信息协议)
内容
每个路由器都维护自己到其他 每个目的网络的距离 和 下一跳交付的路由器(距离也被称为跳数 Hop Count)
协议认为经过的 最优路径是经过的路由器最少
每条路径最多可以包含 15 个路由器,16 个路由器 被视为这个网络是不可达的:目的是为了防止数据报循环出现在环路上
协议要求路由器每 30s 和 相邻 的路由器 交换自己的转发表 (自己相邻的路由器超过 180s 没有和自己交换转发表,视为该路由器从网络中断开) *
采用 距离向量算法 选择性更新自己的转发表
重复交换转发表的过程,最终每个路由器能够得到自己到其他网络的最短路径
细节:
- RIP 协议收敛速度 较慢
- RIP 协议 ==周期性== 的交换路由信息 (网络拓扑结构发生变化也会导致交换信息?)
- RIP协议健壮性相对较差
- RIP 协议不支持子网掩码的广播:每个子网的 子网掩码必须相同 (仅支持分类地址编码的定长子网划分)
- RIP 协议下层协议采用 UDP 报文段传输
- RIP 协议是 应用层协议
问题:
- 选择环路问题 (Routing Loop)
- 无穷计数问题 (Count-to-Infinity):采用毒性逆转 (Poisoned Reverse) 可以解决 特殊 的无穷计数问题 -> 无法解决一般的无穷计数问题
算法
前提:距离向量路由选择算法包含
Bellman-Ford算法 (Bellman-Ford算法只是距离向量选择算法中的一种而已)计算过程
每个路由器只向自己 相邻 的所有路由器广播自己的路由表 (每个路由器当前拥有的路径开销不一定就是最低的:可能还没有收敛)
每个路由器采用
Bellman-Ford计算 当前的最短路径① 某个路由器接收其他路由器发送的 多个路由向量
② 该路由器到其他路由器的距离 + 其他路由器到其他子网的距离 = 该路由器到其他子网的距离 -> 选择最小距离作为更新
贝尔曼福特方程:$d_x(y) = min_v(c(x, v_1) + d_{v1}(y), c(x, v_2) + d_{v2}, c(x, v_3) + d_{v3}…)$ (同时可以收到多个节点发送的分组,选择开销小的那个更新)
③ 更新内容:(1) 更新该路由器到其他子网的距离 (2) 更新自己下一跳路由器
OSPF 协议
协议(Open Shortest Path First 开放最短路径优先)
内容:
每个自治系统 内部 划分层次结构
(1) 分为 主干区域 和 下层区域
(2) 主干区域包含 所有的边界路由器 (也可以包含非边界路由器) & 每个下层区域都独立运行
OSPF协议(3) 下层区域中只有 边界路由器 会和其他区域进行 通信,其余内部路由器仅在内部通信
每个路由器在 初始阶段 仅维护与自己 相邻的路由器的链路信息
每个路由器会向网络中 所有的路由器 发送 自己知道的链路信息 (采用 洪泛法(Flooding) 广播链路状态信息)
仅有 受到信任的路由器 可以参与到自治系统内部的
OSPF协议中支持使用多条链路开销最小的路径 (多路间负载均衡)
细节:
只有链路状态发生变化就会重新计算最低开销路径 (依然采用洪泛法)
OSPF 协议规定所有路由器每隔 30 分钟就刷新一次链路状态信息表,确保拥有的链路状态信息是一致的
算法
前提:链路状态路由选择算法包含
Dijkstra算法 (Dijkstra算法只是众多链路状态选择算法中的一种而已)链路状态算法计算过程:
每个节点会向网络中 “所有” 其他节点广播 ==链路状态分组==(发送自己的路由表)
解释:每个节点只是向自己的 每个邻居 发送自己的路由表,每张路由表也只包含自己相邻节点的信息,邻居路由器收到之后,会继续向他的邻居发送路由表
邻居路由器不会再向自己发送链路状态信息:发送是单向的 (RIP 协议发送是双向的因此会导致选择环路和无穷计数的问题)
每个节点通过这种 ==全局性== 的广播能够获取整个网络的==完整拓扑结构和链路开销==
每个节点采用 ==迪杰斯特拉算法== 计算自己到其他节点的最短路径
每个节点完成最短路径的计算之后,更新自己的路由表
注:迪杰斯特拉算法能够得到最短路径(==倒着==推出来),每个节点只存储利用最短路径到达目的地的==下一个节点==,而不是整条路径
问题:链路振荡:最低开销链路 频繁 发生变化
解决:(1) 使链路开销不依赖链路所承载的流量 (×)
(2) 使每台路由器发送链路信息的时间随机化
对比
RIP协议采用 距离向量算法 <->OSPF协议采用 链路状态算法RIP协议每个路由器拥有的 不一定 是最低开销路径 (需要等到 收敛 之后才是) <->OSPF协议每个路由器拥有的 一定 是最低开销路径RIP协议仅向 相邻 的路由器发送链路信息 <->OSPF协议向网络中 所有 路由器发送链路信息 (洪泛法)RIP协议所有路由器 周期性 交换链路信息 <->OSPF协议仅在 链路状态发生变化 时交换链路信息 (洪泛法)注:
RIP协议在链路状态发生变化时也会交换链路信息 <->OSPF协议也会定期更新链路信息但是并不会采用洪泛法同步RIP协议 不支持 变长子网划分和无分类域间路由技术 <->OSPF协议 支持 变长子网划分和无分类域间路由技术RIP协议 仅可以配置一条 最低开销链路 <->OSPF协议 可以配置多条 最低开销链路RIP协议路由器发送链路信息是 双向 的 <->OSPF协议发送链路信息是 单向 的RIP协议是 应用层协议 & 使用 UDP 协议传输<->OSPF协议是 网络层协议 & 不使用 UDP/TCP 传输使用 IP 数据报传输RIP协议端口号是 520 <->OSPF协议端口号是 89
外部网关协议
- 统称:自治系统间路由选择协议 (Inter-Autonomous System Routing Protocol)
BGP 协议
引入:
- 每个自治系统的内部采用的协议并不相同,但是每个自治系统之间又需要相互联系
- 所以每个自治系统之间需要采用相同的协议来进行联系,也就是 BGP 协议
概念(边界网关协议 Broder Gateway Protocol):用于连接每个不同的自治系统的协议
注:
BGP协议也是 分布式 和 异步 的术语:
边界网关路由器 (Gateway Router):能够连接本自治系统中的路由器 & 也可以连接其余自治系统中的路由器
注:每个边界网关路由器之间通过 TCP 建立连接后通信 (该 TCP 是半永久连接使用端口号 179)
内部路由器 (Internal Router):仅能够连接本自治系统中的路由器
BGP 连接:路由器之间用于通信的连接
- 外部 BGP (eBGP):跨越两个自治系统的 BGP 连接
- 内部 BGP (iBGP):自治系统内部的 BGP 连接
分组信息:
AS-PATH:记录该分组 已经经过的所有自治系统 (用于检测在发送的过程中是否出现 环路 )
NEXT-HOP:记录分组经过的 最后一个自治系统边界网关路由器的
IP地址注:两个属性用于寻找相对较好的路径
通信过程:(路径向量选择)
细节:
最优路由:
热土豆选择算法:源路由器找到 距离 NEXT-HOP 最小的开销,然后依次递推,到达最后的目的路由器
注:这样得到的路径很有可能不是最短的,因为仅仅是确认距离自己最近的,从全局角度来说可能不是最近的
路由器选择算法
- 选择偏好:网路管理员指定偏好值:偏好值高的路径就会被选择 (人为选择)
- 距离向量:如果选择偏好相同,使用距离向量计算最短开销 (计算的是经过的 AS 的跳数)
- 热土豆:如果前两者相同,使用热土豆计算
- 标识:如果前三者相同,使用标识来区分
路由器
概念(Router):具有 多个输入端口 和 多个输出端口 的专用 计算机 (每个路由器有相应的缓存和处理器)
功能:
- 转发(Forwarding):将数据报从 输入端口 经过 交换结构 转移到 输出端口
- 转发功能采用硬件实现
- 转发过程中查询 转发表:(1) 如果查询到相应条目就进行转发 (2) 如果没有查询到就转发到默认路由去 (3) 输入和输出端口缓存已满可能会抛弃这个数据报
- 路由选择(Routing):决定转发表中的内容
- 路由选择功能采用软件实现
- 采取路由选择算法 ==构造路由表== 并且定期维护更新路由表 ((1)链路状态路由选择算法 LS (2) 距离向量路由选择算法 DV)
- 转发(Forwarding):将数据报从 输入端口 经过 交换结构 转移到 输出端口
转发表(Forwarding Table):如果没有找到对应的转发端口,通过默认路由(0.0.0.0)转发给其他的路由器
| 目的网络 IP 地址 | 子网掩码 | 下一跳 IP 地址 | 转发端口 |
|---|---|---|---|
| 1.1.1.0 | 255.255.255.0 | 2.2.2.0 | 1 |
| 0.0.0.0 | 0.0.0.0 | 11451 |
路由表和转发表
路由表:仅包含目的==子网号(网络前缀) + 子网掩码 + 下一跳 IP 地址 + 输出端口== (不包含数据链路层的
MAC信息)转发表:==优化==的路由表;不仅包含路由表中的所有信息,还包含转发所必须的 ==MAC 地址和必要的封装信息==;采用==硬件实现==
内部结构
输入端口:(1) 内部第一个端口用于执行 物理层 的功能 (2) 内部第二个端口用于执行 数据链路层 的功能 (3) 内部第三个端口用于 查询转发表
线路前部阻塞(Head-Of-the-Line):输入队列缓存中的分组必须等待前面分组被转发后才可以转发,即使该分组转发的端口是空闲的

输出端口:(1) 内部第一个端口用于执行 网络层 功能
交换结构:负责将输入端口等待的数据报转移到输出端口
内存交换:
(1) 数据报到达端口时通过 中断 通知 路由选择处理器 (CPU)
(2) 数据报通过 总线 被复制到 内存 中
(2) 路由选择处理器从内存中取出并开始处理(查找应该转发到哪个端口)
1* 每次仅能转发一个数据报:处理器每次仅能执行一个进程 (对于单处理器而言) / 经过内存总线每次仅能够执行一次读写
总线交换
(1) 输入端口制定 内部标签 经过 总线 将数据报交付给输出端口 (不需要路由选择处理器的干预)
(2) 所有输出端口都可以 接收 到该数据报,但是只有 内部标签匹配 的输出端口才可以 保存
1* 每次仅能转发一个数据报:每次仅能够有一个数据报跨越总线
网络交换

转发表:
- 采用 CIDR 的==网络前缀去对应端口==,而不是每个 IP 地址都对应一个端口,这会导致转发表过于庞大
- 端口 3 每次查找转发表中网络前缀对应的转发端口时采用的是==最长前缀匹配原则==

转发过程
机制:==存储转发==
端口:如果分组进入队列中的速率==快于==端口处理分组的速度,就会导致==队列堵塞== (输入输出队列都会早成堵塞)
队列堵塞:路由器不会接收溢出的分组;==分组溢出是造成路由器舍弃分组的重要原因==
弃尾策略(Drop-Tail):输入或者输出队列没有足够的缓存存放数据报时:丢弃一个或者多个数据报为新到来的数据报 腾出空间 并且提示 发送方缓存已满
注:丢弃的三种策略 (1) 丢弃到来的数据报 (2) 基于数据报的优先权丢弃 (3) 随机丢弃
注:统称为 主动队列管理 Active Queue Management
分组调度:制定策略选择输出/输入队列中的哪个数据报进行传输 (分组调度并不能够解决队列堵塞问题)
先进先出(FIFO):先来的数据报先进入端口进行处理,后来的数据报只能够在分组队列中的等待
优先权排队(Priority Queue):
(1) 分为 优先权队列 和 普通队列:优先权队列中的数据报优先处理,普通队列中的数据报稍后处理
(2) 抢占式优先权排队 & 非抢占式优先权排队 (Non-Preemptive Priority Queuing)
- 非抢占式:端口正在处理普通队列中的分组,高优先级的分组 不允许 抢占执行
- 抢占式:端口正在处理普通队列中的分组,高优先级的分组 可以 抢占执行
循环排队 (Round Robin Queue)
(1) 根据分组的类型划分 多个不同类型的队列
(2) 每传输完某个类型队列中的一个分组后立刻传输下一个类型队列中的一个分组 (循环)
注:并不会 传输完某个类型中的所有分组再传输下一个类型队列中的分组,除非其他队列没有分组了
加权公平排队 (Weighted Fair Queuing)
(1) 基于循环排队调度:为每个不同类型的队列 分配一个权重
(2) 每次传输一个类型队列中的分组数量 = 该队列的权重在所有队列权重中的占比
