Назад | Перейти на главную страницу

Почему нельзя использовать все нули в части IP-адреса хоста для хоста?

Я знаю, что если у меня есть сеть 83.23.159.0/24 то у меня есть 254 используемых IP-адреса хоста, потому что:

83.23.159.0      (in binary: host portion all zeros) is the subnet address
83.23.159.1-254  are host addresses
83.23.159.255    (in binary: host portion all ones) is the broadcast address

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

Подводя итог, мои вопросы:

  1. Установлен ли когда-либо адресат IP-пакета на IP-адрес подсети?
  2. Если да, то в каких случаях и почему?
  3. Если нет, то почему бы не освободить этот адрес для использования любым хостом?

Адрес с нулевой частью хоста относится к самой сети, а не к какому-либо конкретному хосту.

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

Итак, я должен не согласиться с некоторыми другими ответами: нет, ноль - это не идеальный адрес хоста. Если вам нужно более 254 адресов, вам необходимо создать подсеть большего размера.

Посмотри, мой роутер Linksys, чей адрес .1 отвечает на пинги .0. (Сетевая маска 255.255.255.0, поэтому последний октет соответствует номеру хоста.)

webserver:~# ping  192.168.1.0
Do you want to ping broadcast? Then -b
webserver:~# ping -b 192.168.1.0
WARNING: pinging broadcast address
PING 192.168.1.0 (192.168.1.0) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.46 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.812 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.819 ms

Если бы я назначил .0 адреса к какому-то хосту, я не смог бы пинговать его, если бы маршрутизатор также не подключился к его ответам. И, как видите, некоторые инструменты, такие как версия этого маршрутизатора ping обращаться 0 как трансляция.

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

Дело в точке.

Я работал в компании, которая разработала сетевой узел, встроенный в шасси с 14 слотами, запускающий многочисленные независимые образы ОС на нескольких типах карт, все обменивающиеся данными через объединительную плату. Была сетевая установка через объединительную плату с условием, что 127.X.0.Y - это внутренний IP-адрес узла Y в слоте X, все пронумерованы от 1.

Мы в основном разбили адрес обратной петли на подсети для наших собственных целей. Чтобы заставить его работать, нам пришлось исправить ядро ​​Linux кое-где и IIRC, немного места для пользователя.

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

Установлен ли когда-либо адресат IP-пакета на IP-адрес подсети?

Да. Это действующий IP-адрес, поэтому его можно использовать.

Если да, то в каких случаях и почему?

Это просто один из 255 используемых IP-адресов в / 24

Если нет, то почему бы не освободить этот адрес для использования любым хостом?

Если у вас есть древний аппаратного обеспечения, вам необходимо проверить, использует ли оно первый или последний адрес в качестве сетевого адреса. (.0 или .255 для сетей с маской FF.FF.FF.00)

Это делает хорошей привычкой пропускать этот IP-адрес. А давно усвоенные привычки трудно игнорировать.

И люди, которые не знают фона, не используют его, «потому что другие тоже не используют его, поэтому его использование должно быть неправильным» или потому, что они не осознают, что «0» может быть первый число.

[Edit] Grezzo только что протестировал его на Windows XP, где графический интерфейс Windows «услужливо» предотвратил эту настройку. Windows 7 ведет себя так же. Затем я попробовал его на хосте, отличном от Windows, где он просто работает. Если вы используете Windows, вам, возможно, придется вручную настроить сеть через IPconfig, чтобы установить все нули.

[Изменить 2]

Чем дольше я работаю с этим, тем больше запутываюсь.

Rfc4632 - Бесклассовая междоменная маршрутизация похоже, не запрещает это, но и не разрешает явно.

Это сообщение ServerFault упоминает: "По историческим причинам многие операционные системы обрабатывают первый адрес как широковещательную рассылку. Например, проверка связи xxx0 из OS X, Linux и Solaris в моей локальной (/ 24) сети приводит к ответам. Windows не позволяет выполнить проверку связи по первому адресу с помощью по умолчанию, но вы могли бы включить его, используя метод SetIPUseZeroBroadcast WMI. Интересно, сможете ли вы обойтись без использования .0 в качестве адреса хоста во всей сети Windows »..

