Що таке розетка?


49

Може хтось мені пояснить, що таке розетка? Я бачу це в багатьох абревіатурах в контексті SSL тощо.

Крім того, чому його називають розеткою? Це суто тому, що це було ім'я, яке вони вигадали? Або це було ім'я, яке вони придумали?


9
Простіше кажучи: розетка - це телефон. Це те, що ви тримаєте в руці, дозволяє вам спілкуватися з іншим телефоном. Аналогія дещо руйнується: більшість телефонних розмов є одноранговими. Підключення сокета - це клієнт-сервер. Клієнт (такий як, але не обмежуючись цим, програмне забезпечення робочої станції, наприклад браузери) підключається до сервера (наприклад, веб-сервера, файлового сервера, сервера аутентифікації тощо). Ще один недолік аналогії: коли ви закриваєте з'єднання з сокетом, сокет руйнується, і ви повинні створити новий розетку, перш ніж ви зможете встановити нове з'єднання.
G-Man каже: «Відновіть Моніку»

Це не так вже й погано для аналогії. Сервер - це лише кол-центр і може одночасно мати багато сотень активних дзвінків.
MSalters

Відповіді:


42

Розетка - лише логічна кінцева точка для спілкування. Вони існують на транспортному шарі. Ви можете надсилати та отримувати речі в сокет, ви можете зв’язувати та слухати розетку. Сокет специфічний для протоколу, машини та порту і адресований як такий у заголовку пакету.

Посібники Beej щодо мережевого програмування та міжпроцесорної комунікації мають хорошу інформацію про те, як користуватися сокетами, і навіть відповідають на це точне запитання .


64

Найпростіше кажучи, сокет - це псевдофайл, який представляє мережеве з'єднання. Після створення сокета (використовуючи належні примітиви та належні параметри для ідентифікації іншого хоста), записи в сокет перетворюються на мережеві пакети, які надсилаються, і дані, отримані з мережі, можуть зчитуватися з сокета.

З одного боку, сокети дуже схожі на труби: вони виглядають так само, як файли програм, що їх використовують, але не призводять до читання чи запису на диск; скоріше вони дозволяють спілкуватися з іншою програмою (локальною у випадку з трубами та, можливо, віддаленою у разі розеток). Вони також пропонують, як ви вже згадували, двосторонній зв'язок (подібно до того, як могла б пара правильно підключених труб).

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

Як згадувало триплеє, в ході історії BSD труби були введені раніше, ніж розетки, і повторно застосовувалися за допомогою розеток, коли вони існували. У цій же посиланні "Проектування та впровадження операційної системи FreeBSD" зазначається, що труби потім були повернені до нерозетної реалізації з міркувань продуктивності: це, безумовно, підкреслює той факт, що труби мають подібність.


3
Можливо також згадати, що труби передують розеткам, але як тільки інтерфейс сокета був доданий в Unix, було багато сенсу повторно застосовувати труби за допомогою локальних розеток.
tripleee

@tripleee: Це чудовий історичний момент. Хочете надати довідку?
даг

Швидке гуглювання з'являється на сторінці 40 в Проектуванні та впровадженні операційної системи FreeBSD ; У тексті згадується про цю зміну в 4.2BSD, але також з'ясовується, що це вже не так, як це робиться, з міркувань продуктивності.
трійчатка

Чудово, я додам це до своєї відповіді.
даг

Найкраща відповідь техно у всіх
хаосгуру

7

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

Якщо дані, що надсилаються через сокет, можна вважати конвертами пошти, то сокет буде вашою поштовою скринькою. Ви приєднуєте до свого будинку (програми) поштову скриньку (розетку) і вкладаєте в неї свою вихідну пошту (дані). У запланований час пошта (операційна система) приходить разом із собою, забирає вашу вихідну пошту та видаляє будь-яку вхідну пошту в тій же поштовій скриньці. Ваша вихідна пошта передається від вашого імені одержувачу через вантажівку поштової пошти (підключення до мережі) разом з усією поштою ваших сусідів. Це дозволяє вам листуватися з далекими людьми, не потребуючи витрат, часу, труднощів тощо, щоб самостійно доставити лист.

Що стосується того, чому їх добре називають «розетками», то тут, мабуть, велику роль відіграє думка, що винахідники називають це все, що хочуть. Хоча, на мою думку, це не погане ім’я :)


7

Тепер, що це?

Сокет або "сокет" може бути декількома речами:

Перш за все, це продумана модель та інтерфейс прикладного програмування (API) . Це означає, що у вас є набір правил, яких потрібно дотримуватися, і набір функцій, які ви можете використовувати для написання програм, які щось роблять, відповідно до точно визначеного договору. У цьому конкретному випадку щось означає обмін даними з іншою програмою.

API sockets широко резюмує деталі "спілкування" загалом. Він описує, з ким ви спілкуєтесь і як, через одну (майже) послідовну та однакову форму для вирізання файлів cookie.
Ви можете створювати сокети в різних "доменах" (наприклад, "unix socket" або "internet socket") і різних типах зв'язку (наприклад, "datagram" socket або "stream") і спілкуватися з різними одержувачами , і все працює точно так само (ну 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 ( ).
трійчатка

0

Я вважаю, ви запитали про створення мережі. Таким чином, TCP-сервіси використовують сокети як точки зв'язку та складаються з IP-адреси, протоколу та номера порту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.