Чим відрізняється порт і сокет?


928

Це питання було порушене одним із інженерів програмного забезпечення в моїй організації. Мене цікавить найширше визначення.


19
Зауважую, сокети не обмежуються мережевим вводом. Вони доступні у всіляких ситуаціях для передачі даних між різними програмами.
Олі

Відповіді:


976

Підсумок

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

Порт є віртуалізацію ідентифікатор , що визначає кінцеву точку служби (на відміну від служби примірника кінцевої точки він же ідентифікатор сеансу).

Сокет TCP не є з'єднанням , це кінцева точка конкретного з'єднання.

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

Для заданої комбінації адреси / порту може бути лише один розетку для слухача .

Експозиція

Це цікаве питання, яке змусило мене переглянути кілька речей, які я вважав, що знаю зсередини. Ви можете подумати, що ім’я, подібне до "socket", було б само собою зрозумілим: воно, очевидно, було вибране для отримання зображень кінцевої точки, до якої ви підключаєте мережевий кабель, і існують сильні функціональні паралелі. Тим не менш, у мережевому мовленні слово "розетка" несе стільки багажу, що необхідно ретельний повторний огляд.

У широкому можливому сенсі порт - це точка входу чи виходу. Хоча не використовується в мережевому контексті, французьке слово porte буквально означає двері або шлюз , ще більше підкреслюючи той факт, що порти є кінцевими точками транспортування, чи ви перевозять дані, чи великі сталеві контейнери.

Для цього обговорення я обмежуся розглядом контексту мереж TCP-IP. Модель OSI все дуже добре, але ніколи не була повністю впроваджена, тим більше менш широко розгорнута в умовах підвищеного стресу з високим рівнем руху

Поєднання IP-адреси та порту строго відоме як кінцева точка і іноді називається сокетом. Це використання походить із RFC793, оригінальної специфікації TCP.

TCP- з'єднання визначається двома кінцевими точками aka sockets .

Кінцева точка (сокет) визначається комбінацією мережевої адреси та ідентифікатора порту . Зауважте, що адреса / порт не повністю ідентифікує сокет (докладніше про це пізніше).

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

Саме пара сокетів (4-кортеж, що складається з IP-адреси клієнта, номера клієнтського порту, IP-адреси сервера та номера порту сервера) визначає дві кінцеві точки, що однозначно ідентифікують кожне з'єднання TCP в Інтернеті. ( TCP-IP Illustrated том 1 , W. Річард Стівенс)

У більшості мов, що походять з С, TCP-з'єднання встановлюються та маніпулюються за допомогою методів на екземплярі класу Socket. Хоча звичайно працювати на більш високому рівні абстракції, як правило, екземпляр класу NetworkStream, це загалом викриває посилання на об'єкт сокета. Для кодера цей об'єкт сокета представляє з'єднання, оскільки з'єднання створюється та маніпулює за допомогою методів об'єкта socket.

У C #, щоб встановити TCP-з'єднання (до існуючого слухача), спершу ви створите TcpClient . Якщо ви не вказали кінцеву точку конструктору TcpClient, він використовує параметри за замовчуванням - так чи інакше визначається локальна кінцева точка. Потім ви викликаєте метод Connect на створеному вами екземплярі. Цей метод вимагає параметра, що описує іншу кінцеву точку.

Все це трохи заплутано і змушує вас повірити в те, що розетка - це з'єднання, яке є болотами. Я працював під цим непорозумінням, поки Річард Дорман не задав це питання.

Зробивши багато читання та мислення, я зараз переконаний, що було б набагато більше сенсу мати клас TcpConnection з конструктором, який бере два аргументи, LocalEndpoint та RemoteEndpoint . Можливо, ви могли б підтримати один аргумент RemoteEndpoint, коли значення за замовчуванням прийнятні для локальної кінцевої точки. Це неоднозначно на багатоходових комп'ютерах, але двозначність можна вирішити за допомогою таблиці маршрутизації, вибравши інтерфейс з найкоротшим маршрутом до віддаленої кінцевої точки.

Чіткість також буде підвищена в інших аспектах. Сокет не ідентифікується за поєднанням IP-адреси та порту:

[...] TCP демультиплексує вхідні сегменти, використовуючи всі чотири значення, що містять локальні та зовнішні адреси: IP-адреса призначення, номер порту призначення, IP-адреса джерела та номер вихідного порту. TCP не може визначити, який процес отримує вхідний сегмент, дивлячись лише на порт призначення. Крім того, одна з [різних] кінцевих точок [заданого номера порту], яка буде отримувати вхідні запити на з'єднання, - це стан, що знаходиться у режимі прослуховування. (p255, Том 1 ілюстрованого TCP-IP , W. Річард Стівенс)

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

Гагравал мені не вірить (див. Коментарі), ось ось справжній зразок. Я підключив веб-браузер до http://dilbert.com, а потім побіг netstat -an -p tcp. Останні шість рядків виводу містять два приклади того, що адреси та порту недостатньо для однозначної ідентифікації сокета. Є два чітких з'єднання між 192.168.1.3 (моя робоча станція) та 54.252.94.236:80 (віддалений сервер HTTP)

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

Оскільки сокет є кінцевою точкою з'єднання, є дві розетки з комбінацією адреси / порту 207.38.110.62:80та ще дві з комбінацією адреси / порту 54.252.94.236:80.

Я думаю, що нерозуміння Хаграваля виникає з мого дуже обережного використання слова "ототожнює". Я маю на увазі "повністю, однозначно і однозначно ототожнює". У наведеному вище зразку є дві кінцеві точки з комбінацією адреси / порту 54.252.94.236:80. Якщо у вас є лише адреса та порт, у вас недостатньо інформації, щоб розказувати ці розетки. Недостатньо інформації для ідентифікації розетки.

