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

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

 

 Резюме
-------

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

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

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

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

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

 Экспозиция
-----------

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

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

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

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

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

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

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

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

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

В С#, чтобы установить 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.92.236:80

```
  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 говорится:

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

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

 Ссылки
-------

* TCP-IP Иллюстрированный том 1 Протоколы, W. Richard Stevens, 1994 Addison Wesley
* [RFC793](https://tools.ietf.org/html/rfc793), Институт информационных наук, Университет Южной Калифорнии для DARPA
* [RFC147](https://tools.ietf.org/html/rfc147), Определение Socket, Joel M. Winett, Lincoln Laboratory

 

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

* IP-адрес
* Транспортный протокол
* Номер порта

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

Например:

* 1030 - это порт.
* (10.1.1.2, TCP, порт 1030) - это сокет.

 

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

 

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

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

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

 

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

Общим определением для сети является использование [модели OSI](https://en.wikipedia.org/wiki/OSI_model), которая разделяет сеть на несколько слоев в соответствии с назначением. Есть несколько важных, которые мы рассмотрим здесь:

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

TCP содержит, помимо прочего, концепцию [ports](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_ports). Это фактически разные конечные точки данных на том же IP-адресе, к которому может привязываться Internet Socket (`AF_INET`).

Как это бывает, [тоже делает UDP](https://en.wikipedia.org/wiki/TCP_and_UDP_port) и другие протоколы транспортного уровня. Они не нуждаются в техническом обслуживании портов, но эти порты предоставляют возможность нескольким приложениям в вышеперечисленных слоях использовать один и тот же компьютер для приема (и действительно) исходящих подключений.

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

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

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

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

Voila! Это подбирает вещи. Итак, в нашей схеме,

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

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

 

Сокет = IP-адрес + порт (числовой адрес)   

Вместе они идентифицируют конечную точку для сетевого соединения на машине. (Я просто запустил сеть 101?)

 

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

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

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

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

 

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

Сокеты специфичны для протокола - поэтому реализация уникальности заключается в том, что [TCP](http://www.networksorcery.com/enp/protocol/tcp.htm)/[IP](http://www.networksorcery.com/enp/protocol/ip.htm) и [UDP](http://www.networksorcery.com/enp/protocol/udp.htm)/[IP](http://www.networksorcery.com/enp/protocol/ip.htm) использует * (ipaddress: порт), отличается от, например, [IPX](http://docsrv.sco.com/SDK_netware/IPX_Addressing.html) (Сеть, Node и... гейм, сокет - но другой сокет, чем под общим термином "сокет". Номера сокетов IPX эквивалентны IP-портам). Но все они предлагают уникальную адресуемую конечную точку.

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

* UDP не имеет отношения к подключению - это означает, что виртуальная схема между двумя конечными точками никогда не создается. Однако в качестве конечной точки мы по-прежнему относимся к [UDP-сокетам](http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-5.html). Функции API дают понять, что оба являются просто разными типами сокетов. `SOCK_DGRAM` - это UDP (просто отправка сообщения), а `SOCK_STREAM` - TCP (создание виртуальной схемы).
* Технически, заголовок IP содержит IP-адрес, а протокол поверх IP (UDP или TCP) содержит номер порта. Это позволяет использовать другие протоколы (например, [ICMP](http://www.networksorcery.com/enp/protocol/icmp.htm), которые не имеют номеров портов, но имеют информацию о IP-адресе).

 

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

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

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

 

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

 

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

Соединения 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
...

```
 

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

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

