Задать вопрос
@yourisus

Число одновременных соединений сервера?

Написал простой SMTP сервер на питоне(не важно), через библиотеку
socket
, позже наткнулся на статейку на хабре https://habrahabr.ru/post/123154/ у меня возник один непростой(для меня) вопрос: как серверы поддерживают огромное кол-во одновременных соединений (tcp), если кол-во сокетов ограничено? (65535)
  • Вопрос задан
  • 1380 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 2
ограничено не кол-во сокетов, а количество собственных портов на IP
не путайте исходящие соединения с входящими
при исходящих "расходуются" пары localIP:localPort
при входящих всегда одна пара localIP:localPort
Ответ написан
@yourisus Автор вопроса
Я упустил тот момент, что сокет - это пара: ip + порт. Отсюда и недопонимание появилось, получается, что сервер и клиент могут иметь максимум 65к соединений друг с другом. И другой клиент, с этим же сервером точно так же 65к соединений.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Создается несколько IP адресов. Можно даже на той же самой сетевушке несколько интерфейсов. На каждом по 65534 сокетов.
Ответ написан
Комментировать
romy4
@romy4
Exception handler
Там же в комментариях и есть разъяснение "как такое возможно".
Ответ написан
Комментировать
Соединение характеризуется двумя сокетами. А вот сам сокет характеризуется не двумя параметрами (ip + порт), а пятью:
ip + порт локальные
ip + порт того, кто присоединился
протокол

Пусть у нас серверная программа на компьютере с ip 192.168.0.10 слушает порт 54123.
Пусть к ней присоединяются два клиента, их ip и порт на ИХ компьютерах такие:
192.168.100.1, порт 64001
192.168.200.5, порт 62038

Тогда на сервере при образовании соединения ОС создает два сокета, каждый из которых идентифицируется вот так:
___server local ip + port___client remote ip + port___protocol
1) 192.168.0.10:54123____192.168.100.1:64001_____tcp
2) 192.168.0.10:54123____192.168.200.5:62038_____tcp

Таким образом, серверной программе с точки зрения "растраты портов" не важно, сколько народа к ней присоединяются, т.к. "своя" пара ip + порт у нее всегда одинаковая => разговор о 64k портов в данном случае не актуален.

Об ограничении в 65k портов можно говорить в случае если бы мы хотели запустить 65k серверных программ и каждой тогда понадобился бы свой порт для прослушивания. Но столько программ очень вряд ли кто-то запускает и к тому же две программы могут "разделять" один и тот же порт через мультиплексирование. Я не знаю о нем толком ничего, просто запомнилось, что такая возможность есть.

P.S. Ограничение в 65k портов связано с тем, что в TCP-слое пакета под порт выделено 16 бит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы