Сокет это в информатике кратко

Обновлено: 30.06.2024

Что дальше? Как насчет этого: бывают разные виды сокетов. Есть DARPA инернет-адреса (Сокеты интернет), CCITT X.25 адреса (X.25 сокеты, которые вам не нужны), и, вероятно, многие другие в зависимости от особенностей вашей ОС. Этот документ описывает только первые, Интернет-Сокеты.

Два типа интернет-сокетов

Что? Есть два типа интернет сокетов? Да. Ну ладно, нет, я вру. Есть больше, но я не хочу вас пугать. Есть ещё raw-сокеты, очень мощная штука, вам стоит взглянуть на них.

Круто. А что насчёт дейтаграммных сокетов? Почему они называются без-соединительными? В чем тут дело? Почему они ненадежны?
Ну, вот некоторые факты: если вы посылаете дейтаграмму, она может дойти. А может и не дойти. Но если уж приходит, то данные внутри пакета будут без ошибок.

Почему UDP не устанавливает соединения? Потому что вам не нужно держать открытое соединение с потоковыми сокетами. Вы просто строите пакет, формируете IP-заголовок с информацией о получателе, и посылаете пакет наружу. Устанавливать соединение нет необходимости. UDP как правило используется либо там, где стек TCP недоступен, либо там, где один-другой пропущеный пакет не приводит к концу света. Примеры приложений: TFTP (trivial file transfer protocol, младшый брат FTP), dhcpcd (DHCP клиент), сетевые игры, потоковое аудио, видео конференции и т.д.

Теория сетей и низкие уровни

Поскольку я только что упоминал слои протоколов, пришло время поговорить о том, как на самом деле работает сеть, и показать примеры того, как построены пакеты SOCK_DGRAM. На самом деле вы можете пропустить этот раздел, но он является неплохим теоретическим подспорьем.


Когда другой компьютер получает пакет, оборудование (сетевая карта) исключает Ethernet-заголовок (разворачивает пакет), ядро ОС исключает заголовки IP и UDP, программа TFTP исключает заголовок TFTP, и наконец мы получаем голые данные.

Теперь наконец можно поговорить о печально известной модели OSI — многоуровневой модели сети. Эта модель описывает систему сетевой функциональности, которая имеет много преимуществ по сравнению с другими моделями. Например, вы можете написать в своей программе как сокеты, которые шлют данные не заботясь о том, как физически передаются данные (серийный порт, эзернет, модем и т.д.), так как программы на более низких уровнях (ОС, драйверы) делают за вас всю работу, и представляют её прозрачно для программиста.

Собственно, вот все уровни полномасштабной модели:

  • Прикладной
  • Представительский
  • Сеансовый
  • Транспортный
  • Сетевой
  • Канальный
  • Аппаратный (физический)

Физический уровень — это оборудование; ком-порт, сетевая карта, модем и т.д. Прикладной слой — дальше всех отстоит от физического. Это то место, где пользователь взаимодействует с сетью.

Для нас эта модель слишком общая и обширная. Сетевая модель, которую можем использовать мы, может выглядеть так:

  • Уровень приложений (Telnet, FTP и т.д.)
  • Транспортный протокол хост-хост (TCP, UDP)
  • Интернет-уровень (IP и маршрутизация)
  • Уровень доступа к сети (Ethernet, Wi-Fi или что угодно)

Теперь вы можете четко видеть, как эти слои соответствуют инкапсуляции исходных данных.

Видите, как много работы заключается в создании одного простого пакета? Офигеть! И все эти заголовки пакетов вы должны самостоятельно набирать в блокноте! Шучу. Всё, что вам нужно сделать в случае потоковых сокетов — это послать (send()) данные наружу. Ядро ОС построит TCP и IP хидеры, а оборудование возьмет на себя уровень доступа к сети. Ах, я люблю современные технологии.

На этом наш краткий экскурс в теорию сетей завершен. Ах да, я забыл вам сказать: всё, что я хотел вам сказать о маршрутизации: ничего! Да-да, я ничего не буду говорить об этом. О таблице маршрутизации за вас позаботятся ОС и IP-протокол. Если вам действительно интересно, почитайте документацию в интернете, её море.

Интерфейс применяется для взаимодействия между разными уровнями.

p, blockquote 1,0,0,0,0 -->


p, blockquote 2,0,0,0,0 -->

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

p, blockquote 3,0,0,0,0 -->

Интерфейс сокетов

p, blockquote 4,0,0,0,0 -->

Сокеты Беркли

Интерфейс называется интерфейсом сокетов. Сокеты впервые появились в операционной системе (ОС) Berkeley Unix 4.2 BSD в 1983 году.

p, blockquote 5,0,0,0,0 -->

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

p, blockquote 6,0,0,0,0 -->

Таким образом взаимодействие с сетью скрыто от программиста. Такая абстракция оказалась очень удобной, сокеты стали использоваться не только в UNIX, но и во многих других ОС в том числе в windows и linux, поддержку сокетов добавили во многие языки программирования.

p, blockquote 7,0,0,0,0 -->

Сокеты сейчас это де-факто стандарт для взаимодействия программ с транспортным уровнем, стека протоколов TCP/IP.

p, blockquote 8,0,0,0,0 -->

Операции сокетов Беркли

МЫ будем рассматривать операции сокетов Беркли. Большая часть современных реализаций сокетов имеют такие же операции или очень похожие на них.

p, blockquote 9,0,1,0,0 -->

Операции сокетов Беркли делятся на несколько типов.

  • Первый тип это создание сокетов: Socket, Bind, Listen.
  • Второй, установка соединения: Connect и Accept.
  • Третья, передача данных Send, Receive.
  • Четвёртое, закрытие соединения Close.

Модель клиент-сервер

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

p, blockquote 11,0,0,0,0 -->

Работа сокетов

Рассмотрим подробнее, как используются сокеты Беркли. У нас есть два компьютера, клиент и сервер. Вначале необходимо создать сокет на сервере и сделать так, чтобы он мог принимать запрос на соединение.

p, blockquote 12,0,0,0,0 -->

На сервере выполняется вызов Soket. Создается объект — сокет, в простейшем случае, это просто файл специального вида.

p, blockquote 13,0,0,0,0 -->

Сокет

p, blockquote 14,0,0,0,0 -->

Затем вызывается метод Bind, который используется для присоединения сокета к определенному ip адресу и порту. Например, ip адрес из внутренней сети и порт 80, порт веб серверов.

p, blockquote 15,0,0,0,0 -->

Bind

p, blockquote 16,0,0,0,0 -->

Вызов Listen говорит о том, что сокет готов принимать соединение по сети, сокет слушает. При вызове listen создаётся очередь для соединений, в вызове необходимо указать размер этой очереди. В примере на картинке ниже, размер очереди 5. Если сервер получит больше, чем 5 запросов на соединение, а предыдущие запросы еще не обработаны, то все новые запросы будут отбрасываться.

p, blockquote 17,0,0,0,0 -->

Listen

p, blockquote 18,0,0,0,0 -->

Затем сервер вызывает метод сокета accept, это говорит о том, что сервер готов принимать соединения и он переходит в режим пассивного ожидания, ждет установку запросов на соединение от клиентов.

p, blockquote 19,1,0,0,0 -->

Клиент со свой стороны, сначала вызывает метод сокет, для создания сокета, как правило для клиента не имеет значение, какой ip адрес и какой порт используется, номер порта назначается операционной системой. Поэтому метод bind на клиентском сокете обычно не вызывается.

p, blockquote 20,0,0,0,0 -->

Socket

p, blockquote 21,0,0,0,0 -->

Сразу после создания сокета, вызывается метод connect, в котором указывается ip адрес и порт. В параметрах метода connect указываются ip адрес сервера и порт с которыми нужно установить соединение. Отправляется запрос на соединение.

