笔者:YY同学
文章目录
Layer 3(L3)功能
提供决定数据包传输路线的服务,一般会选择最佳路线。在 TCP/IP 协议栈内还会定义数据包结构,寻找唯一主机地址以及选择最佳数据包传输路线。
L3 协议
- IP(Internet Protocol):L3 主要协议,分为 IPv4 和 IPv6。
- ICMP(Internet Control Message Protocol):在网络中传送控制信息,提供可能发生在通讯环境中的各种问题反馈,帮助管理者针对发生的问题作出诊断,然后采取适当的解决措施。
- Address Resolution Protocol(ARP):用于地址解析,将 IP 地址解析为对应的 MAC 地址。
- Reverse Address Resolution Protocol(RARP):反向解析,将 MAC 地址解析为 IP 地址。
IP 数据包和 ICMP 数据包结构
- IP 数据包(包括 IP 头和 Data):
- IPv4 头段(可变长度,20 bytes):
- 版本号段:4 bits,4 表示 IPv4,6 表示 IPv6。
- 头长度段:4 bits,用 32-bit 的 word 表示总的头信息的长度。
- TOS(服务种类)段:8 bits,表示层级重要性,由上层协议决定。
- 总长度段:16 bits,总的数据包的长度,包括头和数据。
- 标识符段:16 bits,序列号,用于识别当前数据包。
- 标志段:3 bits,两位低位控制片段,剩下一位表示数据包是否可以分段。
- 片段偏移量段:13 bits,作为前面字段的可延长段使用,用于切片数据段。
- TTL 段:8 bits,表示数据包可经过的最大跳(hop)数量,经过这个数量的 host 之后,数据包会被丢弃。
- 协议段: 8 bits,表示上层协议,例如 TCP 和 UDP。
- 头校验和段:16 bits,帮助确认头部完整。
- 源地址段:32 bits,发送数据包的 host 的 IP 地址。
- 目标地址段:32 bits,接收数据包的 host 的 IP 地址。
- 选项段:可变长度,允许 IP 支持多种选项例如安全选项。
- 填充段:可变长度,可在该段填充 0 以确保 IP 头总是 32 bits 的倍数。
- IPv6 头段(固定长度,40 bytes):
- 版本号段:4 bits,同 IPv4。
- 流量等级段:8 bits,表示 IPv6 数据包的优先级。
- 流标签段:20bits,表示数据包的序列
- 载荷长度段:16bits,表示 IPv6 载荷(payload)长度。
- 次级头段:8bits,表示第一扩展头或者上层协议。
- 跳上限段:8 bits,同 IPv4 的 TTL。
- 源地址段:128bits,同 IPv4。
- 目标地址段:128bits,同 IPv4。
- 数据段(Data):可变长度可达 64 Kbits,包含上层数据。
- ICMP 数据包(有 ICMPv4 和 ICMPv6,传输方式与 IP 数据包相同):
- ICMP 头段:
- 类型段:表示发送的 ICMP 信息的格式。
- 代码段:对于类型的详述信息。
- 校验和段:验证数据完整性。
平面寻址(Flat addressing)VS 分层寻址(Hierarchical addressing)
类型 | 描述 | 举例 |
---|---|---|
平面寻址 | 地址按照顺序 | MAC 地址 |
分层寻址 | 地址按照不同层级,包含网络部分和端口部分 | IP 地址 |
IPv4 地址
地址为 32 位的二进制数(0 或者 1),由小数点符号分成四段,每段 8 位。为了方便表示,我们将 8 位二进制写为十进制数字,因此 IPv4 地址的范围为 0.0.0.0 ~ 255.255.255.255。在限定范围内,每台计算机的 IPv4 地址是唯一的。
- 地址组成:由网络部分(Network Portion,也称为网段)和主机部分(Host Portion,也称为主机地址)组成。网络部分在前,主机部分在后。假定网络部分有 m 位,主机部分有 n 位,则 m + n = 32 m+n=32 m+n=32,在该限定范围内有 2 m 2^m 2m 个网段(子网),每个网段中有 2 n 2^n 2n 个主机地址,因此总共有 2 m + n = 2 32 2^{m+n}=2^{32} 2m+n=232 个 IP 地址。
- 特殊的主机地址:有一些主机地址一般不会分配给主机使用,因为它们有特殊的用途。比如主机地址全为 0 表示对该网段的定义,主机地址全为 1 表示在该网段下的广播地址(会向该网段的所有主机发送信息),剩下的是可用主机地址,因此 n 位主机地址下可用主机地址有 2 n − 2 2^{n}-2 2n−2 个。位于相同网段的主机属于一个子网。
- 子网掩码(Subnet Mask):用于显示子网的位数长度,也被称为前缀长度(Prefix Length),由 32 位二进制数(0 或 1)组成,1 表示网段的范围,0 表示主机地址的范围。如果网段范围有 m 位,主机地址有 n 位,则子网掩码的前 m 位为 1,后 n 位为 0。子网掩码也可以简单地用网络部分的位数表示(一般这种会写在斜杠后面):比如子网掩码为 24 位就是指 32 位地址中前 24 位为网段范围(全为 1),后 8 位为主机地址(全为 0)。当然,子网掩码也可以像 IP 地址一样用十进制表示,比如 24 位子网掩码可以写成 255.255.255.0。
- 有类寻址(Classful Addressing):为了方便统计,我们人为地给所有地址分类:
类型 | 地址范围 | 占比 | 网络部分位数 | 主机部分位数 | 子网掩码 | 主机地址总数 | 可用主机地址数量 |
---|---|---|---|---|---|---|---|
A 类(国家,大型公司) | 1.0.0.0 ~ 126.255.255.255(0 和 127 开头的保留) | 50% | 前 8 位 | 后 24 位 | 255.0.0.0 | 2 24 2^{24} 224=16777216 | 16777214 |
B 类(中型公司) | 128.0.0.0 ~ 191.255.255.255 | 25% | 前 16 位 | 后 16 位 | 255.255.0.0 | 2 16 2^{16} 216=65536 | 65534 |
C 类(小型公司,家用) | 192.0.0.0 ~ 223.255.255.255 | 12.5% | 前 24 位 | 后 8 位 | 255.255.255.0 | 2 8 2^{8} 28=256 | 254 |
D 类(用作多播) | 224.0.0.0 ~ 239. 255.255.255 | 与 E 类合起来 12.5% | 前 28 位 | 后 4 位 | 255.255.255.240 | 2 4 2^{4} 24=16 | 暂不开放使用 |
E 类(保留地址供研究使用) | 240.0.0.0 ~ 255.255.255.255 | 与 E 类合起来 12.5% | 前 28 位 | 后 4 位 | 255.255.255.240 | 2 4 2^{4} 24=16 | 暂不开放使用 |
- 未分配地址,可开放给用户使用(Private Address):10.0.0.0 ~ 10.255.255.255(A 类),172.16.0.0 ~ 172.31.255.255(B 类),192.168.0.0 ~ 192.168.255.255(C 类)。此范围内地址一般通过 VPN 的形式映射到每个子网作虚拟地址,因此无法在网络上进行路由,但可以在子网内部 ping 通。
- 地址种类:单播、多播、广播。广播又分为全局广播(Directed Broadcast)和有限广播(Limited Broadcast)。前者使用的地址是 “当前网段 + 全 1 主机地址”,会经过路由转发给其他网段,但是由于会被其他网段的主机丢弃,最终只能在该网段内广播给所有主机;而后者使用的地址是 255.255.255.255 广播地址,不会通过路由转发(会被 Router 直接丢弃),因此只能广播给本网段内的所有主机。
- 地址分配:静态分配(Static),动态分配(DHCP,Dynamic Host Configuration Protocol)。
IPv4 子网划分(Subnetting)
如果给小型公司分配一个 IPv4 地址的网络部分,我们可以知道在该公司最多可以有多少台主机。但是如果我们要再把这些主机按照公司各个部门分开该怎么办呢?其实可以采用类似的方法:从主机地址位数里借出几位放到网络部分中,相当于网络部分位数更多了,说明该网段下主机地址更少了。由于主机的总数是不变的,那么通过增加网段数量,使得单位网段下的主机个数减少,就相当于原网段被分成了更小的子网段。子网划分方法分为 Classful 和 Classless 两种。
-
有类划分(Classful Subnetting)步骤:
- 获得子网掩码位数:直接写在后面则不需要计算,如果是给出十进制的子网掩码需要先转成二进制后数 1 的个数。
- 根据所需要的子网数确定要借几位:如果要分为 k 个子网,需要借的位数 b = c e i l ( l o g 2 k ) b=ceil(log_{2}k) b=ceil(log2k),ceil 表示向上取整。例如要分成 7 个子网需要借 3 位。
- 得到新的子网掩码位数为:原子网掩码 + 借的位数 b。
- 则划分后的子网共有 2 b 2^b 2b 个,范围从“原网络部分 + b 个 0” 到 “原网络部分 + b 个 1”。每个子网最多可以有 2 ( 32 − 原 网 络 部 分 位 数 − b ) − 2 2^{(32-原网络部分位数-b)}-2 2(32−原网络部分位数−b)−2 台主机(注意全 0 和全 1 的主机地址不能使用)。
-
无类划分(Classless Subnetting)步骤:
- 找到所需主机数最少的网段。例子中红色的 DCE-DTE 线连接的路由器也算主机,因此主机数最少的网段是三个与路由器相连的网段,所需主机数为 1。
- 有了需要的主机数目 n,则主机地址的位数 h = c e i l ( l o g 2 ( n + 2 ) ) h=ceil(log_2(n+2)) h=ceil(log2(n+2)),因为全 0 和全 1 的地址无法使用。因此前 32 - h 位为新的 IP 地址的网络部分,新分配的网段地址从最后一位从 0 开始往上加,如果与前面任何一个网段有重合部分,则继续往上加直至完全不重合。例如在分配 10 个主机的网段时,我们算出需要的主机地址位数为 4,子网掩码为 28。但此时我们发现上一个网段(2 个主机的那个网段)已经占用了六位网络部分 “000100” 中的 “0001”,并且全 0 的部分也被占用(最左边红线连接的网段),因此我们从 “0010” 开始分配,所以该网段地址为 192.168.1.32/28。
- 以此类推,分配完一个子网后,按照所需主机数从小到大的顺序再分配下一个,直至所有网段都分配完毕。
-
Classful 和 Classless 的比较:
- Classful 有类的概念,按照所需的网段个数来分,每个网段可用的主机地址总数是一样的,子网掩码也是一样的,但是分配公平的同时也存在一些地址的浪费(比如一个类可能只有 1 台主机但是该网段分配到的可用主机地址总数大于 1)。
- Classless 没有类的概念,使用 VLSM(Variable Length Subnet Masking)思想,按照所需主机的数量进行分配,每个网段可用的主机地址总数是不一样的,子网掩码也是不一样的,能够最大程度上做到不浪费地址,多的多分配,少的少分配(但不能做到完全不浪费,因为不能保证每个网段所需的主机数量都是 2 n − 2 2^{n}-2 2n−2)。
IPv6 地址
由于全世界正在使用的 IPv4 地址即将耗尽,因此 IPv6 地址便作为 IPv4 地址的替代投入使用。
- 地址长度:128-bit,理论上可以有 2 128 2^{128} 2128 个不同地址。
- 地址表示(十六进制):XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX。有时候可以简写,每四位中高位的 0 可以删去,如果四位全是 0 可以只写一个 0 或者用 :: 表示。注意,:: 可以表示多组连续的 0 但是一个地址中只能出现一个 :: 符号。例如,FE80:0:0:0:2AA:FF:FE9A:4CA2 可以表示为 FE80::2AA:FF:FE9A:4CA2。
- 地址格式:网络前缀(Network Prefix)通常是 64 bits + 接口 ID 通常也是 64 bits,类似于 IPv4 的网络部分和主机部分,子网掩码一般为 64 位,用斜杠加在后面。
- 地址类型:单播地址、多播地址、任意单/多播地址。
- 一些特殊地址:
- 本地链路单播(Link-local Unicast):以 FE80::/10 开头,64 bits 接口。
- 全局单播(Global Unicast):以 2000::/3 或者 2001::/3 开头。
- 多播:以 FF00::/8 开头,请求节点多播为 FF02::1:FF。
- 广播:本地全节点广播为 FF02::1,全路由器广播为 FF02::2。
- EUI-64 地址生成算法:
- 获取 MAC 地址(以 00-AA-AA-AA-AA-AA 为例,十六进制)
- 将最开头 2-bit 转成二进制:00 = 00000000
- 将第 7 位取反码(0 变成 1,1 变成 0)后转回十六进制:00000000 = 00000010 = 02
- 替换原来的 MAC 地址:02-AA-AA-AA-AA-AA
- 在最中间插入 FF-FE:02-AA-AA-FF-FE-AA-AA-AA
- 最后加上 FE80 头,四个一组并去掉短线,添加冒号:FE80::02AA:AAFF:FEAA:AAAA
邻居发现协议(NDP)
该协议用于查找邻居路由器,使用 4 种不同的 ICMPv6 信息。
ICMPv6 信息 | 类型 | 作用概述 |
---|---|---|
Router Solicitation (RS) | 133 | 发现邻居路由器 |
Router Advertisement (RA) | 134 | 包含前缀 |
Neighbor Solicitation (NS) | 135 | 复制被检测到的邻居地址 |
Neighbor Advertisement (NA) | 136 | 地址解析 |
广播域(Broadcast Domain)
在逻辑拓扑中,由一个或多个碰撞域组成的区域。广播域由 L3 的设备(Router)分割,L2 的设备(Bridge 和 Switch)可以拓展广播域。如果一台主机发送广播,则在相同广播域内的设备可以接受到广播信息,因为 L2 设备会转发广播信息(如果 Switch Table 没有记录),但是广播信息会被 L3 设备阻挡。换言之,广播信息只能在当前广播域发送,无法被相邻广播域接受,就像我们平时可以在国内自由旅游,但是却没有办法随意进出别国的国境,因为存在海关和边检。
碰撞域 VS 广播域
域 | 边界设备 | 内部拓展设备 | 通信类型 |
---|---|---|---|
碰撞域 | L2 设备 | L1 设备 | MAC 通信 |
广播域 | L3 设备 | L1、L2 设备 | IP 通信 |
IP 静态路由(Static Routing)及 ARP 的作用
当我们通过一台主机与另一台主机进行连接的时候(例如 ping 命令),源主机(Source)会向目标主机(Destination)发送数据包(Packet),这些数据包通过道路选择最终到达目的地,这就是路由;如果道路的选择是单一固定的,称为静态路由(一般情况下路由都是静态路由)。但是数据包不会自己选路,那么就需要一个机器来帮助它们选路,这个机器就是路由器。数据包发送前,会记录四个地址:源主机的 MAC 地址和 IP 地址以及目标主机的 MAC 地址和 IP 地址。其中源主机和目标主机的 IP 地址是固定的。数据包发送后,会在当前广播域内进行广播,此时源主机的 MAC 还是原来的值,ARP 协议会帮助寻找下一个目标主机的 MAC 并将数据包发送过去。之后新的源主机的 MAC 地址变为上一个目标主机的 MAC 地址,然后再由 ARP 协议继续寻找下一个。如果目标主机在当前广播域内,那么只有目标主机会接受数据包(因为下一个 MAC 地址就是目标主机的 MAC),而其他主机会丢弃数据包;如果目标主机不在当前广播域内,数据包就会被送到路由器的默认网关(Default Gateway,因为下一个 MAC 地址为网关的 MAC 地址)。网关负责将数据包传给邻近的路由器,相当于海关。之后数据包到了新广播域后会重复之前的过程直至找到目标主机。数据包中有个字段为 TTL,意为经过限定次数的跳(hop)后会被路由器自动丢弃。在路由过程中,每经过一个路由器会记一跳,当经过一定数量的路由器后,数据包就会被丢弃。也就是说如果路由的线路太长,数据包会面临被中途路由器丢弃的风险。
Intra-subnet 交互 VS Inter-subnet 交互
- Intra-subnet 交互:与同一个子网内的主机交互。ARP 会记录目标主机的 MAC 地址和 IP 地址。
- Inter-subnet 交互:与其他子网的主机交互。ARP 会记录通往目标主机的网关的 MAC 地址和 目标主机的 IP 地址。
Switching VS Routing
当数据包中的目标地址信息可以在 Table 中找到时(说明曾经发送过有记录),L2 和 L3 设备都会直接向目标地址传送数据包。反之,当 Table 中没有目标地址记录的时候,Switching 会在广播域内广播数据包,而 Routing 会将数据包直接丢弃。