2009-12-21 3 views
2

Я понимаю, что когда клиент TCP подключается к серверу, он автоматически использует неиспользуемый локальный порт, если не указано явно. На стороне сервера у нас есть слуховой сокет, который создает новый сокет при каждом новом подключении.Как пакет TCP/IP достигает определенного сокета сервера?

Но все серверные сокеты используют один и тот же локальный порт (я проверил это с помощью netstat). Мой вопрос: как пакет, отправленный от клиента, достигает определенного сокета на сервере, когда все сокеты на стороне сервера обмениваются данными по одному и тому же IP-адресу и локальному порту?

Ниже приведен снимок telnet, показывающий, что мой echo-сервер tcp/ip использует тот же адрес и порт для двух разных соединений.

alt text http://i47.tinypic.com/34o6jrr.png

ответ

-2

На сервере только один открытый порт просто означает, что вы работаете один сайт.

+3

Как это утверждение ответить на вопрос? – Hemant

+0

Каково ваше определение «сайта»? –

9

Когда вы устанавливаете соединение с клиентом на сервер, TCP на сервере знает адрес и порт клиента. Каждое отдельное соединение идентифицируется и отличается 4-кортежем (client_ip, client_port, server_ip, server_port).

В вашем netstat-дисплее комбинация локального адреса и удаленный (чужой) адрес однозначно идентифицирует соединение. Внешние адреса для двух выделенных соединений различны.

1

В основном это разница между входящими и исходящими соединениями.

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

При использовании netstat вы должны увидеть порт ip: порт сервера в состоянии «Прослушивание» (для TCP-соединений) и несколько ip: port в состоянии «Установлен» для входящих соединений, которые были приняты в новых сокетах.

Исходящие соединения позволяют использовать только несвязанные порты. Вы можете указать их вручную или выбрать случайным образом стек tcp/ip. (Исключение будет при использовании SO_REUSEADDR, что позволяет привязать к связанному порту, который все еще находится в TIME_WAIT состояния)

 Смежные вопросы

  • Нет связанных вопросов^_^