2015-06-01 2 views
4

Я создал tcp-соединение между клиентом и сервером с помощью nodejs (net module). Сервер прослушивает уже предопределенный порт, и клиент подключается к этому порту.Назначение порта клиента Nodejs TCP-соединения

Насколько я понимаю, порт для клиента динамически назначается узлом? Это верно?

  1. Какой узел алгоритма используется для назначения «случайного» порта для клиента? Как это работает, определяется ли это узлом или ОС?
  2. Можно ли определить статический порт, который клиент будет использовать? Можно ли определить диапазон портов для использования клиентом?

ПРИМЕЧАНИЕ: Я думаю, что я нашел обсуждение/вопрос с аналогичной темой на stackoverflow раньше, но я больше не могу его найти. Я был бы признателен, если вы сможете поделиться любыми надежными ресурсами по этому вопросу.

ответ

2

Номер порта источника, как правило, практически не имеет отношения к вашему программированию, если у вас нет маршрутизатора или брандмауэра, который является каким-то ограничительным в этом отношении. Он просто используется базовой инфраструктурой TCP для отслеживания различных TCP-соединений.

От this article:

TCP/IP соединение идентифицируется четыре элемента кортежа в: {исходный IP-, порт источника, IP назначения, порт назначения}. Для установления соединения TCP/IP требуется только IP-адрес и номер порта назначения, операционная система автоматически выбирает исходный IP-адрес и порт.

В приведенной выше статье описывается, как Linux выбирает номер порта источника.

Что касается ваших конкретных вопросов:

Какой алгоритм узла используется для назначения «случайный» порт для клиента ? Как это работает, определяется ли это узлом или ОС?

Определяется ОС. Этот номер порта источника выбирается исходящим хостом на уровне TCP до того, как соединение будет выполнено даже с узлом .js.

Некоторые другие справочные статьи:

Does the TCP source port have to be unique per host?

how can an application use port 80/HTTP without conflicting with browsers?


Примечание: нет никаких оснований безопасности я знаю для брандмауэра, чтобы ограничить номер порта источника или заблокировать определенный номера портов источника. Они - только номер бухгалтерии TCP, не связанный вообще с безопасностью или типом используемой службы. Обратите внимание, что это отличается от порта назначения, который обычно коррелирует непосредственно с типом используемой службы (например, 80 - это HTTP, 25 - SMTP, 143 - IMAP и т. Д. Когда вы делаете TCP-соединение с другим хостом, вы указываете адрес хоста и номер порта назначения. Вы не указываете номер порта источника.

+0

В моем исходном случае порта имеет значение, а потому что правила брандмауэра ограничительных (не определен мною, что означает, что я не могу изменить те). Поэтому в моем случае (на основе статьи, которую вы поделили) «cat/proc/sys/net/ipv4/ip_local_port_range» (linux) этот диапазон портов должен быть разрешен брандмауэром, чтобы клиент работал правильно. Я прав? – cool

+1

@cool - вы на 100% уверены, что порт источника ограничен брандмауэром. Очень часто ограничивается порт назначения, но не является общим для ограничения исходного порта (поскольку исходный порт не связан с безопасностью и является случайным значением, выбранным операционной системой хоста, создающей соединение). Фактически, блокировка номеров портов источника, которые регулярно назначаются исходящим TCP-соединениям, заставит многие вещи не работать, если порт источника был ограничен (включая интернет-просмотр). – jfriend00

+0

@cool - вам, возможно, нужно настроить клиента для использования внутреннего прокси для законного прохождения брандмауэра? – jfriend00

1

Выбранный ответ содержит много информации, но не касается основной проблемы. Узел, похоже, не позволяет https.request указывать порт для клиента. Существуют опции localAddress и localPort, но они кажутся разбитыми.

Я открыл новый вопрос по этому вопросу. Надеюсь, кто-то ответит чем-то другим, кроме «просто не делай этого».

Is there a way to set the source port for a node js https request?

+0

Я не думаю, что мы говорим о той же теме. По моему скромному мнению ответ от @ jfriend00 охватывал все. Мой вопрос был связан главным образом с необработанным tcp-соединением, которое сильно отличается от модуля «https» и использует его как до уровня tcp. – cool

Смежные вопросы