Entwurf und Implementierung des Benutzermodus-Protokollstapels

Eine Datenstruktur jeder Schicht eines Computernetzwerks

Die Computernetzwerkhierarchie ist:

Computernetzwerkstruktur
Anwendungsschicht
Transportschicht
Netzwerkschicht
Datenübertragungsebene
physische Schicht

Die Struktur des Ethernet-Datenrahmens (Sicherungsschicht):


Die Länge des Datensegments beträgt 46 bis 1500 Bytes.
Ethernet-Datenrahmen haben kein Längenfeld. Der Host-Computer bestimmt, dass der Ethernet-Datenrahmen empfangen wurde, und verlässt sich darauf, dass der Host-Empfänger die Spannungsänderung nicht spürt. Wenn der Empfänger die Spannungsänderung nicht wahrnimmt, zeigt dies an, dass dieser Datenrahmen empfangen wurde.

Format des IP-Datagramms (Netzwerkschicht):


Datenformat des UDP-Protokolls:


ARP-Protokollformat:

Drücken Sie das Format der Header-Datei des obigen Datenpakets in Form einer Datenstruktur aus:

#pragma pack(1)								//

#define ETH_ADDR_LENGTH 6

struct ethhdr  {
    unsigned char h_dst[ETH_ADDR_LENGTH];
    unsigned char h_src[ETH_ADDR_LENGTH];
    unsigned short h_proto;	//表示上一层用什么协议
};

struct iphdr {
    unsigned char hdrlen:4,//低位 
                  version:4;//高位

    unsigned char tos;

    unsigned short totlen;

    unsigned short id;

    unsigned short flag_offset;

    unsigned char ttl;//time to live    默认是64

    unsigned char type;

    unsigned short check;

    unsigned int sip;

    unsigned int dip;
};

struct udphdr {
    unsigned short sport;
    unsigned short dport;

    unsigned short length;
    unsigned short check;
};

struct udppkt {
    struct ethhdr eh;
    struct iphdr ip;
    struct udphdr udp;

    unsigned char data[0];//零长数组,柔性数组      1.不关心它的长度;2.它的内存一开始是被分配好的;3。可以计算出它的长度。
};//sizeof(struct udppkt) == 42   

struct arphdr {
	unsigned short h_type;
	unsigned short h_proto;
	
	unsigned char h_addrlen;
	unsigned char h_protolen;

	unsigned short oper;	//请求/响应

	unsigned char smac[ETH_ADDR_LEN];
	unsigned int sip;

	unsigned char dmac[ETH_ADDR_LEN];
	unsigned int dip;
}

#pragma pack(1) wird für die Ein-Byte-Ausrichtung verwendet. Byte-Ausrichtung bedeutet, dass Variablen häufig in Adressen gespeichert werden, deren Adressen durch die Länge teilbar sind, um den Zugriff des Taschenrechners auf Variablen zu beschleunigen. Innerhalb der Struktur werden häufig leere Bytes für die Byte-Ausrichtung automatisch gefüllt. Ein-Byte-Ausrichtung bezieht sich auf das Festlegen der Grenzausrichtung von Variablen in der Struktur auf 1 Byte, d. h. alle Daten werden fortlaufend ohne Auffüllen im Speicher gespeichert.

unsigned char data[0]; Dies ist ein Array der Länge Null, auch flexibles Array genannt. Es gibt drei Bedingungen für die Verwendung eines flexiblen Arrays:
1. Kümmern Sie sich nicht um seine Länge,
2. Sein Speicher wird am Anfang allokiert,
3. Seine Länge kann von anderen Stellen im Programm berechnet werden.

Zwei net_map Einführung

netmap ist ein effizientes I/O-Framework zum Senden und Empfangen von Nachrichten, das unter Linux kompiliert und verwendet werden muss. Wenn Netmap läuft, übernimmt dieses Framework die Grafikkarte des Hosts, sodass die Daten der Grafikkarte zur Verarbeitung an den Kernel-Protokollstapel und dann zur Verarbeitung an das Netmap-Framework gesendet werden.

