Warum begrenzt der Mainline-Client die Anzahl der ausgehenden Verbindungen auf 8?

Der Mainline-Bitcoin-Client begrenzt die Anzahl der ausgehenden Verbindungen auf 8, erlaubt jedoch insgesamt bis zu 125 Verbindungen. Um mehr als 8 Verbindungen zu erreichen (aufgrund der ausgehenden Beschränkung), muss entweder uPnp oder Portweiterleitung verwendet werden, damit der Client eingehende Verbindungen akzeptieren kann.

Warum gibt es ein Limit von 8 Verbindungen und nur für ausgehende Verbindungen? Warum nicht dem Client erlauben, 20 oder 125 ausgehende Verbindungen herzustellen?

Antworten (3)

Dies ist ein Legacy-Problem.

Als das Netzwerk zum ersten Mal implementiert wurde, gab es einen großen Mangel an Servern, die eingehende Verbindungen zuverlässig annehmen konnten. Viele Leute begannen, den Client hinter NAT auszuführen, und sie konnten keine eingehenden Verbindungen akzeptieren. In der Zwischenzeit verbrauchten sie die verfügbare Kapazität für eingehende Verbindungen der begrenzteren Anzahl von Computern, die sie akzeptieren konnten. Der Client aktiviert jetzt standardmäßig uPNP-Traversal.

Zweitens gab es Probleme mit dem Client-Code, die dazu führten, dass er nicht so viele Verbindungen unterstützen konnte, wie er hätte können sollen. Viele Knoten konnten nicht einmal die standardmäßigen 125 Verbindungen unterstützen, obwohl ihre CPU- und Netzwerkauslastung bei weitem nicht ausgeschöpft war.

Heutzutage ist es einfach irgendwie festgefahren. Meine 'Hub-Modus'-Patches machen es Clients leicht möglich, 1.500 Verbindungen zu unterstützen. Aber sie sehen fast nie mehr als 200 Clients, weil die Beschränkungen der Netzwerkkapazität längst vorbei sind.

Sie benötigen eine gesunde Anzahl ausgehender Verbindungen, da ein böswilliger Angreifer alle Ihre eingehenden Verbindungsslots verbrauchen kann, indem er sich wiederholt von einer Vielzahl von IP-Adressen aus mit Ihnen verbindet und in Verbindung bleibt. Der Bitcoin-Client hat tatsächlich Code, um zu versuchen, IP-Diversität in seine ausgehenden Verbindungen zu bekommen, um sich davor zu schützen, dass eine Entität eine Million Server erstellt und eine hohe Chance hat, alle 8 Ihrer ausgehenden Slots zu bekommen.

Wenn Sie paranoid sind, drehen Sie das auf. Sie können immer noch für 32 ausgehende Verbindungen konfigurieren, wenn Sie im Gegenzug auch mindestens 64 Slots für eingehende Verbindungen hinzufügen können. Sie werden dem Netzwerk helfen. Sie können dazu meine Hub-Modus-Patches verwenden.

Vielen Dank. Warum haben die Entwickler das Limit im Mainline-Client nicht erhöht? Man könnte meinen, dass sie mit jeder Version einige Anpassungen vornehmen würden. Wenn man sich den Newbie-Bereich im Bitcointalk-Forum ansieht, ist die langsame und inkonsistente Leistung beim Herunterladen von Blockchain ein ständiges Problem. Da die Blockchain wegfällt, erscheinen mir zumindest die 8 Verbindungslimits immer archaischer. Eine Erhöhung auf mindestens 16 würde einen höheren Durchsatz für neue Clients ermöglichen.
Ich denke, die langsame Blocksynchronisierungsrate ist auf zwei Probleme zurückzuführen, von denen keines mit dem Verbindungslimit zusammenhängt. Einer war ein Fehler, der behoben wurde, aber ältere Clients bringen immer noch neuere durcheinander. Die andere ist die Tatsache, dass der Client jeden Block, jeden Hash und jede Transaktion validiert. Es gibt über 100.000 Blöcke und typische PCs können nicht mehr als etwa 15 pro Sekunde validieren.

Bitcoin-Client, der eingehende Verbindungen akzeptiert, nennen wir es Server, kann eine begrenzte Anzahl davon akzeptieren. Angenommen, die Anzahl der Clients ist größer als die Anzahl der Server, wenn Clients keine starken Einschränkungen hinsichtlich der Anzahl der ausgehenden Verbindungen haben, dann würde dies die Server überlasten und einigen Clients den Zugriff auf Blockchain-Daten verweigern.

Stellen Sie sich zur Veranschaulichung eine Situation vor, in der es nur einen Server im Netzwerk und viele Bitcoin-Clients gibt, wenn Clients so viele Serververbindungen reservieren können, wie sie möchten, würde dies sicherlich einige Clients daran hindern, sich mit dem Server zu verbinden.

Die Konstanten zum Festlegen der Verbindungsnummern befinden sich in src/net.h

static const int MAX_OUTBOUND_CONNECTIONS = 8;

im Repo auf github: https://github.com/bitcoin/bitcoin/blob/3bf06e9bac57b5b5a746677b75e297a7b154bdbd/src/net.h#L59

ändern Sie, was Sie mögen und neu kompilieren