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

928

Этот вопрос был задан одним из разработчиков программного обеспечения в моей организации. Я заинтересован в самом широком определении.

Ричард Дорман
источник
19
Просто повторюсь, сокеты не ограничиваются сетевым вводом-выводом. Они доступны в любых ситуациях для потоковой передачи данных между различными приложениями.
Оли

Ответы:

978

Резюме

Сокет TCP - это экземпляр конечной точки, определяемый IP-адресом и портом в контексте определенного соединения TCP или состояния прослушивания.

Порт - это идентификатор виртуализации, определяющий конечную точку службы (в отличие от конечной точки экземпляра службы или идентификатора сеанса).

TCP-сокет не является соединением , это конечная точка определенного соединения.

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

Для данной комбинации адрес / порт может быть только один сокет прослушивателя .

экспозиция

Это был интересный вопрос, который заставил меня пересмотреть ряд вещей, которые, как я думал, я знал наизнанку. Вы могли бы подумать, что имя типа «сокет» было бы само собой разумеющимся: оно, очевидно, было выбрано, чтобы вызывать образы конечной точки, в которую вы подключаете сетевой кабель, при этом существуют сильные функциональные параллели. Тем не менее, на языке сети слово «розетка» несет в себе столько багажа, что необходим тщательный повторный осмотр.

В самом широком смысле порт является точкой входа или выхода. Хотя французское слово porte не используется в контексте сети, оно буквально означает дверь или шлюз , что еще более подчеркивает тот факт, что порты являются конечными точками транспортировки, независимо от того, отправляете вы данные или большие стальные контейнеры.

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

Комбинация IP-адреса и порта строго известна как конечная точка и иногда называется сокетом. Это использование происходит с RFC793, оригинальной спецификации TCP.

TCP- соединение определяется двумя конечными точками или сокетами .

Конечная точка (сокет) определяется комбинацией сетевого адреса и идентификатора порта . Обратите внимание, что адрес / порт не полностью идентифицирует сокет (подробнее об этом позже).

Назначение портов состоит в том, чтобы различать несколько конечных точек на данном сетевом адресе. Можно сказать, что порт является виртуальной конечной точкой. Эта виртуализация делает возможным одновременное подключение нескольких соединений к одному сетевому интерфейсу.

Именно пара сокетов (4-кортеж, состоящий из IP-адреса клиента, номера порта клиента, IP-адреса сервера и номера порта сервера) определяет две конечные точки, которые однозначно идентифицируют каждое TCP-соединение в Интернете. ( TCP-IP Illustrated Volume 1 , W. Richard Stevens)

В большинстве языков, производных от C, TCP-соединения устанавливаются и управляются с использованием методов в экземпляре класса Socket. Хотя обычно работает на более высоком уровне абстракции, обычно это экземпляр класса NetworkStream, обычно это предоставляет ссылку на объект сокета. Кодеру этот объект сокета, по-видимому, представляет соединение, поскольку соединение создается и управляется с использованием методов объекта сокета.

В C # для установления TCP-соединения (с существующим слушателем) сначала вы создаете TcpClient . Если вы не указываете конечную точку для конструктора TcpClient, он использует значения по умолчанию - так или иначе определяется локальная конечная точка. Затем вы вызываете метод Connect для созданного вами экземпляра. Этот метод требует параметр, описывающий другую конечную точку.

Все это немного сбивает с толку и приводит вас к мысли, что сокет - это соединение, которое является бредом. Я работал над этим заблуждением, пока Ричард Дорман не задал вопрос.

После долгих чтений и размышлений я убежден, что было бы гораздо разумнее иметь класс TcpConnection с конструктором, который принимает два аргумента: LocalEndpoint и RemoteEndpoint . Возможно, вы могли бы поддерживать единственный аргумент RemoteEndpoint, когда значения по умолчанию приемлемы для локальной конечной точки. Это неоднозначно на многосетевых компьютерах, но неоднозначность может быть решена с помощью таблицы маршрутизации путем выбора интерфейса с кратчайшим маршрутом к удаленной конечной точке.

Ясность будет улучшена и в других отношениях. Сокет не определяется комбинацией IP-адреса и порта:

