Різниця між сокетом і портом


121

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


9
Порт - це фізична адреса, а сокет - об'єкт.
superM

14
Якщо пакет потрапляє в кишеню на гнізді на порту ...
user16764

Відповіді:


116

S - серверна програма: скажімо, це сервер HTTP, тому він використовуватиме відомий номер порту для HTTP , який дорівнює 80. Я запускаю його на хості з IP-адресою 10.0.0.4, тому він буде слухати з'єднання на 10.0.0.4:80(тому що саме там кожен очікує, що знайде його).

Всередині S я збираюся створити сокет і прив’язати його до цієї адреси: тепер ОС знає, що з'єднання, що надходять, 10.0.0.4:80повинні бути спрямовані до мого S процесу через цей конкретний сокет.

  • вихідний показник netstat, коли сокет пов'язаний:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    

    NB. місцева адреса - це всі нулі, оскільки S байдуже, як її клієнти досягають

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

  • netstat вихід після прийому з'єднання:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    
    • 10.0.0.4:80являє S кінець з'єднання і пов'язаний з поверненим сокетомaccept
    • 10.0.0.5:55715є кінцевим з'єднанням клієнта і асоціюється з сокетом, який клієнт передав для з'єднання . Порт клієнта не використовується ні для чого, крім маршрутизації пакетів на цьому TCP-з'єднанні до потрібного процесу: він призначається випадковим чином ядром клієнта з діапазону ефемерних портів.

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

Отже, приблизно:

  • IP-адреса призначена для маршрутизації між хостами в мережі
  • порт призначений для маршрутизації до правильного сокета на хості
    • Я ледь не сказав правильний процес , але насправді можливо мати декілька (як правило, дочірніх) процесів, які приймають все в одному сокеті ...
    • однак, кожен раз, коли один із одночасних acceptдзвінків повертається, він робить це лише в одному процесі, розетка кожного вхідного з'єднання є унікальною для одного примірника сервера
  • socket - це об'єкт, який процес використовує для розмови з ОС про певне з'єднання, подібно до дескриптора файлу
    • як згадується в коментарях, існує багато інших застосувань для сокетів, які взагалі не використовують порти: наприклад, socketpair створює пару розеток, з'єднаних разом, які взагалі не мають схеми адресації - єдиний спосіб використовувати цю трубу - це процес, який викликав socketpair, будучи дитиною цього процесу і успадковуючи його, або явно передаючи одну з розеток цього процесу

1
@Useless Варто згадати, що сокети не потребують IP-адреси, як вказує відповідь. Це не зовсім стосується ОП, але пояснення сімейства розеток допомогло б заокрутити цю відповідь.
hafichuk

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

11

Я намагаюся зрозуміти сокет в електроніці, сервер прив’язує сокет до номера порту - це як поставити розетку на стіну, чекаючи, коли деякі електронні пристрої підключаться для зарядки акумулятора. Але коли це прийнято, повертається нова розетка? Чому? Нова розетка поставлена ​​на стіну? Будь ласка, допоможіть мені зрозуміти це за якоюсь аналогією.
Аарон Шен

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

49

Подумайте про свою машину як про багатоквартирний будинок:

  • Порт - номер квартири.

  • Розетка - це двері квартири.

  • IP-адреса - адреса вулиці будівлі.


3
Мені подобається ця аналогія, хоча зараз я думаю про перебування всередині тієї квартири, дивлячись на нескінченний коридор з безліччю дверей. Я не можу вийти. Я не можу вийти! :)
Даніель Холлінрак

1
@Caleb A socket is the door of an apartment.Але чи не могли бути відкриті численні розетки на одному порту?
Suhail Gupta

3
@suhail Іноді в квартирі є кілька дверей. Всі вони мають однаковий номер квартири, але вони різні двері.
Калеб

45

Порт є частиною адреси в протоколах TCP та UDP. Він використовується, щоб допомогти ОС визначити, у якій програмі повинні бути отримані дані. ОС має підтримувати порти для підтримки TCP та UDP, оскільки порти є невід'ємною частиною TCP та UDP.

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


Розетка - це, по суті, 4 кортежі, що складається з: Source IP: Port-Dest IP: Port.
Тоні Лев

ви маєте на увазі, що порт існує тільки в протоколах TCP та UDP ??? А як щодо http та інших протоколів?
Х. Акхін

HTTP - це протокол рівня додатків, який працює над протоколами транспортного рівня, такими як TCP або UDP. У нього немає власної концепції портів, вона успадковує їх від протоколу базового транспортного рівня.
Дірк Холсоппл

8

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


0

Розетка - це шлях зв'язку до порту. Коли ви хочете, щоб ваша програма спілкувалася по мережі, ви надали їй спосіб адресації порту, і це робиться, створивши сокет і приєднавши його до порту. В основному, socket = IP + порти Сокети забезпечують доступ до порту + ip


-1

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

Тому для фактичного спілкування вам потрібен і порт + IP, який називається socket.

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