вычисление маски подсети? - PullRequest
1 голос
/ 21 ноября 2010

как я могу вычислить маску подсети, имеющую IP-адрес 128.2.19.4 и принадлежащую подсети 128.2.19.0/25. Пожалуйста, дайте мне подробную процедуру. Я хочу научиться вычислять.

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

Вот алгоритм с вашим примером:

Маска подсети является просто представлением части "/ 25" вашего адреса подсети.

В IPv4 адреса имеют длину 32 бита, первые 25 бит из которых:

1111 1111 1111 1111 1111 1111 1000 0000  

адреса даны в октетах - 8 бит каждый:

octet 1  .    octet 2  .    octet 3  .    octet 4
0000 0000     0000 0000     0000 0000     0000 0000 
1111 1111     1111 1111     1111 1111     1000 0000

Итак, десятичное представление каждого октета:

255      .    255      .    255      .    128       

Это означает, что ваша маска подсети будет:

255.255.255.128

1 голос
/ 21 ноября 2010

Маска подсети является битовой маской.25 означает, что 25 из 32 битов (начиная сверху) используются для сети, а остальные для хостов.

In bytes:    128.2.19.0
In binary    10000000 00000010 00010011 00000000
The bitmask: 11111111 11111111 11111111 10000000
Ergo:        ------- network ------------  host

Последние 7 бит используются для хостов.Битовая маска в байтах: 255.255.255.128.

0 голосов
/ 18 февраля 2019

Вот как вы можете сделать это в C:

#include <stdio.h>
#include <arpa/inet.h>

uint32_t cidr_to_netmask(uint8_t cidr)
{
  uint8_t unset_bits = 32 - cidr;
  return ntohl(0xffffffff << unset_bits);
}

int main(void)
{
    uint8_t cidr = 25;

    uint32_t _netmask = cidr_to_netmask(cidr);
    struct in_addr _netmask_addr = { _netmask };

    char netmask[16];
    if (inet_ntop(AF_INET, (struct in_addr *)&_netmask_addr, (char *)&netmask, sizeof(netmask)) == NULL) { 
      fprintf(stderr, "error.\n"); 
      return 1; 
    }

    printf("%d = %s\n", cidr, netmask);

    return 0;
}

Вывод:

25 = 255.255.255.128
...