Warum verwendet Bitcoin UDP nicht für die Blockpropagation?

Bitcoin verwendet TCP für P2P, aber warum wird UDP nicht verwendet? Das moderne Internet hat eine relativ niedrige Paketverlustrate, sodass UDP zuverlässig ist. Selbst wenn einige Pakete verworfen werden, können die Peers immer die Blöcke anfordern. Bei TCP ist das Netzwerk eher statisch aufgebaut, während Sie bei UDP jedes Mal, wenn ein Block propagiert wird, einen zufälligen Graphen erstellen können, da UDP verbindungslos ist.

NANO verwendet UDP und ich denke, es ist ein guter Ansatz. Ich bin nur neugierig, ob ich etwas vermisse. Bootstrapping kann offensichtlich mit TCP durchgeführt werden.

Antworten (4)

Das Bitcoin-System hat nicht nur ein Netzwerkprotokoll: Jeder Weg, um die Blöcke zu erhalten, ist gleichermaßen gültig – Blöcke über Freenet, über Satellitenübertragung, über das P2P-Netzwerk, alle funktionieren genauso gut und werden in der Praxis verwendet. UDP wird auch mit Bitcoin vom Fiber-Protokoll verwendet .

Soweit das gängige Bitcoin P2P-Protokoll geht, ist UDP für die meisten Operationen, die es ausführt, nicht besonders gut geeignet. Bitcoin muss zuverlässig Nachrichten senden, die viel größer als ein IP-Paket sind, wie Transaktionen und Blöcke. Obwohl das Internet "zuverlässig" ist, sind Paketverlustraten von 1-3% üblich. Das bedeutet, dass jede Anwendung, die große Nachrichten mit UDP übertragen muss, Paketierung, Neuübertragung, Neuordnung usw. implementieren muss – dieselben Dinge, die TCP bereits für uns implementiert. Viele Anwendungen, die im Userspace 'ihr eigenes TCP gerollt' haben, haben am Ende ausnutzbare Bugs in sich, also sollte dies nicht ohne guten Grund getan werden.

UDP hat auch das Problem des NAT-Traversal: Bidirektionale Kommunikation über ein NAT mit UDP zu erhalten, ist keine einfache Angelegenheit. Das Überqueren von etwas Komplizierterem als einem Full-Cone-Nat erfordert beträchtliche Mengen an speziellem Code, aber ohne ihn wird es viele Hosts geben, die einfach nicht mit anderen Peers mit UDP kommunizieren können.

Sie erwähnen die Verbindungslosigkeit, die es Ihnen ermöglicht, zu einem zufälligen Host im Netzwerk zu wechseln, aber in Bitcoin P2P nutzen wir die konsistente Beziehung zwischen Knoten, um das Netzwerk zuverlässiger und effizienter zu machen. Knoten haben eine Vorstellung davon, was ihre Kollegen bereits wissen, und können es vermeiden, ihnen redundante Daten zu senden. Knoten wissen auch, welche Peers ihnen in der Vergangenheit am schnellsten Blöcke gesendet haben, und behandeln sie speziell. Auch wenn das Protokoll verbindungslos ist, entstehen Kosten für die Verarbeitung von Nachrichten von Peers, indem die Verarbeitung von Nachrichten von vorhandenen Peers priorisiert wird. Bitcoin reduziert die Auswirkungen einiger Arten von DOS-Angriffen. Die Handhabung von Nachrichten, die größer als ein Paket sind, Neuübertragungen usw. bedeutet auch, dass selbst bei einem verbindungslosen Transport immer noch eine Art dauerhafter Zustand vorhanden sein muss.

Aber eine if-Implementierung wollte zufällig eine Verbindung herstellen, um eine Nachricht zu senden, die es könnte, gegen Aufpreis sind ein paar Hin- und Rückfahrten für den Handshake. Oder nicht einmal das: Es gibt nur etwa 10.000 erreichbare Knoten im P2P-Netzwerk, es wäre keine große Herausforderung, eine meist inaktive TCP-Verbindung zu jedem einzelnen von ihnen offen zu halten, wenn der gesamte beibehaltene Zustand nur das TCP wäre Zustand. An dieser Stelle wäre die Verwendung von UDP bestenfalls nur eine Optimierung für etwas, das bereits getan werden könnte, aber nicht getan wird. Ich denke, es wäre interessanter, zuerst die Nützlichkeit all dieser Verbindungen zu demonstrieren, bevor Sie sich Gedanken über die Optimierung machen.

