Определите часть IP-адреса сети и идентификатора узла - PullRequest
4 голосов
/ 28 декабря 2011

Мне нужно выработать алгоритм, определяющий, как вы рассчитываете сетевую и хостовую часть IP-адреса.

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

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

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

Заранее благодарю за любую помощь.

Ответы [ 4 ]

9 голосов
/ 20 мая 2014

Ты слишком усложняешь вещи.

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

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

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

    Весь адрес "публичный"; нет "частных" частей. Протоколы поиска, такие как ARP (который использует полный адрес), используются для поиска компьютеров в локальной сети.

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

    Ничто не "разбито на две части". Это выглядит только потому, что десятично-десятичная запись была предназначена для того, чтобы сделать адреса IPv4 более читабельными для людей (хотя это решение было принято до изобретения CIDR, когда номера сети всегда были выровнены по границам байтов и, таким образом, никогда не вызывали явного «разделения» "десятичного числа).

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

Узлы хоста и сети IP-адреса не имеют ничего общего с общедоступным и частным.

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

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

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

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

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

Давайте создадим еще один пример для ответа на ваш комментарий:

IP-адрес 192.168.255.22, NetMask 255.255.224.0

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

1 голос
/ 18 апреля 2017
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

0 голосов
/ 30 августа 2013

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

#!/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"
...