что такое сокет?

<p>может ли кто-нибудь объяснить мне, что такое сокет? я вижу это во многих аббревиатурах в контексте ssl и т.д.</p><p>кроме того, почему это называется сокетом? это просто потому, что это было какое имя они изобрели? или это было их первое имя?</p>

<p>сокет - это просто логическая конечная точка для общения. они существуют на транспортном уровне. вы можете отправлять и получать вещи в сокет, вы можете связывать и слушать сокет. сокет специфичен для протокола, компьютера и порта и адресуется как таковой в заголовке пакета.</p><p>руководства биджа по <a href="http://beej.us/guide/bgnet/">сетевое программирование</a> и <a href="http://beej.us/guide/bgipc/">межпроцессное взаимодействие</a> содержат хорошую информацию о том, как использовать сокеты, и даже <a href="http://beej.us/guide/bgnet/html/multi/theory.html">ответьте на этот точный вопрос</a> .</p>

<p>проще говоря, сокет - это псевдофайл, представляющий сетевое соединение. как только сокет был создан (используя надлежащие примитивы и надлежащие параметры для идентификации другого хоста), записи в сокет превращаются в сетевые пакеты, которые отправляются, и данные, полученные из сети, могут быть прочитаны из сокета.</p><p>с одной стороны, сокеты очень похожи на каналы: они выглядят как файлы для программ, использующих их, но не приводят к чтению или записи на диск; скорее, они позволяют общаться с другой программой (локальной в случае каналов и, возможно, удаленной в случае сокетов). они также предлагают, как вы упоминаете, двунаправленную связь (так же, как пара правильно соединенных каналов).</p><p>наконец, программы на одном компьютере обычно общаются с использованием стандартных сетевых протоколов, таких как tcp; было бы расточительно пройти весь путь к сетевому оборудованию (если оно есть!), вычислить контрольные суммы и т. д., просто вернуться к тому же хосту: вот где появляются доменные сокеты unix. это очень похоже на обычные сокеты, кроме они связывают процессы на одном хосте, а не на удаленных, и вообще не пытаются использовать какие-либо сетевые ресурсы. таким образом, они являются средой межпроцессного взаимодействия.</p><p>как упоминалось в tripleee, в ходе истории bsd трубы были введены раньше, чем сокеты, и были заново реализованы с использованием сокетов, как только они появились. в той же ссылке <em>проектирование и реализация операционной системы freebsd</em> упоминается, что каналы были затем возвращены к реализации без сокетов по соображениям производительности: это, безусловно, подчеркивает тот факт, что каналы имеют сходство.</p>