Warum also könnte der UDP-Transport für das Bitcoin P2P-Protokoll nützlich sein?

  • Um eine Blockübertragung mit niedrigster Latenz zu erzielen, darf es selbst bei Paketverlusten keine Roundtrips geben, was TCP ausschließt, und aus diesem Grund verwendet Fiber UDP. Um jedoch keine Roundtrips zu erhalten, muss das Protokoll in der Lage sein, Verluste ohne erneute Übertragung zu verarbeiten, und um eine niedrige Latenz zu erzielen, muss ein Block mit einer minimalen Menge an empfangenen Daten dekodierbar sein. Dies erfordert sehr ausgefeilte Fehlerkorrekturtechniken, die sich in einem sich entwickelnden Bereich befinden und noch nicht ausgereift genug sind, um sie in Betracht zu ziehen. Die Latenzvorteile von Glasfaser bestehen auch, solange eine kleine Anzahl von Hosts sie verwendet, da sie die schwere Arbeit übernimmt, Blöcke auf der ganzen Welt zu nehmen. Roundtrips richten bei Verbindungen mit geringer Latenz keinen großen Schaden an. Und diese Latenzbedenken gelten nur für Block-Relay.

  • Im Gegensatz zu TCP erfordert UDP ein gewisses Maß an NAT-Traversal-Handhabung, um einfach die bidirektionale Kommunikation zum Laufen zu bringen. In Kombination mit der vollständigen Behandlung von NAT-Traversal ist UDP jedoch häufig in der Lage, eine Kommunikation zwischen Hosts herzustellen, die sich beide hinter verschiedenen NATs befinden. Dies könnte für das Bitcoin P2P-Netzwerk hilfreich sein, da die meisten Hosts hinter einem nat nicht erreichbar sind. Ironischerweise ist also eine der Herausforderungen von UDP auch eine seiner Verwendungen. Um jedoch Hosts zu verbinden, die sich beide hinter einem Netz befinden, ist die Unterstützung eines nicht-natted Hosts eines Drittanbieters zusammen mit noch mehr NAT-Traversalcode erforderlich. In Anbetracht der Komplexität der Traversierung wäre eine Verbesserung der Unterstützung von Bitcoin für TCP-Port-Mapping (z. B. Implementierung von NAT-PMP) derzeit wahrscheinlich eine bessere Kapitalrendite.

  • Die Verwendung von UDP würde eine "schlechteste als die beste Anstrengung"-Verkehrsabwicklung ermöglichen. Für "Massenverkehr" mit niedriger Priorität wie das Synchronisieren der Blockchain wäre es schön, wenn sich der Verkehr sorgfältig selbst gestalten würde, um eine Störung des anderen Verkehrs im Netzwerk zu vermeiden. Alternative Überlastungskontrollalgorithmen wie LEDBAT machen es möglich, Daten mit niedriger Priorität mit minimalen Auswirkungen zu übertragen. Da TCP-Stacks diese Überlastungskontrollansätze jedoch noch nicht allgemein unterstützen, müssen Anwendungen, die sie benötigen, derzeit ihre eigenen Transporte implementieren. Für Bitcoin wäre es ideal, wenn wir einfach eine Socket-Option umdrehen und LEDBAT bei bestehenden Verbindungen ein- und ausschalten könnten (z. B. wenn der Peer historische Blöcke anfordert oder in Zukunft, wenn etwas wie Fiber vom Knoten verwendet wird, um neue Blöcke weiterzuleiten ) aber das ist '

[Diese letzten beiden Gründe sind die Gründe, warum Bittorrent normalerweise UDP verwendet]