Додаток

Абзац другий розділу 2.7 RFC793 говорить

З'єднання повністю задається парою розеток на кінцях. Місцева розетка може брати участь у багатьох з'єднаннях з різними сторонніми розетками.

Це визначення сокета не є корисним з точки зору програмування, оскільки воно не тотожне об'єкту сокета , який є кінцевою точкою конкретного з'єднання. Для програміста, і більшість аудиторій цього питання є програмістами, це важлива функціональна різниця.

Список літератури

  1. TCP-IP Illustrated том 1 протоколів , В. Річард Стівенс, 1994 р. Аддісон Веслі

  2. RFC793 , Інститут інформаційних наук, Університет Південної Каліфорнії для DARPA

  3. RFC147 , Визначення сокета, Джоел М. Вінетт, Лабораторія Лінкольна


6
Можливо, реальна аналогія з ключовими словами socket та port допоможе тим, хто відповів на це питання. Ще чудове пояснення!
rohitverma

5
@rationalcoder - Прочитайте всю відповідь. Існує різниця між тим, щоб бути визначеним чимось і бути ідентифікованим ним. Наприклад, екземпляри класу визначаються класом. Вони частково, але повністю не ідентифіковані нею.
Пітер Вун

6
Я не проголосував, тому що я не згоден з цим твердженням - " Сокет не ідентифікується поєднанням IP-адреси та порту: " .. Прочитайте TCP RFC - tools.ietf.org/html/rfc793 .. Дуже ясно, що socket - це комбінація IP та порту, якщо ви знаєте IP та порт, то ви визначили сокет або кінцеву точку, якщо ви знаєте пару сокет, тобто клієнтський IP + порт та порт IP + сервера, то ви визначили унікальне з'єднання ..
hagrawal

6
"У наведеному вище зразку є дві кінцеві точки з комбінацією адреси / порту 54.252.94.236:80. Якщо у вас є лише адреса та порт, у вас недостатньо інформації, щоб розказати ці розетки. Недостатньо інформації для ідентифікації розетка ". Чи не ті самі розетки, а різні з'єднання, між двома з'єднаннями у вас підключено 3 розетки, 2 локальних мережі та один і той же серверний сокет; чи це насправді дві різні розетки? Не було б їх розказувати окремо, оскільки вони однакові, але для роз'єднання з'єднань вам знадобляться різні локальні розетки.
Ендрю Клавін

6
-1 Ваша відповідь просто неправильна. Ви: "Сокет TCP - це ... кінцева точка конкретного з'єднання ." RFC 793 : "розетка може бути одночасно використана в декількох з'єднаннях ." Я не впевнений, якими бібліотеками ви користуєтесь, але в бібліотеках, які я використовував, об’єкти сокетів були однозначно визначені IP-адресом та портом і породили об’єкти з'єднання для кожного віддаленого сокета.
Заз

187

Розетка складається з трьох речей:

  1. IP-адреса
  2. Транспортний протокол
  3. Номер порту

Порт - це число від 1 до 65535 включно, що означає логічний затвор у пристрої. Кожне з'єднання між клієнтом і сервером вимагає унікального сокета.

Наприклад:

  • 1030 - порт.
  • (10.1.1.2, TCP, порт 1030) - це сокет.

80
Ні. Розетка складається з п'яти речей: {протокол, локальна адреса, локальний порт, віддалена адреса, віддалений порт}.
користувач207421

19
@EJP Ні, знову. Дивіться обрану відповідь для отримання додаткової інформації.
Келан Крумме

2
@KorayTugay Це в заголовку IP. Чому ви думаєте, що рівень TCP цього не бачить?
користувач207421

1
@EJP, як я бачу в найбільш голосованій відповіді вище, що сокет НЕ є самим з'єднанням, але це кінцева точка з'єднання, то як це може включати як локальні, так і віддалені порти та ip адреси. Сокет буде представляти лише одну сторону з'єднання, тобто локальний порт та локальну ip адресу АБО віддалений порт та віддалений ip акредит. Будь ласка, виправте мене, якщо я помиляюся.
RBT

7
@EJP Still RFC 793: "Пара розеток однозначно ідентифікує кожне з'єднання. Тобто, розетка може бути одночасно використана в декількох з'єднаннях." Якщо розетка вже складалася з п’яти речей, то як у моєму цитуванні може бути "пара розеток"?
Габ 是 好人

100

Сокет представляє єдине з'єднання між двома мережевими програмами. Ці два додатки номінально працюють на різних комп’ютерах, але розетки можуть також використовуватися для міжпроцесорної комунікації на одному комп’ютері. Програми можуть створювати кілька розеток для спілкування один з одним. Розетки є двонаправленими, тобто будь-яка сторона з'єднання здатна як надсилати, так і приймати дані. Тому сокет може бути створений теоретично на будь-якому рівні моделі OSI від 2 вгору. Програмісти часто використовують розетки в мережевому програмуванні, хоча і опосередковано. Бібліотеки програмування, такі як Winsock, приховують багато деталей низького рівня програмування сокетів. Розетки широко використовуються з початку 1980-х.

Порт являє собою кінцеву точку або "канал" для мережевих комунікацій. Номери портів дозволяють різним програмам на одному комп’ютері використовувати мережеві ресурси, не заважаючи один одному. Номери портів найчастіше з'являються в мережевому програмуванні, зокрема в програмуванні розетки. Однак іноді номери портів стають видимими для випадкового користувача. Наприклад, на деяких веб-сайтах, які людина відвідує в Інтернеті, використовується така URL-адреса:

http://www.mairie-metz.fr:8080/ У цьому прикладі число 8080 посилається на номер порту, який використовується веб-браузером для підключення до веб-сервера. Зазвичай веб-сайт використовує номер порту 80, і цей номер не потрібно включати в URL-адресу (хоча це може бути).

У мережах IP, номери портів теоретично можуть становити від 0 до 65535. Однак більшість популярних мережевих додатків використовують номери портів у нижньому кінці діапазону (наприклад, 80 для HTTP).

Примітка: Термін порт також відноситься до кількох інших аспектів мережевих технологій. Порт може посилатися на фізичну точку з'єднання для периферійних пристроїв, таких як послідовний, паралельний і USB-порти. Термін порт також відноситься до певних точок з'єднання Ethernet, таких як концентратори, комутатори або маршрутизатори.

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm


2
Шар 2 в моделі OSI - це з'єднання між вузлами, у нього немає механізму з'єднання процесів. Я не вірю, що ви можете розглянути розетку, наявну в OSI l2.
Антоніо Хейлі

18
Схема - це з'єднання - розетка - кінцева точка. З'єднання складається з 2 розеток.
Марк Брекетт

" Сокет представляє єдине з'єднання між двома мережевими програмами ". Це не відповідає RFC 793, протоколу управління передачею, який пояснює: " Щоб дозволити багатьом процесам в одному хості одночасно використовувати засоби зв'язку TCP, TCP надає набір адрес або порти в межах кожного хоста. Поєднавшись з мережею та адресами хостів із шару зв'язку в Інтернеті, це утворює сокет. Пара розеток однозначно ідентифікує кожне з'єднання ".
Рон

84

З деякою аналогією

Хоча вже багато технічних речей для сокетів вже наведено вище ... Я хотів би додати свою відповідь, про всяк випадок, якщо хтось все-таки не зміг відчути різницю між ip, портом і сокетами.

Розглянемо сервер S ,

і скажіть, що людині X, Y, Z потрібна послуга (скажімо, служба чату) з цього сервера S

тоді

IP-адреса повідомляє -> хто? це той сервер чату "S", з яким хочуть зв’язатися X, Y, Z

гаразд, ти отримав "хто сервер"

але припустимо, що сервер "S" надає деякі інші послуги також іншим людям, скажімо, "S" надає послуги зберігання особам A, B, C

тоді

порт розповідає ---> який? Вам потрібні послуги (X, Y, Z), тобто служба чату, а не послуга зберігання даних

добре .., ви змушуєте сервер дізнатися, що "чат-сервіс" - це те, що ви хочете, а не зберігання

але

вам троє, і сервер, можливо, захоче ідентифікувати всіх трьох по-різному

приходить розетка

тепер сокет розповідає -> який? конкретний зв'язок

тобто, скажімо,

розетка 1 для людини X

розетка 2 для людини Y

і розетка 3 для особи Z

Я сподіваюся, що це допоможе тому, хто все ще був розгублений :)


Отже, X, Y, Z з'єдналися б з тим самим портом, тобто тією ж службою, але мають різні розетки на стороні сервера? Отже, коли, скажімо, X надсилає якийсь пакет на сервер, він скаже: "знайдіть мені (протокол, IP X, порт X, S-IP, S-порт)" і відправте в додаток чату. Я припускаю, що між деякими прикладними об'єктами та сокетними об'єктами має бути зв'язок? Наприклад, коли я отримую деякі дані з socket-1, я хочу відображати це як повідомлення користувача, але додаток повинен знати, що повідомлення з сокета A надходять від User-X.
моноліт

44

По-перше, я думаю, що ми повинні почати з невеликого розуміння того, що означає отримання пакету від А до В.

Загальне визначення для мережі - це використання моделі OSI, яка розділяє мережу на кілька шарів відповідно до призначення. Є кілька важливих, про які ми розповімо тут:

  • Рівень зв'язку даних . Цей рівень відповідає за отримання пакетів даних з одного мережевого пристрою на інший і знаходиться трохи вище рівня, який фактично виконує передачу. Він говорить про MAC-адреси та знає, як знайти хости на основі їх MAC (апаратної) адреси, але нічого більше.
  • Мережевий рівень являє собою шар , який дозволяє передавати дані між машинами і над фізичними кордонами, такими як фізичні пристрої. Мережевий рівень повинен по суті підтримувати додатковий механізм на основі адреси, який так чи інакше стосується фізичної адреси; введіть Інтернет-протокол (IPv4). IP-адреса може отримати ваш пакет від А до В через Інтернет, але нічого не знає про те, як пересувати окремі хмелі. Це обробляється шаром вище відповідно до інформації про маршрутизацію.
  • Транспортний рівень . Цей рівень відповідає за визначення способу отримання інформації від А до В та будь-яких обмежень, перевірок чи помилок щодо такої поведінки. Наприклад, TCP додає додаткову інформацію до пакету таким чином, що можна вивести, якщо пакети були втрачені.

TCP, серед іншого, містить концепцію портів . Це фактично різні кінцеві точки даних на одній і тій же IP-адресі, до якої AF_INETможе прив'язуватися Інтернет-сокет ( ).

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

Що приводить нас до анатомії з'єднання TCP або UDP. Кожен містить вихідний порт та адресу, а також цільовий порт та адресу. Це так, що в будь-який даний сеанс цільова програма може відповідати та отримувати з джерела.

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

