MCU中网络接口的角色边界是什么?

What is the border of roles of network interfaces in MCUs?

我是一名嵌入式软件开发人员,对连接设备上的 TCPIP 有任何经验。另外,我不是软件协议专家,所以我对 TCPIP 协议栈+它的各个物理层的职责有点困惑。

首先,我对 UART、SPI、CAN、USB 等协议有经验。如您所知,在软件级别选择您使用的协议时,phy 层直接影响您。例如,如果你使用 usb 并在其上构建一个软件协议,你不会偶尔处理一些细节,比如检查软件协议中损坏的帧,因为它的物理层 gua运行tees 这个操作。 CAN 还具有一些 CAN 控制器功能,例如 crc 和位填充,因此非常可靠。但是对于像UART/USART这样简单的外围设备,情况就不一样了。假设您正在使用蓝牙模块升级固件,您需要了解通信时可能发生的几乎所有事情,例如延迟、损坏的帧、有效负载验证等。

简而言之,我试图了解 MCU 中包含的 newtork 接口的确切作用,它们直接与 RJ45 phy 插座连接。换句话说,假设我在我的电脑上写了一个服务器应用程序。我还在我的开发板上配置并 运行 一个应用程序,它有一个 RJ45 插座,它作为客户端运行。还假设他们通过 TCP 建立了连接。那么,当我从服务器端向套接字发送 32 字节的数据时,客户端会发生什么情况?在 RxCompleteInterrupt() 最低级别的 MCU 中我会看到什么?我发送的数据和附加到 TCP 数据包的其他一些东西是否保证由 MCU 中的 eth 控制器和我的 PC 的以太网控制器传送?或者我负责(或我使用的堆栈)检查所有必要的东西来验证框架是否有效?

我尽量做到尽可能清楚。请如果您有经验,请尝试写干净的评论。本人不是TCPIP专家,可能用词不当,请重点关注问题的主要概念。

谢谢大家。

如果您之前没有任何使用 TCP/IP 协议套件的经验,我强烈建议您看看这个 IBM Redbook,更具体地说是第 2、3 和 4 章.

这就是说:

  1. 那么,当我发送 32 时,客户端会发生什么情况? 从服务器端到套接字的数据字节?我会在什么时候看到 MCU 的最低级别是 RxCompleteInterrupt()?

    您应该已经在缓冲区中收到一个以太网帧。此以太网帧应包含一个 IP 数据包。此 IP 数据包应包含一个 TCP 数据包,其有效负载应包含在您的 32 字节数据中。但是在接收数据之前客户端和服务器之间会有几次交换,因为 TCP 是面向连接的协议,即几个以太网帧将是 sent/received.
  2. 我发送的数据和其他一些附加到TCP数据包中的东西吗 保证由 MCU 中的 eth 控制器传送,并且 我电脑的以太网控制器?或者我负责(或堆栈我 使用)检查所有必要的东西来验证框架是否 是否有效?

    TCP 数据包最终会被传送,但不保证您的以太网帧和 IP 数据包会被传送,并且会以正确的顺序到达。作为面向连接的协议,这正是 TCP 的工作,而不是执行所需的操作,以便最终交付作为 TCP 有效负载发送的数据。您的 MCU 硬件应该负责验证以太网帧,但是 MCU 上的 TCP/IP 堆栈 运行 负责验证 IP 和 TCP 数据包以及数据的正确传递 sent/received 通过 TCP。

您可以使用 netcat 在 Linux PC 上试验 TCP,并使用 Wiresharktcpdump.

捕获交换

创建一个包含 32 个字节的 'response' 文件:

echo 0123456789ABCDEFGHIJKL > response.txt

启动 Wireshark,并使用过滤器 tcp port 1234
lo 接口上进行过滤 启动 TCP 服务器监听 TCP 端口 1234,它将在收到来自客户端的连接时发送 response.txt 的内容:

netcat -l 1234 < response.txt

在另一个 console/shell 中,连接到侦听 tcp/1234 的服务器并显示收到的内容:

netcat localhost 1234
0123456789ABCDEFGHIJKL

在 Wireshark 上,您应该看到以下内容 Wireshark Network Capture,并且能够使用 IBM 红皮书作为参考来扩展所有 frames/packets 的完整交换。
您的 32 字节数据将位于服务器发送的 TCP 数据包的有效负载部分。