Heim  >  Artikel  >  System-Tutorial  >  Beschreiben Sie kurz den Prozess des Sendens und Empfangens von Netzwerkdatenpaketen im Linux-System

Beschreiben Sie kurz den Prozess des Sendens und Empfangens von Netzwerkdatenpaketen im Linux-System

WBOY
WBOYnach vorne
2024-02-12 21:54:33638Durchsuche

Welche Verarbeitung muss durchgeführt werden, wenn der Linux-Server das Netzwerkdatenpaket empfängt, um die Daten Schritt für Schritt an den Anwendungsprozess zu übertragen? Wie sendet Linux das Datenpaket, wenn ein Anwendungsprozess ein Datenpaket sendet? Heute werden wir über dieses Thema sprechen.

Bevor Linux zum Empfang von Netzwerkdatenpaketen bereit ist, muss es viele Vorbereitungsarbeiten durchführen, z. B.: Initialisierung des Netzwerksubsystems, Registrierung des Protokollstapels, Initialisierung des Netzwerkkartentreibers, Starten der Netzwerkkarte usw. Erst wenn diese bereit sind, kann es wirklich mit dem Empfang von Netzwerkpaketen beginnen.

Netzwerkprotokollstapel


Bevor wir Linux zum Senden und Empfangen von Netzwerkdatenpaketen einführen, wollen wir zunächst den Linux-Netzwerkprotokollstapel verstehen.

Die Internationale Organisation für Normung hat das Open System Interconnection Reference Model formuliert, bei dem es sich um das OSI-Netzwerkmodell handelt. Das Modell besteht hauptsächlich aus 7 Schichten, nämlich Anwendungsschicht, Präsentationsschicht, Sitzungsschicht und Datenverbindungsschicht physikalische Schicht.

Da das OSI-Modell zu komplex ist, handelt es sich nur um ein konzeptionelles und theoretisches Modell mit zu vielen Schichten, was die Komplexität der Netzwerkarbeit erhöht, sodass es nicht in großem Maßstab angewendet wurde.
Am häufigsten verwenden wir das TCP/IP-Netzwerkmodell. Das Linux-System implementiert den Netzwerkprotokollstapel gemäß diesem Netzwerkmodell.

Das TCP/IP-Netzwerkmodell besteht aus 4 Schichten, nämlich Anwendungsschicht, Transportschicht, Netzwerkschicht und Netzwerkschnittstellenschicht. Die Funktionen jeder Schicht sind wie folgt:

1. Anwendungsschicht Entspricht der oberen Schicht des OSI-Referenzmodells und stellt Benutzern verschiedene erforderliche Dienste bereit, wie zum Beispiel: FTP, Telnet, DNS, SMTP usw.

2. Transportschicht Entspricht der Transportschicht des OSI-Referenzmodells und stellt End-to-End-Kommunikationsfunktionen für Entitäten der Anwendungsschicht bereit, um die sequentielle Übertragung von Datenpaketen und die Integrität der Daten sicherzustellen. Diese Schicht definiert zwei Hauptprotokolle: Transmission Control Protocol (TCP) und User Datagram Protocol (UDP).

3. Netzwerkschicht Entspricht der Netzwerkschicht des OSI-Referenzmodells und löst hauptsächlich Host-zu-Host-Kommunikationsprobleme. Es enthält Protokolle, die für die logische Übertragung von Datenpaketen im gesamten Netzwerk konzipiert sind. Der Schwerpunkt liegt auf der Neuzuweisung einer IP-Adresse an den Host, um die Adressierung des Hosts abzuschließen. Außerdem ist er für die Weiterleitung von Datenpaketen in verschiedenen Netzwerken verantwortlich. In dieser Schicht gibt es drei Hauptprotokolle: Internet Protocol (IP), Internet Group Management Protocol (IGMP) und Internet Control Message Protocol (ICMP).

4. Netzwerkschnittstellenschicht Entspricht der physikalischen Schicht und der Datenverbindungsschicht im OSI-Referenzmodell. Es ist für die Überwachung des Datenaustauschs zwischen dem Host und dem Netzwerk verantwortlich. Tatsächlich definiert TCP/IP nicht selbst das Protokoll dieser Schicht. Stattdessen verwendet jedes an der Verbindung beteiligte Netzwerk seine eigenen Protokolle für die physikalische Schicht und die Datenverbindungsschicht und stellt dann eine Verbindung zur Netzwerkzugriffsschicht von TCP/IP her. Das Address Resolution Protocol (ARP) arbeitet auf dieser Schicht, der Datenverbindungsschicht des OSI-Referenzmodells.
Beschreiben Sie kurz den Prozess des Sendens und Empfangens von Netzwerkdatenpaketen im Linux-System

Netzwerkpakete empfangen


Beschreiben Sie kurz den Prozess des Sendens und Empfangens von Netzwerkdatenpaketen im Linux-System

Nachdem das Netzwerkdatenpaket die Netzwerkkarte erreicht hat, wird es in der FIFO-Reihenfolge in der Empfangswarteschlange der Netzwerkkarte gespeichert. Die Netzwerkkarte schreibt das Netzwerkpaket über DMA-Technologie an die angegebene Speicheradresse (Ringpuffer).

Der Ringpuffer wird beim Start des Netzwerkkartentreibers erstellt und initialisiert und speichert den Deskriptor des sk_buff-Puffers (physikalische Adresse und Größe usw.).

Wenn das Netzwerkpaket ankommt, holen Sie sich den spitzen sk_buff-Deskriptor aus dem Ringpuffer und schreiben Sie die Daten über DMA an die Adresse. Nachdem die Daten in sk_buff zur Verarbeitung an den Protokollstapel der oberen Schicht übergeben wurden, wird die Beschreibung im Ringpuffer auf den neu zugewiesenen sk_buff aktualisiert.

Dann initiiert die Netzwerkkarte einen Hardware-Interrupt an die CPU. Wenn die CPU die Hardware-Interrupt-Anfrage empfängt, findet sie die registrierte Interrupt-Verarbeitungsfunktion gemäß der Interrupt-Registrierung.

Die Hardware-Interrupt-Handler-Funktion führt Folgendes aus:

1. Netzwerkkartenunterbrechungen blockieren

Der Zweck besteht darin, zu verhindern, dass die CPU häufig unterbrochen wird und nicht in der Lage ist, andere Aufgaben zu bewältigen. Durch das Maskieren von Interrupts wird der Netzwerkkarte bereits mitgeteilt, dass sie bereits weiß, dass sich Daten im Speicher befinden, und dass sie einfach darauf schreiben kann den Speicher direkt, ohne die CPU zu benachrichtigen.

2. Initiieren Sie einen Soft-Interrupt und stellen Sie den gerade blockierten Interrupt wieder her

Nachdem der ksoftirqd-Thread im Kernel den Soft-Interrupt empfangen hat, ruft er die entsprechende Soft-Interrupt-Verarbeitungsfunktion auf, um die Daten abzufragen und zu verarbeiten. Das heißt: Rufen Sie einen Datenrahmen vom Ringpuffer ab, der durch sk_buff dargestellt wird, und übergeben Sie ihn an den Netzwerkprotokoll als Netzwerkpaket Der Stapel wird Schicht für Schicht von unten nach oben verarbeitet.

Der Netzwerkprotokollstapel verarbeitet Netzwerkpakete wie folgt:

1. Netzwerkschnittstellenschicht

Zuerst überprüft die Netzwerkschnittstellenschicht die Rechtmäßigkeit und Richtigkeit der Nachricht. Wenn sie illegal ist oder die Nachrichtenüberprüfung falsch ist, verwerfen Sie sie. Andernfalls ermitteln Sie den Typ des Protokolls der oberen Schicht (IPv4 oder IPv6) und entfernen Sie den Frame-Header und Frame-Trailer, und überlassen Sie es dann zur Verarbeitung der oberen Schicht, der Netzwerkschicht.

2. Netzwerkschicht

Die Netzwerkschicht entnimmt den IP-Header und bestimmt die nächste Richtung des Netzwerkpakets, ob es weitergeleitet oder an die obere Schicht übergeben wird. Nachdem bestätigt wurde, dass das Netzwerkpaket an den lokalen Computer gesendet werden soll, wird der Typ des Protokolls der oberen Schicht (z. B. TCP oder UDP) herausgenommen, der IP-Header entfernt und dann zur Verarbeitung an die Transportschicht übergeben.

3. Transportschicht

Nachdem die Transportschicht den TCP-Header oder UDP-Header herausgenommen hat, findet sie den entsprechenden Socket basierend auf dem Vier-Tupel [Quell-IP, Quell-Port, Ziel-IP, Ziel-Port] und kopiert die Daten in den Empfangspuffer des Sockets.

4. Anwendungsschicht

Schließlich ruft das Programm der Anwendungsschicht die Socket-Schnittstelle auf, um die Daten im Socket-Empfangspuffer des Kernels in den Puffer der Anwendungsschicht zu kopieren.