```

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

 

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

В наборе TCP/IP, например:

{tcp, 193.44.234.3, 12345}

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

В наборе TCP/IP, например:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

может быть допустимой ассоциацией.

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

или

{protocol, foreign-address, foreign-process}

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

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

 

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

* ip и номер порта ~
* socket ~ телефонное устройство
* соединение ~ телефонный звонок
* установление соединения ~ вызов номера
* процессы, удаленные приложения ~ люди
* сообщения ~ речь

 

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

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

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

Посмотрите [Терминология TCP/IP](https://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.commadmn/doc/commadmndita/tcpip_terms.htm).

 

from [Учебник Oracle Java](https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html):

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

 

Приложение состоит из пары процессов, которые обмениваются данными по сети (пара клиент-сервер). Эти процессы отправляют и получают сообщения в сеть и из нее через программный интерфейс  **сокет**. Учитывая аналогию, представленную в книге "Компьютерная сеть: подход сверху вниз". Существует дом, который хочет общаться с другим домом. Здесь дом аналогичен процессу и двери к розетке. Процесс отправки предполагает, что на другой стороне двери есть инфраструктура, которая будет передавать данные в пункт назначения. Как только сообщение поступит с другой стороны, оно проходит через дверь приемника (гнездо) в дом (процесс). Эта иллюстрация из той же книги может помочь вам:   
[![введите описание изображения здесь]()](/img/0934eed6766547f690535971d40d1a47.png)
  
 Сокеты являются частью транспортного уровня, который обеспечивает логическую связь с приложениями. Это означает, что с точки зрения приложения оба узла напрямую связаны друг с другом, хотя между ними существует множество маршрутизаторов и/или переключателей. Таким образом, сокет не является самим соединением, это конечная точка соединения. Протоколы транспортного уровня реализуются только на хостах, а не на промежуточных маршрутизаторах.   
 **Порты** предоставляют средства внутренней адресации для машины. Основная цель - позволить нескольким процессам отправлять и получать данные по сети без вмешательства в другие процессы (их данные). Все сокеты снабжены номером порта. Когда сегмент поступает на хост, транспортный уровень исследует номер порта назначения сегмента. Затем он переводит сегмент в соответствующий сокет. Это задание доставки данных в сегменте транспортного уровня в правильный сокет называется  **демпплексированием**. Затем данные сегмента передаются процессу, присоединенному к сокету.

 

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

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

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

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

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

  SAVINGACCOUNT\_EMPLOYEE1 - ваш дескриптор сокета, поэтому может быть от SAVINGACCOUNT\_EMPLOYEE1 до SAVINGACCOUNT\_EMPLOYEEN. Это все дескрипторы сокетов.

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

 

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

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

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

  **Замечания:**   

 * Машина, компьютер, хост, мобильный телефон или ПК могут иметь несколько адресов, несколько открытых портов и, следовательно, несколько сокетов. Как и в офисе, у вас может быть несколько телефонов с несколькими телефонными номерами и несколькими людьми для общения.
* Наличие открытого/активного порта требует наличия привязанного к нему сокета, поскольку именно этот порт делает порт доступным. Однако у вас могут быть неиспользуемые порты в настоящее время.
* Также обратите внимание, что в сокете сервера вы можете привязать его (порт, определенный адрес машины) или (порт, все адреса машины), так как в телефоне вы можете подключить множество телефонных линий (телефонных номеров) к телефон или одна конкретная телефонная линия к телефону, и все же вы можете связаться с человеком через все эти телефонные линии или через определенную телефонную линию.
* Вы не можете связать (связать) сокет с двумя портами, так как в телефоне обычно не всегда может быть два человека, использующих один и тот же телефон одновременно.
* Дополнительно: на одной машине не может быть двух сокетов с одинаковым типом (клиент или сервер) и одинаковыми портом и ip. Однако, если вы являетесь клиентом, вы можете открыть два соединения с двумя сокетами к серверу, поскольку локальный порт в каждом из этих клиентских сокетов различен)

 Надеюсь, это очистит вас от сомнений

 

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

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

 

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

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

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

 

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

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

 

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

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

 

Уже были заданы теоретические ответы на этот вопрос. Я хотел бы привести практический пример этого вопроса, который поможет вам разобраться в Socket и Port.

Я нашел [здесь](http://www.dummies.com/how-to/content/network-basics-tcpudp-socket-and-port-overview.html)

>  В этом примере вы пройдете через процесс подключения к веб-сайту, например, 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: порт, или в этом примере, 192.0.2.100:80. Это сервер стороне подключения, но сервер должен знать, куда отправить веб-страницу, которую вы хотите просмотреть в Mozilla Firefox, поэтому у вас есть сокет для клиентская сторона соединения также.
> 
>  Соединение на стороне клиента составлено из вашего IP-адреса, например 192.168.1.25 и произвольно выбранный номер динамического порта. Сокет, связанный с Firefox, выглядит как 192.168.1.25:49175. Потому что веб серверы работают на TCP-порту 80, оба эти сокета - это TCP-сокеты, тогда как если вы подключались к серверу, работающему на порте UDP, и серверные, и клиентские сокеты будут сокетами UDP.
> 
> 
> 

 

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

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

 

Один порт может иметь один или несколько разъемов, подключенных к другому внешнему 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

```
 

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

Кроме того, определение в документации [Java](http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html).

 

Порт:

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

Цоколь:

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

 

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

 

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

См. также:

Стивенс, У. Р. 1998, Сетевое программирование UNIX: Сетевые интерфейсы: Сокеты и XTI; Том 1, Prentice Hall.   

Стивенс, В. Р., 1994, Иллюстрированный TCP/IP, Том 1: Протоколы, Эддисон-Уэсли.