Сокет (програмний інтерфейс)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Сокет
Протилежне Локальні сокети

Сокети (англ. socket - заглиблення, гніздо, роз'єм) — назва програмного інтерфейсу для забезпечення обміну даними між процесами. Процеси при такому обміні можуть виконуватися як на одній ЕОМ, так і на різних ЕОМ, пов'язаних між собою мережею. Сокет - абстрактний об'єкт, що представляє кінцеву точку з'єднання.

Слід розрізняти клієнтські і серверні сокети. Клієнтські сокети грубо можна порівняти з кінцевими апаратами телефонної мережі, а серверні - з комутаторами. Клієнтський додаток (наприклад, браузер) використовує лише клієнтські сокети, а серверний (наприклад, вебсервер, якому браузер посилає запити) - як клієнтські, так і серверні сокети.

Інтерфейс сокетів вперше з'явився в BSD Unix. Програмний інтерфейс сокетів описаний в стандарті POSIX.1 І в тій чи іншій мірі підтримується усіма сучасними операційними системами.

Принципи сокетів[ред. | ред. код]

Кожен процес може створити сокет, що «слухає» (англ. listening socket), або серверний сокет і прив'язати його до якогось порту операційної системи (в UNIX непривілейовані процеси не можуть використовувати порти менше 1024). Процес, що слухає, зазвичай знаходиться в циклі очікування, тобто прокидається при появі нового з'єднання. При цьому зберігається можливість перевірити наявність з'єднань у цей час, встановити тайм-аут для операції тощо.

Кожен сокет має свою адресу. ОС сімейства UNIX можуть підтримувати багато типів адрес, але обов'язково повинні підтримуватися IP-адреса і локальна адреса (англ. Unix domain). Якщо прив'язати сокет до UNIX-адреси (локальні сокети), то буде створено спеціальний файл (файл сокета) за заданим шляхом, через який зможуть повідомлятися будь-які локальні процеси шляхом читання / запису з нього. Сокети Берклі (сімейство протоколів PF_INET або PF_INET6) доступні з мережі і вимагають виділення номера порту.

Зазвичай клієнт явно під'єднується до слухача, після чого будь-яке читання або запис через його файловий дескриптор будуть передавати дані між ним і сервером.

Адреси сокетів[ред. | ред. код]

На практиці сокет зазвичай посилається на сокет в Internet Protocol (IP) мережі (де сокет може називатися Інтернет-сокетом), зокрема для Transmission Control Protocol (TCP), який є протоколом для з'єднань один до одного. У цьому контексті передбачається, що сокети пов'язані з певною адресою сокета, а саме IP-адреса і номером порту для локального вузла, і є відповідна адреса сокету. На зовнішньому вузлі (іншому вузлі), який сам має асоційований сокет, що використовується зовнішнім процесом. Асоціація сокета з адресою сокету називається binding[джерело?].

Зауважимо, що в той час, як локальний процес може спілкуватися із зовнішнім процесом, надсилаючи або отримуючи дані на або з зовнішньої сокет-адреси, він не має доступу до чужого сокета сам по собі, і не може використовувати зовнішній сокет . Дескриптор сокета, оскільки вони є внутрішніми для зовнішнього вузла. Наприклад, у зв'язку між 10.20.30.40:4444 і 50.60.70.80:8888 (локальною IP-адресою: локальним портом, зовнішньою IP-адресою: зовнішнім портом) буде також пов'язаний сокет на кожному кінці, відповідний внутрішньому поданню з'єднання стеком протоколів на цьому вузлі. Вони локально називаються дескрипторами числових сокетів, скажімо 317 на одній стороні і 922 на іншій. Процес на вузлі 10.20.30.40 може запросити зв'язатися з вузлом 50.60.70.80 на порту 8888 (запит, щоб стек протоколу створив сокет для спілкування з цією адресою), і як тільки він створив сокет і отримав дескриптор сокета (317), він може спілкуватися через цей сокет за допомогою дескриптора (317). Стек протоколу буде пересилати дані на вузол 50.60.70.80 і з нього на порт 8888. Однак процес на вузлі 10.20.30.40 не може запитувати зв'язок на основі дескриптора зовнішнього сокету (наприклад, «socket 922» або «socket 922 на вузлі» 50.60.70.80 "), оскільки вони є внутрішніми для іншого вузла і не можуть використовуватися стеком протоколів на вузлі 10.20.30.40.

Реалізація[ред. | ред. код]

Стек протоколів, який сьогодні зазвичай надає операційна система (а не окрема бібліотека, наприклад), являє собою набір служб, які дозволяють процесам обмінюватися даними через мережу, використовуючи протоколи. Application programming interface (API), який використовуються програмами для зв'язку з стеком протоколів, використовуючи мережні сокети, називається сокет API. Розробка прикладних програм, які використовують цей API, називається програмуванням сокетів або мережеве програмування .

API інтернет сокетів зазвичай базуються на стандарті Сокети Берклі. У стандарті сокетів Берклі - сокети є формою файлового дескриптора, завдяки філософії Unix, що "все є файлом", а аналогії між сокетами і файлів. Обидва мають функції для читання, запису, відкриття та закриття. На практиці, під відмінностями розуміють, що по аналогії замість цього використовуються різні інтерфейси (відправляти і отримувати) на сокеті. У взаємодії між процесами кожен кінець, як правило, має свій власний сокет, але вони можуть використовувати різні API: вони абстрагуються мережним протоколом.

У стандартних інтернет-протоколах TCP і UDP адреса 'сокет' - це комбінація IP-адреса і номер порту, подібно до одного кінця телефонного з'єднання - це комбінація a номер телефону і конкретне розширення. Сокетам не потрібно мати адресу джерела, наприклад, тільки для передачі даних, але якщо програма зв'язує сокет з адресою джерела, сокет може використовуватися для отримання даних, надісланих на цю адресу. На основі цієї адреси інтернет-сокети доставляють вхідні пакети даних до відповідного процесу програми.

Визначення[ред. | ред. код]

Відмінності між сокетом (внутрішнє представлення), дескриптором сокета (абстрактним ідентифікатором) і адресою сокету (загальнодоступною адресою) є тонкими, і вони не з великою обачністю розрізняються в повсякденному використанні. Крім того, конкретні визначення "сокета" розрізняються між авторами і часто стосуються інтернет-сокету або TCP-сокета.

Інтернет-сокет характеризується принаймні наступними характеристиками:

  • Локальна адреса сокета, що складається з локальної IP-адреси і (для TCP і UDP, але не IP) номера порту
  • протокол: транспортний протокол, наприклад, TCP, UDP, raw IP. Це означає, що (локальні або віддалені) кінцеві точки з TCP-портом 53 і UDP-портом 53 є окремими сокетами, в той час як IP не має портів.

Сокет, який був підключений до іншого сокета, наприклад, під час встановлення з'єднання TCP, також має адресу віддаленого сокета.   У операційній системі та програмі, яка створила сокет, сокет посилається на унікальне ціле значення, яке називається дескриптором сокета . Операційна система пересилає корисне навантаження вхідних IP-пакетів на відповідний додаток, шляхом вилучення інформації адреси сокету з заголовків IP-адрес і транспортного протоколу, та видалення заголовків з даних програми.

У IETF Запит на коментар, Інтернет-стандарти, у багатьох підручниках, а також у цій статті, термін "сокет" означає об'єкт, який однозначно ідентифікується номером сокета. У інших підручниках, [1] термін сокет відноситься до локальної адреси сокету, тобто "комбінації IP-адреси і номера порту". У вихідному визначенні сокет , наведеному в RFC 147, так як він був пов'язаний з мережею ARPA в 1971 році, "'сокет задається як 32-бітове число для парних сокетів, що ідентифікують приймальні сокети. і непарні сокети, що ідентифікують сокети посилань. '"Сьогодні, однак, зв'язки сокета є двонаправленими.

Інструменти[ред. | ред. код]

У Unix-подібних операційних системах і Microsoft Windows, інструменти командного рядка netstat і ss використовуються для переліку встановлених сокетів і відповідної інформації.

Приклад[ред. | ред. код]

Цей приклад, моделюється відповідно до інтерфейсу сокету Берклі, надсилає рядок "Hello, world!" через TCP до порту 80 хоста з адресою 1.2.3.4. Він ілюструє створення сокета (getSocket), підключення його до віддаленого хоста, відправлення рядка і, нарешті, закриття сокета:

Socket mysocket = getSocket (type = "TCP")
connect (mysocket, address = "1.2.3.4", port = "80")
send (mysocket, "Hello, world!")
close (mysocket)

Типи[ред. | ред. код]

Доступні кілька типів інтернет-сокетів:

  • Datagram sockets, також відомі як сокети без з'єднання, які використовують User Datagram Protocol (UDP).
  • Stream sockets , також відомі як орієнтовані на з'єднання сокети, які використовують Протокол керування передачею (TCP), Stream Control Transmission Protocol (SCTP) або Datagram Congestion Control Protocol (DCCP).
  • Raw sockets (або raw IP sockets), як правило, доступні в маршрутизаторах та інших мережевих пристроях. Тут транспортний рівень обходиться, і заголовки пакетів стають доступними для програми, і немає номера порту в адресі, тільки IP-адреса.

Примітки[ред. | ред. код]

  1. Програма Cisco Networking Academy, CCNA 1 і 2 Companion Guide переглянуто третє видання, P.480, ISBN 1-58713-150-1

Див. також[ред. | ред. код]