Networking Fundamentals
本页介绍 MikroTik RouterOS 中的网络基础知识,涵盖 OSI 和 TCP/IP 模型、各层与协议,以及以太网通信细节,包括 MAC 地址和帧转发类型。
网络基础知识
计算机网络由许多不同的组件和协议协同工作构成。为了理解节点之间通信的工作原理,OSI 模型和 TCP/IP 模型有助于直观地展示节点如何通信。
OSI 模型
开放系统互连(OSI)模型是一个 7 层模型,如今被用作教学工具。OSI 模型最初被构想为构建网络系统的标准架构,但现实世界中的网络远没有 OSI 模型所描述的那样界限分明。
- 第 7 层(应用层) —— 定义服务器与客户端之间通信的协议,例如 HTTP 协议。如果 Web 浏览器想下载一张图片,该协议负责组织和执行请求;
- 第 6 层(表示层) —— 确保数据以可用的格式被接收。加密在这里完成(但实际上未必如此,例如 IPSec);
- 第 5 层(会话层) —— 负责建立、管理和关闭客户端与服务器之间的会话;
- 第 4 层(传输层) —— 传输层的首要职责是组包和重装:数据流被分成块(段),分配序号,并封装到协议头中(例如 TCP、UDP);
- 第 3 层(网络层) —— 负责逻辑设备寻址,数据被封装在 IP 头中,此时称为 "packet"(数据包);
- 第 2 层(数据链路层) —— 数据被封装到自定义头部中,采用 802.3(以太网)或 802.11(无线)格式,称为 "frame"(帧),负责流控;
- 第 1 层(物理层) —— 发送和接收比特的通信介质、电信号和硬件接口;
TCP/IP 模型
该模型与 OSI 模型目的相同,但更适用于现代网络故障排查。与 OSI 模型相比,TCP/IP 是一个 4 层模型:
- 应用层(4) —— 包含 OSI 模型的应用层、表示层和会话层,显著简化了网络故障排查;
- 传输层(3) —— 与 OSI 模型中的传输层相同(TCP、UDP 协议);
- 互联网层(2) —— 与 OSI 模型中的网络层作用相同(包括 ARP、IP 协议);
- 链路层(1) —— 也称为网络接入层。包含 OSI 模型的第 1 层和第 2 层,因此其主要关注点是网络节点之间的物理数据交换;
| TCP/IP | OSI Model | Protocols |
|---|---|---|
| Application Layer | Application Layer | 例如 DNS, DHCP,HTTP,SSH。 |
| Presentation Layer | 例如 JPEG,MPEG,PICT。 | |
| Session Layer | 例如 PAP, SCP, ZIP。 | |
| Transport Layer | Transport Layer | TCP, UDP |
| Internet Layer | Network Layer | ICMP, IGMP, IPv4, IPv6, IPSec |
| Link Layer | Data Link Layer | 例如 ARP, CDP, MPLS, PPP。 |
| Physical Layer | 例如 Bluetooth, Ethernet, Wi-Fi。 |
以太网
计算机网络中最常用的链路层协议(OSI 第 2 层)是以太网协议。为了通信,每个节点都有一个唯一分配的地址,称为 MAC(Media Access Control address),有时也称为以太网地址。
它长 48 位,过去通常由制造商固定(不可更改),但如今自定义 MAC 地址被广泛使用,RouterOS 也允许设置自定义 MAC 地址。
最常用的 MAC 格式是 6 个用冒号分隔的十六进制数(D4:CA:6D:01:22:96)
RouterOS 会为所有类以太网接口(例如 Wireless、60G、VPLS)在配置中显示 MAC 地址
[admin@rack1_b32_CCR1036] /interface ethernet> print
Flags: X - disabled, R - running, S - slave
# NAME MTU MAC-ADDRESS ARP SWITCH
0 R ether1 1500 D4:CA:6D:01:22:96 enabled
1 R ether2 1500 D4:CA:6D:01:22:97 enabled
2 R ether3 1500 D4:CA:6D:01:22:98 enabled
3 ether4 1500 D4:CA:6D:01:22:99 enabled
4 ether5 1500 D4:CA:6D:01:22:9A enabled
5 ether6 1500 D4:CA:6D:01:22:9B enabled
6 ether7 1500 D4:CA:6D:01:22:9C enabled
7 R ether8 1500 D4:CA:6D:01:22:9D enabled
8 sfp-sfpplus1 1500 D4:CA:6D:01:22:94 enabled
9 sfp-sfpplus2 1500 D4:CA:6D:01:22:95 enabled
在以太网网络上转发帧有三种类型:
- 单播(Unicast) —— 带单播地址的帧会发送到冲突域内的所有节点,冲突域通常是两个节点之间的以太网线,在无线情况下则是所有能检测到无线信号的接收方。只有 MAC 地址匹配的远端节点会接受该帧(除非启用了混杂模式)
- 广播(Broadcast) —— 特殊地址之一(
FF:FF:FF:FF:FF:FF),广播帧会被所有节点接受并在二层网络中转发。 - 组播(Multicast) —— 带组播地址的帧会被所有配置为监听该地址的节点接收。
IP 网络
以太网协议足以在两个位于同一以太网网络的节点之间传输数据,但不足以在跨越多个以太网段、相隔多跳的节点之间传输数据。对于互联网/网络层(OSI 第 3 层),使用 IP(Internet Protocol)以唯一的逻辑地址来标识主机。
目前大多数网络使用 IPv4,即用点分十进制表示法书写的 32 位地址(192.168.88.1),但 IPv6(128 位地址)的使用正在扩大。
你可以为一个接口添加多个 IP 地址,也可以让接口不分配任何地址。在桥接或 PPPoE 连接的情况下,物理接口可能没有分配任何地址,却完全可用。为加入 bridge 的物理接口配置 IP 地址,实际上意味着在该 bridge 接口本身上设置地址。
子网掩码(Netmasks)
可能存在多个逻辑网络,为了识别某个 IP 地址属于哪个网络,需要使用子网掩码。子网掩码通常表示为用于标识逻辑网络的位数。该格式也可以用十进制表示,例如 24 位子网掩码可以写作 255.255.255.0
IPv4 地址
IPv4 使用 4 字节地址,被分为四个称为八位组的 8 位字段。每个八位组转换为十进制格式并用点分隔。例如:
11000000 10101000 00000011 00011000 => 192.168.3.24
我们来仔细看看 192.168.3.24/24,以及如何根据子网掩码确定有效范围:
11000000 10101000 00000011 00011000 => 192.168.3.24
11111111 11111111 11111111 00000000 => /24 or 255.255.255.0
在本例中高 24 位被掩码,留给我们 0-255 的范围。 该范围包含三种地址类型:
-
网络地址(Network address) —— 范围中的第一个地址,用于标识网络(在本例中网络地址为 192.168.3.0)
-
广播地址(Broadcast address) —— 范围中的最后/最高地址(在本例中为 192.168.3.255)。广播地址用于把数据发送到所有可能的目的地(all-hosts broadcast),使发送方只需发送一次数据,所有接收方都会收到一份副本。在 IPv4 协议中,地址 255.255.255.255 用于本地广播。此外,还可以向网络广播地址发送定向(受限)广播。
-
单播地址(Unicast address) —— 范围中所有其他地址可用于标识网络中的特定主机(在本例中范围为 1 到 254,用于主机标识)。
与以太网协议一样,也有一个用于组播的特殊地址范围。组播地址用于关联一组感兴趣的接收方。在 IPv4 中,224.0.0.0 到 239.255.255.255 被指定为组播地址。发送方从其单播地址向组播组地址发送单个数据报,中间路由器负责复制并把它们发送给所有已加入相应组播组的接收方;
逻辑 IP 网络、单播、广播和组播的可视化:

