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


121

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


9
Порт - это физический адрес, а сокет - это объект.
СуперМ

14
Если пакет попадает в карман на сокете порта ...
user16764

Ответы:


116

S - это серверная программа: допустим, это HTTP-сервер, поэтому он использует известный номер порта для HTTP , равный 80. Я запускаю его на хосте с IP-адресом 10.0.0.4, поэтому он будет прослушивать соединения 10.0.0.4:80(потому что вот где все ожидают его найти).

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

  • вывод netstat, когда сокет связан:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    

    NB. локальный адрес - все нули, потому что S не волнует, как его клиенты достигают его

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

  • вывод netstat после того, как соединение принято:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    
    • 10.0.0.4:80представляет конец соединения S и связан с сокетом, возвращаемымaccept
    • 10.0.0.5:55715является концом соединения клиента и связан с сокетом, который клиент передал для соединения . Порт клиента не используется ни для чего, кроме маршрутизации пакетов по этому TCP-соединению к нужному процессу: он назначается случайным образом ядром клиента из диапазона временных портов.

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

Итак, примерно:

  • IP-адрес для маршрутизации между хостами в сети
  • порт для маршрутизации на правильный сокет на хосте
    • Я почти сказал правильный процесс , но на самом деле можно иметь несколько (обычно дочерних) процессов, принимающих все в одном сокете ...
    • однако каждый раз, когда acceptвозвращается один из одновременных вызовов, он делает это только в одном процессе, сокет каждого входящего соединения уникален для одного экземпляра сервера.
  • сокет - это объект, который процесс использует, чтобы поговорить с ОС о конкретном соединении, как дескриптор файла
    • как уже упоминалось в комментариях, существует множество других применений для сокетов, которые вообще не используют порты: например, socketpair создает пару сокетов, соединенных вместе, которые не имеют никакой схемы адресации - единственный способ использовать этот канал - это процесс, который вызвал socketpair, являясь дочерним элементом этого процесса и наследуя его, или явно передавая один из сокетов из этого процесса

1
@ Бесполезно Стоит отметить, что сокеты не обязательно должны быть основаны на IP, как указывает ответ. Это не совсем относится к OP, но объяснение семейств сокетов поможет завершить этот ответ.
hafichuk

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

11
это вовсе не бесполезно
l -''''''--------- '' '' '' '' '' ''

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

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

49

Думайте о своей машине как о жилом доме:

  • Порт - это номер квартиры.

  • Розетка - это дверь квартиры.

  • IP-адрес - это уличный адрес здания.


3
Мне нравится эта аналогия, хотя сейчас я думаю о том, чтобы находиться внутри этой квартиры и смотреть на бесконечный коридор с множеством дверей. Я не могу выйти. Я не могу выйти! :)
Даниэль Холлинрейк

1
@Caleb A socket is the door of an apartment.Но разве не может быть много открытых гнезд на одном порту?
Сухаил Гупта

3
@suhail Иногда в квартире больше одной двери. У них всех одинаковый номер квартиры, но они разные двери.
Калеб

45

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

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


Сокет по сути представляет собой 4 кортежа, состоящего из: IP-адреса источника: IP-адрес порта-порта: порт.
Тони Лев

Вы имеете в виду, что порт существует только в протоколах TCP и UDP ??? Как насчет http и других протоколов?
Хосейн Агаджани

HTTP - это протокол прикладного уровня, который работает поверх протоколов транспортного уровня, таких как TCP или UDP. Он не имеет своей собственной концепции портов, он наследует их от базового протокола транспортного уровня.
Дирк Холсоппл

8

Компьютер имеет IP-адрес, который идентифицирует его как отдельный объект в сети. Мы добавляем к этому дополнительный номер, чтобы мы могли различать подключения к этому компьютеру. Это номер порта. На стороне ОС соединения вам нужны буферы, состояние соединения и т. Д. Этот логический объект - сокет.


0

Сокет - это канал связи с портом. Когда вы хотите, чтобы ваша программа взаимодействовала по сети, вы указали ей способ адресации порта, и это делается путем создания сокета и подключения его к порту. По сути, сокет = IP + порты Сокеты обеспечивают доступ к порту + ip


-1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.