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 头中,此时称为“数据包”;
  • 第 2 层(数据链路层) - 数据被封装在自定义头中,采用 802.3(以太网)或 802.11(无线)格式,此时称为“帧”,并负责流量控制;
  • 第 1 层(物理层) - 发送和接收比特的通信介质、电信号以及硬件接口;

TCP/IP 模型

该模型与 OSI 模型目的相同,但更适合现代网络故障排查。与 OSI 模型相比,TCP/IP 是一个 4 层模型:

  • 应用层(4) - 包含 OSI 模型的应用层、表示层和会话层,显著简化了网络故障排查;
  • 传输层(3) - 与 OSI 模型中的传输层相同(TCP、UDP 协议);
  • 互联网层(2) - 承担 OSI 模型中网络层的职责(包括 ARP、IP 协议);
  • 链路层(1) - 也称为网络接入层。包含 OSI 模型的第 1 层和第 2 层,因此主要关注网络节点之间的物理数据交换;
TCP/IPOSI 模型协议
应用层应用层例如 DNS、DHCP、HTTP、SSH。
表示层例如 JPEG、MPEG、PICT。
会话层例如 PAP、SCP、ZIP。
传输层传输层TCP、UDP
互联网层网络层ICMP、IGMP、IPv4、IPv6、IPSec
链路层数据链路层例如 ARP、CDP、MPLS、PPP。
物理层例如 Bluetooth、Ethernet、Wi-Fi。

以太网

计算机网络中最常用的链路层协议(OSI 第 2 层)是以太网协议。为了通信,每个节点都有一个唯一分配的地址,称为 MAC(媒体访问控制地址),有时也称为以太网地址。

该地址长 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 

通过以太网网络转发帧有三种类型:

  • 单播 - 带有单播地址的帧会发送到冲突域内的所有节点,冲突域通常指两个节点之间的以太网电缆,或在无线情况下指所有能检测到无线信号的接收方。只有 MAC 地址匹配的远程节点会接受该帧(除非启用了混杂模式)
  • 广播 - 特殊地址之一(FF:FF:FF:FF:FF:FF),广播帧会被所有节点接受并在第 2 层网络中转发。
  • 组播 - 带有组播地址的帧会被所有配置为监听该地址的节点接收。

IP 网络

以太网协议足以在以太网上的两个节点之间传输数据,但不足以在跨多个以太网段、相隔多跳的节点之间传输数据。对于互联网/网络层(OSI 第 3 层),使用 IP(互联网协议)通过唯一的逻辑地址来标识主机。

当前大多数网络使用 IPv4,它是 32 位地址,采用点分十进制表示法(192.168.88.1),但 IPv6(128 位地址)的使用正在扩大。

可以为接口添加多个 IP 地址,也可以让接口不分配任何地址。在桥接或 PPPoE 连接的情况下,物理接口可能没有分配任何地址,但仍然完全可用。为桥接中包含的物理接口配置 IP 地址,实际上意味着在桥接接口本身上设置该地址。

网络掩码

可能存在多个逻辑网络,为了识别某个 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 的范围。
该范围包含三种地址类型:

  • 网络地址 - 范围中的第一个地址,用于标识网络(在我们的示例中网络地址为 192.168.3.0)

  • 广播地址 - 范围中的最后一个/最高地址(在我们的示例中为 192.168.3.255)。广播地址用于将数据发送到所有可能的目的地(全主机广播),这允许发送方只发送一次数据,所有接收方都会收到一份副本。在 IPv4 协议中,地址 255.255.255.255 用于本地广播。此外,还可以向网络广播地址发送定向(受限)广播。

  • 单播地址 - 范围中的所有其他地址可用于标识网络中的特定主机(在我们的示例中,用于主机标识的范围是 1 到 254)。

与以太网协议一样,组播也有特殊的地址范围。组播地址用于关联一组感兴趣的接收方。在 IPv4 中,地址 224.0.0.0 到 239.255.255.255 被指定为组播地址。发送方从其单播地址向组播组地址发送单个数据报,中间路由器负责复制并发送给所有已加入相应组播组的接收方;

逻辑 IP 网络、单播、广播和组播的可视化:

还有一些为特殊用途保留的地址范围:

  • 私有地址范围(RFC 1918),应仅在本地网络中使用,转发到互联网时通常会被丢弃:

    • 10.0.0.0/8 - 起始:10.0.0.0;结束:10.255.255.255
    • 172.16.0.0/12 - 起始:172.16.0.0;结束:172.31.255.255
    • 192.168.0.0/16 - 起始:192.168.0.0;结束:192.168.255.255
  • 198.18.0.0/15 - 基准测试

  • 192.88.99.0/24 - 6to4 中继任播地址范围

  • 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24 - 文档

  • 169.254.0.0/16 - 自动配置地址范围

点对点寻址

顾名思义,点对点寻址可用于设置仅由两个节点组成的第 3 层网络。有两种方式设置此类寻址:

  • 使用 /31 地址范围

  • 使用 /32 地址,并将网络地址设置为远程节点的 IP 地址。
    例如:

    flowchart LR
      H1 --- H2
    
      H1["**主机 1**____________________ **地址**:192.168.0.1/32**网络**:192.168.0.2"]
      H2["**主机 2**____________________ **地址**:192.168.0.2/32**网络**:192.168.0.1"]
    
      style H1 text-align:left
      style H2 text-align:left
    

地址配置

考虑这样一种设置:两台路由器通过电缆直接相连,并且我们不想浪费地址空间:

路由器 1:

/ip address
add address=10.1.1.1/32 interface=ether1 network=172.16.1.1

路由器 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 回复称可以通过 MAC 地址 08:00:27:3C:79:3A 访问 10.155.101.217
  • 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=ether1
    

    Host 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 - 配置了正确代理 ARP 功能的路由器会在直连网络之间充当透明代理。例如,当你希望为拨入(PPP、PPPoE、PPTP)客户端分配与所连接局域网相同地址空间的 IP 地址时,这种行为会很有用。

  • Local Proxy ARP - 如果接口上的 arp 属性设置为 local-proxy-arp,则路由器仅在此接口上执行代理 ARP。也就是说,仅针对进入和离开同一接口的流量。在普通局域网中,默认行为是两台网络主机直接相互通信,不涉及路由器。 路由器会以路由器自身接口的 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 服务器和隔离桥接端口的桥接设置,其中同一子网中的主机只能通过桥接 IP 在第 3 层相互访问。

    /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 网络(同一个局域网)。它在子网 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 地址。第 2 层广播意味着该帧会发送到同一第 2 层广播域中的所有主机,其中包括路由器的 ether0 接口,但不会到达 Host D,因为路由器默认不转发第 2 层广播。

要解决此问题,我们需要在 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 中的主机。

使用代理 ARP 时,主机的多个 IP 地址会映射到单个 MAC 地址。

免费 ARP

在 RouterOS 中可以创建免费 ARP 请求。为此必须使用 /tool/traffic-generator/inject 工具。下面是一个生成免费 ARP 请求以更新远程设备 ARP 表的示例:

/tool/traffic-generator/inject interface=ether2 \
data="ffffffffffff4c5e0c14ef78080600010800060400014c5e0c14ef780a057a01ffffffffffff0a057a01000000000000000000000000000000000000"

你必须将 MAC 地址(4c5e0c14ef78)和 IP 地址(0a057a01)改为你路由器的地址。IP 地址和 MAC 地址必须来自请求更新 ARP 表的设备。你还需要指定通过哪个接口(ether2)发送免费 ARP 请求。请确保接收设备支持免费 ARP 请求。

传输层

此层的协议为应用程序提供端到端通信服务。这些协议通过交换数据接收确认和重传丢失的数据包,确保数据包按序且无差错地到达。

最著名且广泛使用的是传输控制协议(TCP),它用于面向连接的传输,并包含可靠数据传输机制。

无连接的**用户数据报协议(UDP)**是另一种用于简单数据传输的常见协议。

TCP 协议操作

面向连接的协议在建立正确连接之前不会发送任何数据。每当发送设备尝试与远程节点建立连接时,TCP 都会使用多步握手过程。结果会创建端到端虚拟(逻辑)电路,在其中使用流量控制和确认来实现可靠交付。TCP 在连接建立和终止过程中使用多种消息类型。

三次握手过程:

  1. 需要初始化连接的 HostA 向目的 HostB 发送一个 SYN(同步)数据包,其中包含建议的初始序列号。
  2. 当 HostB 收到 SYN 消息时,会回复一个在 TCP 头中同时设置了 SYN 和 ACK 标志的数据包(SYN-ACK)。
  3. 当 HostA 收到 SYN-ACK 时,会回复 ACK(确认)数据包。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 帧中指定窗口字段。窗口大小表示接收方愿意在缓冲区中存储的已接收数据量。窗口大小(以字节为单位)随确认一起发送给发送方。因此,窗口大小控制着在未收到确认的情况下可以从一台主机传输多少信息到另一台主机。发送方只发送窗口大小指定的字节数,然后等待带有更新窗口大小的确认。

如果接收应用程序处理数据的速度能跟上数据从发送方到达的速度,那么接收方会在每个确认中发送正的窗口通告(增大窗口大小)。这一过程会持续到发送方变得比接收方更快,传入数据最终填满接收方的缓冲区,导致接收方通告零窗口确认。收到零窗口通告的发送方必须停止传输,直到收到正窗口。让我们看一下图示的窗口过程:

  1. HostA 以 1000 的窗口大小开始传输,发送一个 1000 字节的帧。
  2. 接收方 HostB 返回 ACK,窗口大小增加到 2000。
  3. HostA 收到 ACK 后发送两个帧(每个 1000 字节)。
  4. 之后,接收方通告初始窗口大小为 3000。现在发送方发送三个帧并等待确认。
  5. 前三个段填满接收方缓冲区的速度快于接收应用程序处理数据的速度,因此通告的窗口大小达到零,表明在能够继续传输之前必须等待。
  6. 窗口的大小以及增大或减小窗口大小的速度,可在 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(结束)并收到 ACK(确认)后,连接终止。

四次终止过程:

  1. 需要终止连接的 HostA 发送一条带有 FIN 标志的特殊消息,表示它已完成数据发送。
  2. 收到 FIN 段的 HostB 不会终止连接,而是进入“被动关闭”(CLOSE_WAIT)状态,并向 HostA 发送针对该 FIN 的 ACK。如果 HostB 没有要向 HostA 传输的数据,它也会发送 FIN 消息。现在 HostB 进入 LAST_ACK 状态。此时它不再接受来自 HostA 的数据,但可以继续传输数据。
  3. 当 HostA 收到来自 HostB 的最后一个 FIN 时,进入(TIME_WAIT)状态,并向 HostB 发送 ACK。
  4. 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

另请参阅