Определение портов «listen», «listenaddr» и «discovery» из admin.nodeinfo?

Если вы наберете «admin.nodeInfo» в консоли javascript, вы увидите:

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

(вместе с кучей других вещей, конечно.)

Итак, у нас есть эти три порта: listenAddr, listener, discovery. Что каждый из них означает в данном контексте.

Я не спрашиваю о порте RPC или порте веб-сокетов. Я конкретно спрашиваю о том, что только что упомянул.

Совпадают ли ваши порты обнаружения и прослушивания?
@ 0xcaff Согласно показанному выше, да. Но это, по сути, то, к чему идет мой вопрос. Как только я узнаю, в чем заключаются различия, я, возможно, смогу узнать, как их изменить и какой цели это может служить.
@stone212 ты когда-нибудь докопался до сути этого?
@significance Нет, я не думаю, что использовал, и я перестал использовать гет больше года назад. Но я многому научился с мая 2017 года, поэтому, если у вас есть вопрос, связанный с этим, возможно, я смогу ответить?
@stone212 спасибо за предложение! я думаю, что докопался до сути. это очень запутанно, потому что geth использует 30303/tcp для связи с портом и 30303/udp для обнаружения kademlia. я напишу это ниже, когда я получу мес...

Ответы (2)

В основном есть три важных порта. Первый — это порт обнаружения, а два других — это порты прослушивателя:

  1. Порт обнаружения: (по умолчанию 30303). Этот порт используется для подключения к другим узлам geth.
  2. Порт RPC: (по умолчанию 8545). Этот порт используется для отправки запросов JSON-rpc клиенту geth.
  3. Порт веб-сокета: (по умолчанию 8546) Вы можете подключиться к клиенту geth с помощью веб-сокетов.

Все они являются независимыми процессами и, следовательно, не могут работать на одних и тех же портах.

Спасибо, что нашли время ответить, но это вообще не относится к моему вопросу. Мой вопрос заключается в том, что насчет значений «listenAddr» и «listener», которые я нахожу с помощью «admin.nodeInfo», и как они связаны с портом Discovery? Я отредактировал свой пост для большей ясности.
ethereum.stackexchange.com/questions/809/… это наверняка вам поможет
Акшай, я ценю усилия, но в этом посте упоминается, что существуют прослушиватель и порт обнаружения. Но из моего ОП вы видите, что я это уже знал. Там сказано, что они могут быть одинаковыми, что приятно, хотя я не сомневался в этом.

listenAddr - это адрес, т.е. содержит IP+номер порта

слушатель - это только номер порта

открытие также является номером порта для поиска новых пиров


Слово listenerимеет значение соединяющих ворот, например, это еще один фрагмент исходного кода эфириума («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

В Go Listenerстандартный тип:

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
    }

Это значение слова listener, но ListenAddrэто полный адрес сокета. он определен в ядре Linux как эта структура:

#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
};

Поля sin_addrи sin_portвместе это переменная , собственно, это и должен вернуть listenAddrметод .Addr()

Но в коде Ethereum, говоря, что listenerони не ссылаются Interface listenerни на объект, который реализует интерфейс слушателя, они ссылаются на файл port number.

Можно немного конкретнее? Является ли «слушатель» ВСЕГДА номером порта, который входит в «listenAddr», или они не связаны? И утверждение, что что-то является адресом или номером порта, не объясняет, что это такое или чем оно отличается от других адресов или номеров портов. Если вы отредактируете свой ответ, чтобы ответить на вопрос, я отмечу его как ответ.
@stone212 Я как бы пытался объяснить, проверьте, понимаете ли вы это
Я не делаю. Последний абзац — это первая часть, которая, кажется, относится к вопросу. Единственные части, которые вы упомянули, которые говорят о терминах, которые я прошу, только повторяют то, что вы сказали ранее. Спасибо, что нашли время, но это никоим образом не является ответом на мой вопрос.
@stone212 да, ты просто ничего не понимаешь из того, что я только что сказал. Вы должны прочитать о протоколе TCP/IP и о сетевом программировании. Только тогда ты это поймешь.
Я думаю, может быть, вы путаете это с другим ответом, который вы, возможно, написали? Это не связано с сетью, определенно не с TCP/IP. Вопрос касался определения «прослушивания», «listenaddr» и «обнаружения», поскольку они связаны с выводом «admin.nodeinfo» в консоли javascript. Все нормально. Иногда мне кажется, что я тоже в другой теме.
@ stone212 нет, ваш вопрос больше о сети. Я помню, вы должны прочитать TCP/IP, но, возможно, больше о том, что такое сокет. Если вы называете listenAddrпорт, то вы не понимаете, что адрес в Интернете состоит из двух вещей: IP-адреса и номера порта. В противном случае вы бы не позвонили listenAddrв порт, если бы знали это. Кроме того, двойное двоеточие в вашем примере означает, что это адрес IPv6, и он имеет нулевое значение, это нотация, используемая для выражения и адреса, заполненного нулями. Ваш вопрос некорректен из-за этого, здесь не 3 порта, а только 2 порта.
Я не собираюсь использовать чат, чтобы спорить. Но я много лет занимаюсь DevOps, так что проблема не в неправильном понимании TCP/IP. Это Ethereum, я не понимаю. :) Если вы хотите еще раз попытаться ответить на вопрос, ладно. Если нет, то тоже нормально. Спасибо за попытку.