[...] TCP демультиплексирует входящие сегменты, используя все четыре значения, которые содержат локальные и внешние адреса: IP-адрес назначения, номер порта назначения, IP-адрес источника и номер порта источника. TCP не может определить, какой процесс получает входящий сегмент, глядя только на порт назначения. Кроме того, единственная из [различных] конечных точек в [заданном номере порта], которая будет принимать входящие запросы на соединение, - это та, которая находится в состоянии прослушивания. (p255, TCP-IP Illustrated Volume 1 , W. Richard Stevens)

Как видите, у сетевой службы не только возможно, но и вполне вероятно иметь множество сокетов с одним и тем же адресом / портом, но только один сокет прослушивателя для конкретной комбинации адрес / порт. Типичные реализации библиотеки представляют класс сокетов, экземпляр которого используется для создания и управления соединением. Это крайне неудачно, поскольку вызывает путаницу и приводит к широко распространенному слиянию двух концепций.

Хагравал мне не верит (см. Комментарии), так что вот реальный пример. Я подключил веб-браузер к 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, том 1, «Протоколы» , В. Ричард Стивенс, 1994 г. Эддисон Уэсли

  2. RFC793 , Институт информационных наук, Университет Южной Калифорнии для DARPA

  3. RFC147 , Определение гнезда , Джоэл М. Уинетт, Линкольн Лаборатория

Peter Wone
источник
6
Возможно, реальная аналогия с ключевыми словами сокет и порт поможет тем, кто проголосовал за этот вопрос. Все еще отличное объяснение!
Рохитверма
5
@rationalcoder - Читать весь ответ. Существует разница между определением чего-либо и определением этого. Например, экземпляры класса определяются классом. Они частично, но не полностью идентифицированы этим.
Питер Воне
6
Я не голосовал, потому что я не согласен с этим утверждением - « Сокет не идентифицируется по комбинации IP-адреса и порта: » .. Прочитайте TCP RFC - tools.ietf.org/html/rfc793 .. Очень ясно, что сокет - это комбинация 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
Нет. Сокет состоит из пяти элементов : {протокол, локальный адрес, локальный порт, удаленный адрес, удаленный порт}.
Маркиз Лорн
19
@ EJP Нет, опять. Смотрите выбранный ответ для получения дополнительной информации.
Келан Круммэ
2
@KorayTugay Это в заголовке IP. Что заставляет вас думать, что уровень TCP этого не видит?
маркиз Лорн
1
@EJP, как я вижу в ответе, получившем наибольшее количество голосов, выше, что сокет не является самим соединением, но это конечная точка соединения, тогда как он может включать как локальные, так и удаленные порты и IP-адреса. Сокет будет представлять только одну сторону соединения, т.е. либо локальный порт и локальный IP-адрес, либо удаленный порт и удаленный IP-адрес. Пожалуйста, поправьте меня, если я ошибаюсь.
RBT
7
@EJP Still RFC 793: «Пара сокетов однозначно идентифицирует каждое соединение. То есть сокет может одновременно использоваться в нескольких соединениях». Если сокет уже состоит из пяти вещей, как может быть «пара сокетов» в моей цитате?
Габ 是 好人
101

Сокет представляет собой одно соединение между двумя сетевыми приложениями. Эти два приложения обычно работают на разных компьютерах, но сокеты также могут использоваться для межпроцессного взаимодействия на одном компьютере. Приложения могут создавать несколько сокетов для общения друг с другом. Сокеты являются двунаправленными, это означает, что любая сторона соединения способна отправлять и получать данные. Поэтому теоретически сокет может быть создан на любом уровне модели OSI от 2 и выше. Программисты часто используют сокеты в сетевом программировании, хотя и косвенно. Библиотеки программирования, такие как Winsock, скрывают многие детали низкоуровневого программирования сокетов. Розетки широко используются с начала 1980-х годов.

Порт представляет собой конечную точку или «канал» для сетевых коммуникаций. Номера портов позволяют различным приложениям на одном компьютере использовать сетевые ресурсы, не мешая друг другу. Номера портов чаще всего появляются в программировании сети, особенно в программировании сокетов. Однако иногда номера портов становятся видимыми для обычного пользователя. Например, некоторые веб-сайты, которые человек посещает в Интернете, используют URL-адрес, подобный следующему:

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

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

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

ссылка http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ссылка http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

Galwegian
источник
2
Уровень 2 в модели OSI представляет собой соединение между узлами, он не имеет механизма соединения процессов. Я не верю, что вы можете рассмотреть сокет, существующий в OSI l2.
Антонио Хейли
19
Схема - это соединение, сокет - это конечная точка. Соединение состоит из 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

Я надеюсь, что это помогает кому-то, кто был все еще смущен :)

eRaisedToX
источник
То есть X, Y, Z будут подключаться к одному и тому же порту, то есть к одной и той же службе, но иметь разные сокеты на стороне сервера? Поэтому, когда, скажем, X отправляет некоторый пакет на сервер, он говорит: «найди мне (протокол, IP-адрес X, порт X, IP-адрес S, порт S)» и отправь в приложение чата. Я предполагаю, что должна быть связь между некоторыми объектными приложениями и объектами сокетов? Например, когда я получаю некоторые данные из сокета-1, я хочу отобразить их как пользовательское сообщение, но приложение должно знать, что сообщения из сокета A получены от User-X.
монолит
44

Во-первых, я думаю, что мы должны начать с небольшого понимания того, что представляет собой получение пакета от А до Б.

Распространенным определением для сети является использование модели OSI, которая разделяет сеть на несколько уровней в соответствии с назначением. Есть несколько важных, которые мы рассмотрим здесь:

  • Уровень канала передачи данных . Этот уровень отвечает за передачу пакетов данных от одного сетевого устройства другому и находится чуть выше уровня, который фактически выполняет передачу. Он говорит о MAC-адресах и знает, как найти хосты по их MAC (аппаратному) адресу, но не более того.
  • Сетевой слой представляет собой слой , который позволяет передавать данные между машинами и над физическими границами, такими как физические устройства. Сетевой уровень должен по существу поддерживать дополнительный механизм на основе адреса, который каким-либо образом связан с физическим адресом; введите интернет-протокол (IPv4). IP-адрес может получить ваш пакет от А до Б через Интернет, но он ничего не знает о том, как пройти отдельные прыжки. Это обрабатывается уровнем выше в соответствии с информацией о маршрутизации.
  • Транспортный уровень . Этот уровень отвечает за определение пути получения информации от A до B и любых ограничений, проверок или ошибок в этом поведении. Например, TCP добавляет дополнительную информацию к пакету, так что можно определить, были ли потеряны пакеты.

TCP содержит, помимо прочего, концепцию портов . Это фактически разные конечные точки данных на одном и том же IP-адресе, с которыми AF_INETможет связываться интернет-сокет ( ).

Как это происходит, то же самое происходит и с UDP , и с другими протоколами транспортного уровня. С технической точки зрения им нет необходимости использовать порты, но эти порты позволяют нескольким приложениям на вышеприведенных уровнях использовать один и тот же компьютер для получения (и даже создания) исходящих соединений.

Что подводит нас к анатомии соединения TCP или UDP. Каждый из них имеет порт и адрес источника, а также целевой порт и адрес. Это делается для того, чтобы в любом данном сеансе целевое приложение могло отвечать, а также получать от источника.

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

Теперь нам нужно взглянуть на то, как вы общаетесь с точки зрения приложения с внешним миром. Для этого вам необходимо обратиться к своей операционной системе, и, поскольку большинство операционных систем поддерживают способ работы сокетов Berkeley, мы видим, что мы можем создавать сокеты с использованием портов из приложения, например:

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 - это метод запроса приложения для чтения и записи данных в сокет.

Вуаля! Это приводит в порядок вещи. Так что в нашей схеме тогда

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

Так что на самом деле порт является подмножеством требований для формирования интернет-сокета. К сожалению, так уж получилось, что значение слова «сокет» было применено к нескольким различным идеям. Поэтому я от всей души советую вам назвать ваш следующий проект сокет, просто чтобы добавить в замешательство;)


источник
Вот почему пули не покидают и не покидают Powerpoint; они работают!
Анураг Калия
Очень хорошее введение в tcp-ip и сетевые коммуникации. Начинающие, прочитайте это в первую очередь.
Колин
32

Сокет = IP-адрес + порт (числовой адрес)
Вместе они определяют конечную точку для сетевого подключения на машине. (Я только что провалил сеть 101?)

Gishu
источник
7
Я считаю, что порт имеет более широкое значение, чем ваше определение.
Ричард Дорман
2
И сокеты не только подчиняются стеку TCP / IP. См. Доменные сокеты UNIX или сокеты межпроцессного взаимодействия в целом.
Матиас Крулл
не уверен насчет этого ответа. Вы можете использовать HTTP для связи с другим процессом через сокеты без назначения порта.
SEF
31

Как правило, вы получите много теоретического, но один из самых простых способов различить эти два понятия заключается в следующем:

Чтобы получить услугу, вам нужен сервисный номер. Этот сервисный номер называется портом. Просто как тот.

Например, HTTP как служба работает на порту 80.

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

КТА
источник
Каждый сокет требует своего собственного порта?
MondayPaper
Потрясающие. Самый простой способ представить горы знаний.
Асиф Мехмуд
5
Я не уверен, что ваше утверждение: «сервер создает сокет для каждого соединения для поддержки своего клиента» правильно.
Руши Агравал
1
@RushiAgrawal Тогда я предлагаю вам посмотреть. В частности, увидеть, как человек принимает.
Маркиз Лорн
1
Это подразумевает, что для каждого сокета, который сервер создает для каждого соединения для поддержки своего клиента, может быть тот же номер порта (например, порт 80 для продолжения HTTP-соединений), но с другим IP-адресом клиентов, с которых отправляются запросы на соединения. правильно?
Рэндика Вишман
25

Кажется, есть много ответов, приравнивающих сокет к соединению между двумя компьютерами, что я считаю абсолютно неправильным. Сокет всегда был конечной точкой на 1 ПК, который может или не может быть подключен - конечно, мы все использовали сокеты слушателя или UDP * в какой-то момент. Важной частью является то, что он адресуемый и активный. Отправка сообщения в 1.1.1.1:1234 вряд ли будет работать, так как для этой конечной точки не определен сокет.

Сокеты зависят от протокола, поэтому реализация уникальности, которую используют как TCP / IP, так и UDP / IP * (ipaddress: порт), отличается от, например, IPX (сеть, узел и ... гм, сокет), но отличается сокет, чем подразумевается под общим термином «сокет». Номера сокетов IPX эквивалентны портам IP). Но все они предлагают уникальную адресуемую конечную точку.

Поскольку IP стал доминирующим протоколом, порт (в терминах сети) стал синонимичным с номером порта UDP или TCP - который является частью адреса сокета.

  • UDP не требует соединения - это означает, что виртуальный канал между двумя конечными точками не создается. Однако мы по-прежнему называем UDP-сокеты конечной точкой. Функции API дают понять, что оба являются просто разными типами сокетов - SOCK_DGRAMэто UDP (просто отправка сообщения) и SOCK_STREAMTCP (создание виртуального канала).

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

Марк Брэкетт
источник
25

Краткий краткий ответ.

Порт может быть описан как внутренний адрес в пределах хоста , который идентифицирует программу или процесс.

Сокет может быть описан как программный интерфейс позволяет программа для общения с другими программами или процессами, в Интернете, или на местном уровне.

Энди
источник
3
Слово «внутренний» в описании порта звучит как «не публично» для меня.
Йонас Н
Итак, можем ли мы сказать: сокеты работают внутри портов? или порты запускаются внутри сокетов?
Gucho Ca
@ GuchoCa Мы не можем сказать, что сокеты или порты работают вообще, не говоря уже о том, что они находятся внутри другого. Непонятно, о чем ты спрашиваешь.
маркиз Лорн
16

Это термины из двух разных доменов: «порт» - это понятие из сетей TCP / IP, «сокет» - это API (программирование). «Сокет» создается (в коде) путем выбора порта и имени хоста или сетевого адаптера и объединения их в структуру данных, которую можно использовать для отправки или получения данных.

Рул
источник
Для наиболее общего ответа, ударить «сделанный, беря порт и имя хоста или сетевой адаптер и объединяя их в». Например, сокет UNIX - это (в коде) структура данных (или объект), которую вы можете использовать для отправки или получения данных.
Иосия Йодер
14

Это базовые сетевые концепции, поэтому я объясню их простым, но всеобъемлющим образом, чтобы разобраться в деталях.

  • Розетка похожа на телефон (то есть сквозное устройство для связи)
  • IP похож на ваш номер телефона (т.е. адрес для вашего сокета)
  • Порт подобен человеку, с которым вы хотите поговорить (т.е. услуга, которую вы хотите заказать с этого адреса)
  • Сокет может быть клиентским или серверным сокетом (т. Е. В компании телефон службы поддержки - это сервер, но телефон в вашем доме - это в основном клиент)

