网络层
约 3473 字大约 12 分钟
2025-04-14
概述
- 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输
- 要实现网络层任务,需要解决以下主要问题:
- 网络层向运输层提供怎样的服务「可靠传输 or 不可靠传输」
- 网络层寻址问题
- 路由选择问题
- 与 IP 协议配套使用的还有三个协议:
- 地址解析协议 ARP(Address Resolution Protocol)
- 网际控制报文协议 ICMP(Internet Control Message Protocol)
- 网际组管理协议 IGMP(Internet Group Management Protocol)

IP地址编址方式

分类
IP 地址 ::= {< 网络号 >, < 主机号 >}

划分子网
IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}
,IPv4地址与其相应的子网掩码进行逻辑与「有0则0」运算就可以得到IPv4地址所在子网的网络地址
无分类
无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。
IP 地址 ::= {< 网络前缀号 >, < 主机号 >}
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网 。
在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
IP数据报的发送和转发过程
- 主机发送IP数据报:判断主机是否与主机在同一个网络,同一网络->直接交付,不在同一网络->间接交付「默认网关帮忙转发」
- 路由器转发IP数据报:
- 检查IP数据报首部是否出错,出错->丢弃并通告源主机,未出错->转发
- 根据IP数据报的目的地址在路由表中查找匹配的条目,找到->转发,找不到->丢弃并通告源主机
地址解析协议ARP
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。

ARP 实现由 IP 地址得到 MAC 地址。

每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。

ARP协议作用在逐段链路或逐个网络使用,ARP没有安全验证机制,存在ARP欺骗(攻击)问题。
路由选择协议

- 自适应:动态路由选择,能较好地适应网络状态的变化
- 分布式:路由之间交换路由信息
- 分层次:将整个因特网划分为许多较小的自治系统AS「不同AS可以使用不同的路由选择协议」

路由器从功能上可以划分为:路由选择和分组转发。
分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。

路由信息协议RIP
- RIP使用跳数作为度量来衡量到达网络的距离
- 路由器到直连网络的距离定义为1
- 路由器到非直连网络的距离定义为所经过的路由数加1
- 允许一条路径最多只能包含15个路由器,“距离”等于16时相当于不可达。因此,RIP只适用于小型互联网。
image-20250313210626223
- RIP认为好的路由就是“距离短”的路由,也就是所通过路由数量少的路由。
- 当到达同一目的网络有多条“距离相等”的路由时,可以进行等价负载均衡。
- RIP包含以下三个要点:
- 和谁交换信息-->仅和相邻路由器交换信息
- 交换什么信息-->自己的路由器
- 何时交换信息-->周期性交换信息
- 距离向量算法:
- 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
- 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
- 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
- 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。
开放最短路径优先OSPF
开放最短路径优先OSPF,是为了克服RIP的缺点而开发出来的。
开放表示OSPF不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了Dijkstra提出的最短路径算法SPF。
OSPF具有以下特点:
- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
- 只有当链路状态发生变化时,路由器才会发送信息。
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于RIP,OSPF的更新过程收敛的很快「不限制网络规模,更新效率高」。
边界网关协议BGP
- 不同系统之间的路由选择必须考虑相关策略「政治、经济、安全」
- BGP只能说力求寻找一条能够到达目的网络且比较好的路由「不能兜圈子」,而并非要寻找一条最佳路由。
- 每个AS必须配置一个“BGP发言人”,通过两个相邻BGP发言人之间建立TCP连接「端口号:179」来交换路由信息。

IPv4数据报的首部格式

- 版本:占4比特,有4(IPv4)和6(IPv6)两个值,通信双方使用的IP协议的版本必须一致。
- 首部长度:占4比特,该字段的取值以4字节为单位。最小十进制取值为5,表示IP数据报首部只有20字节固定部分;最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分。
- 区分服务:占8比特,一般情况不使用。
- 总长度:占16比特,包括首部长度和数据部分长度。
- 生存时间TTL:占8比特,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃。
- 协议:占8比特,指出携带的数据应该上交给哪个协议进行处理,常用的一些协议和相应的协议字段如下:
image-20250315154903484
- 首部校验和:占16比特,用来检验首部在传输过程中是否出现差错。每经过一个路由器都要重新计算首部校验和,因为某些字段[生存时间、标志、片偏移...]的数值可能发生变化;由于IP层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部校验和,从而更快转发IP数据报。
- 标识:占16比特,在数据报长度过长从而发生分片的情况下,想通数据报的不同分片具有相同的标识符。
- 标志:占3比特,DF位:1表示不允许分片,0表示允许分片;MF位:1表示后面还有分片,0表示这是最后一个分片;保留位,必须为0;
- 片偏移:占13比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位,片偏移以8个字节位单位。
image-20250315163635693
网际控制报文协议ICMP
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。

ICMP 报文分为差错报告报文和询问报文:

Ping
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
traceroute[<=30]
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。
- 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
- 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。
虚拟专用网VPN
由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。
专用(私有)地址:
- 10.0.0.0~10.255.255.255(10/8地址块)
- 172.16.0.0~172.31.255.255(172.16/12地址块)
- 192.168.0.0~192.168.255.255(192.168/16地址块)


网络地址转换NAT
专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。
在以前,NAT 将本地 IP 和全球 IP 一一对应,这种方式下拥有 n 个全球 IP 地址的专用网内最多只可以同时有 n 台主机接入互联网。为了更有效地利用全球 IP 地址,现在常用的 NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。使用端口号的 NAT 也叫做网络地址与端口转换 NAPT。

对于一些P2P网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时会遇到问题(NAT路由器收到来自外网的IP数据报后,在NAPT转换表中找不到相应的记录),需要网络应用自己使用一些特殊的NAT穿越技术来解决问题。
另外,由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护。