<h2>теперь, что это?</h2><p>сокет или "сокет" может состоять из нескольких вещей:</p><p>прежде всего, это модель мышления и <strong> интерфейс прикладного программирования (api) </strong>. это означает, что у вас есть набор правил, которым вы должны следовать, и набор функций, которые вы можете использовать для написания программ, которые что-то делают, в соответствии с четко определенным контрактом. в данном конкретном случае <em> что-то</em> означает обмен данными с другой программой.</p><p>api сокетов широко абстрагирует детали "общения" в целом. он включает в себя, с кем и как вы разговариваете, через одну (почти) последовательную и идентичную форму печенья.<br> вы можете создавать сокеты в разных "доменах" (таких как, например, "сокет unix" или "интернет-сокет") и разных типах связи (например, сокет "датаграмма" или "потоковый" сокет). и говорите с разными получателями, и все работает точно так же (ну, 99%, очевидно, есть небольшие различия, которые вам придется учитывать).</p><p>вам не нужно знать (и вы даже не хотите знать!), разговариваете ли вы с другой программой на том же компьютере или на другом компьютере, или между этими компьютерами существует сеть ipv4 или ipv6, или, возможно, какой-то другой протокол, о котором вы никогда не слышали.</p><p> <a href="http://man7.org/linux/man-pages/man2/socket.2.html"><code>socket</code></a> также является именем библиотечной функции (или системного вызова), которая создает <em> "сокет</em>", который представляет собой особый тип файла (все в unix это файл).</p><h2>как это сравнивается с ...</h2><blockquote> <p>розетки попадают в ту же категорию, что и трубы и именные трубы</p> </blockquote><p>канал - это средство <strong> одностороннего </strong> обмена данными между читателем и писателем (оба являются программами) на одном компьютере. он имитирует <em> stream</em> данных (как, например, tcp).<br> то есть, с точки зрения канала не существует отдельных "сообщений" или "блоков данных". вы можете скопировать любое количество данных в "один конец", а кто-то другой может прочитать любое количество данных (не обязательно одинаковое и не обязательно за один раз) на "другом конце" в том же порядке байтов, что и вы толкнул его.</p><p>a <em> named</em> pipe - это просто труба <em> которой принадлежит имя в файловой системе</em>. то есть это то, что выглядит и ведет себя так же, как файл, оно появляется в списке каталогов, и вы можете открыть его, записать в него и т.д. и т.д. обратите внимание, что вы также можете создавать специальные файлы сокетов (это будет именованный сокет) ,.</p><p>сокет, с другой стороны, является средством <strong> двухстороннего </strong> ("дуплексного") взаимодействия, что означает, что вы можете писать и читать с одного и того же розетка, и вам не нужны две отдельные розетки для двусторонней связи.<br> кроме того, сокет может выступать в качестве потока (идентичного каналу), или он может отправлять дискретные, ненадежные сообщения, или он может отправлять дискретные, упорядоченные сообщения (первые два работают на любом домене, только последний на "домене unix"). он может отправлять сообщения (или имитировать поток) кому-то на совершенно другом компьютере. сокет может даже выполнять форму связи "один ко многим" (многоадресная передача) в некоторых условиях.</p><p>имея это в виду, ясно, что сокеты делают что-то гораздо более сложное и <em> в общем случае</em> имеют больше служебных данных, чем каналы (которые в основном не более чем простые <code>memcpy</code> от и до буфер!), но если вы создаете локальные сокеты (т.е. на одном и том же компьютере), операционная система обычно применяет сильно оптимизированный быстрый путь, так что на самом деле нет особой разницы.</p><blockquote> <p>межпроцессное взаимодействие иногда упоминается в отношении сетей</p> </blockquote><p>да, сокеты являются одним из возможных способов межпроцессного взаимодействия (совместно используемая память и каналы являются примерами альтернатив). все в то же время они используются для "сетевого взаимодействия", как описано выше.</p>

<p>сокет абстракция. он обеспечивает интерфейс для приложений для использования системного ресурса (в данном случае сетевого подключения) таким образом, который позволяет операционной системе опосредовать и организовать использование ограниченного ресурса любым количеством приложений.</p><p>если данные, отправляемые через сокет, можно рассматривать как почтовые конверты, тогда сокет будет вашим почтовым ящиком. вы прикрепляете почтовый ящик (сокет) к своему дому (программе) и помещаете в него исходящую почту (данные). в назначенное время приходит почтальон (операционная система), забирает вашу исходящую почту и отбрасывает любую входящую почту в том же почтовом ящике. ваша исходящая почта передается от вашего имени получателю через грузовик почтальона (сетевое соединение) вместе со всей почтой ваших соседей. это позволяет вам вести переписку с людьми, находящимися далеко от вас, без необходимости тратить деньги, время, трудности и т.д. на доставку письма самостоятельно.</p><p>что касается того, почему их хорошо называют "розетками", то здесь большую роль играет идея, что изобретатели могут называть это как угодно. хотя, на мой взгляд, это не плохое имя :)</p>

<p>для udp или tcp по ip,</p><p>адрес сокета - это комбинация ip-адреса и номера порта.</p><p>ip-адрес - это адрес машины в интернете, например, <code>unix.stackexchange.com has address 198.252.206.140</code></p><p>однако каждая машина должна иметь возможность предоставлять более одной службы, поэтому большинство машин будет предоставлять http (веб-страницы) на порт 80, ssh на порт 22 и т.д.</p><p>так <code>unix.stackexchange.com:80</code> порт <code>80</code> из <code>unix.stackexchange.com</code> (сокет) - это точка доступа этого веб-сайта.</p><p>однако есть и другие типы сокетов, см. комментарии ниже.</p>

<p>я полагаю, что вы спросили о сети так что tcp используют сокеты в качестве точки для связи и состоят из ip-адреса, протокола и номера порта.</p>