MicroTCP是我开始在学习练习时开始构建的TCP/IP网络堆栈,同时参加了在UniversitàDegliStudi Di Napoli Federico II的计算机网络课程。这只是一个爱好项目,旨在仅仅是一个最小而完整的实施。
目前,MicroTCP实现ARP(RFC 826,完整),IPv4(无片段化),ICMP(回复PINGS所需的最低限度)和TCP(完整但不进行应力测试)。请注意,“完整”不应作为“完全合规”,而应作为对所有主要功能的进度的衡量标准。例如,它已经足够完整,可以在本地网络上处理HTTP流量(查看示例/MicroHTTP以了解更多信息)。
MicroTCP可以与OS的网络堆栈一起在Windows和Linux上运行。为了将网络流量路由到MicrotCP,运行IT的过程作为具有自己的IP地址的虚拟主机。这是使用Tap设备在Linux上内置的,需要安装在Windows上。调整MicroTCP可以在微控制器上运行,但还没有尝试过。梦想是从STM32板上提供我的博客!
如果您在Windows上,则需要安装OpenVPN提供的Tap驱动程序并实施虚拟NIC,以便MicroTCP在启动时可以连接到它。要从源构建项目,请确保您用子模型克隆了存储库
git clone https://github.com/cozis/microtcp.git --recursive然后运行
make您将需要make和cmake才能工作。如果一切顺利,您会发现库文件libtuntap.a , libmicrotcp.a和header文件tuntap.h , tuntap-export.h , microtcp.h in out/ 。
MicroTCP的使用任何网络程序员熟悉的常用套接字接口,主要区别是您需要明确实施网络堆栈并将其传递句柄传递。
这是一个简单的回声服务器,显示了基本用法:
#include <microtcp.h>
int main ( void )
{
microtcp_t * mtcp = microtcp_create ( "10.0.0.5" , "10.0.0.4" , NULL , NULL );
if ( mtcp == NULL )
return -1 ; // Couldn't create MicroTCP instance
uint16_t port = 8081 ;
microtcp_socket_t * server = microtcp_open ( mtcp , port );
if ( server == NULL ) {
microtcp_destroy ( mtcp );
return -1 ;
}
while ( 1 ) {
microtcp_socket_t * client = microtcp_accept ( server );
if ( client == NULL )
break ;
char buffer [ 1024 ];
int num = microtcp_recv ( client , buffer , sizeof ( buffer ));
if ( num > 0 ) {
microtcp_send ( client , "echo: " , 6 );
microtcp_send ( client , buffer , num );
}
microtcp_close ( client );
}
microtcp_close ( server );
microtcp_destroy ( mtcp );
return 0 ;
}这应该很简单地理解。可能值得注意的是, microtcp_open行为是BSD的socket+bind+listen立即设置侦听TCP服务器。
设置堆栈有多种方法,主要方式是microtcp_create ,它在主机OS上创建了一个具有IP 10.0.0.5/24的虚拟网络推论,以及MicroTCP进程的虚拟主机在10.0.0.0.4/24。您可以在虚拟NIC上打开Wireshark,以检查主机和过程之间的流量。
也可以使用microtcp_create_using_callbacks配置堆栈,该邮件使您可以明确地向其提供输入L2帧并在缓冲区中接收帧。这就是人们将如何配置堆栈以在微控制器上运行的方式。
MicroTCP的每个实例(不考虑回调)与其他实例完全隔离,因此,如果您的特定回调实现允许,则可以拥有尽可能多的实例!
仍然没有测试基础结构。我正在测试它的方式是设置HTTP或Echo服务器并将其强调,直到使用Wireshark捕获发生的事情,直到某些东西破裂为止。