p, blockquote 22,0,0,0,0 -->

Connect устанавливается соединение

p, blockquote 23,0,0,0,0 -->

Для того, чтобы другие клиенты могли соединяться с этим сервером на этом ip адресе и на этом же порту, создаётся копия сокета. И соединение устанавливается не с исходным сокетом, который принимает соединения, а с копией сокета. Данные передаются через копию сокета.

p, blockquote 24,0,0,0,0 -->

Копия сокета

p, blockquote 25,0,0,0,0 -->

Клиент подготавливает порцию данных, вызывает метод send. Данные передаются по сети и сервер может их прочитать с помощью метода receive.

p, blockquote 26,0,0,0,0 -->

Передача данных

p, blockquote 27,0,0,0,0 -->

Дальше сервер и клиент могут обмениваться между собой несколькими порциями данных. После того, как все данные переданы, клиент вызывает метод close. После чего происходит разрыв соединения.

p, blockquote 28,0,0,0,0 -->

Разрыв соединения

p, blockquote 29,0,0,1,0 -->

Видео пример на Python. Серверный сокет

Рассмотрим пример применения сокетов для разработки программы на питон. Это популярный сейчас язык на котором очень удобно писать программы для работы сетей. Конечно существует большое количество других языков на которых можно писать программу для сетей, но работа с сокетами везде будет примерно одинаковая.

p, blockquote 30,0,0,0,0 -->

Язык питон для сокетов

p, blockquote 31,0,0,0,0 -->

Посмотри видео о примере сокета на языке питон. (timecode 5:15)

p, blockquote 32,0,0,0,0 -->

p, blockquote 33,0,0,0,0 -->

Python. Типы сокетов

Рассмотрим более подробно, какие виды протоколов можно использовать в сокетах. На сетевом уровне можно использовать:

  • socket.AF_INET — IPv4
  • socket.AF_INET6 — IPv6

А на транспортном:

  • socket.SOCK_STREAM — TCP
  • socket.SOCK_DGRAM — UDP

Есть и другие типы сокетов, но с сетями TCP/IP они используются редко.

p, blockquote 36,0,0,0,0 -->

Пример на Python. Клиентский сокет

Рассмотрим использование сокетов на стороне клиентов. Также посмотри видео, которое указано выше. (Timecode 7:03)

p, blockquote 37,0,0,0,0 -->

Пример программирования на питон

p, blockquote 38,0,0,0,0 -->

Заключение

Сокеты это De-facto стандарт интерфейса транспортного уровня. Именно сокеты необходимо использовать, чтобы писать программы для сетей, которые взаимодействуют напрямую с транспортным уровнем. Хотя сейчас многие программы взаимодействуют не с транспортным уровнем, а прикладным уровнем, который предоставляет больше возможностей.

Виды и различия сокетов процессоров

Тип сокета — это важнейшая характеристика процессора и материнской платы. Если опытный пользователь слышит такие названия, как сокет 462, 775, 1155 или AM4, то сразу понимает, о ПК из какого времени идет речь. Давайте разберемся в различиях современных сокетов под процессоры Intel и AMD, а заодно вспомним историю их развития: от первых персональных компьютеров и до наших дней.

Сокеты отличаются числом контактов, которое обычно растет вместе с мощностью и сложностью процессоров. Часть контактов используется для питания процессора, а часть — для работы самого процессора, шины PCI Express, ОЗУ и т. д. Для каждого сокета существует уникальная распиновка контактов, выглядит она примерно так.


Распиновка контактов сокета Intel LGA 1151

Сокет определяет и срок службы вашего ПК. Например, покупая сейчас ПК на сокете LGA1151, с процессором Core i5-9400F и материнской платой GIGABYTE B365M D2V, вы должны понимать, что новых процессоров под этот сокет выходить не будет, и оптимальный максимум на который вы можете рассчитывать при апгрейде, — это процессор Core i7-8700K или Core i9-9900K.

Для того, чтобы понять плюсы и минусы различных сокетов, а также нюансы их использования, стоит вспомнить, с чего все начиналось на заре зарождения персональных компьютеров. Давайте освежим в памяти самые распространенные сокеты на рынке ПК в хронологическом порядке. Серверных сокетов касаться не будем из-за их малого распространения.

Сокеты 1980-х и 1990-х годов

Процессоры первых ПК, такие как Intel 8086 и 8088, устанавливались в простейшие разъемы PIN DIP.


Следующее поколение — Intel 80186, 80286, 80386 — устанавливались в разъемы CLCC, PLCC. Зачастую процессоры Intel 80386 припаивались к плате, как некоторые процессоры современных ноутбуков.


И только некоторые процессоры 80386 стали использовать сокет 80386 со 132 контактами, который уже похож на современные сокеты.


Процессоры 80486 в 1989-1994 годах устанавливались аж в четыре типа сокетов: сокеты 1, 2, 3 и 5 с 169, 238, 237 и 238 контактами соотвественно. В сокет 5 можно было установить процессоры AMD K5 и Cyrix/IBM/TI M1/6x86.


Для установки в такой сокет процессора вы должны чуть отогнуть рычажок, чтобы вывести его из зацепа и приподнять на 90 градусов. При этом откроются контактные площадки, в которые процессор должен провалиться под своим весом, без усилия. После этого рычажок опускается на место и контактные площадки зажимают ножки процессора.

В 1993 году первые процессоры Pentium потребовали новый сокет 4 с 273 контактами. Обновленный сокет 7 появился в 1995 году. В нем уже был 321 контакт, но эти сокеты больше интересны тем, что в них было возможно установить процессоры AMD K6 и Cyrix/IBM/TI 6x86L, а потом и новые процессоры Pentium MMX.

AMD продолжило развитие сокета 7, выпустив сокет Super Socket 7, который поддерживал шину в 100 МГц и процессоры AMD K6-2, AMD K6-III, AMD K6-2+/K6-III+, Cyrix MII/6x86MX.

В 1997 году появляется новый разъем щелевого типа Slot 1 предназначенный для установки новых процессоров Pentium II и Celeron, выпущенных в формате картриджей SECC и SECC2, а потом и на полностью открытой печатной плате — SEPP.


Разъем поддерживал и ранние Pentium III, но имел недостатки в виде ненадежной фиксации, и уже в 1998 году на рынке появляется знакомый многим сокет 370. Начиная с него, Intel стала указывать в названии сокета количество контактов.

Что интересно, Slot 1 и сокет 370 с точки зрения электрики были очень похожи, что позволило выпустить переходники — слоткеты (англ. Slotket от slot и socket), которые позволяли использовать новые процессоры сокета 370 на старых материнских платах Slot 1.


AMD скопировало разъем Slot 1, выпустив Slot A в 1999 году. Но совместим он был только механически, а не электрически. Slot A поддерживал первые процессоры Athlon на ядре K7, выпущенные в формате SECC.

Сокеты 2000-х годов

В 2000 году появляются процессоры Pentium 4, которые вначале используют сокет 423, а затем — сокет 478.


У AMD в это время появляется сокет A или, как его еще называли, сокет 462, поддерживающий процессоры Athlon, Athlon XP, Sempron и Duron на разных ядрах.


В 2004 году Intel выпускает сокет совершенно нового типа под названием сокет T или LGA 775. Ножки с процессора переместились в сокет на материнской плате, и теперь изготавливались в виде пружинных контактов.


Сокеты типа LGA имеют важные преимущества над старыми сокетами PGA:

  • удешевление производства процессора
  • меньшие утечки тока
  • возможность наращивать количество контактов
  • возможность изготавливать сокеты очень больших размеров, как LGA 3647 от Intel или TR4 от AMD
  • очень надежное, по сравнению с сокетами PGA, удержание процессора

