UDP-Lite - UDP-Lite

UDP-Lite ( Lightweight User Datagram Protocol ) ist ein verbindungsloses Protokoll , das eine möglicherweise beschädigte Daten ermöglicht Nutzlast auf eine geliefert werden Anwendung und nicht von der Empfangsstation verworfen wird. Dies ist nützlich, da es Entscheidungen über die Integrität der Daten in der Anwendungsschicht (Anwendung oder Codec ) ermöglicht, wo die Bedeutung der Bits verstanden wird. UDP-Lite wird in RFC  3828 beschrieben .

Protokoll

UDP-Lite basiert auf dem User Datagram Protocol (UDP), aber im Gegensatz zu UDP, bei dem entweder das gesamte Paket oder kein Paket durch eine Prüfsumme geschützt ist, ermöglicht UDP-Lite partielle Prüfsummen , die nur einen Teil eines Datagramms abdecken (eine willkürliche Anzahl von Oktette am Anfang des Pakets) und liefert daher Pakete, die teilweise beschädigt wurden. Es ist für Multimedia-Protokolle wie Voice over IP (VoIP) oder Videostreaming ausgelegt, bei denen der Empfang eines Pakets mit beschädigter Nutzlast besser ist, als überhaupt kein Paket zu empfangen. Bei konventionellem UDP und Transmission Control Protocol (TCP) führt ein einzelnes fehlerhaftes Bit zu einer "schlechten" Prüfsumme, was bedeutet, dass das gesamte Paket verworfen werden muss: Auf diese Weise werden Bitfehler zu ganzen Paketfehlern "befördert", selbst wenn Beschädigung der Daten ist trivial. Zur Berechnung der Prüfsumme verwendet UDP-Lite den gleichen Prüfsummesalgorithmus, der für UDP (und TCP) verwendet wird.

Moderne Multimedia-Codecs wie G.718 und Adaptive Multi-Rate (AMR) für Audio und H.264 und MPEG-4 für Video verfügen über bereits in die Syntax und Struktur des Streams integrierte Widerstandsfähigkeitsfunktionen. Dies ermöglicht es dem Codec, (a) Fehler im Stream zu erkennen und (b) den Fehler möglicherweise während der Wiedergabe zu korrigieren oder zumindest zu verbergen. Diese Codecs sind ideale Partner für UDP-Lite, da sie für einen beschädigten Datenstrom ausgelegt sind und diese Codecs besser vielleicht 200 Byte empfangen, wenn ein paar Bits beschädigt sind, anstatt den Verlust eines ganzen zu verbergen Paket, das aufgrund einer fehlerhaften Prüfsumme verworfen wurde. Die Anwendungsschicht versteht die Bedeutung der Daten, wobei der Transport nur UDP-Pakete sieht. Dies bedeutet, dass bei Bedarf ein Fehlerschutz auf einer höheren Ebene hinzugefügt werden kann, beispielsweise mit einem Vorwärtsfehlerkorrekturschema . Die Anwendung ist der beste Ort, um zu entscheiden, welche Teile des Streams am anfälligsten für Fehler sind und sie entsprechend zu schützen, anstatt eine einzige "Brute-Force"-Prüfsumme zu haben, die alles gleichermaßen abdeckt. Ein Beispiel hierfür ist die Forschung von Hammer et al. wobei UDP-Lite mit dem AMR-Codec gekoppelt ist, um eine verbesserte Sprachqualität unter verlustbehafteten Netzwerkbedingungen zu erzielen.

Da die meisten modernen Verbindungsschichten die übertragenen Daten mit einer starken zyklischen Redundanzprüfung (CRC) schützen und beschädigte Frames verwerfen, erfordert die effektive Nutzung von UDP Lite, dass die Verbindungsschicht die übertragenen Netzwerkschichtdaten kennt. Da keine aktuellen IP-Stacks solche schichtübergreifenden Interaktionen implementieren , erfordert eine effektive Nutzung von UDP-Lite derzeit speziell modifizierte Gerätetreiber.

Die IP-Protokollkennung ist 136. UDP-Lite verwendet denselben Satz von Portnummern, der von der Internet Assigned Numbers Authority (IANA) für die Verwendung durch UDP zugewiesen wurde .

Unterstützung für UDP-Lite wurde in der Linux-Kernel- Version 2.6.20 hinzugefügt .

Unterstützung für UDP-Lite wurde im FreeBSD-Kernel von r264212 hinzugefügt. Das Changeset wurde auch auf Stable/10 zurückversetzt und wurde in FreeBSD 10.1-RELEASE verfügbar.

Die BSD-Socket-API wird um den dritten Parameter des Socket- Systemaufrufs erweitert, um UDP-Lite zu unterstützen : Setzen Sie ihn auf IPPROTO_UDPLITE , um einen UDP-Lite-Socket anzufordern:

int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);

Man kann auch einfach einstellen, welcher Teil des Pakets von der Prüfsumme abgedeckt wird (von Anfang an inklusive Header):

int val = 20; /* 8 octets of header + 12 octets of the application protocol. */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_SEND_CSCOV, &val, sizeof val);

Wenn in einem solchen Setup ein Paket mit weniger als 12 Oktetten gesendet wird, deckt die Prüfsumme das gesamte Paket ab.

Auf der Empfangsseite verwirft ein Socket standardmäßig alle Pakete, die nicht vollständig abgedeckt sind (UDP-Emulation). Um eine geringere Abdeckung zu ermöglichen, kann man verwenden:

int val = 20; /* 8 octets of header + 12 octets of the application protocol. */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_RECV_CSCOV, &val, sizeof val);

Dies ermöglicht Pakete, bei denen mindestens 12 Oktetts von Benutzerdaten mit Prüfsummen zusammengezählt werden. Jedes Paket mit einer geringeren Abdeckung wird stillschweigend als schlecht verworfen. Wenn ein Paket eine Abdeckungslänge von mindestens 20 Oktetts (einschließlich Header) hat und seine Prüfsumme korrekt ist, wird es an die Anwendung geliefert (die gesamte oder ein Teil der Nutzlast kann immer noch beschädigt sein, weil sie nicht von der Prüfsumme abgedeckt werden könnte oder weil die Prüfsumme war übrigens richtig, aber letzteres ist sehr unwahrscheinlich.) Wenn die Prüfsumme falsch ist, wird das Paket verworfen, da es eigentlich unmöglich ist zu wissen, ob der Fehler in den Nutzdaten oder im UDP-Lite-Header lag, also Paket könnte tatsächlich für ein anderes Programm bestimmt sein.

Die kleinstmögliche Abdeckung beträgt 8 Oktette. Header müssen in die Prüfsumme aufgenommen werden. Pakete mit geringerer Reichweite werden unabhängig von Einstellungen (ohne Berücksichtigung von Sniffern, die am gesamten Verkehr interessiert sind) immer als nicht standardkonform verworfen.

Unterstützung

UDP-Lite wird von folgenden Betriebssystemen unterstützt:

  • FreeBSD , seit Version 10.1-RELEASE
  • Linux , seit Kernel-Version 2.6.20
  • Auch unter Windows über eine Drittanbieterbibliothek WULL . verfügbar

Verweise

Externe Links

  • RFC  3828 – Das Lightweight User Datagram Protocol (UDP-Lite)
  • RFC  5097 – MIB für das UDP-Lite-Protokoll
  • RFC  4019 – RObust Header Compression (ROHC): Profile for User Datagram Protocol (UDP) Lite
  • RFC  5405 – Richtlinien zur Verwendung von Unicast UDP für Anwendungsdesigner