【CN101】计算机网络笔记4 —— Layer 3 技术与路由协议

笔者:YY同学

生命不息,代码不止。好玩的项目尽在GitHub



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 数据包结构

  1. 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,包含上层数据。
  1. 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 2n2 个。位于相同网段的主机属于一个子网。
  • 子网掩码(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=1677721616777214
B 类(中型公司)128.0.0.0 ~ 191.255.255.25525%前 16 位后 16 位255.255.0.0 2 16 2^{16} 216=6553665534
C 类(小型公司,家用)192.0.0.0 ~ 223.255.255.25512.5%前 24 位后 8 位255.255.255.0 2 8 2^{8} 28=256254
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. 获得子网掩码位数:直接写在后面则不需要计算,如果是给出十进制的子网掩码需要先转成二进制后数 1 的个数。
    2. 根据所需要的子网数确定要借几位:如果要分为 k 个子网,需要借的位数 b = c e i l ( l o g 2 k ) b=ceil(log_{2}k) b=ceil(log2k)ceil 表示向上取整。例如要分成 7 个子网需要借 3 位。
    3. 得到新的子网掩码位数为:原子网掩码 + 借的位数 b。
    4. 则划分后的子网共有 2 b 2^b 2b 个,范围从“原网络部分 + b 个 0” 到 “原网络部分 + b 个 1”。每个子网最多可以有 2 ( 32 − 原 网 络 部 分 位 数 − b ) − 2 2^{(32-原网络部分位数-b)}-2 2(32b)2 台主机(注意全 0 和全 1 的主机地址不能使用)。
  • 无类划分(Classless Subnetting)步骤:
    在这里插入图片描述

    1. 找到所需主机数最少的网段。例子中红色的 DCE-DTE 线连接的路由器也算主机,因此主机数最少的网段是三个与路由器相连的网段,所需主机数为 1。
    2. 有了需要的主机数目 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。
    3. 以此类推,分配完一个子网后,按照所需主机数从小到大的顺序再分配下一个,直至所有网段都分配完毕。
  • Classful 和 Classless 的比较:

    • Classful 有类的概念,按照所需的网段个数来分,每个网段可用的主机地址总数是一样的,子网掩码也是一样的,但是分配公平的同时也存在一些地址的浪费(比如一个类可能只有 1 台主机但是该网段分配到的可用主机地址总数大于 1)。
    • Classless 没有类的概念,使用 VLSM(Variable Length Subnet Masking)思想,按照所需主机的数量进行分配,每个网段可用的主机地址总数是不一样的,子网掩码也是不一样的,能够最大程度上做到不浪费地址,多的多分配,少的少分配(但不能做到完全不浪费,因为不能保证每个网段所需的主机数量都是 2 n − 2 2^{n}-2 2n2)。

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 地址生成算法:
    1. 获取 MAC 地址(以 00-AA-AA-AA-AA-AA 为例,十六进制)
    2. 将最开头 2-bit 转成二进制:00 = 00000000
    3. 将第 7 位取反码(0 变成 1,1 变成 0)后转回十六进制:00000000 = 00000010 = 02
    4. 替换原来的 MAC 地址:02-AA-AA-AA-AA-AA
    5. 在最中间插入 FF-FE:02-AA-AA-FF-FE-AA-AA-AA
    6. 最后加上 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 会将数据包直接丢弃。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA自学笔记——设计与验证JMB FPGA(可编程逻辑门阵列)是一种可编程的硬件平台,可以实现各种数字电路的设计与验证。本文将简要介绍使用FPGA自学设计与验证JMB(低功耗、高效能、集成度高的多媒体芯片)的过程。 首先,我们需要了解JMB的功能和特性。JMB是一种面向多媒体应用的芯片,具备低功耗、高效能和高集成度的优势。我们需要详细研究JMB的硬件架构和内部模块,包括处理器核、存储器模块、图像和音频处理模块等。 接下来,我们可以使用FPGA开发板来设计和验证JMB。首先,我们需要熟悉FPGA设计工具,例如Vivado或Quartus等。这些工具提供了图形化界面和硬件描述语言(HDL)等设计方法。我们可以使用HDL编写JMB的功能模块,并将其综合为FPGA可执行的位流文件。 在设计完成后,我们需要验证JMB的功能和性能。我们可以使用仿真工具(例如ModelSim或ISE Simulator)来模拟JMB在不同情况下的行为。通过设计测试程序并运行仿真,我们可以验证JMB的各个模块是否正确地工作,是否满足设计要求。 在验证完成后,我们可以将位流文件下载到FPGA开发板中进行智能芯片的物理实现和测试。通过与外部设备的连接以及相关测试程序的运行,我们可以验证JMB在实际硬件中的功能和性能。 总结起来,学习FPGA设计与验证JMB,我们需要熟悉JMB的硬件架构和内部模块,并使用FPGA开发工具进行设计与验证。通过仿真和物理实现测试,我们可以验证JMB的功能和性能。这些过程需要理论知识和实践经验的结合,希望这些笔记能够给你提供一些参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值