Как сервер отличает несколько соединений от одного клиента? - PullRequest
2 голосов
/ 20 июля 2011

Я занимаюсь программированием на C на примерах сокетов Client Server.Допустим, сервер прослушивает порт 80, а клиент - порт 4321. Кортеж используется для различения нескольких соединений.Но как сервер различает соединения от одного и того же клиента?Я имею в виду, что определенно будет несколько приложений от клиента, обращающегося к одному и тому же серверу через один и тот же порт.

Может кто-нибудь объяснить, пожалуйста?

Спасибо

Ответы [ 5 ]

4 голосов
/ 21 июля 2011

Обычный ответ таков: сначала вы просто так не делаете.

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

Когда клиент подключается с помощью несвязанного сокета, стек TCP выберет номер порта, которыйне используется в настоящее время, и назначьте его этому соединению.Когда он отправляет запрос на сервер, сервер ответит на номер порта, который был назначен.На стороне клиента стек TCP будет смотреть на номер порта в пакете и направлять его на тот процесс, которому был присвоен этот номер порта.

Таким образом, клиент не будет использовать порт 4321 - онЯ буду использовать любой порт, назначенный ему стеком.Когда другой процесс на той же машине подключается к тому же серверу, он также не будет использовать порт 4321 - он будет использовать другой порт , который ему назначен.Сетевой стек отвечает за то, чтобы каждый из них получал уникальный номер порта.

Для чего это стоит, порты TCP делятся на три диапазона.От 0 до 1023 - «хорошо известные» порты для серверов, таких как FTP, SMTP, HTTP, POP и т. Д. Они предназначены для использования серверами, и, возможно, ОС предпримет некоторые специальные шаги для их защиты.Например, типичная ОС потребует предоставления каких-либо привилегий уровня администратора / root процессу, который сможет использовать эти порты.

От 1024 до 49151 - зарегистрированные номера портов.Они обычно более свободно контролируются, чем хорошо известные порты.Почти каждый может настроить их прослушивание, но IANA поддерживает реестр конкретных целей для определенных портов.Согласно реестру, порт 4321 предназначен для удаленного протокола whois.

От 49152 до 65535 - динамические порты - когда клиент подключается к серверу, он обычно получает номер локального порта в этом диапазоне.Конечно, вы можете написать сервер и привязать его к номеру порта в этом диапазоне, если вы предпочитаете (например, для тестирования).Когда / если вы это сделаете, стек будет отслеживать это, поэтому он не будет пытаться использовать этот порт для других целей.

3 голосов
/ 20 июля 2011

Два клиента не могут использовать один и тот же порт. Если один клиент использует порт 4321, другой должен использовать другой порт.

2 голосов
/ 21 июля 2011

Соединение идентифицируется кортежем (протокол, IP-адрес источника, порт источника, IP-адрес Dest, порт Dest). Вот как вы можете различать связи.

1 голос
/ 21 июля 2011

Порты TCP Listener различают соединения на основе сокета, который представляет собой комбинацию IP: порт.

Для многократного подключения клиента к одному и тому жесервер, с одной и той же машины, он использует несколько портов (обычно эфемерных) к одному и тому же известному (слушающему) порту.

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

Привязка порта на стороне клиента выполняется ОС автоматически при использовании функции TCP connect (), поэтому вам не нужно управлять этим материалом.

Тогда серверотправляет данные клиенту (-ам) по различным комбинациям IP: порты (которые все еще могут быть в одном приложении), поэтому их невозможно перепутать.

1 голос
/ 20 июля 2011

Два клиента не могут использовать один и тот же порт, поэтому спорный вопрос.

Однако, если вы определяете свой собственный протокол, почему бы не передать ClientID назад и вперед между клиентом и сервером?Клиент может сделать запрос с недопустимым идентификатором client_id, а сервер может назначить его в ack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...