An diesem Punkt ist der Empfangsprozess eines Netzwerkpakets abgeschlossen.

Netzwerkpaket senden


Nachdem wir den Empfangsprozess von Netzwerkpaketen verstanden haben, ist es leicht, den Sendeprozess von Netzwerkpaketen zu verstehen. Die Senderichtung von Netzwerkpaketen ist genau entgegengesetzt zur Empfangsrichtung.

Zuerst ruft die Anwendung die Socket-Schnittstelle auf, um Netzwerkpakete zu senden. Dies ist ein Systemaufruf, der vom Benutzermodus in die Socket-Schicht des Kernelmodus wechselt.

Die Socket-Schicht beantragt einen sk_buff-Speicher im Kernelmodus, kopiert die vom Benutzer zu sendenden Daten in den sk_buff-Speicher und fügt sie dem Socket-Sendepuffer hinzu, um auf die Verarbeitung durch den Netzwerkprotokollstapel zu warten.

Da Netzwerkdatenpakete bei der Übertragung von der Anwendung an den Kernel Rohdaten sind, muss der Protokollstapel Kommunikationskonventionen zu den Rohdaten hinzufügen, um sicherzustellen, dass die Daten korrekt erkannt werden können, wenn sie den Server erreichen. Der Netzwerkprotokollstapel entnimmt das Datenpaket aus dem Socket-Sendepuffer und verarbeitet es dann Schicht für Schicht von oben nach unten entsprechend den Schichten des TCP/IP-Stacks (Transportschicht, Netzwerkschicht, Netzwerkschnittstellenschicht). wandelt den Protokoll-Header um. Informationen werden kontinuierlich in Datenpakete eingefügt.

Der Verarbeitungsablauf des Protokollstapels zum Senden von Datenpaketen ist wie folgt:

1. Transportschicht

Auf der Transportschicht wird dem Server ein TCP-Header hinzugefügt und eine neue Kopie von sk_buff kopiert. Dies liegt daran, dass sk_buff freigegeben wird, wenn es die Netzwerkkarte erreicht und die Übertragung abgeschlossen ist, und das TCP-Protokoll eine erneute Übertragung unterstützt Um sicherzustellen, dass das Netzwerkpaket zuverlässig übertragen wird, kann dieser sk_buff nicht gelöscht werden, bevor die Bestätigung von der anderen Partei empfangen wird.

2. Netzwerkschicht

Auf der Netzwerkebene werden hauptsächlich die folgenden Aufgaben ausgeführt: Routen auswählen (Bestätigung der IP des nächsten Hops), IP-Header ausfüllen, Netzfilter filtern und Datenpakete fragmentieren, die die MTU-Größe überschreiten. Nach der Verarbeitung dieser Aufgaben wird sie zur Verarbeitung an die Netzwerkschnittstellenschicht übergeben.

3. Netzwerkschnittstellenschicht

Die Netzwerkschnittstellenschicht führt eine physische Adressadressierung durch, um die MAC-Adresse des nächsten Hops zu finden, füllt den Frame-Header und Frame-Trailer aus und stellt sie in die Sendewarteschlange. Lösen Sie dann einen Soft-Interrupt aus, um dem Netzwerkkartentreiber mitzuteilen: In der Warteschlange befinden sich neue Netzwerkpakete, die gesendet werden müssen. Wenn der Treiber die Benachrichtigung erhält, liest er den Netzwerkrahmen über DMA aus der Sendepaketwarteschlange und schreibt die Daten über DMA in die FIFO-Sendewarteschlange der Netzwerkkarte.

4. Netzwerkkartenausrüstung

Das Netzwerkkartengerät entnimmt das Datenpaket aus der FIFO-Sendewarteschlange und sendet es an das Netzwerk. Wenn die Übertragung abgeschlossen ist, löst das Netzwerkkartengerät einen harten Interrupt aus, um Speicher freizugeben, hauptsächlich um sk_buff-Speicher freizugeben und RingBuffer zu bereinigen Erinnerung. Wenn schließlich die ACK-Antwort dieser TCP-Nachricht empfangen wird, gibt die Transportschicht den ursprünglichen sk_buff frei.

An diesem Punkt ist der Vorgang des Sendens eines Netzwerkpakets abgeschlossen.

Das obige ist der detaillierte Inhalt vonBeschreiben Sie kurz den Prozess des Sendens und Empfangens von Netzwerkdatenpaketen im Linux-System. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen