【问题标题】:How to implement an ethernet modem如何实现以太网调制解调器
【发布时间】:2015-05-29 20:02:19
【问题描述】:

好的,我想做的,作为一个训练练习,就是实现这样的东西

client --ethernet--> Modem1 --GPIO--> Modem2 --ethernet--> 我的家路由器

客户端使用以太网电缆连接到调制解调器 1。
Modem1 是 Raberry PI,转换信号并通过 GPIO 中继它
Modem2 是 Raberry PI,从 GPIO 接收数据,并通过以太网线发送到我家的路由器

我想实现调制解调器,但不知道从哪里开始。

我已经阅读了一些关于以太网编程的内容,但仍然找不到“简单的东西”之类的答案。

  1. 如何实现 Modem1,以便当它连接到客户端时,客户端会发现它是 Internet 连接。

  2. 在 Modem2 端,如何让“我的家庭路由器”将用于“客户端”的数据包发送到 Modem2,以便 Modem2 转发它们。

可能还有一些我从未想过的事情......

那么,具体来说,我该如何实现呢?最好是c。

【问题讨论】:

  • 这个问题离题了。尝试超级用户或服务器故障。
  • 我不同意。我可能措辞不好,我相信这确实是一个编程问题。您介意详细说明为什么这个问题可能离题吗?
  • 题外话:求教程。

标签: c network-programming ethernet raw-ethernet


【解决方案1】:

我敢说你也许可以编写某种自定义的 GPIO 中间层。

Read Ethernet->Encapsulate->Write GPIO->|->Read GPIO->Decapsulate->Write Ethernet

(反之亦然)

那么问题就变成了:两个调制解调器如何充当“以太网代理”?

Modem1 充当路由器的代理。 Modem2 充当客户端的代理。如果您的 Raspberry Pi 可以欺骗 MAC 地址,您可能能够欺骗以太网对等方与您的调制解调器的以太网端口进行通信。您需要欺骗 MAC 地址的原因是,在 TCP/IP 网络中,有一个 ARP 表,它将远程 IP 地址映射到可以将 IP 数据包路由到/来自它们的 MAC 地址。这就是允许您的客户端通过 TCP/IP 与您的路由器通信的原因。

另一个潜在的缺陷是您的调制解调器通信会引入延迟,从而干扰以太网层对协议的处理。例如,以太网协议可能具有实时限制,如果您引入延迟,可能会破坏这些限制...

但是让我们假设在一个完美的世界里一切皆有可能......

您需要编写用于读取/写入以太网消息的代码(我已经看到在 Linux 中通过原始套接字读取/写入以太网数据包的开源代码)

您需要为 GPIO 通信编写自定义驱动程序。 这意味着实施一个经过深思熟虑的协议来管理引脚状态、消息开始、消息结束、数据有效负载、校验和等等......

最后,您需要编写一个顶层通信层来实现:

以太网到 GPIO 过程

a) 从以太网端口读取,将以太网数据包封装成自定义消息(或消息片段)

b) 使用您的自定义 GPIO 协议驱动程序将此自定义消息传递给外部 GPIO 对等体

GPIO 到以太网的过程

a) 使用您的自定义驱动程序代码从 GPIO 读取 b) 解封装以太网数据包 c) 将以太网数据包写入以太网端口。

这两个进程永远运行...

同样,这一切都取决于您的调制解调器是否可以在不干扰以太网协议的自然流动的情况下将自己插入对等连接中......

至于“C”部分……

如果您使用开源库(或代码 sn-ps)通过原始套接字读取/写入原始以太网,那很可能是用 C 编写的。

您的 GPIO 代码将通过以下两种方式之一从 GPIO 引脚读取写入:从内存映射的硬件地址,或在该硬件地址上使用 ioport 调用。

Receive raw Ethernet frames in Linux

Send a raw Ethernet frame in Linux

祝你好运

【讨论】:

  • 我还是很模糊,路由器是如何建立 ARP 表的。我假设客户端需要发送一些消息来向路由器宣布它的存在,以便路由器可以为其分配一个 IP。那个“握手”是什么样子的?有没有为此实现的通用协议?如果有,说协议的名称是什么,所以我可以阅读它。
  • ARP 是地址解析协议的缩写。试图发送帧的节点会发出一个请求第 2 层地址的广播。
  • 握手在 ARP RFC826 中解释:link。简而言之,节点向对等方发出 ARP 请求。如果对等点知道哪个 MAC 地址具有给定 IP,它会返回一个 ARP 回复,这会导致 ARP 表的更新。
  • 另外,ARP 协议是一个分布式协议,这意味着如果一个节点收到一个 ARP 请求并且它没有答案,那么它会将请求转发给网络中的其他对等点,以此类推在。最终,每个收到 ARP 回复的节点都会更新自己的 ARP 表,并将回复转发回原来的节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多