Если мы создадим прослушивающий сокет, он вернет нам дескриптор (скажем, корневой дескриптор), и мы привяжем этот дескриптор к адресу. Всякий раз, когда доступно новое клиентское соединение, корневой дескриптор информирует нас, и мы принимаем это новое соединение и получаем уникальный дескриптор (скажем, клиентский дескриптор) для каждого клиента. С этого момента мы можем общаться с этим клиентом, используя этот дескриптор. Информация о клиенте хранится в отдельном inode, на который указывает клиентский дескриптор. Благодаря этому Linux смог доставить соответствующие клиентские данные в соответствующий дескриптор.
Если вышесказанное мной верно (поправьте меня, если я не так понял), то у меня возникли сомнения. Какая информация о клиенте хранится в inode? Как Linux однозначно идентифицирует клиента?
решение1
Протоколы TCP/IP и UDP/IP знают «сеанс», который определяется локальным и удаленным IP-адресом и портом [1]. Пакет TCP/IP, например, будет содержать исходный и целевой IP-адрес и порт [2]. Сервер или клиент (например, Firefox), у которого открыто более одного соединения, будет различать на уровне сеанса OSI [3] адрес и порт.
Откройте оболочку и запустите ее как root, используя веб-браузер.
netstat -tulpan
для просмотра текущих и активных подключений [4].
Пример вывода:
# netstat -tulpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1966/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1902/cupsd
tcp 0 0 192.168.1.16:57374 172.217.23.165:443 ESTABLISHED 4730/firefox-bin
tcp 0 0 192.168.1.16:55478 104.26.11.30:443 ESTABLISHED 4730/firefox-bin
udp 0 0 127.0.0.1:53 0.0.0.0:* 1996/named
Строки показывают «УСТАНОВЛЕННЫЕ» соединения Firefox с различными локальными портами, чтобы Firefox мог распознать, какой пакет является ответом на какой запрос.
Другие строки с состоянием LISTEN — это локальные программы, работающие как серверный процесс, включая sshd
(Secure Shell Server), cupsd
(printer daemon) и named
(Bind name server). Они будут принимать входящие соединения.
Ссылки, где можно узнать больше:
[1]https://en.wikipedia.org/wiki/Порт_(компьютерная_сеть)
[2]https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structureа такжеhttps://en.wikipedia.org/wiki/IPv4_header#Заголовок
решение2
Когда вы делаете a, listen
вы указываете порт, так как порт должен быть хорошо известен. Этот конец имеет IP (или более одного) и порт.
Когда вы делаете a, connect
вы указываете IP и порт удаленного listen
er. Локальный IP определяется ОС, и назначается порт (это может быть любое число).
Соединение можно идентифицировать по ( (remote IP, remote port), (local IP, local port) )
Это устанавливает верхний предел в 64 тыс. подключений к каждому удаленному порту с любого одного IP-адреса.