Informationen zu UDP in Linux

Informationen zu UDP in Linux

1. Einführung in UDP und Linux-Grundlagen

Socket: IP-Adresse + Portnummer

IP-Adresse: 4 Bytes Portnummer: 2 Bytes, d. h. der Bereich ist 0 ~ 65535
Portnummern werden unterteilt in: bekannte Portnummern, einige feste Portnummern und bekannte Portnummern.
0--1023: http, ssh, ftp, telnet und andere Protokoll-Portnummern sind fest und können vom Betriebssystem nicht zugewiesen werden

Einige feste Portnummern

SSH-Server, verwendet Port 22
FTP-Server, über Port 21
Telnet-Server, über Port 23
http-Server, verwendet Port 80
Der HTTPS-Server verwendet Port 443. Die vom Betriebssystem dynamisch zugewiesene Portnummer ist die Portnummer des Client-Servers. Das Betriebssystem kann Portnummern in diesem Bereich zuweisen.

Überprüfen Sie die Portnummer

weniger /etc/services
 //Sie können alle Portnummern unter Linux anzeigen

Verständnis von IP-Adressen:
Eine IP-Adresse wird zur Identifizierung eines Hosts verwendet.

Verständnis der Portnummern:
Die Portnummer wird verwendet, um dem Betriebssystem mitzuteilen, auf welchen Prozess zugegriffen werden soll, d. h. die Portnummer wird verwendet, um einen Prozess zu identifizieren. Eine Portnummer kann nur von einem Prozess belegt werden, ein Prozess kann jedoch mehrere Portnummern haben, d. h. zwischen Prozess und Portnummer besteht eine Eins-zu-viele-Beziehung. Wenn wir ein Programm mit Portnummern schreiben, müssen wir diese bekannten Portnummern vermeiden.

【Frage】

(1) Kann ein Prozess an mehrere Portnummern gebunden werden?
Ja, da ein Prozess mehrere Dateideskriptoren öffnen kann und jeder Dateideskriptor einer Portnummer entspricht, kann ein Prozess mehrere Portnummern binden

(2) Kann eine Portnummer von mehreren Prozessen gebunden werden?
Nein. Wenn ein Prozess zuerst eine Portnummer bindet und dann einen untergeordneten Prozess aufspaltet, können mehrere Prozesse an eine Portnummer gebunden werden. Es ist jedoch nicht möglich, dass verschiedene Prozesse an dieselbe Portnummer gebunden werden.
Im Zustand TIME_WAIT kann der Server nicht sofort neu gestartet werden, was auch bedeutet, dass verschiedene Prozesse nicht gleichzeitig an dieselbe Portnummer binden können.

(3) Können mehrere Prozesse auf derselben Portnummer lauschen?
Dürfen. Vor dem Abhören müssen Sie einen Socket erstellen -> IP binden::Portnummer -> Abhören. Wir können die Funktion setsockopt vor dem Binden verwenden, um Socket-Optionen festzulegen, einschließlich der Option REUSEADDR, die angibt, dass mehrere Prozesse die in der Bindefunktion angegebene Adresse und Portnummer wiederverwenden können. Daher kann der Socket einen Prozess auf einem Host genau identifizieren und so die Kommunikation zwischen Computern abschließen (ein Prozess auf Host A kommuniziert mit einem anderen Prozess auf Host B).

Konvertierung der Netzwerk-Byte-Reihenfolge:
Wenn Daten im Netzwerk übertragen werden, unterliegen sie ihren eigenen Übertragungsregeln. Es gibt zwei Übertragungssequenzen für Daten auf dem Host:
Big Endian: Die höchste Byte-Reihenfolge wird an die niedrigste Adresse gesetzt. Little Endian: Die niedrigste Byte-Reihenfolge wird an die niedrigste Adresse gesetzt. Übertragung: Zuerst werden die Daten an die niedrigste Adresse und dann die Daten an die höchste Adresse übertragen. Daher können bei der Datenübertragung vom Host zum Netzwerk Datenfehler auftreten (wenn der Host beispielsweise Little Endian ist, ist eine Konvertierung erforderlich).

Konvertierungsfunktion:

