Так... Я учился на CCNA и тому подобное и работал с IP-сетями как минимум последние 8 лет или около того. Я всегда видел и говорил, что сетевой адрес для подсети не является действительным адресом хоста. Сначала я скажу, что знаю, что это правда. Мой вопрос больше ... есть ли техническая причина, по которой он не может быть использован, или он был просто произвольно согласован при разработке спецификации? Я понимаю, почему широковещательный адрес не может быть использован (потому что он фактически используется). Дело в том, что когда я вижу используемый сетевой адрес, он обычно используется только в маршрутизации, которая использует адреса NETWORK. В этом случае (сетевые адреса используются только тогда, когда вы ожидаете сетевой адрес), есть ли какая-то техническая причина, по которой они не могли иметь сетевой адрес в качестве действительного действительного адреса хоста?
7 ответов
Насколько я понимаю, "сетевой адрес" как специальный адрес является артефактом из классных IP-сетей прошлого. Сегодня мы используем бесклассовую междоменную маршрутизацию (CIDR) в Интернете, которая не имеет понятия сетевого адреса (если вы посмотрите на ссылку RFC 4632, приведенную выше, вы увидите, что в ней перечислено 256 возможных IP-адресов на унаследованную версию). Блок "C", например, нет зарезервированных адресов ни для сети, ни для широковещательного адреса (хотя широковещательные рассылки определены как важные в других RFC).
При этом вам все равно не следует назначать сетевой адрес какому-либо конкретному хосту в сети: сетевой адрес необходим для маршрутизации. Эта концепция широко используется в RFC (RFC 1812). Достаточно взглянуть на таблицы маршрутизации (команда route
), и вы увидите, как ваш локальный сетевой адрес используется для отделения трафика локальной сети от того, что должно проходить через маршрутизатор. Что если этот локальный сетевой адрес был назначен какому-либо узлу?
Еще хуже: лучше не назначать IP-адреса, оканчивающиеся на ноль, даже если этот адрес не является сетевым адресом. Например, если ваша сеть 10.10.0.0/255.255.0.0, IP-адрес 10.10.5.0 не является вашим сетевым адресом, но вам лучше не назначать такой IP-адрес, даже если он полностью действителен даже в классных IP-сетях. Некоторые устаревшие программные /IP-стеки могут иметь проблемы с этим.
ОБНОВЛЕНИЕ: гоблинлордом
Согласно RFC 1812 (раздел 5.3.5.2) то, что мы называем сетевым адресом, первоначально использовалось для «направленных широковещательных рассылок », которые отправляли широковещательный пакет в нужную сеть. Эта функция устарела из-за SMURF-атак. Функция была официально изменена в RFC 2644. Впоследствии, дальнейшие реализации должны молча отбрасывать пакеты с адресом источника, как описано (адрес сети). Хотя это то, что должно произойти, мне любопытно, сколько реализаций на самом деле делают это.
Это дополнительно добавляется в RFC 3021, когда была рассмотрена подсеть /31.
Таким образом, практический ответ: это действительно зависит. Это зависит от:
- Точный адрес
- Версия и версия вашей операционной системы
- ...И это ваш маршрутизатор, и любой другой восходящий маршрутизатор
- ...И интеллект и сложность всех сетевых администраторов этих маршрутизаторов ...
Я не очень углубился в это, но кажется, что большинство интернет-провайдеров не мешают вам назначать и использовать ваш сетевой адрес, и я не столкнулся с какими-либо проблемами при доступе к каким-либо сайтам при тестировании этого; кажется, что в конечном итоге все зависит от капризов сетевых администраторов.
Я уверен, что есть аналитики и хакеры по безопасности, которые имеют безумно подробную статистику о том, сколько именно вариантов реализации стека TCP-IP существует и что делать, а что не разрешать и не разрешать, и как именно и где они пропускают свой след. ,
На самом деле, я просматриваю и публикую это с моего сетевого адреса.
Не называйте меня плохим интернетом, если у вас нет лучшего решения починить этот карточный домик: реальность такова, что, если это возможно, это случится. Реальность такова, что никто по-настоящему умный не уселся и все это продумал во всех возможных итерациях, чтобы придумать абсолютно надежный дизайн. Результат? Стандарты, в которых многие вещи не суммируются и / или теряются в переводе.
Добро пожаловать в реальный мир. Не позволяйте этому отговорить вас от погони за неуловимыми оптимальными идеалами ... Только не ожидайте поддержки от "официальных" каналов или форумов, если вы не хотите испачкать руки и посвятить этому свое время и жизнь.
Итак, я думаю, что другие авторы пытались сказать: если вы хотите сделать эту официальную политику и использовать ее в производстве, вы сами по себе. (Но разве ты не так ли?) Возможно, нам повезет, и компьютерный интеллект разработает для нас IPv8, который обратно совместим с IPv4 и IPv6 и всеми их испорченными реализациями.
Я новичок в сети, но я тоже дам свои 2 цента.
Если у меня есть подсеть /28 из xxx0 - xxx15 В соответствии с предопределенными правилами у нас будет 14 используемых хостов и 2 оставшихся. остальные для сети и широковещания.
Давайте вместо того, чтобы следовать приведенному выше правилу, фактически использовать все 16 хостов. Тогда в этом случае все будет хорошо, никаких проблем. Но если бы коммуникация была необходима вне сети, это было бы невозможно из-за нехватки ресурсов для отправки или получения информации.
Я не очень хорош в объяснении, но говоря по-другому.
Если бы я жил в доме на улице, а на улице содержалось 14 домов. Въезд и выезд для доступа к главной дороге.
Мой почтовый адрес будет варьироваться от 1-14 Personal Street, Off Network Road.
Это не будет проблемой для почтальона. Теперь давайте предположим, что разработчики стали жадными и добавили еще 2 дома и избавились от переулков.
Тогда мой новый почтовый адрес будет варьироваться от 1-16 Personal Street
В этом случае почтальон будет в беде.
Это предположение, дайте мне знать, если я говорю на быка.
В поисках ответа на этот вопрос я наткнулся на эту статью от Cisco. Следующая цитата из этой статьи хорошо подытоживает, я думаю.
[...] рассмотрим IP-адрес 172.16.1.10. Если вы подсчитаете адрес подсети, соответствующий этому IP-адресу, вы получите ответ 172.16.0.0 (ноль подсети). Обратите внимание, что этот адрес подсети идентичен сетевому адресу 172.16.0.0, который изначально был подсетью, поэтому всякий раз, когда вы выполняете подсеть, вы получаете сеть и подсеть (нулевая подсеть) с неразличимыми адресами. Раньше это было источником большой путаницы.
Избежать путаницы - это достаточно веская причина для меня.
Сетевой адрес не считается адресом хоста, но это просто число. В областях с ограниченным адресом, таких как двухточечные сети, часто используется маска /30, но все еще используются адреса хоста. Менее практичным, но достигающим того же принципа, является использование маски /31 и использование одного конца в качестве сетевого адреса, а другого - в качестве широковещательной передачи.
Ex.
Router(config)#int gi0/0
Router(config-if)#ip add 10.0.0.0 255.255.255.254
Router(config-if)#no shut
Router2(config)#int gi0/0
Router2(config-if)#ip add 10.0.0.1 255.255.255.254
Router2(config-if)#no shut
.0 .1
[Router]-----------[Router2]
network broadcast
Сетевой адрес позволяет создавать таблицы маршрутов с целевым столбцом фиксированного размера (4 байта IPv4) и двоичными операциями фиксированного размера, так что маршрутизация хоста и сетевая маршрутизация фактически являются одним и тем же.
Представьте себе таблицу маршрутизации, подобную этой: (этот ПК имеет параллельное соединение с другим ПК и сетевой картой)
Dest Mask Dev
192.168.0.123 /32 plip0 # This is a single host
192.168.0.0 /24 eth0 # This is a network
AND между IP-адресом и маской сети дает именно то, что вам нужно, 4-байтовое число, которое можно сравнить с каждой строкой без дальнейших вычислений.
Таким образом, нулевой номер хоста является особым в том смысле, что после операции AND его адрес, естественно, представляет всю сеть.
Если вы решили использовать номер сети в качестве номера хоста, это приведет к появлению такой таблицы:
Dest Mask Dev
192.168.0.0 /32 eth0 # This is the host (it's a redundant line)
192.168.0.0 /24 eth0 # This is the network
Это кажется законным, поэтому я предполагаю, что понятие сетевого адреса используется для маршрутизации, и поэтому было принято решение произвольно пометить его как специальный адрес и запретить его использование в качестве адреса хоста.
Ну ... на самом деле все не так просто. Я решил попробовать (!!!):
# route add -net 192.168.0.0/32 eth0
# ping 192.168.0.0
Do you want to ping broadcast? Then -b
# telnet 192.168.0.0
Trying 192.168.0.0...
telnet: connect to address 192.168.0.0: Network is unreachable
В настоящее время сетевые программы не позволяют мне использовать номер сети в качестве обычного адреса.
RFC 1122 («Требования к интернет-хостам - коммуникационные уровни») запрещает это:
IP-адресам не разрешается иметь значение 0 или -1 для любого из полей <Host-number>, <Network-number> или <Subnet-number>