Ports „listen“, „listenaddr“ und „discovery“ von admin.nodeinfo aus definieren?

Wenn Sie „admin.nodeInfo“ in die Javascript-Konsole eingeben, sehen Sie Folgendes:

 listenAddr: "[::]:<value>",
  name: "Geth/v1.6.1-stable-021c3c28/linux-amd64/go1.8.1",
  ports: {
    discovery: <value>,
    listener: <value>
  },

(Natürlich zusammen mit ein paar anderen Sachen.)

Wir haben also diese drei Ports: listenAddr, listener, discovery. Was bedeutet jeder von ihnen in diesem Zusammenhang.

Ich frage nicht nach dem RPC-Port oder dem Websockets-Port. Ich frage speziell nach dem, was ich gerade erwähnt habe.

Sind Ihre Discovery- und Listener-Ports identisch?
@0xcaff Laut obiger Anzeige ja. Aber darauf zielt meine Frage im Wesentlichen ab. Sobald ich weiß, was die Unterschiede sind, kann ich vielleicht lernen, wie ich sie ändern kann und welchem ​​Zweck das dienen könnte.
@stone212 bist du dem jemals auf den Grund gegangen?
@significance Nein, ich glaube nicht, dass ich das getan habe, und ich habe vor mehr als einem Jahr aufgehört, Geth zu verwenden. Aber ich habe seit Mai 2017 viel gelernt. Wenn Sie also eine Frage haben, die sich darauf bezieht, kann ich sie vielleicht beantworten?
@stone212 danke für das Angebot! ich glaube ich bin der Sache auf den Grund gegangen. es ist sehr verwirrend, weil geth 30303/tcp für die Portkommunikation und 30303/udp für die kademlia-Erkennung verwendet. Ich schreibe es unten, wenn ich eine Mo habe ...

Antworten (2)

Grundsätzlich gibt es drei wichtige Ports. Der erste ist der Discovery-Port und die anderen beiden sind Listener-Ports:

  1. Erkennungsport: (Standard ist 30303). Dieser Port wird für die Verbindung zu anderen Geth-Knoten verwendet.
  2. RPC-Port: (Standard ist 8545). Dieser Port wird verwendet, um JSON-rpc-Anforderungen an den Geth-Client zu senden.
  3. Websocket-Port: (Standard ist 8546) Sie können sich mit Websockets mit dem Geth-Client verbinden.

Alle von ihnen sind unabhängige Prozesse und können daher nicht auf denselben Ports ausgeführt werden.

Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten, aber das entspricht überhaupt nicht meiner Frage. Meine Frage ist, was ist mit den Werten "listenAddr" und "listener", die ich mit "admin.nodeInfo" finde, und wie beziehen sie sich auf den Discovery-Port? Ich habe meinen Beitrag für mehr Klarheit bearbeitet.
ethereum.stackexchange.com/questions/809/… das könnte dir sicherlich weiterhelfen
Akshay Ich schätze die Mühe, aber dieser Beitrag erwähnt, dass es einen Listener und einen Discovery-Port gibt. Aber aus meiner OP sieht man, dass ich das schon wusste. Es heißt, dass sie gleich sein können, was schön ist, obwohl ich daran nicht wirklich zweifelte.

listenAddr ist eine Adresse, dh enthält IP+Portnummer

listener ist nur eine Portnummer

Discovery ist auch eine Portnummer zum Finden neuer Peers


Das Wort listenerhat zum Beispiel die Bedeutung eines verbindenden Tors, dies ist ein weiteres Stück der Quelle von Ethereum ('node/node.go'):

    ipcListener net.Listener // IPC RPC listener socket to serve API requests
    httpListener  net.Listener // HTTP RPC listener socket to server API requests
    wsListener net.Listener // Websocket RPC listener socket to server API requests

In Go Listenerist ein Standardtyp:

A Listener is a generic network listener for stream-oriented protocols.

Multiple goroutines may invoke methods on a Listener simultaneously.

    type Listener interface {
            // Accept waits for and returns the next connection to the listener.
            Accept() (Conn, error)

            // Close closes the listener.
            // Any blocked Accept operations will be unblocked and return errors.
            Close() error

            // Addr returns the listener's network address.
            Addr() Addr
    }

Dies ist die Bedeutung des Wortes listener, ist aber ListenAddrdie vollständige Adresse des Sockets. Es ist im Linux-Kernel als diese Struktur definiert:

#include <netinet/in.h>

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

Die Felder sin_addrund sin_portsind zusammen die Variable listenAddr, eigentlich sollte die Methode dies Addr()zurückgeben.

Aber im Ethereum-Code listenerverweisen sie nicht auf das Interface listeneroder das Objekt, das die Listener-Schnittstelle implementiert, sondern auf die port number.

Kannst du etwas genauer werden? Ist "Listener" IMMER die Portnummer, die in "listenAddr" eingeht, oder sind sie unabhängig? Und zu sagen, dass etwas eine Adresse oder eine Portnummer ist, erklärt nicht, was es ist oder wie es sich von anderen Adressen oder Portnummern unterscheidet. Wenn Sie Ihre Antwort bearbeiten, um die Frage zu beantworten, werde ich sie als Antwort markieren.
@ stone212 Ich habe versucht zu erklären, ob du es verstehst
Ich nicht. Der letzte Absatz ist der erste Teil, der sich auf die Frage zu beziehen scheint. Die einzigen Teile, die Sie erwähnt haben und die sich auf die von mir gestellten Begriffe beziehen, wiederholen nur, was Sie zuvor gesagt haben. Vielen Dank, dass Sie sich die Zeit genommen haben, aber das ist keine Antwort auf meine Frage.
@ stone212 es ist, du verstehst einfach nichts von dem, was ich gerade gesagt habe. Sie sollten sich über das TCP/IP-Protokoll und über die Netzwerkprogrammierung informieren. Nur dann wirst du es verstehen.
Ich denke, Sie verwechseln dies vielleicht mit einer anderen Antwort, die Sie vielleicht geschrieben haben? Dies hat nichts mit Netzwerken zu tun, definitiv nicht mit TCP/IP. Die Frage bezog sich auf die Definition von „listen“, „listenaddr“ und „discovery“ in Bezug auf die Ausgabe von „admin.nodeinfo“ an der Javascript-Konsole. Es ist okay. Manchmal glaube ich auch, ich bin in einem anderen Thread.
@stone212 nein, deine Frage bezieht sich eher auf das Networking. Ich erinnere mich, Sie sollten TCP/IP lesen, aber wahrscheinlich mehr darüber, was ein Socket ist. Wenn Sie listenAddreinen Port nennen, verstehen Sie nicht, dass eine Adresse im Internet aus 2 Dingen besteht, einer IP-Adresse und einer Portnummer. Sonst würden Sie keinen listenAddrHafen anlaufen, wenn Sie das wüssten. Außerdem bedeutet ein doppelter Doppelpunkt in Ihrem Beispiel, dass es sich um eine IPv6-Adresse handelt und einen Nullwert hat. Dies ist die Notation, die verwendet wird, um eine Adresse voller Nullen auszudrücken. Ihre Frage ist aus diesem Grund falsch, hier gibt es keine 3 Ports, sondern nur 2 Ports.
Ich werde den Chat nicht benutzen, um zu streiten. Aber ich bin seit Jahren in DevOps, also liegt das Problem nicht darin, TCP/IP falsch zu verstehen. Es ist Ethereum, das verstehe ich nicht. :) Wenn Sie noch einmal versuchen möchten, die Frage zu beantworten, okay. Wenn nicht, ist das auch okay. Danke für den Versuch.