Но и у сокетов PGA есть свои преимущества:

  • сам сокет более дешев, что удешевляет материнскую плату
  • ножки на процессоре более надежны, чем ножки на сокете LGA, и позволяют произвести ремонт помятых ножек. Повредить ножки в сокете LGA очень легко, а выпрямить крайне затруднительно
  • сокет PGA более компактен и больше подходит для мобильной техники

Intel продолжила выпускать сокеты LGA и дальше. В 2008 году LGA 775 сменили LGA 1366 для высокопроизводительных систем. В 2009 году — LGA 1156 для настольных систем. Крепежные отверстия под систему охлаждения LGA 1156 совпадают и с современными сокетами Intel. Вы сможете установить на современную систему LGA 1200 старый качественный кулер, если он у вас есть.


А у AMD в 2003 году выходит сокет 754 для процессоров Athlon 64, затем, в 2004 году, — сокет 939. В 2006 году выходит сокет AM2, а в 2007 году — AM2+. В 2009 году выходит сокет AM3 с поддержкой памяти DDR3. А в 2011 году выходит сокет AM3+ с поддержкой процессоров Bulldozer. Платы и процессоры под этот сокет продаются и сейчас.


Эти сокеты отличало поступательное эволюционное развитие, что отражалось в расширенной обратной совместимости процессоров. Например, процессор под сокет AM3, Phenom II X4 925, можно установить в материнскую плату AM2+, и даже в AM3+!

Такая широкая возможность совместимости давала пользователям очень широкие возможности апгрейда и принесла компании AMD дивиденды в виде преданности пользователей.

Сокеты 2010-х годов

В 2011-2014 годах AMD выпускает сокеты FM1, FM2 и FM2+ для процессоров Athlon и APU серий A8, A6 и А4. В 2014 году выходит сокет AM1 для недорогих и энергоэффективных процессоров Kabini.

У Intel в 2011 году выходит сокет LGA 1155 или H2. Сокет оказался очень удачным и популярным. Для высокопроизводительных систем был выпущен сокет LGA 2011 или R.

В 2013 году Intel выпускает сокет LGA 1150 или H3. В 2014 году для высокопроизводительных систем выходит LGA 2011-3 или R3. А в 2015 году выходит сокет LGA 1151 или H4. Процессоры и платы под этот сокет продаются и сейчас.


Особо впечатляющим выглядит запуск и разгон процессора Coffee Lake Refresh Core i9-9900K на устаревшей материнской плате с чипсетом Z170.

Самые актуальные сокеты

Ну вот мы и подошли к самым актуальным на сегодняшний момент сокетам. У Intel это сокет LGA 1200, выпущенный во втором квартале 2020 года. По сути, это модифицированный сокет LGA 1151 с 49 дополнительными контактами для улучшения питания и поддержки новых функций ввода-вывода.


На 2021 год уже запланирован выход новых процессоров Alder Lake-S и нового сокета LGA 1700.

А вот у AMD актуальным является сокет AM4, выпущенный в 2017 году. Это стандартный PGA-ZIF сокет с 1331 контактом, но интересен он тем, что уже стал долгожителем. Первые процессоры под этот сокет — APU 7-ого поколения и Athlon X4 950 на архитектуре AMD Excavator.


А в 2017 году появляются популярнейшие процессоры Zen, совершившие рывок в количестве ядер и потоков у бюджетных процессоров. В 2018 году под сокет AM4 выходят процессоры Zen+, а в 2019 — Zen 2. И остается буквально месяц до анонса процессоров архитектуры Zen 3, которые также будут использовать сокет AM4.

Серьезный минус сокета AM4 — изменение расстояний между отверстиями под СО, что сразу сделало несоместимым с ним огромное число дорогих кулеров. При этом расстояние между пластиковыми зубцами осталось прежним и на него можно поставить стандартное крепление даже от сокета 754.

Следующее поколение процессоров будет использовать память DDR5 и, скорее всего, потребует нового сокета.