还有一些为特殊用途保留的地址范围:
-
私有地址范围(RFC 1918),应仅在本地网络中使用,转发到互联网时通常会被丢弃:
- 10.0.0.0/8 - start: 10.0.0.0; end: 10.255.255.255
- 172.16.0.0/12 - start: 172.16.0.0; end:172.31.255.255
- 192.168.0.0/16 - start: 192.168.0.0; end: 192.168.255.255
-
198.18.0.0/15 - 基准测试
-
192.88.99.0/24 - 6to4 relay anycast 地址范围
-
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 - 文档
-
169.254.0.0/16 - 自动配置地址范围
点对点寻址
点对点寻址顾名思义,可用于设置仅由两个节点组成的三层网络。设置这种寻址有两种方式:
-
使用 /31 地址范围
-
使用 /32 地址,并把网络地址设置为远端节点的 IP 地址。 例如:
flowchart LR H1 --- H2 H1["**Host 1**____________________ **Address**: 192.168.0.1/32**Network**: 192.168.0.2"] H2["**Host 2**____________________ **Address**: 192.168.0.2/32**Network**: 192.168.0.1"] style H1 text-align:left style H2 text-align:left
地址配置
考虑一种场景:两台路由器用网线直接相连,我们不想浪费地址空间:
Router 1:
/ip address
add address=10.1.1.1/32 interface=ether1 network=172.16.1.1
Router 2:
/ip address
add address=172.16.1.1/32 interface=ether1 network=10.1.1.1
ARP 与整体串联
尽管 IP 数据包使用 IP 地址寻址,但实际从一个主机向另一个主机传输数据时必须使用硬件地址。
这就引出了地址解析协议(ARP),它用于把主机的 IPv4 地址映射到硬件地址(MAC)。ARP 协议在 RFC 826 中有定义。它属于过去的技术,在 IPv6 中被组播所取代,但只要 IPv4 仍在使用,它就会继续存在。
每个网络设备都有一张当前使用的 ARP 条目表。通常该表是动态建立的,但为了提升网络安全性,可以通过添加静态条目来部分或完全静态地建立它。
当局域网中的一台主机想向同一网络中的另一台主机发送 IP 数据包时,它必须在自己的 ARP 缓存中查找目的主机的以太网 MAC 地址。如果目的主机的 MAC 地址不在 ARP 表中,就会发送 ARP 请求来查找具有相应 IP 地址的设备。ARP 通过向局域网上的所有设备发送广播请求消息,要求具有指定 IP 地址的设备用其 MAC 地址进行回复。识别出该 IP 地址属于自己的设备会返回带有自身 MAC 地址的 ARP 响应:

我们做一个简单配置,仔细看看 Host A 尝试 ping Host C 时的过程。
首先,在 Host A 上添加 IP 地址:
/ip address add address=10.155.101.225/24 interface=ether1
Host B:
/ip address add address=10.155.101.221/24 interface=ether1
Host C:
/ip address add address=10.155.101.217/24 interface=ether1
我们运行 /tool/sniffer 把数据包转储保存到文件,并在 Host A 上运行 ping 命令:
/tool sniffer
set file-name=arp.pcap filter-interface=ether1
start
/ping 10.155.101.217 count=1
/tool sniffer stop
现在你可以从路由器下载 arp.pcap 文件,并在 Wireshark 中打开分析:

- Host A 发送 ARP 消息,询问谁拥有 "10.155.101.217"
- Host C 回复 10.155.101.217 可通过 MAC 地址 08:00:27:3C:79:3A 到达
- Host A 和 Host C 现在都更新了各自的 ARP 表,随后可以发送 ICMP(ping)数据包
如果你通过运行 /ip/arp/print 查看两台主机的 ARP 表,应该能看到相关条目:
[admin@host_a] /ip arp> print
Flags: D - DYNAMIC; C - COMPLETE
Columns: ADDRESS, MAC-ADDRESS, INTERFACE, VRF, STATUS
# ADDRESS MAC-ADDRESS INTERFACE VRF STATUS
0 DC 10.155.101.217 08:00:27:3C:79:3A ether1 main reachable
[admin@host_b] /ip arp> print
Flags: D - DYNAMIC; C - COMPLETE
Columns: ADDRESS, MAC-ADDRESS, INTERFACE, VRF, STATUS
# ADDRESS MAC-ADDRESS INTERFACE VRF STATUS
0 DC 10.155.101.225 08:00:27:85:69:B5 ether1 main reachable
某些场景下可能需要不同的行为。RouterOS 允许为支持 ARP 的接口配置不同的模式:
-
Enabled —— 自动发现 ARP 并把新的动态条目添加到 ARP 表中。这是接口的默认模式。
-
Disabled —— 如果接口上的 ARP 功能被关闭,路由器不会应答来自客户端的 ARP 请求。因此,客户端上也需要添加静态 ARP 条目。例如: Host A:
/interface/set ether1 arp=disabled /ip arp add mac-address=08:00:27:3C:79:3A address=10.155.101.217 interface=ether1Host B:
/ip arp add mac-address=08:00:27:85:69:B5 address=10.155.101.225 interface=ether1 -
Reply Only —— 如果接口上的 ARP 属性设为
reply-only,路由器只回复 ARP 请求。邻居 MAC 地址通过/ip/arp静态解析,但与 ARP 被禁用的情况不同,无需把路由器的 MAC 地址添加到其他主机的 ARP 表中。 -
Proxy ARP —— 正确配置了 proxy ARP 功能的路由器会在直接相连的网络之间充当透明代理。这种行为的用处之一是,你可以把拨入(PPP、PPPoE、PPTP)客户端分配为与所连接 LAN 使用相同地址空间的 IP 地址。
-
Local Proxy ARP —— 如果接口上的 arp 属性设为
local-proxy-arp,则路由器仅对该接口进行进出的 proxy ARP,即针对从同一接口进入并离开的流量。在普通 LAN 中,默认行为是两台网络主机直接相互通信,无需路由器参与。 路由器会用自己接口的 MAC 地址而不是另一台主机的 MAC 地址回复所有客户端主机。例如,如果 Host A (192.168.88.2/24) 查询 Host B (192.168.88.3/24) 的 MAC 地址,路由器会用它自己的 MAC 地址回复。换句话说,如果启用了 local-proxy-arp,路由器将承担在 Host A 192.168.88.2 和 Host B 192.168.88.3 之间转发流量的责任。Host A 和 Host B 上的所有 ARP 缓存条目都指向路由器的 MAC 地址。在这种情况下,路由器为整个子网 192.168.88.0/24 执行 local-proxy-arp。
RouterOS local-proxy-arp 的一个例子是带 DHCP 服务器和隔离 bridge 端口的 bridge 配置,其中同一子网的主机只能通过 bridge IP 在三层互相访问。
/interface bridge add arp=local-proxy-arp name=bridge1 /interface bridge port add bridge=bridge1 horizon=1 interface=ether2 add bridge=bridge1 horizon=1 interface=ether3 add bridge=bridge1 horizon=1 interface=ether4该技术有不同名称:
- 在 RFC 3069 中称为 VLAN Aggregation;
- Cisco 和 Allied Telesis 称之为 Private VLAN;
- Hewlett-Packard 称之为 Source-Port filtering 或 port-isolation;
- Ericsson 称之为 MAC-Forced Forwarding(RFC Draft)。
Proxy ARP 示例
我们来看示例图。

子网 A 上的 Host A(172.16.1.2)想向子网 B 上的 Host D(172.16.2.3)发送数据包。Host A 的子网掩码是 /16,这意味着它认为自己与整个 172.16.0.0/16 网络(同一个 LAN)直接相连。它在子网 A 上广播,以查询 Host D 的 MAC 地址。
来自数据包分析软件的信息:
No. Time Source Destination Protocol Info
12 5.133205 00:1b:38:24:fc:13 ff:ff:ff:ff:ff:ff ARP Who has 173.16.2.3? Tell 173.16.1.2
Packet details:
Ethernet II, Src: (00:1b:38:24:fc:13), Dst: (ff:ff:ff:ff:ff:ff)
Destination: Broadcast (ff:ff:ff:ff:ff:ff)
Source: (00:1b:38:24:fc:13)
Type: ARP (0x0806)
Address Resolution Protocol (request)
Hardware type: Ethernet (0x0001)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (0x0001)
[Is gratuitous: False]
Sender MAC address: 00:1b:38:24:fc:13
Sender IP address: 173.16.1.2
Target MAC address: 00:00:00:00:00:00
Target IP address: 173.16.2.3
通过这个 ARP 请求,Host A(172.16.1.2)在要求 Host D(172.16.2.3)发送其 MAC 地址。二层广播意味着该帧被发送到同一二层广播域中的所有主机,其中包括路由器的 ether0 接口,但不会到达 Host D,因为路由器默认不转发二层广播。
要解决这个问题,我们需要在 ether0 上启用 proxy-arp:
/interface/ethernet set ether0 arp=proxy-arp
现在,路由器知道目标地址(172.16.2.3)在另一个子网上且可达,于是用它自己的 MAC 地址向 Host A 发送单播回复。基本上它是在说 "把这些数据包发给我,我会把它们送到该去的地方"。
No. Time Source Destination Protocol Info
13 5.133378 00:0c:42:52:2e:cf 00:1b:38:24:fc:13 ARP 172.16.2.3 is at 00:0c:42:52:2e:cf
Packet details:
Ethernet II, Src: 00:0c:42:52:2e:cf, Dst: 00:1b:38:24:fc:13
Destination: 00:1b:38:24:fc:13
Source: 00:0c:42:52:2e:cf
Type: ARP (0x0806)
Address Resolution Protocol (reply)
Hardware type: Ethernet (0x0001)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: reply (0x0002)
[Is gratuitous: False]
Sender MAC address: 00:0c:42:52:2e:cf
Sender IP address: 172.16.1.254
Target MAC address: 00:1b:38:24:fc:13
Target IP address: 172.16.1.2
当 Host A 收到 ARP 响应后,它会更新自己的 ARP 表,如下所示:
C:\Users\And>arp -a
Interface: 173.16.2.1 --- 0x8
Internet Address Physical Address Type
173.16.1.254 00-0c-42-52-2e-cf dynamic
173.16.2.3 00-0c-42-52-2e-cf dynamic
173.16.2.2 00-0c-42-52-2e-cf dynamic
MAC 表更新后,Host A 把发往 Host D(172.16.2.3)的所有数据包直接转发到路由器接口 ether0(00:0c:42:52:2e:cf),路由器再把数据包转发给 Host D。子网 A 中主机的 ARP 缓存中,子网 B 上所有主机对应的条目都填入了路由器的 MAC 地址。因此,发往子网 B 的所有数据包都被发送到路由器,路由器再把这些数据包转发给子网 B 中的主机。
使用 proxy ARP 时,主机的多个 IP 地址被映射到单个 MAC 地址。
免费 ARP(Gratuitous ARP)
可以在 RouterOS 中创建 Gratuitous ARP 请求。要做到这一点,你必须使用 /tool/traffic-generator/inject 工具。下面是一个生成 Gratuitous ARP 请求以更新远端设备 ARP 表的示例:
/tool/traffic-generator/inject interface=ether2 \
data="ffffffffffff4c5e0c14ef78080600010800060400014c5e0c14ef780a057a01ffffffffffff0a057a01000000000000000000000000000000000000"
你必须把 MAC 地址(4c5e0c14ef78)和 IP 地址(0a057a01)改为你路由器的地址。IP 地址和 MAC 地址必须来自请求更新 ARP 表的设备。你还需要指定通过哪个接口(ether2)发送 Gratuitous ARP 请求。请确认接收设备支持 Gratuitous ARP 请求。
传输层
该层的协议为应用提供端到端通信服务。这些协议应通过交换数据接收确认和重传丢失的数据包,确保数据包按序、无差错地到达。
最著名且使用最广的是传输控制协议(TCP),用于面向连接的传输,内置可靠的传输机制。
无连接的**用户数据报协议(UDP)**是另一种用于简单数据传输的常用协议。
TCP 协议工作机制
面向连接的协议在建立正确连接之前不发送任何数据。每当发送设备尝试与远端节点建立连接时,TCP 都使用多步握手过程。其结果是创建了一条端到端虚拟(逻辑)电路,其中使用流控和确认来实现可靠传输。TCP 在连接建立和终止过程中有几种消息类型。
三次握手过程:
- 需要初始化连接的 HostA 向目的地 HostB 发送一个带有提议初始序号的 SYN(Synchronize)包。
- 当 HostB 收到 SYN 消息后,回复一个在 TCP 头中同时设置了 SYN 和 ACK 标志的包(SYN-ACK)。
- 当 HostA 收到 SYN-ACK 后,回复 ACK(Acknowledgment)包。HostB 收到 ACK,此时连接处于 ESTABLISHED 状态;
sequenceDiagram
HostA->>HostB: Syn sent
HostB->>HostA: Syn-Ack sent
HostA->>HostB: Ack sent
Note right of HostB: Established
既然我们知道了 TCP 连接如何建立,就需要理解数据传输是如何管理和维持的。
面向连接的协议服务通常在成功交付后发送确认(ACK)。数据传输包发送后,发送方等待接收方的确认。如果超时且发送方未收到 ACK,则会重传该数据包。
我们来想想如果数据报发送速度超过接收设备处理速度会发生什么。接收方把它们存储在称为缓冲区的内存中。但由于缓冲区空间并非无限,当其容量被超出时,接收方开始丢弃帧。所有被丢弃的帧都必须重新传输,这就是传输性能低下的原因。
为解决这个问题,TCP 使用流控协议。窗口机制用于控制数据流。连接建立后,接收方在每个 TCP 帧中指定 window 字段。窗口大小代表接收方愿意在缓冲区中存储的已接收数据量。窗口大小(字节)与确认一起发送给发送方。因此窗口大小控制着在未收到确认的情况下可以从一台主机向另一台主机传输多少信息。发送方只发送窗口大小指定的字节数,然后等待带有更新窗口大小的确认。
如果接收应用处理数据的速度能跟上数据到达的速度,接收方会在每次确认时发送正的窗口通告(增大窗口大小)。这一直有效,直到发送方变得比接收方快,传入的数据最终填满接收方的缓冲区,使接收方通告窗口为零的确认。收到零窗口通告的发送方必须停止发送,直到收到正的窗口。我们来看看图示的窗口过程:
- HostA 以窗口大小 1000 开始传输,发送一个 1000 字节的帧。
- 接收方 HostB 返回窗口大小增大到 2000 的 ACK。
- HostA 收到 ACK 后发送两个帧(各 1000 字节)。
- 之后接收方通告初始窗口大小增大到 3000。现在发送方发送三个帧并等待确认。
- 前三个段填满接收方缓冲区的速度超过了接收应用处理数据的速度,因此通告的窗口大小变为零,表明在进一步传输之前必须等待。
- 窗口大小以及增大或减小窗口大小的速度,可在 Reno、Vegas、Tahoe 等各种 TCP 拥塞避免算法中实现。
sequenceDiagram
HostA->>HostB: Window size of 1000
HostB->>HostA: Ack1 window size=2
HostA->>HostB: Window size of 2000
HostA->>HostB:
HostB->>HostA: Ack2 window size=3
rect rgb(185, 50, 50)
HostA->>HostB: Window size of 3000
HostA->>HostB:
HostA->>HostB:
Note left of HostB: Buffer is full, stop sending...
HostB->>HostA: Ack3 window size=0
end
Note left of HostB: Buffer have been freed, continue...
HostB->>HostA: Ack window size=1
当数据传输完成、主机想终止连接时,终止过程被启动。与使用三次握手的 TCP 连接建立不同,连接终止使用四次握手。当双方都通过发送 FIN(finish)并接收 ACK(Acknowledgment)完成关闭过程后,连接即被终止。
四次终止过程:
- 需要终止连接的 HostA 发送一个带 FIN 标志的特殊消息,表示它已发送完数据。
- 收到 FIN 段的 HostB 不会终止连接,而是进入 "被动关闭"(CLOSE_WAIT)状态,并向 HostA 发回该 FIN 的 ACK。如果 HostB 没有数据要发送给 HostA,它也会发送 FIN 消息。此时 HostB 进入 LAST_ACK 状态。此时它不再接受来自 HostA 的数据,但可以继续发送数据。
- 当 HostA 收到来自 HostB 的最后一个 FIN 后,进入(TIME_WAIT)状态,并向 HostB 发回 ACK。
- HostB 收到来自 HostA 的 ACK,连接被终止。
sequenceDiagram
HostA->>HostB: Fin sent
Note right of HostB: CLOSE_WAIT
HostB->>HostA: Ack sent
HostB->>HostA: Fin sent
Note right of HostB: LAST_ACK
HostA->>HostB: Ack sent
Note right of HostB: Terminated