Как FTP-сервер обрабатывает несколько подключений с одного и того же порта? - PullRequest
0 голосов
/ 10 мая 2011

Привет,
Если я правильно понимаю протокол FTP (RFC959), в активном режиме с настройками по умолчанию сервер устанавливает соединения для передачи данных от своего порта 20 к которому подключился клиент ip / port.

Может кто-нибудь объяснить мне, как это работает с несколькими клиентами?(или скажите, где я ошибся)

Чтобы быть более точным, скажем, я:

1) вызов socket()
2) bind() дескриптор моего ip /порт 20
3) connect() клиент для установления соединения для передачи данных
, в то время как в другом потоке, обрабатывающем другого клиента, я пытаюсь сделать то же самое, вызов bind() завершится неудачно по очевидным причинам.

Мне известно, что вы можете использовать setsockopt () с SO_REUSEADDR, чтобы сокеты связывались с одним и тем же адресом / портом, но будут ли пакеты доставляться правильно?Я совершенно растерялся.

Я пока не смог ничего найти по этому вопросу, поэтому любая помощь будет принята с благодарностью.

Ответы [ 4 ]

4 голосов
/ 10 мая 2011

Сокетное соединение идентифицируется по 4 параметрам - IP-адрес источника, порт источника, dest.IP и dest.port. В случае активного соединения 4-й параметр (порт назначения, порт на клиентском компьютере) будет отличаться для каждого соединения. Сложности возникают, когда задействованы маршрутизаторы / NAT, и во многих случаях активный режим не работает.

0 голосов
/ 12 мая 2011

Как вы заметили, если вы установите параметр сокета SO_REUSEADDR на обоих сокетах, и ни один из них не будет прослушивать, то bind() не выйдет из строя - они оба могут быть связаны с одним и тем же локальным адресом.

Пакеты доставляются правильно, поскольку один сокет подключен к одному адресу однорангового узла, а другой сокет подключен к другому.То есть, когда приходит пакет, исходный адрес и порт, а также адрес назначения и порт amd используются для определения, в какой локальный сокет отправить его (если есть).

0 голосов
/ 11 мая 2011

FWIW, цель SO_REUSEADDR не в том, чтобы сервер получал несколько соединений на одном TCP-порте ... это так, чтобы TCP-сервер мог быстро перезагружаться, пока соединения активны; в противном случае им пришлось бы ждать, пока они прекратят работу таблицы соединений ядра.

Интересно, что сокеты UDP могут утверждать SO_REUSEADDR, чтобы позволить одноадресным и многоадресным приложениям прослушивать один и тот же порт UDP.

0 голосов
/ 11 мая 2011

Клиенты обычно не связываются.позвоните socket, затем connect.Соединению будет назначен уникальный локальный порт.

На сервере socket, bind и listen устанавливают порт сервера.accept возвращает уникальное клиентское соединение.

...