Определение части идентификатора сети и хоста IP-адреса

Мне нужно разработать алгоритм расчета сетевой и хостовой части IP-адреса.

  1. Является ли идентификатор хоста общедоступной частью? Является ли идентификатор сети частной частью для определения местоположения компьютера в локальной сети?

  2. Если значение маски подсети меньше 255, соответствующий октет в IP-адресе необходимо разбить на двоичный код, чтобы определить, какая часть числа является идентификатором хоста, а какая — идентификатором сети. Всегда ли результирующее двоичное число делится на два?

    (например, IP-адрес 192.168.33.22 с маской подсети 255.255.224.0 означает, что октет, содержащий 33, разбит следующим образом: 0010|0001 указывает, что 0010 — это часть идентификатора сети, а 0001 — это часть идентификатора хоста?)

Спасибо заранее за любую помощь.


person fwc    schedule 28.12.2011    source источник


Ответы (4)


Вы слишком все усложняете.

Адреса 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);

  • если они различаются, источник должен отправить дейтаграмму на маршрутизатор, который находится сам по себе. сеть (используя описанный выше процесс для доступа к этому маршрутизатору); маршрутизатор увидит, что фрейм адресован ему, а дейтаграмма — нет, и должен переслать дейтаграмму (инкапсулированную в другой фрейм) к месту назначения. Многие хосты знают только об одном маршрутизаторе, их "шлюзе по умолчанию", хотя возможны и другие конфигурации.

Те биты адреса, которые не идентифицируют номер сети источника, явно обозначенные 0s в его сетевой маске, можно считать формирующими его номер хоста, хотя на самом деле не имеет смысла и не полезно извлекать их таким же образом, как это было сделано выше: даже при общении с хостом в собственной сети для идентификации используется его полный адрес, а не только номер хоста.

Тем не менее, как чисто академическое упражнение, конечно, можно выполнить побитовое И с дополнением маски:

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

Итак, чтобы ответить на ваши вопросы:

  1. #P11#
    #P12#
  2. #P13#
    #P14#
person eggyal    schedule 20.05.2014

  • Является ли идентификатор хоста общедоступной частью? Является ли идентификатор сети частной частью для определения местоположения компьютера в локальной сети?

Хостовая и сетевая части IP-адреса не имеют ничего общего с публичной и частной.

  • Если значение маски подсети меньше 255, соответствующий октет в IP-адресе необходимо разбить на двоичный код, чтобы определить, какая часть числа является идентификатором хоста, а какая — идентификатором сети. Всегда ли результирующее двоичное число делится на два? ... маска подсети 255.255.224.0 означает, что октет, содержащий 33, разбит следующим образом: 0010|0001...

Ваш пример неверен. В частности, вы предполагаете, что 224 имеет четыре последовательных двоичных бита, когда вы выплевываете 33-й октет как 0010|0001 (где | — это разделение между сетью и хостом)...

Октет в маске подсети, содержащий 224, содержит три последовательных двоичных единицы: 11100000. Следовательно, «сетевая часть» всего IP-адреса: 192.168.32.0. «Хост-часть» IP-адреса — 0.0.1.22. Используя ваши обозначения, третий октет ip 192.168.33.22 (маска 255.255.224.0): 001|00001.

Чтобы получить сетевую часть IP-адреса, вы должны выполнить бинарную операцию AND для IP-адреса и его сетевой маски. Часть хоста представляет собой двоичный файл AND инвертированной сетевой маски (биты перевернуты между 0 и 1).

РЕДАКТИРОВАТЬ

Давайте сделаем еще один пример, чтобы ответить на ваш комментарий:

IP-адрес 192.168.255.22, сетевая маска 255.255.224.0

Сетевая часть этого адреса — 192.168.224.0, а хостовая часть адреса — 0.0.31.22. Я намеренно выбрал числа в примере, чтобы сделать математику максимально очевидной. Пожалуйста, преобразуйте 224 и 31 в двоичные файлы, это должно прояснить ситуацию. Если нет, см. статью Википедии о подсетях.

person This    schedule 28.12.2011
comment
Привет, Майк, я не уверен, что следую последней части о сети и части идентификатора хоста. Вы говорите, что, поскольку двоичная версия 224 равна 11100000, сетевая часть будет частью, соответствующей трем единицам? а часть идентификатора хоста - это раздел, связанный с 0? Еще раз спасибо за ваше объяснение. - person fwc; 29.12.2011
comment
да, это ответ на мой вопрос. кажется, алгоритм использует 1-ю часть двоичного файла из маски подсети. это будет означать, что тот же IP-адрес из моего примера с третьим октетом, что и 31, будет иметь идентификатор хоста 0.0.31.22. Поправьте меня, если я ошибаюсь здесь. - person fwc; 31.12.2011
comment
@fwc, ты не прав. Прочитайте, что я сказал в своем ответе о 192.168.33.22 и маске 255.255.224.0 - person This; 31.12.2011
comment
@MikePennington- я бы рассчитал это следующим образом: маска подсети для третьего октета по-прежнему равна 11100000, поэтому двоичный код для 33 равен 00011111; поэтому он будет разделен следующим образом 000 | 11111, где линия является разделителем между сетью и идентификатором хоста, или я все еще что-то упускаю? - person fwc; 31.12.2011
comment
@fwc, пожалуйста, проверьте свою двоичную математику в интерпретаторе Python. >>> int('00011111', 2). Получается 31, а не 33. - person This; 31.12.2011

Host address portion and network address portion can be easily identified.
Use this trick.
 Class A: N.H.H.H
 Class B: N.N.H.H
 Class C: N.N.N.H
(N= network  H=Host)
Class A network range: 1-127
Class B network range: 128-191
Class C network range: 192-223

Ссылка: https://www.youtube.com/watch?v=ddodZeXUS0w.

person Aathira Sajan    schedule 18.04.2017

Вы можете использовать следующий скрипт:

#!/bin/sh
GetNumericIP()
{
    ipbin=0
    for part in `echo $1 | awk -F'.' '{print $1 " " $2 " " $3 " " $4}'`
    do
        ipbin=`expr $ipbin \* 256`
        ipbin=`expr $ipbin + $part`
    done
    echo "$ipbin"
}
GetSrtingIP()
{
    ipbin=$1
    count=0
    while [ $count -le 3 ]
    do
        rem=`expr $ipbin % 256`
        ipbin=`expr $ipbin / 256`
        if [ -z "$ipstr" ]
        then
            ipstr=$rem
        else
            ipstr=`echo ${rem}.${ipstr}`
        fi
        count=`expr $count + 1`
    done
    echo $ipstr
}
mask=$2
maskbin=`GetNumericIP $mask`
ip=$1
ipbin=`GetNumericIP $ip`
networkid=$(( $maskbin & $ipbin ))
networkid=`GetSrtingIP $networkid`
echo "networkid = $networkid"
person John Smith    schedule 30.08.2013