В чем разница между портом и сокетом? - PullRequest
823 голосов
/ 30 сентября 2008

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

Ответы [ 35 ]

875 голосов
/ 30 сентября 2008

Резюме

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

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

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

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

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

Exposition

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

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

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

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

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

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

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

Это сокет пара (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, 1 , У. Ричард Стивенс)

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

Хагравал мне не верит (см. Комментарии), так что вот реальный пример. Я подключил веб-браузер к 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 , Определение гнезда, Джоэл М. Винетт, Лаборатория Линкольна

170 голосов
/ 02 августа 2012

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

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

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

Например:

  • 1030 - это порт.
  • (10.1.1.2, TCP, порт 1030) - это сокет.
91 голосов
/ 30 сентября 2008

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

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

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

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

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

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

67 голосов
/ 20 июня 2016

По аналогии

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

Рассмотрим сервер S ,

и скажите человеку X, Y, Z нужна услуга (скажем, служба чата) с этого сервера S

затем

IP-адрес сообщает -> , кто? тот сервер чата 'S', с которым X, Y, Z хочет связаться

хорошо, вы получили "кто является сервером"

но предположим, что сервер 'S' также предоставляет некоторые другие услуги другим людям, скажем, 'S' предоставляет услуги хранения человеку A, B, C

тогда

порт сообщает ---> , какой? обслуживать вас (X, Y, Z) * ​​1048 * нужен т. Е. Чат, а не этот сервис хранения

ладно ... вы заставляете сервер знать, что вам нужен «сервис чата», а не хранилище

но

вам три года, и сервер может захотеть идентифицировать все три по-разному

приходит розетка

сейчас сокет сообщает -> какой? конкретное соединение

то есть, скажем,

розетка 1 для человека X

розетка 2 для человека Y

и розетка 3 для человека Z

Надеюсь, это поможет тому, кто все еще был в замешательстве :)

43 голосов
/ 08 апреля 2012

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

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

  • Канальный уровень . Этот уровень отвечает за передачу пакетов данных от одного сетевого устройства другому и находится чуть выше уровня, который фактически выполняет передачу. Он говорит о 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 мы будем указывать наш порт и bam! Работа выполнена! Ну, почти, кроме:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

также возможно. Эх, вот и бросил гаечный ключ в работах!

Хорошо, на самом деле это не так. Все, что нам нужно сделать, это придумать некоторые соответствующие определения:

  • Интернет-сокет - это комбинация IP-адреса, протокола и связанного с ним номера порта, по которому служба может предоставлять данные. Итак, TCP-порт 80, stackoverflow.com - это интернет-сокет.
  • Unix-сокет - это конечная точка IPC, представленная в файловой системе, например, /var/run/database.sock.
  • API-интерфейс сокетов - это метод запроса приложения на возможность чтения и записи данных в сокет.

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

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

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

28 голосов
/ 30 сентября 2008

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

26 голосов
/ 13 декабря 2013

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

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

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

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

24 голосов
/ 19 марта 2014

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

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

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

24 голосов
/ 30 сентября 2008

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

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

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

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

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

16 голосов
/ 30 сентября 2008

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

...