Как пакет TCP / IP достигает определенного сокета сервера? - PullRequest
2 голосов
/ 21 декабря 2009

Я понимаю, что когда TCP-клиент подключается к серверу, он автоматически использует неиспользуемый локальный порт, если это не указано явно. На стороне сервера у нас есть сокет прослушивания, который создает новый сокет всякий раз, когда принимается новое соединение.

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

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

alt text

Ответы [ 3 ]

9 голосов
/ 21 декабря 2009

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

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

1 голос
/ 21 декабря 2009

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

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

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

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

0 голосов
/ 21 декабря 2009

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

...