Назад | Перейти на главную страницу

Как сервер обрабатывает несколько клиентов на одном порту? Несколько сокетов или несколько портов?

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

Предполагая, что у меня есть сервер с IP 10.10.10.10 который слушает порт 80 и два клиента с IP 20.20.20.20 и IP 30.30.30.30 соответственно, когда оба клиента подключаются к серверу через порт 80, что происходит?

Является ли...

А. сервер принимает соединение через порт 80 для обоих клиентов и создает два сокета:

server IP: 10.10.10.10
server port: 80
client IP: 20.20.20.20
client port: whatever port client 1 used to connect

и

server IP: 10.10.10.10
server port: 80
client IP: 30.30.30.30
client port: whatever port client 2 used to connect

затем, когда новые пакеты поступают на порт 80 от клиентов, они отправляются в соответствующий сокет на основе IP-адреса клиента и порта?

Или...

Б. сервер принимает соединения только через порт 80 и выделяет другие порты для связи с клиентами при подключении клиентов? Итак, у нас все еще есть два сокета, но вот так:

server IP: 10.10.10.10
server port: random free port
client IP: 20.20.20.20
client port: whatever port client 1 used to connect

и

server IP: 10.10.10.10
server port: another random free port
client IP: 30.30.30.30
client port: whatever port client 2 used to connect

а порт 80 остается свободным для приема других подключений?

Так что это?

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

Сокеты однозначно идентифицируются комбинацией (исходный IP-адрес, исходный порт, целевой IP-адрес, порт назначения), поэтому ваш А сценарий правильный.

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

Это НАСТОЛЬКО проще, чем вы думаете.

Сервер прослушивает, скажем, порт 80, он получает пакет от 20.xx, поэтому знает, что 20.xx чего-то хочет, поэтому отправляет его обратно на 20.xx. Затем приходит 30.xx и запрашивает порт 80, так что он отвечает напрямую на 30.xx.

Все, ничего более сложного.

Это немного похоже на то, как если бы вы разговаривали по телефону и слышите, как разговаривают два разных человека, вы слышите, как ваша жена спрашивает, во сколько вы вернетесь, и вы можете ответить «пять, дорогая», и вы можете слышать, как ваши дети кричат ​​за вас принести обратно мороженое и сказать «нет, ложись спать» - все в одну строчку. Серьезно, это лучшая аналогия, которую я мог придумать, извините :)