2

В описании TCP в Википедии указано, что

Количество сеансов на стороне сервера ограничено только памятью и может увеличиваться по мере поступления новых соединений, но клиент должен выделить случайный порт перед отправкой первого SYN на сервер.

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

Но почему клиенты не могут делать то же самое? Если сокет А подключается к серверу 1 с помощью временного порта 12345 (например, клиент:12345 -> сервер 1:80), почему сокет В не может подключиться к серверу 2 путем повторного использования того же порта источника (клиент:12345 -> сервер 2:80)? Это позволило бы более (количество портов) исходящих TCP-соединений с одного хоста.

Есть ли что-то в спецификации TCP, которая запрещает такое повторное использование порта, или это ограничение является лишь практическим результатом распространенных реализаций TCP? Если да, действительно ли первый случай обрабатывается иначе, чем второй, или число входящих TCP-соединений на один порт сервера практически также ограничено 65535?

Чтобы уточнить, я ищу теоретические (в соответствии со спецификациями) и практические (реализации; особенно Linux) ограничения для:

  • Исходящие соединения с одного клиента на ЛЮБОЙ сервер / порт. (client:* -> *:*)
  • Соединения от одного клиента к тому же самому серверу и порту (client:* -> server:port) - это, очевидно, не может быть больше чем 65535.
  • Входящие подключения к одному порту сервера от ЛЮБОГО клиента (*:* -> server:port) - я подозреваю, что это больше чем 65535 в соответствии с цитируемым параграфом и причинами, указанными выше.

2 ответа2

5

Сеанс tcp определяется всеми четырьмя частями адреса, и только все четыре части в комбинации должны быть уникальными.

Так

client ip : source port  -> server ip : destination port

При условии, что они отличаются от следующего сеанса, следующий сеанс действителен, даже если он использует тот же порт источника и ip клиента.

Возможно ли это на самом деле, зависит от реализации как сетевого стека ОС, так и используемой библиотеки TCP.

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

0

Клиенты ограничены сетевым стеком ОС. Маловероятно, что любая операционная система позволяет нескольким процессам использовать один и тот же исходный порт в сокетном соединении. Теоретически возможно разрешить неограниченное количество подключений даже в существующих клиентских ОС, используя промежуточный сервис для известных протоколов, таких как HTTP, аналогично тому, как HTTP.SYS работает для нескольких HTTP-серверов (в разных процессах!) на порт 80 в Windows.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .