Что такое сокет?


48

Может ли кто-нибудь объяснить мне, что такое сокет? Я вижу это во многих аббревиатурах в контексте SSL и т. Д.

Кроме того, почему это называется сокетом? Это просто потому, что это было какое имя они придумали? Или это было их первое имя?


9
С точки зрения непрофессионала: розетка - это телефон. Это то, что вы держите в руке, чтобы вы могли поговорить с другим телефоном. Аналогия немного нарушается: большинство телефонных разговоров являются одноранговыми. Сокетные соединения клиент-сервер. Клиент (например, программное обеспечение для рабочих станций, такое как браузеры), но не ограничивается ими, подключается к серверу (например, веб-серверу, файловому серверу, серверу аутентификации или другому). Еще один недостаток аналогии: когда вы закрываете сокетное соединение, сокет разрушается, и вы должны создать новый сокет, прежде чем сможете установить новое соединение.
G-Man говорит: «Восстановите Монику»

Это не так уж плохо для аналогии. Сервер - это всего лишь колл-центр, который может одновременно принимать несколько сотен активных вызовов.
MSalters

Ответы:


42

Сокет - это просто логическая конечная точка для общения. Они существуют на транспортном уровне. Вы можете отправлять и получать вещи в сокет, вы можете связывать и слушать сокет. Сокет специфичен для протокола, компьютера и порта и адресуется как таковой в заголовке пакета.

Руководства Биджа по сетевому программированию и межпроцессному взаимодействию содержат хорошую информацию о том, как использовать сокеты, и даже отвечают на этот точный вопрос .


65

Проще говоря, сокет - это псевдофайл, представляющий сетевое соединение. Как только сокет был создан (используя надлежащие примитивы и соответствующие параметры для идентификации другого хоста), записи в сокет превращаются в сетевые пакеты, которые отправляются, и данные, полученные из сети, могут считываться из сокета.

С одной стороны, сокеты очень похожи на каналы: они выглядят как файлы для программ, использующих их, но не приводят к чтению или записи на диск; скорее, они позволяют общаться с другой программой (локальной в случае каналов и, возможно, удаленной в случае сокетов). Они также предлагают, как вы упоминаете, двунаправленную связь (так же, как пара правильно соединенных каналов).

Наконец, программы на одном компьютере обычно общаются с использованием стандартных сетевых протоколов, таких как TCP; было бы расточительно пройти весь путь к сетевому оборудованию (если оно есть!), вычислить контрольные суммы и т. д., просто вернуться на тот же хост: вот где появляются сокеты доменов Unix. Это очень похоже на обычные сокеты, за исключением они связывают процессы на одном хосте, а не удаленные процессы, и вообще не пытаются использовать какие-либо сетевые ресурсы. Таким образом, они являются средой межпроцессного взаимодействия.

Как упоминалось в tripleee, в ходе истории BSD трубы были введены раньше, чем сокеты, и были заново реализованы с использованием сокетов, как только они появились. В той же ссылке, «Проектирование и реализация операционной системы FreeBSD» , упоминается, что каналы были затем возвращены к реализации без сокетов по соображениям производительности: это, безусловно, подчеркивает тот факт, что каналы имеют сходство.


3
Возможно также упомяните, что каналы предшествуют сокетам, но как только интерфейс сокетов был добавлен в Unix, было много смысла переопределять каналы, используя локальные сокеты.
tripleee

@tripleee: Это отличный исторический момент. Хотите предоставить ссылку?
дхаг

Быстрое прибегание к поиску на странице 40 в разделе «Разработка и внедрение операционной системы FreeBSD» ; в тексте упоминается об этом изменении в 4.2BSD, но также поясняется, что это больше не так, по соображениям производительности.
tripleee

Отлично, я добавлю это к моему ответу.
дхаг

Лучший техно-ответ во всем
хаосгуру

7

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

Если данные, отправляемые через сокет, можно рассматривать как почтовые конверты, тогда сокет будет вашим почтовым ящиком. Вы прикрепляете почтовый ящик (сокет) к своему дому (программе) и помещаете в него исходящую почту (данные). В назначенное время приходит почтальон (операционная система), забирает вашу исходящую почту и отбрасывает любую входящую почту в том же почтовом ящике. Ваша исходящая почта передается от вашего имени получателю через грузовик почтальона (сетевое соединение) вместе со всей почтой ваших соседей. Это позволяет вам вести переписку с людьми, находящимися далеко, без необходимости тратить время, трудности и т. Д. На доставку письма самостоятельно.

Что касается того, почему их хорошо называют «розетками», то здесь большую роль играет идея, что изобретатели могут называть это как угодно. Хотя, на мой взгляд, это не плохое имя :)


7

Теперь, что это?

Сокет или «сокет» может состоять из нескольких вещей:

Прежде всего, это модель мышления и интерфейс прикладного программирования (API) . Это означает, что у вас есть набор правил, которым вы должны следовать, и набор функций, которые вы можете использовать для написания программ, которые что-то делают, в соответствии с четко определенным контрактом. В данном конкретном случае что-то означает обмен данными с другой программой.

API сокетов широко абстрагирует детали «общения» в целом. Он включает в себя, с кем и как вы разговариваете, через одну (почти) последовательную и идентичную форму печенья.
Вы можете создавать сокеты в разных «доменах» (таких как, например, «сокет unix» или «интернет-сокет») и для разных типов связи (например, сокет «дейтаграмма» или «потоковый» сокет) и общаться с разными получателями. и все работает точно так же (ну, 99%, очевидно, есть небольшие различия, которые вам придется учитывать).

Вам не нужно знать (и вы даже не хотите знать!), Разговариваете ли вы с другой программой на том же компьютере или на другом компьютере, или между этими компьютерами существует сеть IPv4 или IPv6, или, возможно, какой-то другой протокол, о котором вы никогда не слышали.

socketтакже имя библиотечной функции (или syscall), которая создает «сокет », который представляет собой особый тип файла (в Unix все является файлом).

Как это сравнивается с ...

розетки попадают в ту же категорию, что и трубы и именные трубы

Канал - это средство односторонней связи между читателем и писателем (обе программы) на одном компьютере. Он имитирует поток данных (как, например, TCP).
То есть, с точки зрения канала не существует отдельных «сообщений» или «блоков данных». Вы можете скопировать любое количество данных в «один конец», а кто-то другой может прочитать любое количество данных (не обязательно одинаковое и не обязательно за один раз) на «другом конце» в том же порядке байтов, что и вы толкнул его.

Имя труба, ну, просто труба , которая имеет имя в файловой системе . То есть это то, что выглядит и ведет себя как файл, оно появляется в списке каталогов, и вы можете открыть его, записать в него, и т. Д. И т. Д. Обратите внимание, что вы также можете создавать специальные файлы сокетов (которые будут именованными сокетами) ,

Сокет, с другой стороны, является средством двусторонней («дуплексной») связи, что означает, что вы можете записывать и читать из одного и того же сокета, и вам не нужны два отдельных сокета для двусторонней связи.
Кроме того, сокет может действовать как поток (идентичный каналу), или он может отправлять дискретные, ненадежные сообщения, или он может отправлять дискретные, упорядоченные сообщения (первые два работают в любом домене, последние только в «домене unix»). ). Он может отправлять сообщения (или имитировать поток) кому-то на совершенно другом компьютере. Сокет может даже выполнять форму связи «один ко многим» (многоадресная передача) в некоторых условиях.

Имея это в виду, ясно, что сокеты делают что-то намного более сложное и обычно имеют больше служебных данных, чем конвейеры (которые в основном не более, чем простой memcpyбуфер и из буфера!), Но если вы создаете локальные сокеты (то есть на одном и том же компьютер), операционная система обычно применяет сильно оптимизированный быстрый путь, так что на самом деле нет особой разницы.

межпроцессное взаимодействие иногда упоминается в отношении сетей

Да, сокеты являются одним из возможных способов межпроцессного взаимодействия (совместно используемая память и каналы являются примерами альтернатив). Все в то же время они используются для «сетевого взаимодействия», как описано выше.


1

Для UDP или TCP по IP,

Адрес сокета - это комбинация IP-адреса и номера порта.

IP-адрес - это адрес машины в интернете, например unix.stackexchange.com has address 198.252.206.140

Однако каждая машина должна иметь возможность предоставлять более одной службы, поэтому большинство машин будет предоставлять http (веб-страницы) на порт 80, ssh на порт 22 и т. Д.

Поэтому unix.stackexchange.com:80порт 80из unix.stackexchange.com(гнездо) является точкой доступа данного веб - сайта.

Однако есть и другие типы сокетов, см. Комментарии ниже.


5
tcp / ip - это только один вид сокетов. Есть другие, которые не имеют ничего общего с tcp / ip.
psusi

сколько существует разных видов розеток?
Абдул Аль Хазред

1
@AbdulAlHazred, я знаю о четырех распространенных типах, используемых в ip-сетях: один с ip6, два с unix и два с IPX. Я не смотрел на ax25, atm или appletalk. Существуют другие протоколы, поддерживаемые в Linux, и есть протоколы, которые Linux не поддерживает. В большинстве случаев каждый протокол имеет сокеты потока (tcp) и дейтаграммы (udp). Необработанные сокеты также распространены, и imcp может также иметь интерфейс сокетов.
Hildred

Дело в том, что этот ответ является неполным в том смысле, что он охватывает только один тип сокетов, и вводит в заблуждение тем, что он представляет сокеты в целом, как если бы они всегда были сетевыми сокетами, и в частности AF_INETсокеты IP ( ).
tripleee

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.