Ich bin gerade von meiner Prüfung in Netzwerkprogrammierung nach Hause gekommen, und eine der Fragen, die sie uns stellten, war: "Wenn Sie Videos streamen möchten, würden Sie TCP oder UDP verwenden? Geben Sie eine Erklärung für gespeicherte Videos und Live-Videostreams." . Auf diese Frage erwarteten sie einfach eine kurze Antwort von TCP für gespeichertes Video und UDP für Live-Video, aber ich dachte auf dem Heimweg darüber nach, und ist es notwendigerweise besser, UDP für das Streaming von Live-Video zu verwenden? Ich meine, wenn Sie die Bandbreite dafür haben und sagen, dass Sie ein Fußballspiel oder ein Konzert streamen, müssen Sie dann wirklich UDP verwenden?
Nehmen wir an, während Sie dieses Konzert oder was auch immer mit TCP streamen, verlieren Sie Pakete (in einem Netzwerk zwischen Ihnen und dem Absender ist etwas Schlimmes passiert), und für eine ganze Minute erhalten Sie keine Pakete. Der Videostream wird angehalten und nach Ablauf der Minute werden die Pakete wieder durchgelassen (IP hat eine neue Route für Sie gefunden). Was dann passieren würde, wäre, dass TCP die Minute, in der Sie verloren haben, erneut überträgt und Ihnen weiterhin den Live-Stream sendet. Angenommen, die Bandbreite ist höher als die Bitrate im Stream, und der Ping ist nicht zu hoch. In kurzer Zeit fungiert die verlorene Minute auf diese Weise als Puffer für den Stream Wenn der Paketverlust erneut auftritt, werden Sie es nicht bemerken.
Jetzt kann ich von einigen Geräten denken , wo dies nicht eine gute Idee wäre, wie zum Beispiel Videokonferenzen, wo Sie müssen immer am Ende des Stroms sein, weil Verzögerung während eines Video-Chat einfach schrecklich ist, aber Während eines Fußballspiels oder eines Konzerts, was macht es aus, wenn Sie eine Minute hinter dem Strom sind? Außerdem ist Ihnen garantiert, dass Sie alle Daten erhalten, und es ist besser, sie für eine spätere Anzeige zu speichern, wenn sie fehlerfrei eingehen.
Das bringt mich zu meiner Frage. Gibt es Nachteile, die ich bei der Verwendung von TCP für Live-Streaming nicht kenne? Oder sollte es wirklich so sein, dass Sie sich für TCP entscheiden sollten, wenn Sie die Bandbreite dafür haben, da es für das Netzwerk "netter" ist (Flusskontrolle)?
quelle
Antworten:
Nachteile der Verwendung von TCP für Live-Videos:
Zu Ihrer Information, bitte verwenden Sie nicht das Wort "Pakete", wenn Sie Netzwerke beschreiben. Netzwerke senden "Pakete".
quelle
Für einige Fußballfans ziemlich viel. Es wurde angemerkt, dass Verzögerungen von nur wenigen Sekunden in digitalen Videostreams aufgrund von Codierung (oder was auch immer) sehr ärgerlich sein können, wenn Sie bei hochkarätigen Ereignissen wie WM-Spielen den Jubel und das Stöhnen der Jungs hören nebenan (die sich ein ungelöstes analoges Programm ansehen), bevor Sie die Spielbewegungen sehen, die sie verursacht haben.
Ich denke, dass es für jemanden, der sich sehr für Sport interessiert (und das ist die größte Gruppe zahlender Kunden für digitales Fernsehen, zumindest hier in Deutschland), völlig inakzeptabel wäre, in einem Live-Videostream eine Minute zurückzubleiben (wie in, sie ' d Wechseln Sie zu Ihrem Konkurrenten, wo dies nicht geschieht.
quelle
Normalerweise ist ein Videostream etwas fehlertolerant. Wenn also einige Pakete verloren gehen (z. B. weil ein Router unterwegs überlastet ist), kann der Inhalt weiterhin angezeigt werden, jedoch mit reduzierter Qualität.
Wenn Ihr Live - Stream TCP / IP wurde mit, dann wäre es werden gezwungen für diese fallen gelassen Pakete zu warten , bevor es neuere Datenverarbeitung fortgesetzt werden konnte.
Das ist doppelt schlecht:
Wenn es Ihr Ziel ist, so aktuelle Informationen wie möglich anzuzeigen (und für einen Live-Stream möchten Sie normalerweise auf dem neuesten Stand sein, auch wenn Ihre Frames etwas schlechter aussehen), arbeitet TCP gegen Sie.
Bei einem aufgezeichneten Stream ist die Situation etwas anders: Sie werden wahrscheinlich viel mehr (möglicherweise mehrere Minuten!) Puffern und möchten lieber Daten erneut übertragen als einige Artefakte aufgrund verlorener Pakete. In diesem Fall passt TCP gut zusammen (dies könnte natürlich immer noch in UDP implementiert werden, aber TCP hat nicht so viele Nachteile wie im Fall des Live-Streams).
quelle
Es gibt einige Anwendungsfälle, die für den UDP-Transport geeignet sind, und andere, die für den TCP-Transport geeignet sind.
Der Anwendungsfall bestimmt auch die Codierungseinstellungen für das Video. Bei der Ausstrahlung von Fußballspielen liegt der Schwerpunkt auf der Qualität und bei Videokonferenzen auf der Latenz.
Wenn Sie Multicast verwenden, um Videos an Ihre Kunden zu liefern, wird UDP verwendet.
Voraussetzung für Multicast ist teure Netzwerkhardware zwischen Rundfunkserver und Kunde. In der Praxis bedeutet dies, dass Sie UDP und Multicast für Live-Video-Streaming verwenden können, wenn Ihr Unternehmen über eine Netzwerkinfrastruktur verfügt. Selbst dann wird Quality-of-Service implementiert, um Videopakete zu markieren und zu priorisieren, damit kein Paketverlust auftritt.
Multicast vereinfacht die Rundfunksoftware, da die Netzwerkhardware die Verteilung von Paketen an Kunden übernimmt. Kunden abonnieren Multicast-Kanäle und das Netzwerk wird neu konfiguriert, um Pakete an neue Teilnehmer weiterzuleiten. Standardmäßig stehen alle Kanäle allen Kunden zur Verfügung und können optimal geroutet werden.
Dieser Workflow erschwert den Autorisierungsprozess. Netzwerkhardware unterscheidet abonnierte Benutzer nicht von anderen Benutzern. Die Lösung für die Autorisierung besteht darin, Videoinhalte zu verschlüsseln und die Entschlüsselung in der Player-Software zu aktivieren, wenn das Abonnement gültig ist.
Mit dem Unicast-Workflow (TCP) kann der Server die Anmeldeinformationen des Clients überprüfen und nur gültige Abonnements zulassen. Erlaube sogar nur eine bestimmte Anzahl gleichzeitiger Verbindungen.
Multicast ist nicht über das Internet aktiviert.
Für die Bereitstellung von Videos über das Internet muss TCP verwendet werden. Wenn UDP verwendet wird, implementieren Entwickler die Neuübertragung von Paketen erneut, z. Bittorrent p2p Live-Protokoll.
Dieser Puffer muss in irgendeiner Form vorhanden sein. Gleiches gilt für den Jitterpuffer auf der Spielerseite. Es wird als "Socket-Puffer" bezeichnet und die Serversoftware kann erkennen, wann dieser Puffer voll ist, und geeignete Videobilder für Live-Streams verwerfen. Es ist besser, die Unicast / TCP-Methode zu verwenden, da die Serversoftware die richtige Frame-Drop-Logik implementieren kann. Zufällig fehlende Pakete im UDP-Fall führen nur zu einer schlechten Benutzererfahrung. wie in diesem Video: http://tinypic.com/r/2qn89xz/9
Dies gilt für private Netzwerke. Multicast ist nicht über das Internet aktiviert.
UDP kümmert sich auch nicht darum, ganze Frames oder Frame-Gruppen zu löschen, sodass die Benutzererfahrung nicht mehr kontrolliert werden kann.
Codiertes Video ist nicht fehlertolerant. Bei der Übertragung über einen unzuverlässigen Transport wird dem Videocontainer eine Vorwärtsfehlerkorrektur hinzugefügt. Ein gutes Beispiel ist der MPEG-TS-Container, der in Satellitenvideosendungen verwendet wird und mehrere Audio-, Video-, EPG- usw. Streams überträgt. Dies ist erforderlich, da die Satellitenverbindung keine Duplexkommunikation ist und der Empfänger keine erneute Übertragung verlorener Pakete anfordern kann.
Wenn Sie über Duplex-Kommunikation verfügen, ist es immer besser, Daten nur an Clients mit Paketverlust erneut zu übertragen, als den Aufwand für die Vorwärtsfehlerkorrektur in den an alle Clients gesendeten Stream einzubeziehen.
In jedem Fall sind verlorene Pakete nicht akzeptabel. Abgelegte Frames sind in Ausnahmefällen in Ordnung, wenn die Bandbreite eingeschränkt ist.
Das Ergebnis fehlender Pakete sind Artefakte wie dieses:
Einige Decoder können in Streams, in denen Pakete fehlen, an kritischen Stellen unterbrochen werden.
quelle
Ich empfehle Ihnen, sich das neue P2P-Live-Protokoll Bittorent Live anzusehen .
Für das Streaming ist es besser, UDP zu verwenden, da es die Serverlast verringert, aber hauptsächlich, weil Sie Pakete mit Multicast senden können, ist es einfacher, als es an jeden verbundenen Client zu senden.
quelle
Es hängt davon ab, ob. Wie kritisch ist der Inhalt, den Sie streamen? Wenn kritisch, verwenden Sie TCP. Dies kann zu Problemen mit der Bandbreite, der Videoqualität (möglicherweise müssen Sie eine niedrigere Qualität verwenden, um die Latenz zu bewältigen) und der Latenz führen. Wenn Sie jedoch den Inhalt benötigen, um garantiert dorthin zu gelangen, verwenden Sie ihn.
Andernfalls sollte UDP in Ordnung sein, wenn der Stream nicht kritisch ist und bevorzugt wird, da UDP tendenziell weniger Overhead hat.
quelle
Eines der größten Probleme bei der Bereitstellung von Live-Events im Internet ist die Skalierung, und TCP lässt sich nicht gut skalieren. Wenn Sie beispielsweise ein Live-Fußballspiel übertragen - im Gegensatz zu einer On-Demand-Filmwiedergabe -, kann die Anzahl der Zuschauer leicht 1000-mal höher sein. In einem solchen Szenario ist die Verwendung von TCP ein Todesurteil für die CDNs (Content Delivery Networks).
Es gibt einige Hauptgründe, warum TCP nicht gut skaliert:
Einer der größten Nachteile von TCP ist die Variabilität des Durchsatzes, die zwischen dem Sender und dem Empfänger erreichbar ist. Beim Streamen von Videos über das Internet müssen die Videopakete mehrere Router über das Internet durchlaufen. Jeder dieser Router ist mit Verbindungen unterschiedlicher Geschwindigkeit verbunden. Der TCP-Algorithmus beginnt mit einem kleinen TCP-Fenster und wächst dann, bis ein Paketverlust erkannt wird. Der Paketverlust wird als Zeichen einer Überlastung angesehen und TCP reagiert darauf, indem die Fenstergröße drastisch reduziert wird, um eine Überlastung zu vermeiden. Dadurch wird der effektive Durchsatz sofort reduziert. Stellen Sie sich nun ein Netzwerk mit TCP-Übertragung vor, das 6-7 Router-Hops zum Client verwendet (ein ganz normales Szenario). Wenn einer der Zwischenrouter ein Paket verliert, verringert der TCP für diese Verbindung die Übertragungsrate. Tatsächlich folgt der Verkehrsfluss zwischen Routern einer Sanduhrform. Gong immer zwischen einem der Zwischenrouter auf und ab. Das Rendern des effektiven Durchsatzes ist im Vergleich zu UDP mit bestem Aufwand viel geringer.
Wie Sie vielleicht bereits wissen, ist TCP ein bestätigungsbasiertes Protokoll. Nehmen wir zum Beispiel an, ein Absender ist 50 ms entfernt (dh Latenz zwischen zwei Punkten). Dies würde bedeuten, dass es 100 ms dauert, bis ein Paket an einen Empfänger gesendet wird und der Empfänger eine Bestätigung sendet. Somit ist der maximal mögliche Durchsatz im Vergleich zur UDP-basierten Übertragung bereits halbiert.
Das TCP unterstützt weder Multicasting noch den neuen Standard für Multicasting-AMT. Dies bedeutet, dass die CDNs nicht die Möglichkeit haben, den Netzwerkverkehr durch Replizieren der Pakete zu reduzieren, wenn viele Clients denselben Inhalt ansehen. Das selbst ist ein Grund genug für CDNs (wie Akamai oder Level3), nicht mit TCP für Live-Streams zu arbeiten.
quelle
Beim Lesen der TCP-UDP-Debatte habe ich einen logischen Fehler festgestellt. Ein TCP-Paketverlust, der eine Verzögerung von einer Minute verursacht und in einen Puffer von einer Minute umgewandelt wird, kann nicht damit korreliert werden, dass UDP eine volle Minute verliert, während derselbe Verlust auftritt. Ein fairer Vergleich ist wie folgt.
TCP erfährt einen Paketverlust. Das Video wird angehalten, während die Pakete von TCP erneut gesendet werden, um zu versuchen, mathematisch perfekte Pakete zu streamen. Das Video wird um eine Minute verzögert und dort fortgesetzt, wo es aufgehört hat, nachdem das fehlende Paket sein Ziel erreicht hat. Wir warten alle, aber wir wissen, dass wir kein einziges Pixel verpassen werden.
Bei UDP tritt ein Paketverlust auf. Während des Videostreams wird eine Ecke des Bildschirms für eine Sekunde etwas verschwommen. Niemand bemerkt es und die Show geht weiter, ohne nach den verlorenen Paketen zu suchen.
Alles, was gestreamt wird, profitiert am meisten von UDP. Der Paketverlust, der eine Verzögerung von einer Minute für TCP verursacht, würde keine Verzögerung von einer Minute für UDP verursachen. In Anbetracht der Tatsache, dass die meisten Systeme Streams mit mehreren Auflösungen verwenden, wodurch die Dinge beim Verhungern nach Paketen blockiert werden, ist die Verwendung von UDP noch sinnvoller.
UDP FTW beim Streaming.
quelle
Wenn die Bandbreite weit über der Bitrate liegt, würde ich TCP für Unicast-Live-Video-Streaming empfehlen.
Fall 1: Aufeinanderfolgende Pakete gehen für eine Dauer von mehreren Sekunden verloren. => Live-Videos werden auf der Clientseite unabhängig von der Transportschicht (TCP oder UDP) angehalten. Wenn das Netzwerk wiederhergestellt wird: - Wenn TCP verwendet wird, kann der Client-Videoplayer wählen, ob der Stream beim ersten verlorenen Paket neu gestartet werden soll (Timeshift) oder ob alle verspäteten Pakete verworfen werden sollen und ob der Videostream ohne Timeshift neu gestartet werden soll. - Wenn UDP verwendet wird, gibt es auf der Clientseite keine Auswahl. Der Videostart wird ohne Zeitverschiebung live neu gestartet. => TCP gleich oder besser.
Fall 2: Einige Pakete gehen zufällig verloren und gehen häufig im Netzwerk verloren. - Wenn TCP verwendet wird, werden diese Pakete sofort erneut übertragen, und mit einem korrekten Jitterpuffer hat dies keine Auswirkungen auf die Qualität / Latenz des Videostreams. - Wenn UDP verwendet wird, ist die Videoqualität schlecht. => TCP viel besser
quelle
Für Video-Streaming ist die Bandbreite wahrscheinlich die Einschränkung des Systems. Mit Multicast können Sie die verwendete Upstream-Bandbreite erheblich reduzieren. Mit UDP können Sie Ihre Pakete problemlos an alle angeschlossenen Terminals multicasten. Sie können auch ein zuverlässiges Multicast-Protokoll verwenden, eines heißt Pragmatic General Multicast (PGM). Ich weiß nichts darüber und denke, es ist in seiner Verwendung nicht weit verbreitet.
quelle
Neben all den anderen Gründen kann UDP Multicast verwenden. Die Unterstützung von Tausenden von TCP-Benutzern, die alle dieselben Daten übertragen, verschwendet Bandbreite. Es gibt jedoch noch einen weiteren wichtigen Grund für die Verwendung von TCP.
TCP kann viel einfacher durch Firewalls und NATs geleitet werden. Abhängig von Ihrem NAT und Operator können Sie aufgrund von Problemen mit dem Stanzen von UDP-Löchern möglicherweise nicht einmal einen UDP-Stream empfangen.
quelle
Alle "UDP verwenden" -Antworten setzen ein offenes Netzwerk voraus und nähern sich so weit wie möglich. Gut für alte Audio- / Videonetzwerke im geschlossenen Garten, die verschwinden.
In der tatsächlichen Welt wird Ihre Übertragung über Firewalls (die Multicast und manchmal auch udp löschen) erfolgen. Das Netzwerk wird mit anderen wichtigeren ($$$) Apps geteilt, sodass Sie Missbraucher mit Fensterskalierung bestrafen möchten .
quelle
Dies ist die Sache, es ist mehr eine Frage des Inhalts als ein Zeitproblem. Das TCP-Protokoll erfordert, dass ein nicht zugestelltes Paket überprüft, verifiziert und erneut zugestellt werden muss. UDP verwendet diese Anforderung nicht. Wenn Sie also eine Datei mit UDP gesendet haben, die Millionen von Paketen enthält, wie z. B. ein Video, und einige der Pakete bei der Zustellung fehlen, werden sie höchstwahrscheinlich nicht übersehen.
quelle