Таким образом, сокет в сети - это виртуальное коммуникационное устройство, привязанное к паре (ip, порт) = (адрес, сервис).

Замечания:

  • Машина, компьютер, хост, мобильный телефон или ПК могут иметь несколько адресов, несколько открытых портов и, следовательно, несколько сокетов. Как и в офисе, у вас может быть несколько телефонов с несколькими телефонными номерами и несколькими людьми для общения.
  • Наличие открытого / активного порта требует наличия привязанного к нему сокета, поскольку именно этот порт делает порт доступным. Однако у вас могут быть неиспользуемые порты в настоящее время.
  • Также обратите внимание, что в сокете сервера вы можете привязать его (порт, конкретный адрес машины) или (порт, все адреса машины), так как в телефоне вы можете подключить множество телефонных линий (телефонных номеров) к телефон или одна конкретная телефонная линия к телефону, и все же вы можете связаться с человеком через все эти телефонные линии или через определенную телефонную линию.
  • Вы не можете связать (связать) сокет с двумя портами, поскольку в телефоне обычно не всегда может быть два человека, использующих один и тот же телефон одновременно.
  • Дополнительно: на одной машине не может быть двух сокетов с одинаковым типом (клиент или сервер) и одинаковыми портом и 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
...
Colin
источник
12

Адрес сокета - это IP-адрес и номер порта

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

Соединение происходит, когда 2 сокета связаны друг с другом.

Zaz
источник
Нет такой вещи, как связывание двух сокетов вместе. Слово «связанный» означает что-то еще с портами.
Маркиз Лорн
10

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

В пакете TCP / IP, например:

{tcp, 193.44.234.3, 12345}

Разговор - это канал связи между двумя процессами, который отображает связь между двумя процессами. Ассоциация - это 5-кортеж, который полностью определяет два процесса, составляющих соединение: {протокол, локальный адрес, локальный процесс, внешний адрес, внешний процесс}

В пакете TCP / IP, например:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

может быть действительной ассоциацией.

Полусвязь это либо: {протокол, локальный адрес, локальный процесс}

или

{протокол, внешний адрес, внешний процесс}

которые указывают каждую половину соединения.

Полусвязь также называется сокетом или транспортным адресом. Таким образом, сокет является конечной точкой для связи, которая может быть названа и адресована в сети. Интерфейс сокетов является одним из нескольких интерфейсов прикладного программирования (API) для протоколов связи. Разработанный как универсальный интерфейс программирования связи, он был впервые представлен системой UNIX 4.2BSD. Хотя он не был стандартизирован, он стал фактическим отраслевым стандартом.

Кришна
источник
Этот ответ тот, который сделал это для меня. Я думаю, это потому, что никто не упомянул слово «ассоциация». Хорошее объяснение.
рациональный
Ни в одном из ваших примеров нет номера процесса. Слово, которое вы ищете, это «порт».
Маркиз Лорн
Прочтите первый абзац. Там четко сказано. Дайте мне знать о любой двусмысленности, цитируя точную фразу. Было бы полезно для меня импровизировать.
Кришна
7

Сокет является конечной точкой связи. Сокет не имеет прямого отношения к семейству протоколов TCP / IP, его можно использовать с любым протоколом, поддерживаемым вашей системой. API сокета C ожидает, что вы сначала получите пустой объект сокета из системы, который затем можно будет привязать к локальному адресу сокета (чтобы напрямую получать входящий трафик для протоколов без установления соединения или принимать входящие запросы на соединение для протоколов, ориентированных на установление соединения) или что вы можете подключиться к удаленному адресу сокета (для любого типа протокола). Вы можете даже сделать и то и другое, если хотите контролировать оба: локальный адрес сокета, к которому привязан сокет, и адрес удаленного сокета, к которому подключен сокет. Для протоколов без подключения подключение сокета даже необязательно, но если вы этого не сделаете, вы ' Придется также передавать адрес назначения с каждым пакетом, который вы хотите отправить через сокет, иначе как сокет узнает, куда отправлять эти данные? Преимущество заключается в том, что вы можете использовать один сокет для отправки пакетов на разные адреса сокетов. Как только вы настроили свой сокет и, возможно, даже подключили его, считайте его двунаправленным каналом связи. Вы можете использовать его для передачи данных в какой-либо пункт назначения, а другой пункт назначения может использовать его для передачи данных вам. То, что вы пишете в сокет, отправляется, а то, что было получено, доступно для чтения. Вы можете использовать его для передачи данных в какой-либо пункт назначения, а другой пункт назначения может использовать его для передачи данных вам. То, что вы пишете в сокет, отправляется, а то, что было получено, доступно для чтения. Вы можете использовать его для передачи данных в какой-либо пункт назначения, а другой пункт назначения может использовать его для передачи данных вам. То, что вы пишете в сокет, отправляется, а то, что было получено, доступно для чтения.

С другой стороны, порты - это то, что есть только у определенных протоколов стека протоколов TCP / IP. Пакеты TCP и UDP имеют порты. Порт - это просто число. Комбинация порта источника и порта назначения определяет канал связи между двумя хостами. Например, у вас может быть и сервер, и простой HTTP-сервер, и простой FTP-сервер. Если сейчас приходит пакет для адреса этого сервера, как он узнает, является ли это пакет для HTTP или FTP-сервера? Что ж, он будет знать, так как HTTP-сервер будет работать на порту 80, а FTP-сервер - на порту 21, поэтому, если пакет поступает с портом назначения 80, он предназначен для HTTP-сервера, а не для FTP-сервера. Также пакет имеет порт источника, поскольку без такого порта источника сервер может иметь только одно подключение к одному IP-адресу за раз. Порт источника позволяет серверу различать идентичные соединения: все они имеют один и тот же порт назначения, например, порт 80, один и тот же IP-адрес назначения (IP-адрес сервера) и один и тот же IP-адрес источника, поскольку все они поступают из один и тот же клиент, но поскольку у них разные исходные порты, сервер может отличать их друг от друга. И когда сервер отправляет обратно ответы, он делает это с портом, с которого поступил запрос, таким образом, клиент также может различать разные ответы, которые он получает от одного и того же сервера.

Mecki
источник
2
Это неверно Сокет не является конечной точкой. Сокет определяется двумя конечными точками. Каждая конечная точка определяется сетевым адресом и портом. Назначение портов - дифференцировать несколько конечных точек на одном сетевом адресе, чтобы можно было поддерживать несколько одновременных сокетов.
Питер Воне
1
Я заметил, что RFC793 (оригинальная спецификация TCP) действительно ссылается на комбинацию сетевого адреса и порта в качестве сокета, поэтому я могу видеть, где вы получили это, но это все еще неправильно, поскольку сокет обязательно определяется двумя конечными точками.
Питер Воне
2
По размышлениям литература противоречива, и я прошу прощения. Строго говоря, связь не происходит до тех пор, пока не будет установлено TCP-соединение между двумя конечными точками (так называемыми сокетами), каждая из которых идентифицируется сетевым адресом и портом. Я сдаюсь.
Питер Воне
6

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

  • IP и порт ~ номер телефона
  • розетка ~ телефонное устройство
  • соединение ~ телефонный звонок
  • установление соединения ~ вызов номера
  • процессы, удаленные приложения ~ люди
  • сообщения ~ речь
inf3rno
источник
Хорошее уточнение (особенно если учесть историю телефонной коммутации , который является частью основы сетевой терминологии ..)
oɔɯǝɹ
Посмотрите на netstatдисплей некоторое время. Все сокеты, принимаемые от прослушивающего сокета, используют один и тот же порт. Следовательно, порт не является уникальным идентификатором сокета.
Маркиз Лорн
6

Приложение состоит из пары процессов, которые обмениваются данными по сети (пара клиент-сервер). Эти процессы отправляют и получают сообщения в и из сети через программный интерфейс, называемый сокетом . Учитывая аналогию, представленную в книге «Компьютерные сети: нисходящий подход». Есть дом, который хочет общаться с другим домом. Здесь дом аналогичен процессу, а дверь - в розетку. Процесс отправки предполагает, что с другой стороны двери имеется инфраструктура, которая будет транспортировать данные к месту назначения. Как только сообщение поступает на другую сторону, оно проходит через дверь приемника (розетку) в дом (процесс). Эта иллюстрация из той же книги может помочь вам:
введите описание изображения здесь
Сокеты являются частью транспортного уровня, который обеспечивает логическую связь с приложениями. Это означает, что с точки зрения приложения оба хоста напрямую связаны друг с другом, хотя между ними существует множество маршрутизаторов и / или коммутаторов. Таким образом, сокет - это не само соединение, а конечная точка соединения. Протоколы транспортного уровня реализуются только на хостах, а не на промежуточных маршрутизаторах.
Портыобеспечить средства внутренней адресации к машине. Основная цель - позволить нескольким процессам отправлять и получать данные по сети, не мешая другим процессам (их данным). Все розетки снабжены номером порта. Когда сегмент прибывает на хост, транспортный уровень проверяет номер порта назначения сегмента. Затем он направляет сегмент в соответствующий сокет. Эта работа по доставке данных в сегменте транспортного уровня в правильный сокет называется демультиплексированием . Затем данные сегмента передаются процессу, подключенному к сокету.

Ugnes
источник
5

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

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

Только один сокет может использовать порт по адресу. Сокет выделяет порт примерно так же, как устройство для ввода-вывода файловой системы. Как только порт выделен, никакой другой сокет не может подключиться к этому порту. Порт будет освобожден, когда сокет будет закрыт.

Взгляните на терминологию TCP / IP .

С. Лотт
источник
3
Это описание сокета довольно необычно. Сокет - это соединение между парой кортежей, где кортеж ссылается на пару IP ADDR и порт. Кроме того, многие разъемы могут подключаться к одному и тому же порту. Как вы думаете, веб-сервер принимает несколько соединений через порт 80? Это плохой ответ
Tall Jeff
1
Сожалею. Несколько разъемов не подключены к порту 80. Один разъем подключен и порождает дополнительные разъемы, где происходит реальная передача. См. Opengroup.org/onlinepubs/009695399/functions/listen.html .
С.Лотт
1
На самом деле, описание на opengroup.org/onlinepubs/009695399/functions/connect.html лучше. Одноранговый сокет, возвращаемый соединением, НЕ находится на порте 80.
S.Lott
1
Этот пост неверен в нескольких деталях и вводит в заблуждение в нескольких отношениях.
Питер Воне
@ Питер Воне: Какие подробности? Какие аспекты? Надеюсь учиться на своих ошибках.
S.Lott
5

из Oracle Java Tutorial :

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

yondoo
источник
Это только учебник, и, конечно, не нормативная справка.
Маркиз Лорн
«Сокет - это одна конечная точка двусторонней связи». Разве это не определение сокета, не учебник по Java?
prayagupd
@prayagupd Конечно, это определение, но оно из учебника, а не спецификации.
маркиз Лорн
4

Порт и сокет можно сравнить с отделением банка.

Номер здания «Банка» аналогичен IP-адресу. Банк имеет различные разделы, такие как:

  1. Отдел сберегательного счета
  2. Отдел персональных кредитов
  3. Отдел ипотечного кредитования
  4. Отдел рассмотрения жалоб

Итак, 1 (отдел сберегательного счета), 2 (отдел персональных кредитов), 3 (отдел жилищных кредитов) и 4 (отдел рассмотрения жалоб) являются портами.

Теперь позвольте нам сказать, что вы идете, чтобы открыть сберегательный счет, вы идете в банк (IP-адрес), затем вы идете в «отдел сберегательного счета» (порт № 1), затем вы встречаете одного из сотрудников, работающих в «отдел сберегательного счета» ». Давайте позвоним ему SAVINGACCOUNT_EMPLOYEE1 для открытия счета.

SAVINGACCOUNT_EMPLOYEE1 - ваш дескриптор сокета, поэтому может быть от SAVINGACCOUNT_EMPLOYEE1 до SAVINGACCOUNT_EMPLOYEEN. Это все дескрипторы сокетов.

Аналогичным образом, другие отделы будут иметь работу под их руководством, и они аналогичны сокету.

Shridhar410
источник
3

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

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

шлифовальный
источник
3

Относительная терминология TCP / IP, которая, как я предполагаю, подразумевается под вопросом. С точки зрения непрофессионала:

ПОРТ похож на номер телефона конкретного дома в определенном почтовом индексе. Почтовый индекс города можно рассматривать как IP-адрес города и всех домов в этом городе.