Заключение

Как видите, сокеты за 40 лет прошли огромный путь, постоянно видоизменяясь и увеличив количество контактов в 30 раз. Некоторые сокеты остаются актуальны очень короткое время и не пользуются особой популярностью. А некоторые — становятся долгожителями, как, к примеру, сокет LGA 775 или AM4.

Сокеты (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

Принципы сокетов¶

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

Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.

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

Основные функции¶

socket()¶

Создаёт конечную точку соединения и возвращает файловый дескриптор. Принимает три аргумента:

domain указывающий семейство протоколов создаваемого сокета

  • AF_INET для сетевого протокола IPv4
  • AF_INET6 для IPv6
  • AF_UNIX для локальных сокетов (используя файл)

type

  • SOCK_STREAM (надёжная потокоориентированная служба (сервис) или потоковый сокет)
  • SOCK_DGRAM (служба датаграмм или датаграммный сокет)
  • SOCK_RAW (Сырой сокет — сырой протокол поверх сетевого уровня).

protocol

Протоколы обозначаются символьными константами с префиксом IPPROTO_* (например, IPPROTO_TCP или IPPROTO_UDP). Допускается значение protocol=0 (протокол не указан), в этом случае используется значение по умолчанию для данного вида соединений.

Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число, представляющее присвоенный дескриптор.

Пример на Python

Связывает сокет с конкретным адресом. Когда сокет создается при помощи socket(), он ассоциируется с некоторым семейством адресов, но не с конкретным адресом. До того как сокет сможет принять входящие соединения, он должен быть связан с адресом. bind() принимает три аргумента:

  1. sockfd — дескриптор, представляющий сокет при привязке
  2. serv_addr — указатель на структуру sockaddr, представляющую адрес, к которому привязываем.
  3. addrlen — поле socklen_t, представляющее длину структуры sockaddr.

Возвращает 0 при успехе и −1 при возникновении ошибки.

Пример на Python

Автоматическое получение имени хоста.

listen()¶

Подготавливает привязываемый сокет к принятию входящих соединений. Данная функция применима только к типам сокетов SOCK_STREAM и SOCK_SEQPACKET. Принимает два аргумента:

  1. sockfd — корректный дескриптор сокета.
  2. backlog — целое число, означающее число установленных соединений, которые могут быть обработаны в любой момент времени. Операционная система обычно ставит его равным максимальному значению.

После принятия соединения оно выводится из очереди. В случае успеха возвращается 0, в случае возникновения ошибки возвращается −1.

Пример на Python

accept()¶

Используется для принятия запроса на установление соединения от удаленного хоста. Принимает следующие аргументы:

  1. sockfd — дескриптор слушающего сокета на принятие соединения.
  2. cliaddr — указатель на структуру sockaddr, для принятия информации об адресе клиента.
  3. addrlen — указатель на socklen_t, определяющее размер структуры, содержащей клиентский адрес и переданной в accept(). Когда accept() возвращает некоторое значение, socklen_t указывает сколько байт структуры cliaddr использовано в данный момент.

Функция возвращает дескриптор сокета, связанный с принятым соединением, или −1 в случае возникновения ошибки.

Пример на Python

connect()¶

Устанавливает соединение с сервером.

Некоторые типы сокетов работают без установления соединения, это в основном касается UDP-сокетов. Для них соединение приобретает особое значение: цель по умолчанию для посылки и получения данных присваивается переданному адресу, позволяя использовать такие функции как send() и recv() на сокетах без установления соединения.

Загруженный сервер может отвергнуть попытку соединения, поэтому в некоторых видах программ необходимо предусмотреть повторные попытки соединения.

Возвращает целое число, представляющее код ошибки: 0 означает успешное выполнение, а −1 свидетельствует об ошибке.

Пример на Python

Передача данных¶

Для передачи данных можно пользоваться стандартными функциями чтения/записи файлов read и write, но есть специальные функции для передачи данных через сокеты:

Читайте также: