Назад | Перейти на главную страницу

TCP и соединение портов

Может ли одновременно быть активным более одного TCP-соединения между двумя портами на двух разных хостах? Ответьте, пожалуйста.

Если вы спрашиваете, можно ли открыть сокет из двух клиентских систем на сервер, на котором одни и те же порты источника и расширения совпадают, тогда да, это возможно.

# connections as seen by server
src_ip       sce_port  dest_ip      dest_port
192.168.1.5  1234      192.168.1.1  1234
192.168.1.4  1234      192.168.1.1  1234

Сокеты идентифицируются (адрес источника + порт источника + адрес назначения + порт назначения). Два адреса назначения будут разными, и поэтому все будет работать нормально.

Это вряд ли будет происходить очень часто в реальном мире, поскольку исходный порт обычно выбирается из диапазона портов, доступных для использования в исходящих соединениях.

# connections as seen by server you would most likely see in the real world
src_ip       sce_port  dest_ip      dest_port
192.168.1.5  49345     192.168.1.1  1234
192.168.1.4  51284     192.168.1.1  1234

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

# cannot happen/invalid, client can't bind
src_ip       sce_port  dest_ip      dest_port
192.168.1.4  1234      192.168.1.1  1234
192.168.1.4  1234      192.168.1.1  1234

TCP-соединения отслеживаются кортежем порт / адрес:

192.168.101.24:61213 <---> 192.168.105.50:80

Это соединение отслеживается с обеих сторон, и именно это сетевые стеки используют для определения фактического соединения. Из-за этого может быть одно и только одно соединение с этим кортежем. Вот почему создатель соединения использует для своей половины «эфемерный» порт, поэтому он может открыть более одного соединения с удаленной стороной.