Це питання було порушене одним із інженерів програмного забезпечення в моїй організації. Мене цікавить найширше визначення.
Це питання було порушене одним із інженерів програмного забезпечення в моїй організації. Мене цікавить найширше визначення.
Відповіді:
Сокет 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 до 65535 включно, що означає логічний затвор у пристрої. Кожне з'єднання між клієнтом і сервером вимагає унікального сокета.
Наприклад:
Сокет представляє єдине з'єднання між двома мережевими програмами. Ці два додатки номінально працюють на різних комп’ютерах, але розетки можуть також використовуватися для міжпроцесорної комунікації на одному комп’ютері. Програми можуть створювати кілька розеток для спілкування один з одним. Розетки є двонаправленими, тобто будь-яка сторона з'єднання здатна як надсилати, так і приймати дані. Тому сокет може бути створений теоретично на будь-якому рівні моделі 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
З деякою аналогією
Хоча вже багато технічних речей для сокетів вже наведено вище ... Я хотів би додати свою відповідь, про всяк випадок, якщо хтось все-таки не зміг відчути різницю між 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
Я сподіваюся, що це допоможе тому, хто все ще був розгублений :)
По-перше, я думаю, що ми повинні почати з невеликого розуміння того, що означає отримання пакету від А до В.
Загальне визначення для мережі - це використання моделі OSI, яка розділяє мережу на кілька шарів відповідно до призначення. Є кілька важливих, про які ми розповімо тут:
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);
також можливо. Урх, це викинуло гайковий ключ у творах!
Гаразд, насправді це не так. Все, що нам потрібно зробити, - це придумати кілька відповідних визначень:
/var/run/database.sock
.Вуаля! Це налагоджує справи. Тож у нашій схемі тоді,
Тож справді порт - це підмножина вимог щодо формування Інтернет-сокета. На жаль, просто так трапляється, що значення слова socket було застосовано до кількох різних ідей. Тому я щиро раджу вам назвати наступний гніздо проекту, просто додати плутанину;)
Сокет = IP-адреса + порт (числова адреса)
Разом вони ідентифікують кінцеву точку мережевого з'єднання на машині. (Я щойно заграв мережу 101?)
Як правило, ви отримаєте багато теоретичного, але один з найпростіших способів диференціювати ці два поняття:
Для того, щоб отримати послугу, вам потрібен номер сервісу. Цей номер послуги називається портом. Просто як це.
Наприклад, HTTP як послуга працює на порту 80.
Зараз багато людей можуть запитати послугу, і з'єднання з клієнтом-сервером встановлено. Буде багато зв’язків. Кожне з'єднання представляє клієнта. Для того, щоб підтримувати кожне з'єднання, сервер створює сокет на з'єднання, щоб підтримувати свого клієнта.
Здається, є багато відповідей, що прирівнюють сокет до з'єднання між двома комп'ютерами. Я думаю, це абсолютно неправильно. Сокет завжди був кінцевою точкою на 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-адреси).
Коротка коротка відповідь.
Порт може бути описаний як внутрішній адресу в межах хоста , який ідентифікує програму або процес.
Сокет може бути описаний як програмний інтерфейс дозволяє програма для спілкування з іншими програмами або процесами, в Інтернеті, або на місцевому рівні.
Вони є термінами з двох різних областей: "порт" - це поняття від мережі TCP / IP, "socket" - це API (програмування). "Сокет" робиться (у коді) шляхом взяття порту та імені хоста або мережевого адаптера та об'єднання їх у структуру даних, яку ви можете використовувати для надсилання чи отримання даних.
Це основні концепції мереж, тому я поясню їх легким, але всебічним способом, щоб зрозуміти деталі.
Отже, розетка в мережі - це віртуальний пристрій зв’язку, прив'язаний до пари (ip, port) = (адреса, послуга).
Примітка:
Сподіваюся, це очистить вас від сумнівів
Прочитавши чудові відповіді, я зрозумів, що наступний момент потребує акценту для мене, новачка в мережевому програмуванні:
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
...
123.132.213.231 # IP address
:1234 # port number
123.132.213.231:1234 # socket address
З'єднання відбувається, коли 2 розетки пов'язані між собою.
Сокет - це особливий тип обробки файлів, який використовується процесом для запиту послуг мережі в операційній системі. Адреса сокета є потрійною: {протокол, локальна адреса, локальний процес}, де локальний процес ідентифікується за номером порту.
У наборі 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. Хоча він не був стандартизований, він став фактично галузевим стандартом.
Розетка - кінцева точка зв'язку. Сокет не має прямого відношення до сімейства протоколів 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-код джерела, як і всі вони той самий клієнт, але оскільки вони мають різні вихідні порти, сервер може відрізняти їх один від одного. І коли сервер надсилає відповіді, він зробить це на порт, від якого надходив запит, і таким чином клієнт може також відрізняти різні відповіді, які він отримує від одного сервера.
Порт був найпростішою частиною, це просто унікальний ідентифікатор для сокета. Розетка - це те, що процеси можуть використовувати для встановлення з'єднань і для спілкування один з одним. У високого Джеффа була чудова аналогія телефону, яка не була ідеальною, тому я вирішив виправити це:
netstat
дисплей деякий час. Усі розетки, прийняті від прослуховувальної розетки, мають один і той же порт. Ergo a port не є унікальним ідентифікатором для сокета.
Додаток складається з пари процесів, які спілкуються по мережі (пара клієнт-сервер). Ці процеси надсилають та приймають повідомлення в мережу та з неї через програмний інтерфейс, який називається socket . Розглядаючи аналогію, представлену в книзі "Комп'ютерні мережі: підхід зверху вниз". Є будинок, який хоче спілкуватися з іншим будинком. Тут будинок є аналогом процесу, а двері - до розетки. Процес надсилання передбачає, що з іншого боку дверей є інфраструктура, яка транспортуватиме дані до місця призначення. Як тільки повідомлення надійшло з іншого боку, воно переходить через двері приймача (розетку) в будинок (процес). Ця ілюстрація з тієї ж книги може вам допомогти:
Розетки є частиною транспортного шару, який забезпечує логічне спілкування з програмами. Це означає, що з точки зору програми обидва хости безпосередньо підключені один до одного, хоча між ними є численні маршрутизатори та / або комутатори. Таким чином, сокет не є самим з'єднанням, це кінцева точка з'єднання. Протоколи транспортного рівня реалізуються лише на хостах, а не на проміжних маршрутизаторах.
Портизабезпечити засоби внутрішньої адреси до машини. Основна мета - дозволити безлічі процесів надсилати та приймати дані по мережі без втручання в інші процеси (їх дані). Всі розетки надаються номером порту. Коли сегмент надходить до хоста, транспортний рівень вивчає номер порту призначення сегмента. Потім він пересилає сегмент у відповідну розетку. Це завдання доставки даних у сегменті транспортного шару до правильного сокета називається де-мультиплексуванням . Дані сегмента потім передаються в процес, приєднаний до сокета.
Сокет - це структура вашого програмного забезпечення. Це більш-менш файл; він має такі операції, як читання та запис. Це не фізична річ; це спосіб вашого програмного забезпечення посилатися на фізичні речі.
Порт - річ, схожа на пристрій. У кожного хоста є одна або кілька мереж (ті фізичні); хост має адресу в кожній мережі. Кожна адреса може мати тисячі портів.
Можливо, лише один сокет використовує порт за адресою. Сокет виділяє порт приблизно як розподілення пристрою для вводу / виводу файлової системи. Після виділення порту жоден інший сокет не може підключитися до цього порту. Після закриття сокета порт буде звільнений.
Погляньте на термін TCP / IP .
з навчального посібника Java Oracle :
Сокет - це одна кінцева точка двостороннього зв’язку зв'язку між двома програмами, що працюють в мережі. Сокет прив’язаний до номера порту, щоб рівень TCP міг ідентифікувати додаток, якому дані призначені для надсилання.
Порт і сокет можна порівняти з відділенням банку.
Номер будинку "Банку" є аналогом IP-адреси. Банк має різні секції, такі як:
Так 1 (відділ ощадних рахунків), 2 (відділ особистого кредитування), 3 (відділ кредитування житла) та 4 (відділ оскарження) - це порти.
Тепер скажімо, що ви відкриваєте ощадний рахунок, ви переходите до банку (IP-адреса), потім переходите до "відділу ощадних рахунків" (порт №1), потім зустрічаєте одного з працівників, що працюють в "відділі ощадних рахунків ". Назвіть його SAVINGACCOUNT_EMPLOYEE1 для відкриття рахунку.
SAVINGACCOUNT_EMPLOYEE1 - ваш дескриптор розетки, тому може бути SAVINGACCOUNT_EMPLOYEE1 до SAVINGACCOUNT_EMPLOYEEN. Це все дескриптори сокетів.
Так само в інших відділах буде працювати зайнятих, і вони аналогічні сокету.
Сокет - це механізм вводу / виводу даних. Порт - це договірна концепція протоколу зв'язку . Сокет може існувати без порту. Порт може існувати без конкретного сокета (наприклад, якщо на одному порту активовано кілька сокет, що може бути дозволено для деяких протоколів).
Порт використовується для визначення, до якого сокета приймач повинен спрямовувати пакет, за допомогою багатьох протоколів, але це не завжди потрібно, і вибір сокета прийому можна здійснити іншими способами - порт - це цілком інструмент, який використовується обробником протоколу в мережева підсистема. наприклад, якщо протокол не використовує порт, пакети можуть переходити у всі прослуховувальні сокети або будь-які сокети.
Відносна термінологія TCP / IP, яка, на мій погляд, передбачається питанням. Простіше кажучи:
ПОРТ - це як номер телефону певного будинку в певному поштовому індексі. Поштовий індекс міста можна вважати IP-адресою міста та всіх будинків у цьому місті.
SOCKET з іншого боку, більше нагадує встановлений телефонний дзвінок між телефонами пари будинків, які розмовляють один з одним. Ці дзвінки можна встановити між будинками в одному місті або двома будинками в різних містах. Це тимчасово встановлений шлях між парою телефонів, що розмовляють один з одним, і є НАДОМКА.
У широкому сенсі Socket - це саме те, розетка, як і ваша електрична, кабельна або телефонна розетка. Точка, коли "необхідні речі" (живлення, сигнал, інформація) можуть виходити і надходити. У ньому приховано багато деталізованих матеріалів, які не потрібні для використання "необхідних речей". Програмне забезпечення передбачає загальний спосіб визначення механізму зв'язку між двома сутностями (ці сутності можуть бути будь-якими - двома програмами, двома фізично окремими пристроями, простором користувача та ядра в ОС тощо)
Порт - це дискримінатор кінцевої точки. Він відрізняє одну кінцеву точку від іншої. На рівні мережі він відрізняє один додаток від іншого, так що мережевий стек може передавати інформацію у відповідну програму.
Вже дано теоретичні відповіді на це питання. Я хотів би надати практичний приклад цього питання, який зрозуміє ваше розуміння щодо 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 - це абстракція, що надається ядром користувачам програм для вводу-виводу даних. Тип сокета визначається протоколом його обробки, IPC-зв’язком тощо. Отже, якщо хтось створює сокет TCP, він може робити маніпуляції, такі як зчитування даних у сокет і записування даних до нього простими методами та обробкою протоколів нижчого рівня, як перетворення TCP і переадресація пакетів до мережевих протоколів нижчого рівня виконується конкретною реалізацією сокета в ядрі. Перевага полягає в тому, що користувач не повинен турбуватися про обробку конкретних протоколів nigrities і повинен просто читати і записувати дані в сокет, як звичайний буфер. Те саме стосується IPC, користувач просто читає і записує дані в сокет, а ядро обробляє всі деталі нижчого рівня залежно від типу створеного сокета.
Порт разом із IP-адресою - це як надання адреси в сокет, хоча це і не потрібно, але це допомагає в мережевих комунікаціях.
Один порт може мати одну або кілька розеток, підключених до різних зовнішніх 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
Socket - це SW абстракція кінцевої точки мережі, яка використовується як інтерфейс до програми. У Java, C # це представлено об'єктом, в Linux, Unix - це файл.
Порт - це лише властивість сокета, який ви маєте вказати, якщо ви хочете встановити зв'язок. Для отримання пакету з сокета вам потрібно прив’язати його до певного локального порту та NIC (з локальною IP-адресою) або всіх NIC (INADDR_ANY вказано у виклику прив’язки). Щоб надіслати пакет, потрібно вказати порт та IP віддаленого сокета.
Сокет - це в основному кінцева точка для мережевого зв'язку, що складається з принаймні IP-адреси та порту. У Java / C # сокет - це реалізація вищого рівня з одного боку двостороннього з'єднання.
Також визначення в документації Java .
Порт:
Порт може посилатися на фізичну точку з'єднання для периферійних пристроїв, таких як послідовний, паралельний і USB-порти. Термін порт також відноситься до певних точок з'єднання Ethernet, schch, до таких на концентраторі, комутаторі або маршрутизаторі.
Розетка:
Сокет представляє єдине з'єднання між двома мережевими програмами. Ці два додатки номінально працюють на різних комп’ютерах, але розетки можуть також використовуватися для міжпроцесорної комунікації на одному комп’ютері. Програми можуть створювати кілька розеток для спілкування один з одним. Розетки є двонаправленими, тобто будь-яка сторона з'єднання здатна як надсилати, так і приймати дані.
Порт позначає кінцеву точку зв'язку в транспорті TCP та UDP для протоколу IP-мережі. Сокет - це програмне абстрагування для кінцевої точки зв'язку, яка зазвичай використовується при реалізації цих протоколів (API сокета). Альтернативна реалізація - API XTI / TLI.
Дивись також:
Stevens, WR 1998, Мережеве програмування UNIX: Мережеві API: Sockets та XTI; Том 1, Прентіс Хол.
Stevens, WR, 1994, TCP / IP Illustrated, Том 1: Протоколи, Аддісон-Веслі.