Тепер нам потрібно поглянути на те, як ви спілкуєтесь із точки зору програми із зовнішнім світом. Для цього вам потрібно люб’язно попросити вашу операційну систему, і оскільки більшість ОС підтримують Berkeley Sockets як робити це, ми бачимо, що ми можемо створити сокети з портами з такої програми:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...

Чудово! Тож у sockaddrструктурах ми вкажемо наш порт та бам! Робота виконана! Ну, майже, крім:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

також можливо. Урх, це викинуло гайковий ключ у творах!

Гаразд, насправді це не так. Все, що нам потрібно зробити, - це придумати кілька відповідних визначень:

  • Інтернет-розетка - це поєднання IP-адреси, протоколу та відповідного номера порту, на якому служба може надавати дані. Отже, tcp-порт 80, stackoverflow.com - це Інтернет-розетка.
  • Unix-сокет - це кінцева точка IPC, представлена ​​у файловій системі, наприклад /var/run/database.sock.
  • API сокета - це метод, який вимагає, щоб програма могла читати і записувати дані в сокет.

Вуаля! Це налагоджує справи. Тож у нашій схемі тоді,

  • Порт - це числовий ідентифікатор, який, як частина протоколу транспортного рівня, ідентифікує номер послуги, який повинен відповідати даному запиту.

Тож справді порт - це підмножина вимог щодо формування Інтернет-сокета. На жаль, просто так трапляється, що значення слова socket було застосовано до кількох різних ідей. Тому я щиро раджу вам назвати наступний гніздо проекту, просто додати плутанину;)


Ось чому кулі не залишають і не залишать Powerpoint; вони працюють!
Анураг Калія

Дуже приємне знайомство з tcp-ip та мережевим зв’язком. Початківці, читайте це спочатку.
Колін

32

Сокет = IP-адреса + порт (числова адреса)
Разом вони ідентифікують кінцеву точку мережевого з'єднання на машині. (Я щойно заграв мережу 101?)


7
Я вважаю, порт має ширше значення, ніж ваше визначення.
Річард Дорман

2
І сокети не тільки підлягають стеку TCP / IP. Див. Розетки домену UNIX або взагалі міжпроцесорні комунікаційні розетки.
matthias krull

не впевнений у цій відповіді. Ви можете використовувати HTTP для зв'язку з іншим процесом через сокети, не призначаючи порт.
SeF

31

Як правило, ви отримаєте багато теоретичного, але один з найпростіших способів диференціювати ці два поняття:

Для того, щоб отримати послугу, вам потрібен номер сервісу. Цей номер послуги називається портом. Просто як це.

Наприклад, HTTP як послуга працює на порту 80.

Зараз багато людей можуть запитати послугу, і з'єднання з клієнтом-сервером встановлено. Буде багато зв’язків. Кожне з'єднання представляє клієнта. Для того, щоб підтримувати кожне з'єднання, сервер створює сокет на з'єднання, щоб підтримувати свого клієнта.


Чи потрібен кожному сокету власний порт?
понеділокПапер

Дивовижно. Найпростіший спосіб представити гірські знання.
Асиф Мехмуд

5
Я не впевнений, чи правильне ваше твердження: "сервер створює сокет за з'єднанням, щоб підтримувати його клієнт".
Rushi Agrawal

1
@RushiAgrawal Тоді пропоную поглянути. Зокрема, дивіться, як людина приймає.
користувач207421

1
Це означає, що для кожного сокета, який сервер створює за з'єднання для підтримки свого клієнта, може бути однаковий номер порту (наприклад, порт 80 для продовження HTTP-з'єднань), але з різною IP-адресою клієнтів, з яких надсилаються запити на з'єднання. правильно?
Рандіка Вішман

25

Здається, є багато відповідей, що прирівнюють сокет до з'єднання між двома комп'ютерами. Я думаю, це абсолютно неправильно. Сокет завжди був кінцевою точкою на 1 ПК, яка може бути, а може і не бути підключеною - напевно, ми в певний момент усі використовували прослуховувачі або UDP-сокети *. Важлива частина - це адресація та активність. Відправлення повідомлення до 1.1.1.1.1234, ймовірно, не спрацює, оскільки для цієї кінцевої точки не визначено сокет.

Сокети є специфічними для протоколу, тому реалізація унікальності, якою і TCP / IP, і UDP / IP використовує * (ipaddress: порт), відрізняється, ніж, наприклад, IPX (мережа, вузол та ... ах, сокет - але інша socket, ніж розуміється загальним терміном "socket". Номери розеток IPX еквівалентні IP-портам). Але всі вони пропонують унікальну адресну кінцеву точку.

Оскільки IP став домінуючим протоколом, порт (з точки зору мережі) став синономічним або з номером порту UDP, або з TCP - що є частиною адреси сокета.

  • UDP не пов’язаний з підключенням, тобто жодна віртуальна схема між двома кінцевими точками ніколи не створюється. Однак ми все ще називаємо розетки UDP як кінцеву точку. Функції API дають зрозуміти, що обидва є просто різними типами сокетів - SOCK_DGRAMце UDP (просто відправка повідомлення) і SOCK_STREAMє TCP (створення віртуальної схеми).

  • Технічно заголовок IP містить IP-адресу, а протокол зверху IP (UDP або TCP) містить номер порту. Це дає можливість мати інші протоколи (наприклад, ICMP , які не мають номерів портів, але мають інформацію про IP-адреси).


25

Коротка коротка відповідь.

Порт може бути описаний як внутрішній адресу в межах хоста , який ідентифікує програму або процес.

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


3
Слово "внутрішній" в описі порту для мене звучить як "непублічне".
Йонас N

Тож чи можна сказати: Sockets працює всередині портів? або Порти працює всередині сокетів?
Gucho Ca

@GuchoCa Ми не можемо сказати, що або сокети, або порти працюють взагалі, не кажучи вже про один всередині іншого. Незрозуміло, що ви просите.
user207421

16

Вони є термінами з двох різних областей: "порт" - це поняття від мережі TCP / IP, "socket" - це API (програмування). "Сокет" робиться (у коді) шляхом взяття порту та імені хоста або мережевого адаптера та об'єднання їх у структуру даних, яку ви можете використовувати для надсилання чи отримання даних.


Для найбільш загальної відповіді, накресліть "зроблено, взявши порт і ім'я хоста або мережевий адаптер та об'єднавши їх у". Наприклад, сокет UNIX - це (в коді) структура даних (або об'єкт), яку ви можете використовувати для надсилання або отримання даних.
JosiahYoder-deactive за винятком ..

14

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

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

Отже, розетка в мережі - це віртуальний пристрій зв’язку, прив'язаний до пари (ip, port) = (адреса, послуга).

Примітка:

  • Машина, комп’ютер, хост, мобільний телефон або ПК можуть мати кілька адрес, кілька відкритих портів і, отже, кілька розеток. Як і в офісі, ви можете мати кілька телефонів із декількома телефонними номерами та з багатьма людьми, з якими можна поговорити.
  • Наявність відкритого / активного порту вимагає, щоб ви мали бути прив'язаним до нього сокетом, оскільки саме сокет робить порт доступним. Однак у вас можуть бути невикористані порти.
  • Також зверніть увагу, що в розетці сервера ви можете прив’язати його до (порт, конкретна адреса машини) або до (порт, всі адреси машини), оскільки в телефоні ви можете підключити багато телефонних ліній (телефонних номерів) до телефон або одна конкретна телефонна лінія до телефону, і все ж ви можете зв’язатися з людиною через усі ці телефонні лінії або через певну телефонну лінію.
  • Ви не можете пов'язувати (прив’язувати) розетку з двома портами, як у телефоні, як правило, ви не завжди можете мати двох людей, які користуються одним і тим же телефоном одночасно.
  • Додатково: на одній машині у вас не може бути двох розеток з одним типом (клієнт або сервер) та одного порту та ip. Однак якщо ви - клієнт, ви можете відкрити два з'єднання з двома сокетами до сервера, оскільки локальний порт у кожному з цих розеток клієнта різний)

Сподіваюся, це очистить вас від сумнівів


Цікаво побачити всі ці розуміння та аналогії розеток / портів / ip-адрес під цим питанням. І мені подобається ця відповідь.
Кривавої

12

Прочитавши чудові відповіді, я зрозумів, що наступний момент потребує акценту для мене, новачка в мережевому програмуванні:

TCP-IP-з'єднання - це двонаправлені шляхи, що з'єднують одну адресу: комбінація портів з іншою адресою: комбінація портів. Тому щоразу, коли ви відкриваєте з'єднання з локальної машини до порту на віддаленому сервері (скажімо, www.google.com:80), ви також пов'язуєте новий номер порту на вашій машині із з'єднанням, щоб сервер міг надіслати речей до вас, (наприклад, 127.0.0.1:65234). Це може бути корисно за допомогою netstat для перегляду з'єднань вашого апарату:

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...

12

Адреса сокета - це IP-адреса та номер порту

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

З'єднання відбувається, коли 2 розетки пов'язані між собою.


Не існує такого поняття, як зв’язувати дві розетки разом. Слово "пов'язаний" означає щось інше з портами.
користувач207421

10

Сокет - це особливий тип обробки файлів, який використовується процесом для запиту послуг мережі в операційній системі. Адреса сокета є потрійною: {протокол, локальна адреса, локальний процес}, де локальний процес ідентифікується за номером порту.

У наборі TCP / IP, наприклад:

{tcp, 193.44.234.3, 12345}

Бесіда - це зв’язок зв'язку між двома процесами, таким чином зображаючи асоціацію між двома. Асоціація - це 5-канальний пакет, який повністю визначає два процеси, що містять з'єднання: {протокол, локальна адреса, локальний процес, іноземна адреса, іноземний процес}

У наборі TCP / IP, наприклад:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

може бути дійсною асоціацією.

Половина асоціацій є або: {протокол, локальна адреса, локальний процес}

або

{протокол, іноземна адреса, іноземний процес}

які вказують кожну половину з'єднання.

Напівсоціація також називається сокетом або транспортною адресою. Тобто сокет - це кінцева точка для зв'язку, яку можна назвати і адресувати в мережі. Інтерфейс сокета є одним з декількох інтерфейсів програмування (API) до протоколів зв'язку. Розроблений як загальний інтерфейс програмування комунікацій, він вперше був представлений системою 4.2BSD UNIX. Хоча він не був стандартизований, він став фактично галузевим стандартом.


Ця відповідь - це те, що зробив це для мене. Я думаю, це тому, що ніхто більше не згадував слово асоціація. Гарне пояснення.
раціональнийкодер

У жодному з ваших прикладів немає жодного номеру процесу. Слово, яке ви шукаєте, - «порт».
користувач207421

Прочитайте перший пункт .. Там це чітко згадується. Повідомте мене про будь-яку неоднозначність, цитуючи точну фразу .. Було б корисно для мене, щоб імпровізувати.
Кришна

7

Розетка - кінцева точка зв'язку. Сокет не має прямого відношення до сімейства протоколів TCP / IP, його можна використовувати з будь-яким протоколом, який підтримує ваша система. API socket C очікує, що ви спочатку отримаєте з системи порожній об'єкт сокета, який ви можете потім прив’язати до локальної адреси сокета (безпосередньо отримати вхідний трафік для протоколів, що не підключаються до з'єднання, або прийняти вхідні запити на з'єднання для протоколів, орієнтованих на з'єднання) або що ви можете підключитися до віддаленої адреси сокета (для будь-якого типу протоколу). Ви навіть можете робити обидва, якщо ви хочете керувати обома, локальною адресою сокета, до якої пов'язаний сокет, і віддаленою адресою сокета, до якої підключено сокет. Для протоколів без підключення підключення сокета навіть необов’язково, але якщо ви цього не зробите, Вам доведеться також передавати адресу призначення з кожним пакетом, який ви хочете надіслати через сокет, як інакше сокет знатиме, куди надсилати ці дані? Перевага полягає в тому, що ви можете використовувати один сокет для надсилання пакетів на різні адреси сокетів. Після того, як у вас розетка налаштована і, можливо, навіть підключена, вважайте, що це двостороння комунікаційна труба. Ви можете використовувати їх для передачі даних до якогось пункту призначення, а якесь призначення може використовувати їх для передачі даних вам. Те, що ви пишете в сокет, надсилається, а отримане - доступне для читання. Ви можете використовувати їх для передачі даних до якогось пункту призначення, а якесь призначення може використовувати їх для передачі даних вам. Те, що ви пишете в сокет, надсилається, а отримане - доступне для читання. Ви можете використовувати їх для передачі даних до якогось пункту призначення, а якесь призначення може використовувати їх для передачі даних вам. Те, що ви пишете в сокет, надсилається, а отримане - доступне для читання.

Порти з іншого боку - це те, що мають лише певні протоколи стека протоколів TCP / IP. TCP і UDP пакети мають порти. Порт - це просто просте число. Поєднання вихідного порту та порту призначення ідентифікують канал зв'язку між двома хостами. Наприклад, у вас може бути сервер, який повинен бути і простий, і простий сервер HTTP, і простий FTP-сервер. Якщо зараз на адресу цього сервера надходить пакет, то як би він знав, чи це пакет для HTTP або FTP-сервера? Добре, це буде знати, як HTTP-сервер працюватиме на порту 80, а FTP-сервер на порту 21, тому якщо пакет прибуває з портом призначення 80, це для HTTP-сервера, а не для FTP-сервера. Також пакет має вихідний порт, оскільки без такого порту джерела сервер міг мати лише одне підключення до однієї IP-адреси одночасно. Порт джерела дозволяє серверу розрізняти ідентичні з'єднання: усі вони мають один і той же порт призначення, наприклад порт 80, той самий IP-адреса призначення (IP-сервер) і той самий IP-код джерела, як і всі вони той самий клієнт, але оскільки вони мають різні вихідні порти, сервер може відрізняти їх один від одного. І коли сервер надсилає відповіді, він зробить це на порт, від якого надходив запит, і таким чином клієнт може також відрізняти різні відповіді, які він отримує від одного сервера.


2
Це неправильно. Розетка не є кінцевою точкою. Розетка визначається двома кінцевими точками. Кожна кінцева точка визначається мережевою адресою та портом. Метою портів є диференціювання декількох кінцевих точок на одній і тій же мережевій адресі, щоб можна було підтримувати кілька одночасних сокетів.
Пітер Вун

1
Я зауважую, що RFC793 (оригінальна специфікація TCP) посилається на комбінацію мережевої адреси та порту як сокет, тому я можу побачити, де ви це взяли, але це все-таки неправильно, оскільки сокет обов'язково визначається двома кінцевими точками.
Пітер Вон

2
За роздумом література суперечлива, і я вибачаюся. Дуже строго кажучи, зв’язок не відбувається, поки TCP-з'єднання не буде встановлено між двома кінцевими точками (ака-сокетами), кожна з яких ідентифікується мережевою адресою та портом. Я здаюся.
Пітер Вун

6

Порт був найпростішою частиною, це просто унікальний ідентифікатор для сокета. Розетка - це те, що процеси можуть використовувати для встановлення з'єднань і для спілкування один з одним. У високого Джеффа була чудова аналогія телефону, яка не була ідеальною, тому я вирішив виправити це:

  • ip і порт ~ номер телефону
  • розетка ~ телефонний пристрій
  • з'єднання ~ телефонний дзвінок
  • встановлення зв'язку ~ виклик номера
  • процеси, віддалені програми ~ люди
  • повідомлення ~ мовлення

Гарне уточнення (особливо якщо врахувати історію телефонної комутації , який є частиною основи мережевий термінології ..)
oɔɯǝɹ

Погляньте на netstat дисплей деякий час. Усі розетки, прийняті від прослуховувальної розетки, мають один і той же порт. Ergo a port не є унікальним ідентифікатором для сокета.
користувач207421

6

Додаток складається з пари процесів, які спілкуються по мережі (пара клієнт-сервер). Ці процеси надсилають та приймають повідомлення в мережу та з неї через програмний інтерфейс, який називається socket . Розглядаючи аналогію, представлену в книзі "Комп'ютерні мережі: підхід зверху вниз". Є будинок, який хоче спілкуватися з іншим будинком. Тут будинок є аналогом процесу, а двері - до розетки. Процес надсилання передбачає, що з іншого боку дверей є інфраструктура, яка транспортуватиме дані до місця призначення. Як тільки повідомлення надійшло з іншого боку, воно переходить через двері приймача (розетку) в будинок (процес). Ця ілюстрація з тієї ж книги може вам допомогти:
введіть тут опис зображення
Розетки є частиною транспортного шару, який забезпечує логічне спілкування з програмами. Це означає, що з точки зору програми обидва хости безпосередньо підключені один до одного, хоча між ними є численні маршрутизатори та / або комутатори. Таким чином, сокет не є самим з'єднанням, це кінцева точка з'єднання. Протоколи транспортного рівня реалізуються лише на хостах, а не на проміжних маршрутизаторах.
Портизабезпечити засоби внутрішньої адреси до машини. Основна мета - дозволити безлічі процесів надсилати та приймати дані по мережі без втручання в інші процеси (їх дані). Всі розетки надаються номером порту. Коли сегмент надходить до хоста, транспортний рівень вивчає номер порту призначення сегмента. Потім він пересилає сегмент у відповідну розетку. Це завдання доставки даних у сегменті транспортного шару до правильного сокета називається де-мультиплексуванням . Дані сегмента потім передаються в процес, приєднаний до сокета.


5

Сокет - це структура вашого програмного забезпечення. Це більш-менш файл; він має такі операції, як читання та запис. Це не фізична річ; це спосіб вашого програмного забезпечення посилатися на фізичні речі.

Порт - річ, схожа на пристрій. У кожного хоста є одна або кілька мереж (ті фізичні); хост має адресу в кожній мережі. Кожна адреса може мати тисячі портів.

Можливо, лише один сокет використовує порт за адресою. Сокет виділяє порт приблизно як розподілення пристрою для вводу / виводу файлової системи. Після виділення порту жоден інший сокет не може підключитися до цього порту. Після закриття сокета порт буде звільнений.

Погляньте на термін TCP / IP .


3
Цей опис розетки досить не базується. Сокет - це зв'язок між парою кортежів, де кортеж відноситься до пари IP ADDR & Port. Крім того, багато розеток МОЖЕ підключатися до одного порту. Як ви думаєте, як веб-сервер приймає кілька підключень на порт 80? Це погана відповідь
високий Джефф

1
Вибачте. Кілька розеток не підключено до порту 80. Один сокет підключений і породить додаткові розетки, де відбувається реальна передача. Див. Opengroup.org/onlinepubs/009695399/functions/listen.html .
S.Lott

1
Насправді, опис на opengroup.org/onlinepubs/009695399/functions/connect.html є кращим. Пакет, що повернувся через з'єднання, НЕ перебуває на порту 80.
S.Lott

1
Ця публікація є некоректною в декількох деталях та оманливою у кількох аспектах.
Пітер Вон

@ Peter Wone: Які деталі? Які аспекти? Сподіваючись навчитися на своїх помилках.
С.Лотт

5

з навчального посібника Java Oracle :

Сокет - це одна кінцева точка двостороннього зв’язку зв'язку між двома програмами, що працюють в мережі. Сокет прив’язаний до номера порту, щоб рівень TCP міг ідентифікувати додаток, якому дані призначені для надсилання.


Це лише підручник, і, звичайно, не є нормативним посиланням.
користувач207421

"Сокет - це одна кінцева точка двостороннього зв’язку зв'язку" Це не визначення сокета, а не підручник java ??
prayagupd

@prayagupd Звичайно, це визначення, але це підручник, а не специфікація.
користувач207421

4

Порт і сокет можна порівняти з відділенням банку.

Номер будинку "Банку" є аналогом IP-адреси. Банк має різні секції, такі як:

  1. Відділ ощадних рахунків
  2. Відділ особистого кредитування
  3. Відділ кредитування житла
  4. Відділ подання скарг

Так 1 (відділ ощадних рахунків), 2 (відділ особистого кредитування), 3 (відділ кредитування житла) та 4 (відділ оскарження) - це порти.

Тепер скажімо, що ви відкриваєте ощадний рахунок, ви переходите до банку (IP-адреса), потім переходите до "відділу ощадних рахунків" (порт №1), потім зустрічаєте одного з працівників, що працюють в "відділі ощадних рахунків ". Назвіть його SAVINGACCOUNT_EMPLOYEE1 для відкриття рахунку.

SAVINGACCOUNT_EMPLOYEE1 - ваш дескриптор розетки, тому може бути SAVINGACCOUNT_EMPLOYEE1 до SAVINGACCOUNT_EMPLOYEEN. Це все дескриптори сокетів.

Так само в інших відділах буде працювати зайнятих, і вони аналогічні сокету.


3

Сокет - це механізм вводу / виводу даних. Порт - це договірна концепція протоколу зв'язку . Сокет може існувати без порту. Порт може існувати без конкретного сокета (наприклад, якщо на одному порту активовано кілька сокет, що може бути дозволено для деяких протоколів).

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


3

Відносна термінологія TCP / IP, яка, на мій погляд, передбачається питанням. Простіше кажучи:

ПОРТ - це як номер телефону певного будинку в певному поштовому індексі. Поштовий індекс міста можна вважати IP-адресою міста та всіх будинків у цьому місті.

SOCKET з іншого боку, більше нагадує встановлений телефонний дзвінок між телефонами пари будинків, які розмовляють один з одним. Ці дзвінки можна встановити між будинками в одному місті або двома будинками в різних містах. Це тимчасово встановлений шлях між парою телефонів, що розмовляють один з одним, і є НАДОМКА.


2
Розетка - кінцева точка. Він існує до встановлення з'єднання (TCP) або за відсутності з'єднання (UDP). Ерго, це не сам зв'язок.
користувач207421

2

У широкому сенсі Socket - це саме те, розетка, як і ваша електрична, кабельна або телефонна розетка. Точка, коли "необхідні речі" (живлення, сигнал, інформація) можуть виходити і надходити. У ньому приховано багато деталізованих матеріалів, які не потрібні для використання "необхідних речей". Програмне забезпечення передбачає загальний спосіб визначення механізму зв'язку між двома сутностями (ці сутності можуть бути будь-якими - двома програмами, двома фізично окремими пристроями, простором користувача та ядра в ОС тощо)

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


2

Вже дано теоретичні відповіді на це питання. Я хотів би надати практичний приклад цього питання, який зрозуміє ваше розуміння щодо Socket і Port.

Я знайшов це тут

Цей приклад дозволить вам пройти процес підключення до веб-сайту, наприклад Wiley. Ви відкриєте веб-браузер (наприклад, Mozilla Firefox) і введіть www.wiley.com в адресний рядок. Ваш веб-браузер використовує сервер системи доменних імен (DNS) для пошуку імені www.wiley.com для виявлення його IP-адреси. У цьому прикладі адреса 192.0.2.100.

Firefox підключається до адреси 192.0.2.100 та до порту, де працює веб-сервер рівня додатків. Firefox знає, якого порту очікувати, оскільки це добре відомий порт. Відомий порт для веб-сервера - порт 80 TCP.

Цільовий гніздо, до якого намагається підключитися Firefox, записується як socket: port, або в цьому прикладі 192.0.2.100:80. Це серверна частина з'єднання, але сервер повинен знати, куди надсилати веб-сторінку, яку ви хочете переглянути в Mozilla Firefox, тому у вас є розетка і для клієнтської частини з'єднання.

Підключення на стороні клієнта складається з вашої IP-адреси, наприклад 192.168.1.25, та випадково вибраного динамічного номера порту. Сокет, пов'язаний з Firefox, виглядає як 192.168.1.25:49175. Оскільки веб-сервери працюють на порту TCP 80, обидва ці сокети є TCP-сокетами, тоді як якщо ви підключалися до сервера, що працює на UDP-порту, і серверні, і клієнтські сокети були би UDP-сокетами.


Цитування дуже низької якості. У третьому абзаці неправильно використовується слово "socket", як якщо б воно означало "IP-адресу". Це не так.
користувач207421

2

Socket - це абстракція, що надається ядром користувачам програм для вводу-виводу даних. Тип сокета визначається протоколом його обробки, IPC-зв’язком тощо. Отже, якщо хтось створює сокет TCP, він може робити маніпуляції, такі як зчитування даних у сокет і записування даних до нього простими методами та обробкою протоколів нижчого рівня, як перетворення TCP і переадресація пакетів до мережевих протоколів нижчого рівня виконується конкретною реалізацією сокета в ядрі. Перевага полягає в тому, що користувач не повинен турбуватися про обробку конкретних протоколів nigrities і повинен просто читати і записувати дані в сокет, як звичайний буфер. Те саме стосується IPC, користувач просто читає і записує дані в сокет, а ядро ​​обробляє всі деталі нижчого рівня залежно від типу створеного сокета.

Порт разом із IP-адресою - це як надання адреси в сокет, хоча це і не потрібно, але це допомагає в мережевих комунікаціях.


2

Один порт може мати одну або кілька розеток, підключених до різних зовнішніх IP-адрес, як кілька електричних розеток.

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312
  TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312
  TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312
  TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312

2

Socket - це SW абстракція кінцевої точки мережі, яка використовується як інтерфейс до програми. У Java, C # це представлено об'єктом, в Linux, Unix - це файл.

Порт - це лише властивість сокета, який ви маєте вказати, якщо ви хочете встановити зв'язок. Для отримання пакету з сокета вам потрібно прив’язати його до певного локального порту та NIC (з локальною IP-адресою) або всіх NIC (INADDR_ANY вказано у виклику прив’язки). Щоб надіслати пакет, потрібно вказати порт та IP віддаленого сокета.


1

Сокет - це в основному кінцева точка для мережевого зв'язку, що складається з принаймні IP-адреси та порту. У Java / C # сокет - це реалізація вищого рівня з одного боку двостороннього з'єднання.

Також визначення в документації Java .


Ви маєте на увазі Java Turorial.
користувач207421

1

Порт:

Порт може посилатися на фізичну точку з'єднання для периферійних пристроїв, таких як послідовний, паралельний і USB-порти. Термін порт також відноситься до певних точок з'єднання Ethernet, schch, до таких на концентраторі, комутаторі або маршрутизаторі.

Розетка:

Сокет представляє єдине з'єднання між двома мережевими програмами. Ці два додатки номінально працюють на різних комп’ютерах, але розетки можуть також використовуватися для міжпроцесорної комунікації на одному комп’ютері. Програми можуть створювати кілька розеток для спілкування один з одним. Розетки є двонаправленими, тобто будь-яка сторона з'єднання здатна як надсилати, так і приймати дані.


Порт TCP або UDP не посилається ні на що фізичне, ані на точки з'єднання Ethernet. Ви не відповіли на запитання.
користувач207421

1

Порт позначає кінцеву точку зв'язку в транспорті TCP та UDP для протоколу IP-мережі. Сокет - це програмне абстрагування для кінцевої точки зв'язку, яка зазвичай використовується при реалізації цих протоколів (API сокета). Альтернативна реалізація - API XTI / TLI.

Дивись також:

Stevens, WR 1998, Мережеве програмування UNIX: Мережеві API: Sockets та XTI; Том 1, Прентіс Хол.
Stevens, WR, 1994, TCP / IP Illustrated, Том 1: Протоколи, Аддісон-Веслі.

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