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捕獲發生的事情,直到某些東西破裂為止。