Date: Mon, 3 Jun 2002 12:13:38 +0000 (UTC)
From: Ivan Pascal <pascal@tsu.ru>
Newsgroups: fido7.ru.unix
Subject: Вычисление сетевой маски для подсети
> Чтобы оба адреса оказались в 160-й сети, нужно всего-то правильно указать
> общий броадкаст.
Вот оно что!
А я никак не мог понять - откуда у вас такой энтузиазм по поводу
манипуляциями с маской на одной из сторон. Оказывается "нужно всего-то
правильно указать общий броадкаст".
Вынужден вас огорчить, к реальному механизму IP это утверждение
никакого отношения не имеет. То есть вы исходили из совершенно ложного
положения.
Да и подумайте сами - как ваша удаленная машина догадается, что
на какой-то другой машине в результате неких манипуляций получился
подобный броадкаст? Вы думаете, что она будет перебирать все возможные
маски при отправке ответных пакетов? Или, что она отвечает по
броадкастному адресу?
Увы, ни то ни другое не есть правда.
Посмотрите в доступной литературе - что делает хост в IP сети
на "широковещательном" интерфейсе при отправке пакета.
Вкратце... Все машины (IP) для него делятся на две категории -
- те, которые находятся ни том же езернете
- все остальные, связь с которыми возможна только через некий
gateway (вообще говоря, "соседних" сетей и gateway'ев к ним
может быть много, но для простоты будем считать, что связь со всеми
остальными сетками идет через один gateway).
Возникает небольшая техническая проблема - как хост по IP адресу
получателя может догадаться - является ли он "соседом по езернету"
или лежит за gateway'ем.
Решается она в TCP/IP просто - все соседи должны находиться
в той же IP подсети, что и сам хост. Или другими словами - только
те, чьи адреса находятся в той же подсети, являются соседями,
то есть доступными непосредственно.
Идем дальше. Как наш хост определяет - лежит ли чужой IP в той
же подсети? Для этого он использует собственную маску и собственный
IP. Все IP одной подсети должны иметь одинаковую комбинацию битиков
в "сетевой части адреса" (та, что в маске забита единицами) и могут
иметь любую комбинацию в "хостовой части адреса" (то, что в маске
забито нулями).
Поэтому наш хост должен наложить свою (!) маску на свой IP и на
IP получателя, убрав при этом все, что под ноликами, так как эти
части имеют право (и должны) быть различными. И сравнивать только
те части, которые оказались под единицами. Если они совпадут, то
чужая машина лежит в той же IP подсети и следовательно является
"соседом, к которому можно обратиться непосредственно".
Таким же соседом должен быть и gateway. И поскольку ваша потерянная
машина имеет маску 248 (и именно ее она и будет использовать при
сравнении IP адресов), то и соседями она считает только IP
в диапазоне 168-175. Адрес 7 в этот диапазон не входит и следовательно
gateway'ем быть не может, так как для доступа к нему самому нужен
еще один gateway.
Где вы здесь видите использование broadcast IP? Нет его. Он в этой
процедуре никак не фигурирует. Поэтому еще раз подчеркиваю - при
ответе удаленная машина будет использовать только свою маску и
никакие манупуляции с маской на другом конце ее не интересуют (может
быть и интерсуют, но знать она о них не может).
P.S. Я вообще не могу понять откуда вы могли взять утверждение, что
"если броадкасты у двух машин сопадают, то они лежат в одной сетке".
представьте себе все возможные подсетки (на 8, 16, 32, 64... адресов),
которые заканчиваются на адресе 255 (ну то есть - 248-255, 240-255...
128-255, 0-255). Они все будут иметь один и тот же броадкаст - 255.
Но машины из сетки 240-255 будут считать соседями только машины
из 240-255 (основываясь на своей маске). Машины с адресами 1,2,3...
из сетки 0-255 никак соседями считаться не могут, хотя броадкаст
у них тот же самый.
В общем, совпадения броадкастов можно считать _косвеным_ признаком
принадлежности к одной сети, но с кучей дополнительных условий, типа
"подстети не перекрываются", "маски консистентны" (что вы и нарушаете)
и т.п.
Или другими словами - совпадение масок является первичным признаком
и только оно. А совпадение броадкастов - только в том случае, если
броадкаст однозначно соответствует маске (и первому адресу в подсети).
Как только оказывается, что две разные по маске подсетки ведут к одному
и тому же броадкасту, оринтироваться на броадкаст уже нельзя.
P.P.S. Вообще-то, теоретически IP адрес gateway'я не обязан лежать
в той же подсетке, что и IP хоста. Хотя бы потому, что для хоста
он как таковой не нужен. А нужен ему только MAC адрес gateway'я.
Но это только в теории, а на практике я не помню, чтобы в
каких-нибудь Юниксах (и уж тем более в FreeBSD) можно было отступать
от этого правила.
-----
Ivan Pascal | pascal@tsu.ru
Administrator of | Tomsk State University.
university network | Tomsk. Russia.