@g-maxwell Tolle Antwort. Was halten Sie von folgendem: Wenn es sich um ein PoS-System handelt, in dem bestimmte Prüfer nur Transaktionen verarbeiten können. Anstatt sich auf die TCP-Blockpropagation zu verlassen, halten Sie es für sinnvoll, wenn diese Validatoren UDP-Transaktionsanfragen akzeptieren, damit wir Transaktionen schneller validieren können? Mit anderen Worten, sehen Sie einen Nachteil darin, TCP für die Blockausbreitung (große Daten) und UDP für einzelne Transaktionsanforderungen zu verwenden, sodass die Knoten keine TCP-Verbindung herstellen müssen?
Warum müssen sich Transaktionen schnell ausbreiten? Diese Prämisse steht im Allgemeinen im Konflikt mit der Privatsphäre.
Denn wenn wir eine echte Akzeptanz für Krypto wollen, müssen zwei Dinge passieren: stabile Währung und Bestätigungszeit. Wir können die Stabilität durch Pegging lösen und das lässt uns Zeit für die Bestätigung. Um eine Bestätigungszeit von 2–3 Sekunden zu erreichen, benötigen wir einen schnelleren Relaismechanismus als eine Ausbreitung.
Bitcoin erreicht den größten Teil der Netzwerklaufzeit für kleine Blöcke unter einer Sekunde ... es besteht keine Notwendigkeit, etwas anderes als TCP dafür zu verwenden. Aber 2-3 Sekunden wahre Bestätigungszeit drängen mit den Gesetzen der Physik für ein tatsächlich dezentrales Netzwerk, das die Erde umspannt, und sind mit echten Netzwerken wahrscheinlich praktisch nicht möglich. Manchmal, wenn auch nicht oft, werden ganze Kontinente meist minutenlang voneinander getrennt.
Wenn Sie das ganze POW vs. Pos-Argument beiseite legen können, habe ich tatsächlich einen funktionierenden Prototypen, der ein echtes Testnetz in einer geografisch dislozierten Umgebung ausgeführt hat, wo ich (mein Team) eine 6-7-sekündige echte Bestätigung erzielte. Dies beinhaltet natürlich nicht die Transaktionsübermittlungszeit. Um hier also die Frage zu stellen, Greg: Wäre die Übermittlung von UDP-Transaktionen in meiner Umgebung eine gute Idee? Schätzen Sie Ihre Einsicht, da Sie in meinem Buch sehr respektiert werden.

NANO verwendet UDP einfach für Blöcke, die normalerweise (sicherlich meistens, aber immer??) kleiner als die theoretische Größenbeschränkung eines UDP-Pakets von 65 KB sind. Im Fall von Bitcoin sind Transaktionen ≠ Blöcke. Es ist sicherlich ineffizient, lange Daten (Bitcoin-Blöcke können bis zu 4 Megabyte groß sein – theoretisch) mit UDP zu übertragen, und so wählen auch andere Dienste zwischen ihnen. Außerdem, selbst wenn Blöcke ein paar Kilobyte groß sind, wird der Paketverlust dazu führen, dass Bergleute VIEL verlieren, da eine Verzögerung von wenigen Sekunden erheblich ist.

Wenn die Daten klein sind, können Sie nur ein Paket senden (das normalerweise viel kleiner als 65 KB ist). Ansonsten sind die Dinge mit TCP, Handshake und Keepalive nicht teuer.

Wissenswertes: In Satoshis Client gab es keine zusätzlichen Fehlerkorrekturcodes im Protokoll. Satoshi Trusted TCP-Fehlerkorrektur.

Block ist Bitcoin ist 1 MB. Sicher, es passt nicht in ein einziges UDP-Datagramm, und selbst wenn, ist es bei 65 KB immer noch der Fragmentierung ausgesetzt. Es macht jedoch keinen Sinn, die Transaktion selbst nicht UDP-basiert zu lassen

