Разница между сокетом и портом


121

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


9
Порт - это физический адрес, а сокет - это объект.
— СуперМ

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возвращается один из одновременных вызовов, он делает это только в одном процессе, сокет каждого входящего соединения уникален для одного экземпляра сервера.
  • сокет - это объект, который процесс использует, чтобы поговорить с ОС о конкретном соединении, как дескриптор файла
    • как уже упоминалось в комментариях, существует множество других применений для сокетов, которые вообще не используют порты: например, socketpair создает пару сокетов, соединенных вместе, которые не имеют никакой схемы адресации - единственный способ использовать этот канал - это процесс, который вызвал socketpair, являясь дочерним элементом этого процесса и наследуя его, или явно передавая один из сокетов из этого процесса

1
@ Бесполезно Стоит отметить, что сокеты не обязательно должны быть основаны на IP, как указывает ответ. Это не совсем относится к OP, но объяснение семейств сокетов поможет завершить этот ответ.
— hafichuk

Хороший вопрос - я уже беспокоился о ползучести области, когда начал писать о многопроцессорных серверах. Не стесняйтесь редактировать это, и если вы этого не сделаете, я когда-нибудь вернусь к этому ...
— Бесполезно

11
это вовсе не бесполезно
— l -''''''--------- '' '' '' '' '' ''

Я пытаюсь понять сокет в электронике, сервер, привязывающий сокет к номеру порта, похож на сокет на стене, ожидающий подключения электронных устройств для зарядки аккумулятора. Но когда принято, новый сокет возвращается? Почему? Новая розетка ставится одна стена? Пожалуйста, помогите мне разобраться в этом по некоторой аналогии.
— Аарон Шен

3
Проблема здесь в том, что ваша аналогия неверна. Забудьте, что означает сокет в физическом мире - это не метафора для чего-то другого, это просто технический термин для конкретной концепции технического программного обеспечения. Это даже не сильно связано с физическими сетевыми портами или сокетами - вы просто должны понимать это, в этом домене, как концепцию на своих собственных условиях.
— Бесполезно

49

Думайте о своей машине как о жилом доме:

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

  • Розетка - это дверь квартиры.

  • IP-адрес - это уличный адрес здания.


3
Мне нравится эта аналогия, хотя сейчас я думаю о том, чтобы находиться внутри этой квартиры и смотреть на бесконечный коридор с множеством дверей. Я не могу выйти. Я не могу выйти! :)
— Даниэль Холлинрейк

1
@Caleb A socket is the door of an apartment.Но разве не может быть много открытых гнезд на одном порту?
— Сухаил Гупта

3
@suhail Иногда в квартире больше одной двери. У них всех одинаковый номер квартиры, но они разные двери.
— Калеб

45

Порт является частью адреса в протоколах TCP и UDP. Он используется для того, чтобы помочь ОС определить, какое приложение должно получить полученные данные. ОС должна поддерживать порты для поддержки TCP и UDP, потому что порты являются неотъемлемой частью TCP и UDP.

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


Сокет по сути представляет собой 4 кортежа, состоящего из: IP-адреса источника: IP-адрес порта-порта: порт.
— Тони Лев

Вы имеете в виду, что порт существует только в протоколах TCP и UDP ??? Как насчет http и других протоколов?
— Хосейн Агаджани

HTTP - это протокол прикладного уровня, который работает поверх протоколов транспортного уровня, таких как TCP или UDP. Он не имеет своей собственной концепции портов, он наследует их от базового протокола транспортного уровня.
— Дирк Холсоппл

8

Компьютер имеет IP-адрес, который идентифицирует его как отдельный объект в сети. Мы добавляем к этому дополнительный номер, чтобы мы могли различать подключения к этому компьютеру. Это номер порта. На стороне ОС соединения вам нужны буферы, состояние соединения и т. Д. Этот логический объект - сокет.


0

Сокет - это канал связи с портом. Когда вы хотите, чтобы ваша программа взаимодействовала по сети, вы указали ей способ адресации порта, и это делается путем создания сокета и подключения его к порту. По сути, сокет = IP + порты Сокеты обеспечивают доступ к порту + ip


-1

IP-адрес идентифицирует устройство, то есть адрес конкретного устройства, когда вы достигли машины с использованием IP-адреса, теперь порт определяет, с каким процессом на этой машине обмениваться данными.

Таким образом, для реального обмена данными вам нужны оба порта + IP, который называется сокетом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.