Розетка, с другой стороны, больше похожа на телефонный звонок между телефонами пары домов, разговаривающих друг с другом. Эти звонки могут быть установлены между домами в одном городе или двумя домами в разных городах. Это тот временный путь между парой телефонов, разговаривающих друг с другом, это розетка.

Высокий Джефф
источник
2
Сокет является конечной точкой. Он существует до установления соединения (TCP) или при отсутствии соединения (UDP). Ergo это не сама связь.
Маркиз Лорн
2

В широком смысле, Socket - это просто розетка, такая же, как ваша электрическая, кабельная или телефонная розетка. Точка, в которой «необходимые вещи» (сила, сигнал, информация) могут выходить и появляться. Он скрывает много подробностей, которые не требуются для использования «необходимых вещей». На языке программного обеспечения он предоставляет общий способ определения механизма связи между двумя объектами (эти объекты могут быть любыми - два приложения, два физически отдельных устройства, пространство пользователя и ядра в ОС и т. Д.)

Порт - это дискриминатор конечной точки. Это отличает одну конечную точку от другой. На сетевом уровне он отличает одно приложение от другого, так что сетевой стек может передавать информацию соответствующему приложению.

Harty
источник
2

На этот вопрос уже даны теоретические ответы. Я хотел бы привести практический пример к этому вопросу, который прояснит ваше понимание о Socket и Port.

Я нашел это здесь

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

Firefox устанавливает соединение с адресом 192.0.2.100 и портом, где работает веб-сервер прикладного уровня. Firefox знает, какой порт ожидать, потому что это хорошо известный порт. Хорошо известным портом для веб-сервера является TCP-порт 80.

Сокет назначения, к которому пытается подключиться 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.

Омкар Рамтеккар
источник
Очень плохое качество цитирования. Третий абзац неправильно использует слово «сокет», как если бы оно означало «IP-адрес». Это не так.
маркиз Лорн
2

Сокет - это абстракция, предоставляемая ядром пользовательским приложениям для ввода / вывода данных. Тип сокета определяется протоколом его обработки, связью IPC и т. Д. Поэтому, если кто-то создает сокет TCP, он может выполнять манипуляции, такие как чтение данных в сокет и запись данных в него простыми методами, а также обработка протокола более низкого уровня, например, преобразования TCP и пересылка пакетов на сетевые протоколы более низкого уровня осуществляется конкретной реализацией сокета в ядре. Преимущество состоит в том, что пользователю не нужно беспокоиться об обработке специфичных для протокола нитриций, а следует просто читать и записывать данные в сокет, как обычный буфер. То же самое верно в случае 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

Сокет - это программная абстракция конечной точки сети, используемая в качестве интерфейса для приложения. В Java, C # он представлен объектом, в Linux, Unix это файл.

Порт - это просто свойство сокета, который вы указываете, если хотите установить связь. Чтобы получить пакет из сокета, вы должны привязать его к определенному локальному порту и NIC (с локальным IP-адресом) или ко всем NIC (INADDR_ANY указано в вызове bind). Чтобы отправить пакет, вы должны указать порт и IP удаленного сокета.

Дражен Г.
источник
1

Сокет - это, по сути, конечная точка для сетевого взаимодействия, состоящая как минимум из IP-адреса и порта. В Java / C # сокет является реализацией более высокого уровня одной стороны двустороннего соединения.

Кроме того, определение в документации Java .

Эрик ван Бракель
источник
Ты имеешь в виду на Java Turorial.
Маркиз Лорн
1

Порт:

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

Разъем:

Сокет представляет собой одно соединение между двумя сетевыми приложениями. Эти два приложения обычно работают на разных компьютерах, но сокеты также могут использоваться для межпроцессного взаимодействия на одном компьютере. Приложения могут создавать несколько сокетов для общения друг с другом. Сокеты являются двунаправленными, это означает, что любая сторона соединения способна отправлять и получать данные.

balaweblog
источник
Порт TCP или UDP не относится ни к чему физическому, ни к точкам подключения Ethernet. Вы не ответили на вопрос.
маркиз Лорн
1

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

Смотрите также:

Стивенс, WR 1998, Сетевое программирование UNIX: Сетевые API: Сокеты и XTI; Том 1, Прентис Холл.
Стивенс, WR, 1994, TCP / IP Illustrated, том 1: Протоколы, Эддисон-Уэсли.

VoidPointer
источник