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

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

861
задан 31.12.2019, 14:39

13 ответов

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

порт А является подобной устройству вещью. Каждый хост имеет одну или несколько сетей (те являются физическими); хост имеет адрес в каждой сети. Каждый адрес может иметь тысячи портов.

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

Смотрят на Терминология TCP/IP .

5
ответ дан 31.12.2019, 14:41
  • 1
    Это заказывает, детализируют определенное математическое решение для решения 3 размерной инверсной кинематики? – Mr Bell 05.11.2019, 15:59
  • 2
    Это описание сокета симпатично от основы. Сокет о соединении между парой кортежей, где кортеж относится к ADDR IP & пара Порта. Дополнительно много подключений CAN сокетов к тому же порту. Как Вы думаете, что веб-сервер берет многочисленные связи на порте 80? Это - плохой ответ – Tall Jeff 31.12.2019, 14:41
  • 3
    Извините. Несколько сокетов не подключены для портирования 80. Один сокет подключен и порождает дополнительные сокеты, где реальная передача происходит. См. opengroup.org/onlinepubs/009695399/functions/listen.html . – S.Lott 31.12.2019, 14:42
  • 4
    На самом деле описание в opengroup.org/onlinepubs/009695399/functions/connect.html лучше. Сокет однорангового узла, возвращенный соединением, НЕ находится на порте 80. – S.Lott 31.12.2019, 14:42
  • 5
    Я соглашаюсь. Downvoted. – Alvaro Rodriguez 31.12.2019, 14:42
  • 6
    Это сообщение является неправильным в нескольких подробных сведениях и вводящий в заблуждение в нескольких отношениях. – Peter Wone 31.12.2019, 14:43

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

16
ответ дан 31.12.2019, 14:43
  • 1
    That' s пользовательское время, не процессорное время. – Matt Ball 15.11.2019, 04:42

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

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

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

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

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

касательно http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

касательно http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

93
ответ дан 31.12.2019, 14:44
  • 1
    " время Разработчика стоит намного больше, чем время " процессора; - пока выполнение приложения явно не замедляется:) – Mark Kahn 15.11.2019, 04:41
  • 2
    Уровень 2 на модели OSI является соединением между узлами, это не имеет никакого механизма соединения процессов. Я don' t полагают, что можно считать сокет существующим в OSI l2. – Antonio Haley 31.12.2019, 14:44
  • 3
    Схема является соединением - сокет является конечной точкой. Соединение состоит из 2 сокетов. – Mark Brackett 31.12.2019, 14:45

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

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

СОКЕТ А, с другой стороны, больше похож на установленный телефонный вызов между телефонами пары зданий, говорящих друг с другом. Те вызовы могут быть установлены между зданиями в том же городе или двумя зданиями в различных городах. Именно той временной установленной трассой между парой телефонов, говорящих друг с другом, является СОКЕТ.

3
ответ дан 31.12.2019, 14:46
  • 1
    @supercat, если Ваш экземпляр будет недопустимым после десериализации его, тогда необходимо обработать это на процессе десериализации (или внутренне на классе или фабрикой). Если бы Вы сериализируете socket1 isntance, и он расположил себя тогда socket1, больше не применимо кодом, который сбивал бы с толку потребителя и может вызвать неожиданное поведение. – Dustin Davis 18.02.2011, 22:42

Порт:

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

Сокет:

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

1
ответ дан 31.12.2019, 14:48
  • 1
    Надлежащая семантика для вызова Располагает, " Был бы последний для отъезда комнаты, окажитесь lights". объекты не должны располагать себя, если другим объектам все еще нужны они, но если объект узнает это it' s не нужный больше, и никто больше не собирается расположить его своевременным способом, объект должен расположить себя. – supercat 18.02.2011, 22:10

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

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

3
ответ дан 31.12.2019, 14:49
  • 1
    @David ObjectDisposedException в этом случае. – Adam Lear♦ 18.02.2011, 20:55
  • 2
    На отражении литература является противоречащей, и я приношу извинения. Очень строго говоря коммуникация не происходит, пока соединение TCP не устанавливается между двумя конечными точками (иначе сокеты), каждый из которых определяется сетевым адресом и портом. Я сдаюсь. – Peter Wone 31.12.2019, 14:49
  • 3
    Это неправильно. Сокет не является конечной точкой. Сокет определяется двумя конечными точками. Каждая конечная точка определяется сетевым адресом и портом. Цель портов состоит в том, чтобы дифференцировать несколько конечных точек на том же сетевом адресе, так, чтобы могли поддерживаться несколько параллельных сокетов. – Peter Wone 31.12.2019, 14:50
  • 4
    Я замечаю, что RFC793 (исходная спецификация TCP) действительно относится к комбинации сетевого адреса и порта как сокет, таким образом, я вижу, где Вы получили это, но it' s все еще неправильный inasmuchas сокет обязательно определяется двумя конечными точками. – Peter Wone 31.12.2019, 14:50

В широком смысле Сокет - просто что, сокет, точно так же, как Ваше электрическое, кабель или телефонный разъем. Точка, откуда "необходимый материал" (питание, сигнал, информация) может выйти и войти. Это скрывает много подробного материала, который не требуется для использования "необходимого материала". В языке программного обеспечения это обеспечивает универсальный способ определить механизм коммуникации между двумя объектами (те объекты могли быть чем-либо - два приложения, два физически отдельных устройства, Пользователь & пространство Ядра в ОС, и т.д.)

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

2
ответ дан 31.12.2019, 14:52

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

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

2
ответ дан 31.12.2019, 14:52
  • 1
    @skjagini: См. ^ Операто𠆓, Эксклюзивный Или, и < < Операто𠆓Сдвиг влево. Существует много способов объединить несколько числовых значений вместе для получения единственного HashCode. Эксклюзивный Или эффективно вертит биты; однако это имеет некоторые слабые места. Поиск реализаций GetHashCode, такой как это ТАК отправляет . – Nigel Touch 12.08.2013, 17:37

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

29
ответ дан 31.12.2019, 14:53
  • 1
    целое число не имеет никакого участника с длиной имени. Таким образом, длина ничего не значит для целого числа. Строка однако имеет свойство длины. $a = ' string'; $a.length – Lars Truijens 11.09.2011, 15:05
  • 2
    Я полагаю, что порт имеет более широкое значение, чем Ваше определение. – Richard Dorman 31.12.2019, 14:54
  • 3
    И сокеты не только подвергаются стеку TCP/IP. Посмотрите сокеты домена UNIX или предайте коммуникационные сокеты процесса земле в целом. – matthias krull 31.12.2019, 14:54

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

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

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

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

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

25
ответ дан 31.12.2019, 14:55

Сводка

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

порт А является идентификатором виртуализации определение сервисной конечной точки (в отличие от сервиса экземпляр конечная точка иначе идентификатор сессии).

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

могут быть параллельные соединения к сервисной конечной точке , потому что соединение определяется [1 114] и его локальное и удаленное конечные точки, позволяя трафику быть направленным к определенному сервисному экземпляру.

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

Выставка

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

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

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

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

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

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

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

Это - пара сокета (с 4 кортежами, состоящий из клиентского IP-адреса, числа клиентского порта, IP-адреса сервера и номера порта сервера), который определяет две конечных точки, который однозначно определяет каждое соединение TCP в Интернете. ( IP TCP Проиллюстрированный Объем 1 , W. Richard Stevens)

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

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

Все это немного сбивает с толку и приводит Вас полагать, что сокет является соединением, которое является яйцами. Я трудился под этим недоразумением, пока Richard Dorman не задал вопрос.

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

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

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

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

Hagrawal не верит мне (см. комментарии), таким образом, вот реальный образец. Я подключил веб-браузер с 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.

я думаю, что недоразумение Hagrawal является результатом моего очень тщательного использования слова, "определяет". Я имею в виду "полностью, однозначно и однозначно определяет". В вышеупомянутом образце существует две конечных точки с адресом/комбинацией портов 54.252.94.236:80. Если все, что Вы имеете, является адресом и портом, у Вас нет достаточной информации для сообщения этих сокетов независимо. Это - недостаточно информации к [1 131], определяют сокет.

Абзац Приложения

два из раздела 2.7 из RFC793 говорят

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

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

Ссылки

  1. IP TCP Проиллюстрированный Объем 1 Протоколы , W. Richard Stevens, 1994 Addison Wesley

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

  3. RFC147, Определения Сокета, Joel M. Winett, Lincoln Laboratory

912
ответ дан 31.12.2019, 14:56
  • 1
    Я знаю это старый вопрос, но можете Вы объяснять о выражении, которое Вы использовали здесь – skjagini 12.10.2012, 21:22
  • 2
    Возможно, аналогия реального мира с сокетом ключевых слов и портом помогла бы тем кто проголосовавший вопрос. Все еще большое объяснение! – rohitverma 31.12.2019, 14:58

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

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

1
ответ дан 31.12.2019, 14:56
  • 1
    Я соглашаюсь, процесс, создающий объект, должен быть в состоянии полагаться на него являющийся доступным и не внезапно получить сообщение об ошибке как Исключение нулевого указателя, которое будет очень трудно отладить. – David Mårtensson 18.02.2011, 20:51

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

См. также:

Stevens, W. R. 1998, Сетевое программирование UNIX: Сетевые API: Сокеты и XTI; Объем 1, Prentice Hall.
Stevens, W. R., 1994, Проиллюстрированный TCP/IP, Объем 1: Протоколы, Addison-Wesley.

0
ответ дан 31.12.2019, 14:57
  • 1
    @supercat: Я не соглашаюсь с Вашим последним предложением. C# имеет сборку "мусора" для заботы об объектном распоряжении когда it' s самый удобный для программы; и it' s довольно хороший в нем. ЕДИНСТВЕННОЕ время необходимо переопределить это, - то, если объект имеет дело с неуправляемыми ресурсами; то, которое возвращается к коду, ответственному за инстанцирование объекта, должно быть ответственно за выпуск его, не сам объект. – NotMe 18.02.2011, 22:22

Теги

Похожие вопросы