2016-01-06 4 views
1

СОПУТСТВУЮЩЕГО POSTВ случае успешного соединения TCP между сервером и клиентом

Сообщения здесь In UNIX forum описывает

  • сервера будет продолжать listeninig на номере порта.

  • Сервер принимает клиентов connect() с использованием accept(). Как только сервер принимает запрос клиента, ядро ​​выделяет случайный номер порта для сервера для дальнейших send() и , так как тот же номер порта на сервере не может использоваться для отправки, а также для прослушивания, а предыдущий порт все еще прослушивает новые соединения

ВОПРОС

у меня есть серверное приложение S, который постоянно прослушивает порт 18333 (это на самом деле bitcoindtestnet). Когда другой клиентский узел C соединяется с ним, скажем, 53446 (случайный порт). Согласно вышеуказанному сообщению, S сможет отправлять/получать данные «C» только с порта 53446.

Но когда я запускаю bitcoindtestnet. Это прекрасно связывается с другим узлом только с одним соединением сокета в порту 18333, без необходимости другого для отправки/получения. Ниже приведен фрагмент, и я даже подтвердил это

bitcoin-cli -testnet -rpcport=16591 -datadir=/home/user/mytest/1/ 

    { 
    "id": 1, 
    "addr": "178.32.61.149:18333" 
    } 

Может ли кто-нибудь помочь мне понять, что правильно работает в соединении сокетов TCP?

+1

Я не совсем уверен, что вы просите. Вы путаете исходные и целевые порты? – CodeCaster

+0

Можете ли вы указать указатели на то, что должно произойти в простом клиент-серверном приложении? Возможно, тогда я постараюсь совладать с биткойном. –

+0

Первый Google ударил по «порту назначения источника tcp»: http://stackoverflow.com/questions/21253474/source-port-vs-destination-port – CodeCaster

ответ

0

Сервер принимает клиентов connect() с использованием accept(). Как вскоре, как сервер принимает запрос клиента, ядро ​​выделяет номер случайного порта для сервера для дальнейших send() и.

В обычном TCP-трафике это не тот случай. Если веб-сервер прослушивает порт 80, все пакеты, отправленные обратно клиенту, будут через порт 80 сервера (это может быть проверено с помощью WireShark, например), но для каждого соединения будет socket (srcIP:port - dstIP:port). Эта информация отправляется в заголовки сетевых пакетов - IP и код протокола (TCP, UDP или другой) в заголовке IP, номера портов как часть заголовка TCP или UDP).

Но изменение портов может произойти при общении через ftp, где может быть порт управления (обычно 21) и порт данных с согласованными данными.

+0

, конечно, номера портов не являются частью заголовка ip, но либо tcp заголовка или udp. IP-адреса являются частью IP-заголовка. Я думаю, это то, что вы имеете в виду, но я бы рекомендовал адаптировать этот ответ, чтобы избежать downvotes. –

+0

@PhilipStuyck - Да, конечно - обновлено сейчас, спасибо. –

2

TCP-соединение идентифицируется парой сокетов и это однозначно идентифицируется 4 параметрами:

  • Исходный IP
  • порт источника
  • Dest IP
  • Dest порт

Для каждого соединения, установленного на сервере, сокет в основном клонируется и используется один и тот же порт. Поэтому для каждого подключения у вас есть сокет, использующий тот же серверный порт. Таким образом, у вас есть n + 1 сокет, использующий тот же порт, когда есть n соединений.

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

Ваша вторая пуля поэтому неверна, потому что тот же порт используется, как я объяснял выше.

+0

Спасибо! Я получаю это сейчас. Но мой вопрос на самом деле специфичен для приложения биткойнов. Сервер прослушивает порт 18333. Допустим, что многие клиенты делают подключения к этому серверу через один и тот же порт назначения. Так может ли порт 18333 на конце сервера использоваться для отправки/приема данных? Не заблокирован ли он только для прослушивания соединений? Но как-то биткойн общается и слушает через один и тот же порт. –

+0

Нет, потому что каждое соединение имеет свои собственные сокеты, и все еще есть один прослушивающий сокет. который в приведенном выше объяснении обозначается символом +1. Если соединений нет, у вас есть только гнездо для прослушивания. И он будет использоваться только для прослушивания новых входящих соединений. –

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