假设我们有一个 LAN - 5 个主机连接到交换机。我尚未为任何主机配置任何 IP 地址。我可以通过发送 L2 流量(L2 报头和其上方的数据)与另一台主机通信吗?
如果是,那么任何主机如何知道目标主机的 MAC 地址,无论如何对于 ARP 我们都需要 IP 地址。
答案1
假设我们有一个 LAN - 5 个主机连接到交换机。我尚未为任何主机配置任何 IP 地址。我可以通过发送 L2 流量(L2 报头和其上方的数据)与另一台主机通信吗?
是的。大多数操作系统都会提供 API(尽管通常是特权 API),并且存在各种程序直接在以太网上实现协议。(当然,这也是操作系统实现 IP 本身的方式。)
如果您正在寻找示例,“etherwake”和“open-plc-utils”是两个浮现在您想到的项目。
如果是,那么任何主机如何知道目标主机的 MAC 地址,无论如何对于 ARP 我们都需要 IP 地址。
它惯于神奇地知道目的地。这是你的程序/协议需要自己处理的事情。例如,你可以简单地询问用户手动指定正确的目标 MAC 地址。
你也可以实现某种发现协议使用 L2 广播(即为您自己的协议创建 ARP 等效协议)。例如,在 Mikrotik RouterOS 中,“RoMON”基于 L2 的管理协议将广播发现数据包并收集来自附近节点的响应。
(同时,“MAC-Telnet”协议只是广播所有数据并且根本不关心下一跳 MAC 地址。这当然是一个安全问题,并且只能接受,因为 MAC-Telnet 是最后的恢复工具。)
或者,您可以使用多播,让所有节点监听固定地址上的数据包。例如,Homeplug 管理协议 (open-plc-utils) 默认将所有帧发送到 00:b0:52:00:00:01,并将收到来自任何Homeplug 设备。
答案2
如果您只有 L2 连接(即您的情况中的以太网),则除了计算机了解其自己的主机名和 mac 地址之外,没有主机<->mac 地址映射的概念。
显然,通过监控收到的数据包上的“源”mac 地址(无论是发送到其自己的 mac 地址还是广播给所有人),它可以了解 LAN 上存在的其他 mac 地址(类似于交换机了解哪个 mac 地址位于交换机上的哪个端口后面)。
但为了知道计算机 XYZ 的 mac 地址为 00112233445566,某人(用户)需要在某处指定它。
要在 LAN 上动态查询哪个 mac 地址与给定的主机名相匹配,还需要做更多工作:您可以编写一些软件,将广播 L2 数据包发送到整个 LAN,并将主机名作为有效负载发送。您还可以在所有计算机上放置一个软件,监听此类数据包,并在收到包含其自身主机名的广播数据包时发送响应。
这或多或少会取代 IP 世界中 ARP 的功能。
恭喜您:您刚刚在 L2 网络上创建了一个基本功能,这是实现完整 L2-L3 网络堆栈的第一步。
答案3
在数据链路层(本例中为以太网),没有“IP 地址”的概念,唯一存在的地址是 MAC 地址。发送的帧可以标记为 包含IP 数据包(以太网类型 0x0800/0x86DD),但如何处理数据则由更高层来决定。
仅从以太网接口的角度来看,这是可能的。但是,从大多数使用该接口的设备的角度来看,它们更愿意从 TCP/IP 或 UDP/IP 层查看网络,而不愿意看到该层之下的内容。需要专门的网络软件才能利用这些数据包进行通信。
Juniper 技术库文章 第 2 层网络:以太网帧的优势 关于这个话题,我是这样说的:
- 大多数信息都始于以太网帧内,也终于以太网帧内。如今,这适用于数据、语音(例如 VoIP)和视频(例如网络摄像头)。
- 以太网帧具有网络所需的所有基本要素,例如全局唯一的源地址和目标地址、错误控制等等。
- 以太网帧可以承载任何类型的数据包。第 2 层网络与协议无关(与第 3 层协议无关)。第 2 层网络适用于 IP 数据包和所有其他第 3 层协议。
管理纯 L2 网络中的 MAC 地址由处理数据包的软件负责。地址需要广播才能在网络上被知道。 地址解析协议 (ARP) 是用于发现链路层地址的一种通信协议。