uint32_t htonl(uint32_t hostlong);
uint16_thtons(uint16 hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h: gibt den Hostnamen an
n: zeigt Netzwerk an
l: bedeutet 4 Byte lang
s: zeigt einen 2-Byte-Short an

Adresskonvertierungsfunktion:

Konvertieren Sie die Zeichenfolge in in_addr
in_addr_t inet_addr(const char*strptr)
in_addr wird in Zeichenfolge char* inet_ntoa(struct in_addr inaddr) umgewandelt

Es ist nicht wiedereintrittsfähig, das heißt, es kann nicht mehrfach aufgerufen werden, da die Funktion selbst einen Speicherplatz im statischen Bereich zuweist, um die IP-Adresszeichenfolge zu speichern.

UDP-Protokoll:
UDP-Protokoll-Endformat

  • 16 ist die UDP-Länge, die die maximale Länge des gesamten Datagramms (UDP-Header + UDP-Daten) angibt (64 KB).
  • Prüfsumme: Wenn die Prüfsumme falsch ist, wird sie direkt verworfen (bei der Prüfung wird sowohl der Header als auch der Datenteil geprüft)
  • Die Prüfsumme wird zunächst beim Datensender durch einen speziellen Algorithmus berechnet und nach der Übermittlung an den Empfänger neu berechnet. Wenn ein Datagramm während der Übertragung durch Dritte manipuliert oder aufgrund von Leitungsrauschen oder aus anderen Gründen beschädigt wird, stimmen die Prüfsummenberechnungswerte von Absender und Empfänger nicht überein, sodass das UDP-Protokoll prüfen kann, ob ein Fehler vorliegt.
  • Quellportnummer: Wird gewählt, wenn die Gegenstelle antwortet. Wird sie nicht benötigt, können auch alle 0 verwendet werden
  • Zielportnummer: muss bei der Zustellung von Nachrichten am Ziel verwendet werden
  • Länge: Die Länge des UDP-Benutzerdatagramms, der Mindestwert beträgt 8 (nur der Header)

Eigenschaften von UDP:

  • Keine Verbindung: Daten direkt nach Erhalt der IP- und Portnummer des anderen Endes übertragen, ohne eine Verbindung herzustellen
  • Unzuverlässig: Es gibt keinen Bestätigungsmechanismus, keinen Neuübertragungsmechanismus. Da kein Netzwerkfehler vorliegt, kann das Segment nicht an die andere Partei gesendet werden und die UDP-Protokollschicht gibt keine Fehlerinformationen an die Anwendungsschicht zurück.
  • Datagrammorientiert: Anzahl und Menge der Lese- und Schreibdaten können nicht flexibel gesteuert werden
  • Weniger Steuerungsmöglichkeiten, weniger Verzögerung bei der Datenübertragung und hohe Datenübertragungseffizienz
  • Datagrammorientiert
  • Unabhängig davon, wie viel Zeit die Anwendungsschicht UDP gibt, sendet UDP es so wie es ist, ohne Aufteilung oder Zusammenführung

Beispiel: Verwenden Sie UDP, um 100 Byte Daten zu übertragen <br /> Wenn der Sender sendto einmal aufruft, sendet er 100 Byte. Dann muss die empfangende Seite auch einmal das entsprechende recvfrom aufrufen, um 100 Bytes zu empfangen; sie kann recvfrom nicht 10 Mal in einer Schleife aufrufen und jedes Mal 10 Bytes senden.
UDP-Puffer
UDP hat keinen Sendepuffer. Nach dem Aufruf von sendto werden die Daten direkt an den Kernel übergeben, der die Daten zur anschließenden Übertragung an das Netzwerkschichtprotokoll weiterleitet. Da UDP nicht verbindungsorientiert ist, gibt es keinen Mechanismus zur erneuten Übertragung und es ist nicht erforderlich, einen Puffer zu senden, um die gesendeten Daten für die erneute Übertragung im Falle einer fehlgeschlagenen Übertragung zu speichern.
UDP verfügt über einen Empfangspuffer. Dieser Empfangspuffer kann jedoch nicht garantieren, dass die Reihenfolge der empfangenen UDP-Pakete mit der Reihenfolge der gesendeten UDP-Pakete übereinstimmt; wenn der Puffer voll ist, werden die ankommenden UDP-Daten verworfen.
UDP-Socket kann lesen und schreiben, Vollduplex

Hinweise zur Verwendung von UDP:
Der UDP-Protokollheader hat eine maximale Länge von 16 Bit, was bedeutet, dass die maximale Datenlänge, die per UDP übertragen werden kann, 64 KB beträgt (einschließlich des UDP-Headers). Allerdings ist 64 KB im heutigen Internetumfeld eine sehr kleine Zahl. Wenn die zu übertragenden Daten 64 KB überschreiten, müssen wir sie auf der Anwendungsebene manuell in Pakete aufteilen, mehrmals senden und am Empfangsende zusammensetzen.
Die Berechnungsmethode der Prüfsumme im UDP-Header ist etwas speziell. Bei der Berechnung der Prüfsumme wird vor dem UDP-Benutzerdatagramm ein 12 Byte langer Pseudoheader angehängt. Der Pseudoheader wird weder nach unten übertragen noch nach oben übermittelt, sondern dient nur zur Berechnung der Prüfsumme. Im Gegensatz zur IP-Datagrammprüfsumme, die nur den IP-Datagrammheader prüft, prüft die UDP-Prüfsumme sowohl den Header als auch den Datenteil.

Pseudoheader:

UDP-basierte Anwendungsschichtprotokolle:

  • NFS: Netzwerkdateisystem
  • TFTP: Trivial File Transfer Protocol
  • DHCP: Dynamic Host Configuration Protocol
  • DNS: Domain Name Resolution Protocol

Mit UDP eine zuverlässige Übertragung erreichen?

  • Beziehen Sie sich auf den Zuverlässigkeitsmechanismus von TCP und implementieren Sie eine ähnliche Logik auf der Anwendungsebene
  • Referenzseriennummer zur Sicherstellung der Datenreihenfolge
  • Führen Sie Bestätigungsantworten ein, um sicherzustellen, dass das andere Ende die Daten empfangen hat
  • Führen Sie eine Timeout-Neuübertragung ein. Wenn nach einer gewissen Zeit keine Antwort erfolgt, senden Sie die Daten erneut.

2. Verwendung der einzelnen Funktionen

1. Verwendung von Socket-Funktionen

1.1 Funktionsprototyp

int socket(int-Domäne, int-Typ, int-Protokoll);
Domäne: Domäne AF_INET:IPV4
    AF_INET6: IPV6
Typ: Typ SOCK_STREAM
    SOCK_DGARM
Protokoll: Protokoll

1.2 Was macht die Funktion?
Erstellt einen ungebundenen Socket in der Kommunikationsdomäne und gibt einen Dateideskriptor zurück, der in nachfolgenden Funktionsaufrufen verwendet werden kann, die auf den Socket zugreifen.

2. Verwendung der Bindefunktion

2.1 Funktionsprototyp
int bind(int socket, const struct sockaddr*adresse, socklen_t adresse_länge);
2.2. Funktion Diese Funktion verwendet den zuvor erstellten Socket, um die IP-Adresse und die Portnummer zu binden, was bedeutet, dass der Socket einen bestimmten Host in einem Netzwerk und den Prozess im Host identifizieren kann.

3. Verwendung der recvfrom-Funktion

3.1 Funktionsprototyp

ssize_t recvfrom(int socket, void* restrict buffer, size_t length, 
                 int flags, struct sockaddr* Adresse einschränken, 
                socklen_t* Adresslänge einschränken);
​
Socket: der Socket, dessen Nachricht empfangen werden soll. Puffer: der Puffer, der zum Empfangen von Nachrichten verwendet wird. Länge: die Länge der empfangenen Nachricht. Flags: Typ. Adresse: ein Nullzeiger oder eine Sockaddr-Struktur zum Speichern gesendeter Informationen. addless_len: gibt die Länge der Sockaddr-Struktur an, auf die der Adressparameter zeigt.

3.2 Funktionen
Wird zum Empfangen von Nachrichten verwendet, die vom Socket gesendet werden. Die Sockaddr-Struktur des Sockets kennt außerdem

4. Verwendung der Sendto-Funktion

4.1 Funktionsprototyp
ssize_t recvfrom(int socket, const void* message, size_t Länge,
int-Flags, const-Struktur sockaddr*dest_addr,
socklen_t* Ziellänge);
4.2 Funktion <br /> Diese Funktion wird vom Socket verwendet, um Nachrichten von dest_addr zu empfangen.

3. Erweitern Sie Ihr Wissen

1. netstat

Netstat ist ein nicht kritisches Tool zur Überwachung von TCP/IP-Netzwerken. Syntax: netstat [Optionen]
Funktion: Netzwerkstatus anzeigen

Optionen:
-a, alle angeschlossenen Sockets anzeigen
-c, Netzwerkstatus kontinuierlich auflisten
-n, die IP-Adresse direkt verwenden, ohne den Domänennamenserver zu durchlaufen, d. h. als Zahl anzeigen
-l, zeigt den Socket des überwachten Servers an und listet nur den Socket im Listening-Status auf
-p, zeigt den Identifikationscode und den Namen (PID/Programmname) des Programms an, das den Socket verwendet
-t, zeigt den Verbindungsstatus des TCP-Übertragungsprotokolls an
-u, zeigt den Verbindungsstatus des UDP-Transportprotokolls an
-v, zeigt den Ausführungsprozess des Befehls an
-V, Versionsinformationen anzeigen
-x, zeigt den Verbindungsstatus des UNIX-Transportprotokolls an
-s, Netzwerkarbeitsinformationen-Statistiken anzeigen
-h, Onlinehilfe

2. pidof

Das Anzeigen der Serverprozess-ID ist sehr praktisch

Syntax: pisdof [Prozessname]

Funktion: Prozess-ID nach Prozessnamen anzeigen

Dies ist das Ende dieses Artikels zum Erlernen von UDP in Linux. Weitere relevante Linux-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Linux-Indexknoten-Inode
  • Linux: Kein Speicherplatz mehr auf Gerät 500 – Fehler aufgrund voller Inodes
  • Details zur Linux-Netzwerkeinrichtung
  • So implementieren Sie mit MyCat die Lese-/Schreibtrennung von MySQL-Master und -Slave unter Linux
  • Versteckter Overhead von Unix/Linux-Forks
  • Linux-Swap-Partition (ausführliche Erklärung)
  • C++-Netzwerkprogrammierung unter Linux, Epoll-Technologie und IOCP-Modell unter Windows
  • Wie viele Ports kann ein Linux-Server maximal öffnen?
  • Details zu Linux-Dateideskriptoren, Dateizeigern und Inodes

<<:  MySQL-Startfehlerproblem und Szenarioanalyse

>>:  CSS3-Beispielcode zum Erreichen einer Elementbogenbewegung

Artikel empfehlen

MySQL-Deduplizierungsmethoden

MySQL-Deduplizierungsmethoden 【Anfänger】 Es gibt ...

Erstellen Sie ein SSL-Zertifikat, das in nginx und IIS verwendet werden kann

Inhaltsverzeichnis Erstellen eines SSL-Zertifikat...

So verwenden Sie MySQL „group by“ und „order by“ gemeinsam

Angenommen, es gibt eine Tabelle: Belohnung (Belo...

25 Tipps und Tricks zur Div+CSS-Programmierung

1. Das ul-Tag hat in Mozilla standardmäßig einen ...

MySQL Serie 4 SQL-Syntax

Inhaltsverzeichnis Tutorial-Reihe 1. Einführung u...

Lösung für die Auswirkungen leerer Pfade auf die Seitenleistung

Vor ein paar Tagen habe ich einen von Yu Bo getei...

So debuggen Sie das Loader-Plugin in einem Webpack-Projekt

Als ich kürzlich lernte, wie man webpack verwende...

Kleines Problem mit dem Abstand zwischen Label und Eingabe im Google Browser

Erst Code, dann Text Code kopieren Der Code lautet...

Verwendung des Linux-Befehls usermod

1. Befehlseinführung Der Befehl usermod (user mod...

Beispiel für die Verwendung von Docker zum Erstellen eines ELK-Protokollsystems

Die folgenden Installationen verwenden alle das V...

Die häufigsten Fehler beim Schreiben von HTML-Tags

Wir sollten besser aufpassen, denn die HTML-Poliz...

Mysql behält den vorhandenen Inhalt bei und fügt später Inhalte hinzu

Dieser Befehl ändert die Datentabelle ff_vod und ...