MCU中网络接口的作用边界是什么?

时间:2019-04-21 23:20:06

标签: networking tcp embedded ethernet

我是一位嵌入式软件开发人员,具有在连接的设备上使用TCPIP的经验。另外,我不是软件协议专家,所以我对TCPIP协议堆栈及其各个phy层的职责感到困惑。

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

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

我试图尽可能清楚。请如果您有经验,请尝试撰写简洁的评论。我不是TCPIP专家,也许我使用了一些错误的术语,请重点关注问题的主要概念。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

如果您以前没有使用TCP / IP协议套件的经验,强烈建议您看一下IBM Redbook,尤其是第2、3和4章。

这么说:

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

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

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

您可以使用netcat在Linux PC上试验TCP,并使用Wiresharktcpdump捕获交换。

创建一个包含32个字节的“响应”文件:

echo 0123456789ABCDEFGHIJKL > response.txt

启动Wireshark,并使用过滤器lotcp port 1234界面上进行过滤
 启动一个侦听TCP端口1234的TCP服务器,该服务器将在接收到来自客户端的连接后发送response.txt的内容:

netcat -l 1234 < response.txt

在另一个控制台/外壳中,连接到侦听tcp / 1234的服务器,并显示接收到的内容:

netcat localhost 1234
0123456789ABCDEFGHIJKL

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