Wenn das Netmap-Framework gestartet wird, werden die Daten in der Grafikkarte über mmap in den Speicher gemappt. Der Mapping-Prozess von mmap wird von DMA gesteuert. Nach der Zuordnung können Benutzer die Netzwerkdaten im Speicher direkt bearbeiten.

Schlüsselfunktionsanalyse:
nm_open: Erstellen Sie einen Dateideskriptor, der auf die Netzwerkkarte zeigt.
nm_nextpkt: Empfängt die Daten in der Netzwerkkarte und gibt einen Zeiger auf den Datenheader zurück.

Die Datenstruktur des Speichers, der Netzwerkkartendaten empfängt: Ringbuffer (Ring Queue)

Das Programm antwortet auf das Eintreffen neuer Daten von der Netzwerkkarte durch Polling. Es gibt zwei Möglichkeiten, auf Daten zu reagieren, eine Abfrage und die andere ereignisgesteuert. Das Polling-Verfahren ist geeignet, um auf große Datenmengen zu reagieren. Ereignisgesteuert ist geeignet, um auf spärliche Daten zu reagieren.

Drei ARP-Protokolle und ARP-Angriffe

Das ARP-Protokoll ist eine Eins-zu-Eins-Entsprechung zwischen IP-Adressen und Mac-Adressen. Außerhalb des lokalen Netzwerks erkennen sich Hosts an der IP-Adresse, und im lokalen Netzwerk erkennen sich Hosts an der Mac-Adresse. Wenn das externe Datenpaket das LAN findet, in dem sich der Zielhost über die IP-Adresse befindet, muss es sich auf die MAC-Adresse verlassen, um den Zielhost im LAN zu finden.

Wenn der Host beabsichtigt, Daten an einen anderen Host im LAN zu senden, muss der Host den entsprechenden Ziel-Mac in der ARP-Cache-Warteschlange über die Ziel-IP finden. Wenn es keine übereinstimmende MAC-Zieladresse gibt, führt der Host automatisch ARP aus. Die Schritte von ARP sind wie folgt:

1. Der ARP-Prozess sendet ein ARP-Anforderungspaket im lokalen Netzwerk, das die lokale IP, MAC und Ziel-IP enthält; 2.
Alle ARP-Prozesse, die auf allen Hosts im lokalen Netzwerk laufen, empfangen dieses ARP-Anforderungspaket;
3. Stimmt die IP-Adresse eines bestimmten Hosts mit der Adresse im ARP-Request-Paket überein, akzeptiert er das ARP-Request-Paket und sendet ein ARP-Response-Paket zurück, das die MAC des Hosts enthält. Für Hosts, die nicht mit der Ziel-IP im ARP-Anfragepaket übereinstimmen, ignorieren Sie diese Anfrage
4. Wenn der Host das ARP-Antwortpaket empfängt, schreibt er die Ziel-IP und die Ziel-MAC in die ARP-Cache-Warteschlange.

ARP-Angriff bezieht sich darauf, dass es im lokalen Netzwerk einen bestimmten Host gibt, der auf jede ARP-Anfrage antwortet, und die MAC-Adresse der Antwort ebenfalls falsch ist, was zu Datenfehlern in der ARP-Cache-Warteschlange des Hosts im lokalen Bereich führt Netzwerk und eine große Anzahl von ARP-Anfragen im lokalen Netzwerk, so dass das lokale Netzwerk lahmgelegt wurde.


Referenz-Blog-Adresse: Entwurf und Implementierung des Benutzermodus-Protokollstapels –  Eindringen und Löschen von pudn.com

Supongo que te gusta

Origin blog.csdn.net/m0_58687318/article/details/127056407
Recomendado
Clasificación