MicROTCP ist ein TCP/IP -Netzwerkstapel, den ich als Lernübung aufgebaut habe, während ich am Computer -Netzwerkkurs am Universität Studi di Napoli Federico II teilnehme. Es ist nur ein Hobbyprojekt und soll nur eine minimale und dennoch vollständige Implementierung sein.
Zu diesem Zeitpunkt implementiert MicROTCP ARP (RFC 826, Complete), IPv4 (keine Fragmentierung), ICMP (minimal erforderlich, um auf Pings zu antworten) und TCP (vollständig, aber nicht stressig getestet). Beachten Sie, dass "vollständig" nicht als "vollständig konform" gedacht sein sollte, sondern nur als Maß für den Fortschritt bei allen Hauptmerkmalen. Beispielsweise ist es vollständig genug, um den HTTP -Datenverkehr in einem lokalen Netzwerk zu verarbeiten (siehe Beispiele/microHTTP, um mehr zu erfahren).
MicROTCP kann neben dem Netzwerkstapel des Betriebssystems unter Windows und Linux ausgeführt werden. Um den Netzwerkverkehr an micROTCP weiterzuleiten, verhält sich der Prozess, der ausgeführt wird, als virtueller Host mit einer eigenen IP -Adresse. Dies erfolgt mit einem Tap-Gerät, das unter Linux integriert ist und unter Windows installiert werden muss. Es sollte sehr einfach sein, micROTCP für Mikrocontroller anzupassen, aber noch nicht ausprobiert. Der Traum ist es, meinen Blog aus einem STM32 -Board zu dienen!
Wenn Sie unter Windows sind, müssen Sie den von OpenVPN bereitgestellten TAP -Treiber installieren und eine virtuelle NIC einrichten, damit micROTCP zu Beginn eine Verbindung zu ihm herstellen kann. Stellen Sie sicher, dass Sie das Repository mit Submodules kloniert haben
git clone https://github.com/cozis/microtcp.git --recursiveund dann rennen
make Sie müssen sowohl make als auch cmake benötigen, damit es funktioniert. Wenn alles gut läuft, finden Sie die Bibliotheksdateien libtuntap.a , libmicrotcp.a und Header-Dateien tuntap.h , tuntap-export.h , microtcp.h in out/ .
MicROTCPs verwendet die übliche Socket -Schnittstelle, mit der jeder Netzwerkprogrammierer vertraut ist. Der Hauptunterschied besteht darin, dass Sie den Netzwerkstapel explizit einsetzen und seinen Griff umgeben müssen.
Hier ist ein einfacher Echo -Server, der die grundlegende Nutzung zeigt:
#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 ;
} Dies sollte ziemlich einfach zu verstehen sein. Eine Sache ist möglicherweise erwähnenswert, dass sich microtcp_open als socket+bind+listen verhält, um einen Hör -TCP -Server einzurichten.
Es gibt mehr als eine Möglichkeit, den Stapel einzurichten, wobei microtcp_create der Hauptweg auf dem Host -Betriebssystem mit IP 10.0.0.5/24 und einem virtuellen Host für den MicROTCP -Prozess unter 10.0.0.4/24 ein virtuelles Netzwerk erstellt wird. Sie können Wireshark auf der virtuellen NIC eröffnen, um den Verkehr zwischen dem Host und dem Prozess zu inspizieren.
Es ist auch möglich, den Stack mithilfe der microtcp_create_using_callbacks zu konfigurieren, mit der Sie die Eingabe -L2 -Frames explizit an ihn bereitstellen und die Frames in einem Puffer empfangen können. So konfiguriert man den Stapel so, dass man auf einem Mikrocontroller ausgeführt wird.
Jede Instanz von micROTCP (ohne die Rückrufe) ist vollständig von den anderen isoliert. Wenn Ihre spezifische Rückrufimplementierung dies zulässt, können Sie so viele Instanzen haben, wie Sie möchten!
Es gibt immer noch keine Testinfragestruktur. Die Art und Weise, wie ich es teste, besteht darin, einen HTTP- oder Echo -Server einzurichten und ihn zu belasten, bis etwas bricht, während ich das erfasst, was mit Wireshark passiert ist.