Все ли сокеты в пространстве имен подключаются к одному и тому же порту на сервере в socket.io?
Да, это так.
First off socket. io построен на базовом протоколе webSocket. Соединение webSocket начинается с соединения http, которое построено поверх соединения TCP, а затем обе стороны соглашаются «обновить» протокол, чтобы начать разговор по протоколу webSocket вместо протокола http.
Итак, когда приходит соединение socket.io, изначально это соединение http.
Во-вторых, любой TCP-сервер прослушивает входящие соединения через известный порт. Клиент должен знать, что это за порт, и клиент пытается подключиться к комбинации IP-адреса и порта. Обычный TCP-сервер, использующий только один сетевой адаптер, будет просто прослушивать этот один порт. Все входящие клиентские соединения будут поступать на этот один порт.
Я думал, что при запуске сервера он создает указанное c количество портов TCP на компьютере. поэтому, когда приходит новое соединение, он назначает порт этому клиенту («соединение»).
Это не так. Сервер прослушивания создает пассивный сокет, прослушивающий входящие соединения на одном указанном c порту . Когда TCP-клиент инициирует исходящее соединение, этот клиент выбирает динамически выбранный номер порта для этого исходящего соединения (которое является уникальным для этого клиента и в настоящее время не используется). Этот исходный номер порта обычно не виден в программировании TCP, http, webSocket или socket.io (хотя вы можете увидеть, что есть, если хотите - вам просто не нужно использовать его самостоятельно на уровне, на котором мы обычно программируем). Это часть протокола TCP, которая помогает доставлять пакеты в нужный сокет. Таким образом, в этот момент у него есть IP-адрес источника и номер порта источника. Затем он пытается подключиться к целевому IP-адресу на целевом порту.
Эта уникальная комбинация этих четырех параметров:
source IP
source port (dynamically assigned on the client)
target IP (known in advance by the client)
target port (known in advance by the client)
определяет уникальное TCP-соединение. Никакие два TCP-соединения не будут иметь одинаковые четыре параметра. Если тот же клиент устанавливает другое TCP-соединение с тем же целевым IP-адресом и портом, ему будет назначен другой номер порта источника, и, следовательно, это будет другая уникальная комбинация.
Здесь есть один маленький (несколько запутанный) аспект что я вас проинформирую, но не буду пытаться чрезмерно объяснить или запутать. Многие клиенты находятся в частной сети и имеют частный IP-адрес. Этот частный IP-адрес не является тем, что сервер видит источником соединения. В какой-то момент соединение проходит через шлюз, который соединяет частную сеть с сетью publi c. Этот шлюз будет выполнять NAT (преобразование сетевых адресов). Он заменит частный исходный IP / порт на опубликованный c исходный IP / порт, который соответствует самому шлюзу. Он запоминает, что он поменял, так что когда пакеты возвращаются другим напрямую, он может поменять его обратно. Таким образом, целевой сервер фактически считает, что он связывается со шлюзом, но все, что целевая отправляет на шлюз, «пересылается» на частный IP-адрес / порт исходного отправителя. Таким образом, вам на самом деле не нужно разбираться в деталях шлюза, за исключением того, что он служит посредником между частным IP-адресом какого-либо компьютера в частной сети и компьютера в общедоступном c inte rnet, которым вы являетесь. пытаясь подключиться к. Он делает то, что называется «преобразованием сетевых адресов», чтобы все это работало. В остальной части обсуждения вы должны забыть об этом и просто притвориться, что и источник, и цель оба находятся на публикуемых c inte rnet с публичными c IP-адресами (хотя это почти никогда не имеет место, но шлюз заставляет его работать так, как если бы они были.)
"Socket.IO позволяет вам« именовать »свои сокеты, что по сути означает назначение различных конечных точек или путей. Это полезная функция, позволяющая минимизировать количество ресурсов (TCP-соединений) и в то же время разделять проблемы в вашем приложении за счет разделения каналов связи. Несколько пространств имен фактически используют одно и то же соединение WebSockets, что позволяет нам экономить порты сокетов на сервере ".
В socket.io, когда вы подключаетесь к пространству имен, вы создаете новое базовое соединение webSocket с тем же целевой IP / порт. У сервера может быть много входящих подключений к одному и тому же IP / порту. Каждому назначается собственный сокет TCP, и четыре упомянутых выше параметра однозначно определяют каждый. Когда входящий сетевой пакет достигает самого низкого уровня, TCP может сообщать исходный IP-адрес и исходный порт, с которого он поступил, и какой целевой IP-порт был отправлен, и это позволяет драйверу TCP определить, к какому сокету принадлежит этот пакет, чтобы пакет мог быть доставлен к коду, который отслеживает спецификацию c сокет.
Эту часть я не понял: «Несколько пространств имен фактически используют одно и то же соединение WebSockets, таким образом сохраняя нам порты сокетов на сервере». Мой вопрос заключается в том, как все соединения могут совместно использовать один порт на веб-сервере. * 103 9 *
Чтобы использовать пространство имен в socket.io, вы устанавливаете новое соединение socket.io с этим указанным c пространством имен. Вы не используете несколько пространств имен в одном соединении socket.io. Но пространство имен работает на более высоком уровне, чем логика соединения TCP или webSocket c. Он движется поверх этого на прикладном уровне. Таким образом, все соединения пространства имен, независимо от того, какое пространство имен вы используете, подключаются к одному и тому же серверу с тем же IP-адресом и одним и тем же портом. После того как соединение установлено, socket.io отправляет некоторые данные о том, что ему нужно «логическое» соединение в этом пространстве имен, а затем получающему коду socket.io сообщается, что новое соединение принадлежит этому пространству имен.
Вот полезная статья для чтения на topi c: Понимание сокета и порта в TCP .