Это тот же вопрос, но не ответ.

Сетевой адрес также используется в таблицах маршрутизации. Но я не понимаю, почему это не сработает из-за этого. Такое же обозначение в таблицах маршрутизации будет направлено в нужную сеть. Попав в нужную сеть, он попадет на ПК с IP 0.

(Все это для 192.168.1 / 24.
Если вы использовали 192.168.0 / 23, тогда 192.168.1.0 было бы допустимым и безопасным значением в середине диапазона)

[Изменить 3]

Еще одна ссылка на тот же вопрос. Это кажется довольно популярным при обмене стеками:

https://superuser.com/questions/379451/why-can-a-network-address-not-be-a-valid-host-address

И одна мысль:

Destination_IP вероятно Ид.) с сетевой мачтой (быстрая аппаратная операция) перед сравнением с записями в таблицах маршрутизации. Но:

(Полуслучайный IP-адрес) 192.168.0.42 И 255.255.255.0 даст 192.168.0.0
Но 192.168.0.0 И 255.255.255.0 также дадут 192.168.0.0


[Изменить 4 - спустя долгое время после того, как этот ответ был написан - мне, возможно, придется переписать весь пост из-за эта новая информация ]

RFC923 на странице 3 говорится, что:

  In certain contexts, it is useful to have fixed addresses with
  functional significance rather than as identifiers of specific
  hosts.  When such usage is called for, the address zero is to be
  interpreted as meaning "this", as in "this network".  The address
  of all ones are to be interpreted as meaning "all", as in "all
  hosts".  For example, the address 128.9.255.255 could be
  interpreted as meaning all hosts on the network 128.9.  Or, the
  address 0.0.0.37 could be interpreted as meaning host 37 on this
  network.

Цитирование @ylearn на наш сайт сетевой инженерии

Я считаю, что первая документация об этом исходит от RFC950 какие ссылки RFC943 (который устарел RFC923 выше, но использует тот же язык для специальных адресов):

     It is useful to preserve and extend the interpretation of these
     special addresses in subnetted networks.  This means the values
     of all zeros and all ones in the subnet field should not be
     assigned to actual (physical) subnets.

на самом деле это зависит от сетевой маски, например, для сети 83.23.159.0/23, 83.23.159.0 - идеально подходящий IP-адрес

Похоже, здесь есть небольшая путаница с базовыми сетями.

«Древнее оборудование», упомянутое в одном из ответов, не будет использовать нулевую подсеть IP - использование IP-адреса x.x.x.0 с сетью, настроенной для / 24 CIDR или маски подсети 255.255.255.0, является совершенно другой проблемой.

IP-подсеть нулевая

  • Старое оборудование не будет использовать нулевую подсеть IP - это означает, что они не будут использовать первую подсеть в сетевой системе с несколькими подсетями. Таким образом, в сети / 23 или 255.255.254.0 подсеть X.X.X.0 и все ее адреса использоваться не будут. Современные маршрутизаторы не имеют этого ограничения, но могут быть настроены для использования этой старой модели I.E. при желании не использовать нулевую подсеть.

Используемые IP-адреса хоста в подсети

  • Базовая работа в сети:
    • С / 24, т.е. маска подсети 255.255.255.0
    • x.x.x.0 зарезервирован как сетевой адрес. Маршрутизаторы и протоколы маршрутизации (EIGRP, RIP2 и т. Д.) Используют сетевой адрес для определения сетевых сегментов для перемещения пакетов внутри и через границы сети.
    • x.x.x.255 зарезервирован для широковещательного адреса
    • Обычно на маршрутизаторах используются адреса .1 или .254, так что остается 253 используемых IP-номера.

И сетевой адрес, и широковещательный адрес зарезервированы и не могут (по текущим и предыдущим сетевым стандартам) быть назначены устройству. Использование x.x.x.0 в качестве адреса хоста в системе / 24 неверно. Даже если Linux позволяет вам использовать это, не означает, что это правильно, это просто означает, что Linux думает, что вы знаете, что делаете.

Если ваша система позволяет вам назначать x.x.x.0 в качестве IP4-адреса хосту, и он, похоже, работает - скорее всего, этот конкретный хост получает ВЕСЬ трафик, нацеленный на ЛЮБОЕ устройство в этой сети, поэтому его сеть, вероятно, не работает оптимально.

RFC 1122 («Требования к Интернет-хостам - Уровни связи») запрещает:

IP-адресам не разрешается иметь значение 0 или -1 для любого из полей <Host-number>, <Network-number> или <Subnet- number>.

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

В вашем примере у вас есть подсеть 255.255.255.0. Любое устройство, которое знает протокол TCP / IP, будет использовать сетевую маску в сочетании с IP-адресом, чтобы вычислить, предназначен ли пакет для локальной сети (путем выполнения логической операции И) или что он должен быть отправлен через шлюз / маршрутизатор.

Итак, я предполагаю, что причина того, что IP не может использоваться, заключается в том, что он уже используется для «определения» границ сети вместе с сетевой маской по дизайну.

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

В RFC919, он указывает на общее принятие сетевого адреса:

However, as a notational convention, we refer to
networks (as opposed to hosts) by using addresses with zero fields.
For example, 36.0.0.0 means "network number 36"

Это обеспечивает соглашение, которое должно прояснить наше понимание, если кто-то упомянет «10.1.2.0» как сеть, а не как хост в сети.

Отсюда использование «0» в IP-адресах было определено в RFC923 и переносятся в следующих RFC:

Special Addresses:

  In certain contexts, it is useful to have fixed addresses with
  functional significance rather than as identifiers of specific
  hosts.  When such usage is called for, the address zero is to be
  interpreted as meaning "this", as in "this network".  The address
  of all ones are to be interpreted as meaning "all", as in "all
  hosts".  For example, the address 128.9.255.255 could be
  interpreted as meaning all hosts on the network 128.9.  Or, the
  address 0.0.0.37 could be interpreted as meaning host 37 on this
  network.

Этот пример обеспечивает конкретный хост в текущей сети (0.0.0.37) с использованием 0 в сетевых частях адреса, но на самом деле не проясняет противоположный случай (0 в части адреса хоста). Однако, поскольку он определил «0» как «это».

В RFC1060 адрес «0.0.0.0» был четко задокументирован как «этот хост в этой сети»:

     (a)   {0, 0}

        This host on this network.  Can only be used as a source
        address (see note later).

Поскольку все нули в части адреса хоста означают «этот хост», из этого логически следует, что он не может использоваться в качестве адреса хоста.

Возвращаясь к непосредственному ответу на ваши вопросы:

  1. Установлен ли когда-либо адресат IP-пакета на IP-адрес подсети?
  2. Если да, то в каких случаях и почему?
  3. Если нет, то почему бы не освободить этот адрес для использования любым хостом?

Согласно тому, что я нашел в RFC, это не должно использоваться. Я признаю, что это не так четко указано, как хотелось бы, но это общее во многих стандартах. Когда стандарты становятся немного менее жесткими, отрасль, кажется, «соглашается» на общепринятую интерпретацию.

Кроме того, на основе содержимого RFC может быть написано программное обеспечение, предполагающее, что этот адрес используется для адресации сети, а не конкретного хоста. Или даже более буквально как своего рода «петля» (т.е. этот хост в указанной сети).

Так почему же некоторые операционные системы явно разрешают его использование? Я бы предположил, что многие вещи сводятся к времени / ресурсам разработчика, или никто действительно не подумал добавить проверку достоверности. Логика должна быть немного более сложной, чем «если она заканчивается на 0», поскольку большая подсеть (a / 23 или больше) будет содержать действительный IP-адрес .255 и .0 (т.е. 10.1.2.0/23 содержит оба действительных IP-адреса). адреса 10.1.2.255 и 10.1.3.0). Хотя некоторые организации также избегают использования этих действительных адресов в более крупных подсетях, чтобы избежать каких-либо странных проблем с программным обеспечением, которое неправильно поддерживает современное разбиение на подсети.

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