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

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

30.09.2008 10:04:01
Просто повторюсь, сокеты не ограничиваются сетевым вводом-выводом. Они доступны в любых ситуациях для потоковой передачи данных между различными приложениями.
Oli 30.09.2008 10:14:33
30 ОТВЕТОВ

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

30
30.09.2008 10:05:47
Я считаю, что порт имеет более широкое значение, чем ваше определение.
Richard Dorman 30.09.2008 10:09:37
И сокеты не только подчиняются стеку TCP / IP. См. Доменные сокеты UNIX или сокеты межпроцессного взаимодействия в целом.
matthias krull 1.05.2012 23:04:53
не уверен насчет этого ответа. Вы можете использовать HTTP для связи с другим процессом через сокеты без назначения порта.
SeF 13.04.2020 07:48:42

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

99
7.06.2016 01:55:44
Уровень 2 в модели OSI представляет собой соединение между узлами, он не имеет механизма соединения процессов. Я не верю, что вы можете рассмотреть сокет, существующий в OSI l2.
Antonio Haley 30.09.2008 12:45:31
Схема - это соединение, сокет - это конечная точка. Соединение состоит из 2 розеток.
Mark Brackett 30.09.2008 14:33:15
« Сокет представляет собой одно соединение между двумя сетевыми приложениями. » Это не соответствует RFC 793, протоколу управления передачей, в котором поясняется: « Чтобы позволить многим процессам в пределах одного хоста одновременно использовать средства связи TCP, TCP предоставляет набор адресов или порты в каждом хосте. Объединенный с сетью и адресами хоста из уровня интернет-связи, это формирует сокет. Пара сокетов однозначно идентифицирует каждое соединение. "
Ron Maupin 17.11.2019 18:37:46

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

16
30.09.2008 10:08:29
Для наиболее общего ответа, ударить «сделанный, беря порт и имя хоста или сетевой адаптер и объединяя их в». Например, сокет UNIX - это (в коде) структура данных (или объект), которую вы можете использовать для отправки или получения данных.
JosiahYoder-deactive except.. 22.09.2016 16:51:34

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

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

1
30.09.2008 10:08:53
Ты имеешь в виду на Явском Турориале.
user207421 29.01.2017 01:21:34

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

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

3
30.09.2008 10:08:55

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

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

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

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

5
31.12.2008 11:10:28
Это описание сокета довольно необычно. Сокет - это соединение между парой кортежей, где кортеж ссылается на пару IP ADDR и порт. Кроме того, многие разъемы могут подключаться к одному и тому же порту. Как вы думаете, веб-сервер принимает несколько соединений через порт 80? Это плохой ответ
Tall Jeff 30.09.2008 12:15:45
Сожалею. Несколько разъемов не подключены к порту 80. Один разъем подключен и порождает дополнительные разъемы, где происходит реальная передача. См. Opengroup.org/onlinepubs/009695399/functions/listen.html .
S.Lott 30.09.2008 12:39:19
На самом деле, описание на opengroup.org/onlinepubs/009695399/functions/connect.html лучше. Одноранговый сокет, возвращенный соединением, НЕ находится на порте 80.
S.Lott 30.09.2008 12:41:52
Этот пост неверен в нескольких деталях и вводит в заблуждение в нескольких отношениях.
Peter Wone 2.10.2008 02:12:45
@ Питер Воне: Какие особенности? Какие аспекты? Надеюсь учиться на своих ошибках.
S.Lott 2.10.2008 10:01:11

Порт:

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

Разъем:

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

1
30.09.2008 10:23:50
Порт TCP или UDP не относится ни к чему физическому, ни к точкам подключения Ethernet. Вы не ответили на вопрос.
user207421 23.06.2017 20:11:37

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

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

7
17.11.2019 18:30:01
Это неверно Сокет не является конечной точкой. Сокет определяется двумя конечными точками. Каждая конечная точка определяется сетевым адресом и портом. Назначение портов состоит в том, чтобы различать несколько конечных точек на одном сетевом адресе, чтобы можно было поддерживать несколько одновременных сокетов.
Peter Wone 30.09.2008 11:18:14
Я заметил, что RFC793 (оригинальная спецификация TCP) действительно ссылается на комбинацию сетевого адреса и порта как сокета, поэтому я могу видеть, где вы получили это, но это все еще неправильно, поскольку сокет обязательно определяется двумя конечными точками.
Peter Wone 30.09.2008 11:28:22
По размышлениям литература противоречива, и я прошу прощения. Строго говоря, связь не происходит до тех пор, пока не будет установлено TCP-соединение между двумя конечными точками (так называемыми сокетами), каждая из которых идентифицируется сетевым адресом и портом. Я сдаюсь.
Peter Wone 30.09.2008 12:29:52

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

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

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

1
30.09.2008 10:28:36

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

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

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

3
30.09.2008 12:31:21
Сокет является конечной точкой. Он существует до установления соединения (TCP) или при отсутствии соединения (UDP). Ergo это не сама связь.
user207421 28.06.2016 18:19:08

Резюме

Сокет 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 , Определение гнезда , Джоэл М. Уинетт, Линкольн Лаборатория

966
30.05.2019 21:11:28
Возможно, реальная аналогия с ключевыми словами сокет и порт поможет тем, кто поднял вопрос. Все еще отличное объяснение!
rohitverma 8.02.2013 18:24:28
@rationalcoder - Читать весь ответ. Существует разница между определением чего-либо и определением этого. Например, экземпляры класса определяются классом. Они частично, но не полностью идентифицированы этим.
Peter Wone 16.12.2015 01:42:27
Я не голосовал, потому что я не согласен с этим утверждением - « Сокет не идентифицируется комбинацией IP-адреса и порта: » .. Прочитайте TCP RFC - tools.ietf.org/html/rfc793 .. Очень ясно, что сокет - это комбинация IP и порта, если вы знаете IP и порт, то вы определили сокет или конечную точку, если вы знаете пару сокетов, то есть IP + порт клиента и IP + порт сервера, то вы определили уникальное соединение ..
hagrawal 6.03.2016 00:52:55
«В приведенном выше примере есть две конечные точки с комбинацией адрес / порт 54.252.94.236:80. Если у вас есть только адрес и порт, у вас недостаточно информации для разделения этих сокетов. Недостаточно информации для идентификации разъем." Разве это не одни и те же сокеты, но разные соединения, между двумя соединениями у вас есть 3 сокета, 2 локальных и один и тот же сокет сервера, к которому подключаются; или это на самом деле две разные розетки? Они не будут различаться, потому что они одинаковы, но для разграничения соединений вам потребуются разные локальные сокеты.
Andrew Clavin 4.07.2016 06:41:00
-1 Твой ответ просто неправильный. Вы: «TCP-сокет - это ... конечная точка определенного соединения ». RFC 793 : «сокет может использоваться одновременно в нескольких соединениях ». Я не уверен, какие библиотеки вы используете, но в библиотеках, которые я использовал, объекты сокетов были уникально определены IP-адресом и портом и порождали объекты подключения для каждого удаленного сокета.
Zaz 24.01.2017 16:48:17

Кажется, есть много ответов, приравнивающих сокет к соединению между двумя компьютерами, что я считаю абсолютно неправильным. Сокет всегда был конечной точкой на 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
30.09.2008 13:26:46

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

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

2
31.12.2008 07:47:21

Разъем подключения (fd) представлен для локального адреса + локальный порт + адрес однорангового узла + порт однорангового узла. Обрабатывать получение / отправку данных через абстрактный сокет. Прослушивающий сокет (fd) представлен для локального адреса + локальный прослушивающий порт. Процесс может принять новое соединение через сокет.

-2
31.08.2015 04:17:18
Пожалуйста, не думайте, что добавление произвольного полужирного шрифта везде является заменой для выражения себя ясно и правильно.
user207421 31.08.2015 04:17:44

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

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

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

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

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

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

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

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

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

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

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

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

44
7.04.2012 20:17:03
Вот почему пули не покидают и не покидают Powerpoint; они работают!
Anurag Kalia 1.03.2013 18:47:27
Очень хорошее введение в tcp-ip и сетевые коммуникации. Начинающие, прочитайте это в первую очередь.
Colin 14.03.2013 18:43:10

Сокет состоит из трех вещей:

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

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

Например:

  • 1030 - это порт.
  • (10.1.1.2, TCP, порт 1030) является сокетом.
186
2.06.2013 22:52:51
Нет. Сокет состоит из пяти элементов : {протокол, локальный адрес, локальный порт, удаленный адрес, удаленный порт}.
user207421 22.07.2013 01:30:29
@ EJP Нет, опять. Смотрите выбранный ответ для получения дополнительной информации.
Kehlan Krumme 10.10.2013 20:58:23
@KorayTugay Это в заголовке IP. Что заставляет вас думать, что уровень TCP не может этого увидеть?
user207421 31.08.2015 04:00:50
@EJP, как я вижу в ответе, получившем наибольшее количество голосов, выше, что сокет не является самим соединением, но это конечная точка соединения, тогда как получается, что он может включать как локальные, так и удаленные порты и IP-адреса. Сокет будет представлять только одну сторону соединения, т.е. либо локальный порт и локальный IP-адрес, либо удаленный порт и удаленный IP-адрес. Пожалуйста, поправьте меня, если я ошибаюсь.
RBT 17.03.2016 08:56:32
@EJP Still RFC 793: «Пара сокетов однозначно идентифицирует каждое соединение. То есть сокет может одновременно использоваться в нескольких соединениях». Если сокет уже состоит из пяти вещей, как может быть «пара сокетов» в моей цитате?
Gab是好人 29.01.2017 18:39:59

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

Соединения TCP-IP являются двунаправленными путями, соединяющими одну комбинацию адреса: порта с другой комбинацией адреса: порта. Поэтому, когда вы открываете соединение с вашего локального компьютера с портом на удаленном сервере (например, www.google.com:80), вы также связываете новый номер порта на вашем компьютере с соединением, чтобы сервер мог отправлять вещи обратно к вам (например, 127.0.0.1:65234). Может быть полезно использовать netstat для просмотра соединений вашей машины:

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

Порт - это объект, который используется сетевыми протоколами для доступа к подключенным хостам. Порты могут быть специфичными для приложения или связаны с определенной средой связи. Различные протоколы используют разные порты для доступа к хостам, например, HTTP использует порт 80 или FTP использует порт 23. Вы можете назначить пользовательские номера портов в вашем приложении, но они должны быть выше 1023.

Порты открывают соединение с требуемым хостом, в то время как сокеты являются конечной точкой в ​​межсетевом или межпроцессном взаимодействии. Сокеты назначаются через API (интерфейс прикладного программирования) системой.

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

-1
18.03.2013 14:56:27
Нет, они не будут. Порты будут присутствовать только тогда, когда процесс открывает один для прослушивания TCP или отправки / получения UDP.
user207421 29.01.2017 01:24:09

На этот вопрос уже даны теоретические ответы. Я хотел бы привести практический пример к этому вопросу, который прояснит ваше понимание о 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.

2
26.06.2013 12:57:17
Очень плохое качество цитирования. Третий абзац неправильно использует слово «сокет», как если бы оно означало «IP-адрес». Это не так.
user207421 28.06.2016 18:24:18

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

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

2
16.10.2013 10:08:44

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

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

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

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

30
19.12.2018 10:21:20
Каждый сокет требует свой собственный порт?
MondayPaper 2.07.2014 14:45:08
Потрясающие. Самый простой способ представить горы знаний.
Asif Mehmood 15.05.2015 14:16:33
Я не уверен, что ваше утверждение: «сервер создает сокет для каждого соединения для поддержки своего клиента» правильно.
Rushi Agrawal 6.06.2015 15:08:10
@RushiAgrawal Тогда я предлагаю вам посмотреть. В частности, увидеть, как человек принимает.
user207421 31.08.2015 04:02:26
Это подразумевает, что для каждого сокета, который сервер создает для каждого соединения для поддержки своего клиента, может быть тот же номер порта (например, порт 80 для продолжения HTTP-соединений), но с другим IP-адресом клиентов, с которых отправляются запросы на соединения. верно?
Randika Vishman 5.09.2015 05:57:55

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

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

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

25
27.07.2014 14:55:37
Слово «внутренний» в описании порта звучит как «не публично» для меня.
Jonas N 21.01.2016 15:25:07
Итак, можем ли мы сказать: сокеты работают внутри портов? или порты запускаются внутри сокетов?
Gucho Ca 6.06.2016 19:52:30
@ GuchoCa Мы не можем сказать, что сокеты или порты работают вообще, не говоря уже о том, что они находятся внутри другого. Непонятно, о чем ты спрашиваешь.
user207421 29.11.2016 00:32:04

из Oracle Java Tutorial :

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

5
29.01.2017 01:20:06
Это только учебник, и, конечно, не нормативная справка.
user207421 31.08.2015 04:04:23
«Сокет - это одна конечная точка двусторонней связи». Разве это не определение сокета, не учебник по Java?
prayagupd 7.06.2017 06:03:13
@prayagupd Конечно, это определение, но оно из учебника, а не спецификации.
user207421 23.06.2017 20:08: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. Хотя он не был стандартизирован, он стал фактическим отраслевым стандартом.

10
20.05.2015 16:53:46
Этот ответ тот, который сделал это для меня. Я думаю, это потому, что никто не упомянул слово «ассоциация». Хорошее объяснение.
rationalcoder 16.12.2015 05:57:43
Ни в одном из ваших примеров нет номера процесса. Слово, которое вы ищете, это «порт».
user207421 28.06.2016 18:16:48
Прочтите первый абзац. Там четко сказано. Дайте мне знать о любой двусмысленности, цитируя точную фразу. Было бы полезно для меня импровизировать.
Krishna 3.11.2018 10:09:15

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

Существует 4 типа розеток:

  • потоковые розетки
  • дейтаграммы
  • сырые розетки
  • последовательные пакетные сокеты.

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

-4
31.08.2015 04:24:28
Порт - это числовое значение. Здесь не так много понимания.
user207421 31.08.2015 04:24:53

Проще говоря, между сокетом и портом нет никакой физической разницы, как, например, между PATA и SATA. Они просто кусочки программного обеспечения для чтения и написания NIC.

Порт - это, по сути, публичный сокет, некоторые из которых общеизвестны / общеприняты, обычный пример - 80, посвященный HTTP. Любой, кто хочет обмениваться трафиком с использованием определенного протокола, в данном случае HTTP, канонически переходит на порт 80. Конечно, 80 физически не выделен для HTTP (это не физически ничего, это просто число, логическое значение), и может использоваться на каком-то конкретном компьютере для какого-то другого протокола ad libitum, если те, кто пытается подключиться, знают, какой протокол (который может быть довольно закрытым) использовать.

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

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

-1
19.08.2015 18:35:53
Порт не является «общедоступным сокетом», а сокет не является «частным портом». Ответное рукопожатие не содержит такой вещи, как «информация о сокете», и последующий обмен данными происходит между тем же локальным и удаленным IP-адресом и портом, что и запрос на соединение. См. RFC 793. Ответ - полная чушь.
user207421 28.06.2016 18:28:51
@EJP: Мне жаль, что тебе не понравилось, как я сформулировал свой ответ, или, возможно, не понял его. Но это не "полная чушь". Когда сервер выполняет процедуру accept (), процесс разветвляется и выделяет новый сокет для частного использования этого соединения. Исходный процесс продолжает прослушивать сокет, индексированный номером порта, к которому было запрошено соединение. Если вы все еще думаете, что мой ответ - чепуха, я призываю вас прочитать сетевое программирование Стивенса для Unix .
MMacD 30.06.2016 11:12:32
Ни один из этих неуместных вафель не обращается к тому, что я на самом деле написал. Слова, которые я привел в вашем посте, не поддерживаются RFC 793, и единственный адекватный ответ на них - предоставить подтверждающую цитату из этого документа. Стивенс не является нормативной ссылкой, хотя там тоже нет ничего, что поддерживало бы ваше утверждение.
user207421 2.07.2016 01:03:28

Один порт может иметь одно или несколько разъемов, соединенных с разными внешними 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
31.08.2015 03:43:01

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

  • IP и порт ~ номер телефона
  • розетка ~ телефонное устройство
  • соединение ~ телефонный звонок
  • установление соединения ~ вызов номера
  • процессы, удаленные приложения ~ люди
  • сообщения ~ речь
6
11.10.2015 23:19:57
Хорошее пояснение (особенно если учесть историю телефонных переключений, которая является частью основы сетевой терминологии ..)
oɔɯǝɹ 3.04.2016 14:11:56
Посмотрите на netstatдисплей некоторое время. Все сокеты, принимаемые от прослушивающего сокета, используют один и тот же порт. Следовательно, порт не является уникальным идентификатором сокета.
user207421 29.01.2017 01:19:18

С некоторой аналогией

Хотя для сокетов уже было дано много технических деталей ... Я хотел бы добавить свой ответ, на всякий случай, если кто-то все еще не может почувствовать разницу между 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

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

83
3.08.2018 14:41:36
То есть X, Y, Z будут подключаться к одному и тому же порту, то есть к одной и той же службе, но иметь разные сокеты на стороне сервера? Поэтому, когда, скажем, X отправляет некоторый пакет на сервер, он говорит: «найди мне (протокол, IP-адрес X, порт X, IP-адрес S, порт S)» и отправь в приложение чата. Я предполагаю, что должна быть связь между некоторыми объектными приложениями и объектами сокетов? Например, когда я получаю некоторые данные из сокета-1, я хочу отобразить их как пользовательское сообщение, но приложение должно знать, что сообщения из сокета А получены от пользователя Х.
monolith 7.11.2019 20:14:36

Я знаю, что есть много объяснений. Но есть еще один простой способ понять это на практическом примере. Мы все можем подключиться к HTTP-порту 80, но означает ли это, что только один пользователь может подключаться к этому порту одновременно? Ответ, очевидно, «нет». Несколько пользователей для разных целей могут получить доступ к HTTP-порту 80, но они по-прежнему получают правильный ответ от сервера, не так ли? Теперь подумай минутку, как? Да, вы правы, его IP-адресэто однозначно идентифицирует разных пользователей, которые контактируют для разных целей. Если бы вы прочитали предыдущие ответы, прежде чем попасть сюда, вы бы знали, что IP-адрес является частью информации, из которой состоит сокет. Задумайтесь, возможно ли общение без розеток? Ответ «Да», но вы не можете запустить более одного приложения в порту, но мы знаем, что мы не являемся коммутатором «Dump», который работает только на оборудовании.

1
27.12.2016 07:42:02
Нет, это не так. Это 5-ти кортеж {протокол, исходный IP, исходный порт, целевой IP, целевой порт} .
user207421 29.01.2017 01:23:11
Да, я согласен. мы добавляем интеллект по мере развития переключателей.
Vishal S 29.01.2017 23:19:47
Это не то, что я сказал, и это не то, с чем вы утверждаете, что согласны. Переключатели не имеют к этому никакого отношения.
user207421 23.06.2017 20:14:28