UDP ist in Bitcoin nicht sehr nützlich. Es ist weitgehend eine unidirektionale Kommunikationsstruktur, während Bitcoin auf bidirektionale Kommunikation angewiesen ist. Wenn sich ein Knoten mit einem anderen Knoten verbindet, gibt es einen gespeicherten Zustand für diese Knoten (Knoten verfolgen Dinge, die sie an andere Knoten gesendet haben, und Dinge, die sie von anderen Knoten empfangen haben) und es gibt eine Hin- und Her-Kommunikation (z. B. senden inv, empfangen getdataAntwort und senden Sie die Daten). UDP ist dafür nicht geeignet, aber TCP schon.

Darüber hinaus setzt UDP die Knoten der Unzuverlässigkeit der Netzwerke aus. Die Paketverlustrate ist nicht 0 (und kann nicht 0 sein), daher führt die Verwendung von UDP dazu, dass aufgrund von Paketverlusten viele zusätzliche Daten gesendet werden. Dies liegt daran, dass Blöcken und Transaktionen keinerlei Bytes fehlen dürfen. Andernfalls werden sie ungültig. Wenn bei TCP ein Paket verworfen wird, übernimmt TCP das erneute Senden der Daten. Bei UDP muss dies jedoch auf der Anwendungsebene gehandhabt werden, und es wird nur kompliziert, da das Herausfinden, was gelöscht wurde, eine bidirektionale Kommunikation erfordert, die mit UDP nicht einfach zu bewerkstelligen ist.

Insgesamt ist UDP also für Bitcoin nicht sinnvoll. Es unterstützt keine bidirektionale Kommunikation und garantiert keine Paketzustellung. Beides ist notwendig, damit das P2P-Protokoll von Bitcoin funktioniert, daher kann UDP nicht verwendet werden. TCP erledigt beides auf Protokollebene, also wird es verwendet.

Das ist falsch. Zunächst einmal ist UDP keine unidirektionale Kommunikation. UDP ist verbindungslos, jedoch kann Statefulness auf der Anwendungsschicht implementiert werden, was BITCOIN bereits tut. siehe ihr P2P-System. Wie ich schon sagte, der Verlust des Pakets ist kein Problem, da die ganze Idee eines P2P-Netzwerks so ist, dass es Paketverluste toleriert. Was also, wenn ein Knoten keine Transaktion erhalten hat, fragen Sie einfach erneut danach. Deine Antwort ist nicht sehr hilfreich. Es tut uns leid.
Ich zuckte auch ein wenig bei der unidirektionalen Behauptung zusammen, aber sie ist nicht ganz falsch: Deshalb ist NAT-Traversal ein Problem für UDP, während es für TCP keins ist. Es ist so, dass die Statefulness in der Anwendung implementiert werden kann und wird, aber die Statefulness von TCP selbst ist im Vergleich zur allgemeinen Statefulness des Protokolls wirklich bescheiden. Wie meine Antwort betonte: Es wäre völlig vernünftig, wenn jeder Bitcoin-Knoten eine TCP-Verbindung zu den meisten anderen erreichbaren Knoten hätte. Die staatlichen Kosten für das TCP selbst sind nicht so hoch. Der Status des Bitcoin-Protokolls ist eine andere Sache ...

Mittlerweile sind mehrere Reliable UDP-Implementierungen verfügbar, sodass Anforderungen wie die Wiederherstellung nach Paketverlust und Statefulness erfüllt werden können. Ein Beispiel ist die von der University of Chicago entwickelte UDT-Bibliothek: http://udt.sourceforge.net/

Wir haben ein Protokoll namens SRT (Secure Reliable Transport) entwickelt, das ursprünglich auf UDT basierte und um bidirektionale Datenübertragung und Verschlüsselung erweitert wurde. Obwohl es für Echtzeitdaten wie Video optimiert ist, ist es inhaltsunabhängig konzipiert: https://github.com/Haivision/srt

In Video-Anwendungsfällen sehen wir dramatisch erhöhte Bandbreitennutzungszahlen mit UDP über TCP (z. B. RTMP), besonders relevant für die Kommunikation über größere Entfernungen. Ich halte es für sinnvoll, UDP-basierte Alternativen für die Datenübertragung zwischen Knoten zu evaluieren, um die Netzwerkeffizienz zu erhöhen.

Haben Sie Kontaktinformationen, unter denen ich Sie erreichen kann - ich würde gerne darüber sprechen.