2016-09-04 3 views
4

Я не понимаю, что это такое означает до bind сокет по любому адресу, кроме 127.0.0.1 (или :: 1 и т. Д.).
Am I not - по определению - привязка гнезда к порту на мой собственный машина .., который является localhost?
Какой смысл это сделать, чтобы связать или прослушать еще один порт устройства или IP-адреса?
Концептуально это просто не имеет смысла для меня!Что означает связывать() сокет по любому адресу, отличному от localhost?

(Это оказалось на удивление трудно Google ... возможно потому, что я не погуглить правильные термины.)

+0

Для моих собственных (и будущих читателей) более поздней ссылки: [эта страница] (https://technet.microsoft.com/en-us/magazine/ad9db381-1e1b-4077-be1c-bcefb11f1ea8). – Mehrdad

+0

Какая ссылка содержит страница? Он вообще не упоминает привязки. – LarsH

+0

@LarsH: Я не помню конкретной причины, по которой я разместил ее здесь, если честно, но я предполагаю, что причина в том, что вы привязываетесь к адресу, который не относится к вашей собственной машине, что страница рассказывает о. – Mehrdad

ответ

11

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

Обычно на конкретной машине имеется несколько интерфейсов, то есть петля псевдоинтерфейса, где машина может достигать себя, ethernet, WLAN, VPN .... Каждый из этих интерфейсов может иметь несколько назначенных IP-адресов. Например, loopback имеет обычно 127.0.0.1, а IPv6 также :: 1, но вы можете назначить и других. Ethernet или WLAN имеют IP-адреса в локальной сети, т. Е. 172.16.0.34 или что-то еще.

Если вы привязываете сокет для приема данных к определенному адресу, вы можете получать только данные, отправленные на этот конкретный IP-адрес. Например, если вы привязываетесь к 127.0.0.1, вы сможете получать данные из своей собственной системы, но не из какой-либо другой системы в локальной сети, поскольку они не могут отправлять данные в ваш 127.0.0.1: для одного из любых данных 127.0 .0.1 будут отправлены в их собственный 127.0.0.1, а второй ваш 127.0.0.1 - это адрес вашего внутреннего интерфейса обратной петли, который недоступен извне.

Вы также можете привязать сокет к общему адресу, например 0.0.0.0` (Ipv4) и :: (Ipv6). В этом случае он не привязан к определенному IP-адресу, но сможет принимать данные для отправки на любой IP-адрес устройства.

+0

+1 Спасибо за ответ. Это на самом деле вызывает несколько вопросов для меня: (1) Так правильно ли утверждать, что «адрес», который я «связываю», на самом деле указывает интерфейс *, который я связываю? (2) Несмотря на первую часть, что, если у меня один адрес на двух интерфейсах? Будет ли он связываться с обоими одновременно? (3) Действительно ли верно, что привязка к 127.0.0.1 запрещает другим системам отправлять мне пакеты с точки зрения безопасности? Могут ли они вручную отправить пакет, который указывает, что это фиктивный IP-адрес для цели? (4) Является ли сокет привязанным к фиктивному адресу на 100% недоступным? – Mehrdad

+0

@Mehrdad: нет, вы не привязываетесь к интерфейсу, а адресу по интерфейсу. Bindung до 127.0.0.1 не получит данные для 127.1.1.1, даже если это может быть один и тот же интерфейс. (2) вы не можете иметь один и тот же IP-адрес на другом интерфейсе, и если произойдет хаос (т. Е. Неопределенный). (3) да, привязка к 127.0.0.1 ограничивает доступ ко всем системам, которые могут достичь вашего 127.0.0.1 - это должна быть только ваша система. Большинство систем отклонят или отбрасывают пакеты, которые поступают на интерфейс, где целевой адрес не настроен. –

+0

(4) Если никто не может отправить вам данные на фиктивный адрес, то вы не сможете получить там данные. В большинстве случаев сокет становится практически непригодным. –

 Смежные вопросы

  • Нет связанных вопросов^_^