Вы слишком все усложняете.
Адреса IPv4 (и маски подсети) просто отображаются в десятичном формате с точками просто как средство сделать их более удобочитаемыми для людей. Внутри компьютера это просто 4 байта непрерывной памяти (часто хранящиеся, например, в long int
):
Stored in computer: 11000000 10101000 00100001 00010110
Displayed for human: 192. 168. 33. 22
Stored in computer: 11111111 11111111 11100000 00000000
Displayed for human: 255. 255. 224. 0
1
в маске обозначают биты, которые идентифицируют номер сети, поэтому нужно просто использовать побитовую операцию AND для извлечения номера сети:
address 11000000 10101000 00100001 00010110 192.168.33.22
mask 11111111 11111111 11100000 00000000 255.255.224.0
(AND) ----------------------------------- -------------
network 11000000 10101000 00100000 00000000 192.168.32.0
С момента введения CIDR (до этого адрес класс указывает границу сети/узла), узлы обычно знают только маску своей собственной сети и поэтому неспособны разделить произвольные адреса (например, адрес датаграммы' адресата) в сеть и номера хостов.
Так в чем смысл? Что ж, хост-источник по-прежнему может принимать побитовое И от адреса получателя и своей (источника) собственной сетевой маски. Хотя результат этой операции не обязательно даст значимый номер сети, он будет соответствовать номеру сети источника тогда и только тогда, когда они находятся в одной сети:
если они совпадают, пункт назначения должен быть доступен на слое ссылок (например, путем поиска его MAC-адрес, возможно, через широковещательную рассылку ARP, а затем инкапсулировать дейтаграмму в frame, который адресован этому MAC);
если они различаются, источник должен отправить дейтаграмму на маршрутизатор, который находится сам по себе. сеть (используя описанный выше процесс для доступа к этому маршрутизатору); маршрутизатор увидит, что фрейм адресован ему, а дейтаграмма — нет, и должен переслать дейтаграмму (инкапсулированную в другой фрейм) к месту назначения. Многие хосты знают только об одном маршрутизаторе, их "шлюзе по умолчанию", хотя возможны и другие конфигурации.
Те биты адреса, которые не идентифицируют номер сети источника, явно обозначенные 0
s в его сетевой маске, можно считать формирующими его номер хоста, хотя на самом деле не имеет смысла и не полезно извлекать их таким же образом, как это было сделано выше: даже при общении с хостом в собственной сети для идентификации используется его полный адрес, а не только номер хоста.
Тем не менее, как чисто академическое упражнение, конечно, можно выполнить побитовое И с дополнением а> маски:
address 11000000 10101000 00100001 00010110 192.168.33.22
~mask 00000000 00000000 00011111 11111111 0.0.31.255
(AND) ----------------------------------- -------------
host 00000000 00000000 00000001 00010110 0.0.1.22
Итак, чтобы ответить на ваши вопросы:
#P11#
#P12#
#P13#
#P14#
person
eggyal
schedule
20.05.2014