Как сервер обрабатывает несколько клиентов на одном и том же порту? Несколько сокетов или несколько портов?
У меня неправильное представление о некоторой теории сетей, и потому что я не смог найти однозначного ответа в Интернете (большинство ресурсов - это теория, теория и т. Д. Без кратких примеров), я спрашиваю здесь.
Предполагая, что у меня есть сервер с IP 10.10.10.10
который прослушивает порт 80 и двух клиентов с IP 20.20.20.20
а также IP 30.30.30.30
соответственно, когда оба клиента подключаются к серверу через порт 80, что происходит?
Является ли...
A. Сервер принимает соединение через порт 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-адреса клиента и порта?
Или же...
B. сервер принимает соединения только через порт 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 остается свободным для принятия других подключений?
Так что это?
Извините, если вопрос звучит глупо или новичок, но я нашел оба упомянутых в Интернете, и они не могут быть правдой. Я думаю, что у других такая же путаница, и четкий и краткий ответ здесь может быть очень полезным.
2 ответа
Сокеты однозначно идентифицируются по комбинации (исходный ip, исходный порт, ip назначения, порт назначения), поэтому ваш сценарий A верен.
Найдите минутку и подумайте о последствиях, если бы B было так. Брандмауэр был бы почти невозможен, если бы порт назначения постоянно менялся - должна была бы быть постоянная связь между сервером и сетевым оборудованием, с сервером, информирующим брандмауэр, где он ожидает принимать трафик. По этой и многим другим причинам это было бы кошмаром.
Это намного проще, чем вы думаете.
Сервер, прослушивающий, скажем, порт 80, получает пакет от 20.xx, поэтому знает, что 20.xx хочет что-то, поэтому он идет и делает это и отправляет обратно в 20.xx. Затем приходит 30.xx и запрашивает порт 80, чтобы он ответил обратно на 30.xx.
Вот и все, ничего сложнее.
Это как если бы вы разговаривали по телефону и слышали, как разговаривают два разных человека, вы слышите, как ваша жена спрашивает, во сколько вы вернулись, и вы можете ответить "пять дорогих", и вы слышите, как ваши дети кричат о вас. вернуть мороженое и сказать "нет и лечь спать" - все на одну строчку. Серьезно, это лучшая аналогия, о которой я мог подумать извините:)