Ты слишком усложняешь вещи.
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
в маске указывают биты, которые идентифицируют номер сети, поэтому просто нужно использовать операцию поразрядно И для извлечения номера сети:
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 запрос, а затем инкапсуляция дейтаграммы в кадр , который адресован этому 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
Итак, чтобы ответить на ваши вопросы:
Является ли идентификатор хоста публичной частью? Является ли идентификатор сети частной частью для определения местоположения компьютера в локальной сети?
Весь адрес "публичный"; нет "частных" частей. Протоколы поиска, такие как ARP (который использует полный адрес), используются для поиска компьютеров в локальной сети.
Если маска подсети имеет значение меньше 255, соответствующий октет в IP-адресе должен быть разбит на двоичный код, чтобы определить, какая часть номера является идентификатором хоста, а какая - идентификатором сети. Всегда ли двоичное число результата делится на две части?
Ничто не "разбито на две части". Это выглядит только потому, что десятично-десятичная запись была предназначена для того, чтобы сделать адреса IPv4 более читабельными для людей (хотя это решение было принято до изобретения CIDR, когда номера сети всегда были выровнены по границам байтов и, таким образом, никогда не вызывали явного «разделения» "десятичного числа).