Сетевой сокет — это программная структура внутри сетевого узла компьютерной сети , которая служит конечной точкой для отправки и получения данных по сети. Структура и свойства сокета определяются интерфейсом прикладного программирования (API) для сетевой архитектуры. Сокеты создаются только во время существования процесса приложения , работающего на узле.
Из-за стандартизации протоколов TCP/IP в ходе развития Интернета термин « сетевой сокет» чаще всего используется в контексте набора протоколов Интернета, и поэтому его часто также называют Интернет-сокетом . В этом контексте сокет внешне идентифицируется для других хостов по его адресу сокета , который представляет собой триаду транспортного протокола , IP-адреса и номера порта .
Термин «сокет» также используется для обозначения программной конечной точки внутриузлового межпроцессного взаимодействия (IPC), которая часто использует тот же API, что и сетевой сокет.
Использование термина « сокет» в программном обеспечении аналогично функции электрического разъема , аппаратного устройства для связи между узлами, соединенными между собой электрическим кабелем . Аналогично, термин порт используется для внешних физических конечных точек на узле или устройстве.
Интерфейс прикладного программирования (API) для стека сетевых протоколов создает дескриптор для каждого сокета, созданного приложением, обычно называемый дескриптором сокета . В Unix-подобных операционных системах этот дескриптор является разновидностью дескриптора файла . Он сохраняется процессом приложения для использования при каждой операции чтения и записи в канале связи.
Во время создания с помощью API сетевой сокет привязан к комбинации типа сетевого протокола, который будет использоваться для передачи, сетевого адреса хоста и номера порта . Порты — это пронумерованные ресурсы, представляющие другой тип программной структуры узла. Они используются как типы служб и после создания процессом служат компонентом местоположения, адресуемым извне (из сети), так что другие хосты могут устанавливать соединения.
Сетевые сокеты могут быть выделены для постоянных соединений для связи между двумя узлами или могут участвовать в многоадресной передаче и без установления соединения.
На практике из-за распространения протоколов TCP/IP, используемых в Интернете, термин « сетевой сокет» обычно относится к использованию с интернет-протоколом (IP). Поэтому его часто еще называют Интернет-розеткой .
Приложение может взаимодействовать с удаленным процессом путем обмена данными по TCP/IP, зная комбинацию типа протокола, IP-адреса и номера порта. Эту комбинацию часто называют адресом сокета . Это сетевой дескриптор доступа к сетевому сокету. Удаленный процесс устанавливает сетевой сокет в своем собственном экземпляре стека протоколов и использует сетевой API для подключения к приложению, предоставляя свой собственный адрес сокета для использования приложением.
Стек протоколов , обычно предоставляемый операционной системой (а не, например, отдельной библиотекой), представляет собой набор сервисов, которые позволяют процессам взаимодействовать по сети с использованием протоколов, реализуемых стеком. Операционная система пересылает полезную нагрузку входящих IP-пакетов соответствующему приложению, извлекая информацию об адресе сокета из заголовков IP и транспортного протокола и удаляя заголовки из данных приложения.
Интерфейс прикладного программирования (API), который программы используют для связи со стеком протоколов с помощью сетевых сокетов, называется API сокетов . Разработка прикладных программ, использующих этот API, называется программированием сокетов или сетевым программированием . API-интерфейсы интернет-сокетов обычно основаны на стандарте сокетов Беркли . В стандарте сокетов Беркли сокеты представляют собой форму файлового дескриптора из-за философии Unix , согласно которой «все является файлом», и аналогий между сокетами и файлами. Оба имеют функции чтения, записи, открытия и закрытия. На практике различия затрудняют аналогию, и в сокете используются разные интерфейсы (отправки и приема). При межпроцессном взаимодействии каждый конец обычно имеет свой собственный сокет.
В стандартных интернет-протоколах TCP и UDP адрес сокета представляет собой комбинацию IP-адреса и номера порта , подобно тому, как один конец телефонного соединения представляет собой комбинацию номера телефона и определенного расширения . Сокеты не обязательно должны иметь адрес источника, например, только для отправки данных, но если программа привязывает сокет к адресу источника, сокет можно использовать для получения данных, отправленных на этот адрес. На основе этого адреса интернет-сокеты доставляют входящие пакеты данных соответствующему процессу приложения .
Сокет часто относится конкретно к интернет-сокету или TCP-сокету. Интернет-розетка минимально характеризуется следующим:
Различия между сокетом (внутренним представлением), дескриптором сокета (абстрактным идентификатором) и адресом сокета (публичным адресом) невелики, и они не всегда различаются в повседневном использовании. Кроме того, конкретные определения сокета различаются между авторами. В IETF Request for Comments , Internet Standards , во многих учебниках, а также в этой статье термин сокет относится к сущности, которая однозначно идентифицируется номером сокета. В других учебниках [1] термин «сокет» относится к локальному адресу сокета, то есть «комбинации IP-адреса и номера порта». В исходном определении сокета , данном в RFC 147, [2] в связи с сетью ARPA в 1971 году, «сокет указывается как 32-битное число, где четные сокеты идентифицируют принимающие сокеты, а нечетные сокеты идентифицируют отправляющие сокеты». Однако сегодня связь через сокеты является двунаправленной.
В операционной системе и приложении, создавшем сокет, сокет называется уникальным целочисленным значением, называемым дескриптором сокета .
В Unix-подобных операционных системах и Microsoft Windows инструменты командной строки netstat или ss [3] используются для вывода списка установленных сокетов и связанной с ними информации.
Этот пример, смоделированный в соответствии с интерфейсом сокета Беркли, отправляет строку «Hello, world!» по TCP на порт 80 хоста с адресом 203.0.113.0. Он иллюстрирует создание сокета (getSocket), подключение его к удаленному хосту, отправку строки и, наконец, закрытие сокета:
Сокет mysocket = getSocket(type = "TCP")Connect (mysocket, адрес = «203.0.113.0», порт = «80»)send(mysocket, «Привет, мир!»)закрыть (mysocket)
Доступны несколько типов интернет-розеток:
Другие типы сокетов реализуются через другие транспортные протоколы, такие как системная сетевая архитектура [10] и сокеты домена Unix для внутреннего межпроцессного взаимодействия.
Компьютерные процессы, предоставляющие службы приложений, называются серверами и при запуске создают сокеты, находящиеся в состоянии прослушивания . Эти сокеты ждут инициативы от клиентских программ.
TCP-сервер может обслуживать несколько клиентов одновременно, создавая уникальный выделенный сокет для каждого клиентского соединения в новом дочернем процессе или потоке обработки для каждого клиента. Они находятся в установленном состоянии , когда виртуальное соединение сокет-сокет или виртуальный канал (VC), также известный как сеанс TCP , устанавливается с удаленным сокетом, обеспечивая дуплексный поток байтов .
Сервер может создать несколько одновременно установленных TCP-сокетов с одинаковым номером локального порта и локальным IP-адресом, каждый из которых сопоставлен своему собственному дочернему процессу сервера и обслуживает свой собственный клиентский процесс. Операционная система рассматривает их как разные сокеты, поскольку адрес удаленного сокета (IP-адрес клиента или номер порта) отличается; т.е. поскольку они имеют разные кортежи пар сокетов.
Сокеты UDP не имеют установленного состояния , поскольку протокол не поддерживает соединение . Серверный процесс UDP обрабатывает входящие дейтаграммы от всех удаленных клиентов последовательно через один и тот же сокет. Сокеты UDP не идентифицируются по удаленному адресу, а только по локальному адресу, хотя каждое сообщение имеет связанный удаленный адрес, который можно получить из каждой дейтаграммы с помощью интерфейса программирования сетевых приложений (API).
Взаимодействующие локальные и удаленные сокеты называются парами сокетов . Каждая пара сокетов описывается уникальным набором из четырех кортежей , состоящим из IP-адресов источника и назначения, а также номеров портов, т. е. адресов локальных и удаленных сокетов. [11] [12] Как обсуждалось выше, в случае TCP пара сокетов связана на каждом конце соединения с уникальным четырехкортежом.
Термин «сокет» появился в 1971 году, когда был опубликован RFC 147, когда он использовался в ARPANET. Большинство современных реализаций сокетов основаны на сокетах Беркли (1983 г.) и других стеках, таких как Winsock (1991 г.). API сокетов Беркли в дистрибутиве программного обеспечения Беркли (BSD) возник в операционной системе Unix 4.2BSD в качестве API. Однако только в 1989 году Калифорнийский университет в Беркли смог выпустить версии своей операционной системы и сетевой библиотеки, свободные от лицензионных ограничений Unix компании AT&T , защищенной авторским правом .
В ц. В 1987 году AT&T представила интерфейс транспортного уровня (TLI) на основе STREAMS в UNIX System V Release 3 (SVR3). [13] и продолжилось в версии 4 (SVR4). [14]
Другие ранние реализации были написаны для TOPS-20 , [15] MVS , [15] VM , [15] IBM-DOS (PCIP). [15] [16]
Сокет — это прежде всего концепция, используемая на транспортном уровне набора протоколов Интернета или сеансовом уровне модели OSI . Сетевое оборудование, такое как маршрутизаторы , работающие на интернет-уровне , и коммутаторы , работающие на канальном уровне , не требуют реализации транспортного уровня. Однако сетевые брандмауэры с отслеживанием состояния , трансляторы сетевых адресов и прокси-серверы отслеживают активные пары сокетов. В многоуровневых коммутаторах и поддержке качества обслуживания (QoS) в маршрутизаторах потоки пакетов могут быть идентифицированы путем извлечения информации о парах сокетов.
Необработанные сокеты обычно доступны в сетевом оборудовании и используются для протоколов маршрутизации, таких как IGRP и OSPF , а также для протокола управляющих сообщений Интернета (ICMP).