10 класс
vkrysanov320@gmail.com
version 1.0 not-fixed, 31-03-2025
Каждый компьютер, подключенный к сети Интернет, должен иметь собственный адрес, который называют IP-адресом (IP — Internet Protocol).
IP-адрес компьютера — это 32-битное число; для удобства его обычно записывают в виде четырёх чисел, разделенных точками; каждое из этих чисел находится в интервале 0…255, например: 192.168.85.210.
IP-адрес:
адрес сети
адрес узла
Маска:
1..............................1
0..............................0
32 бита
.
.
.
0...255
8 бит
8 бит
8 бит
8 бит
Сначала единицы, затем нули! В маске не могут чередоваться нули и единцы, есть чёткая граница между ними.
Деление адреса определяется маской!
Если перебрать все комбинации в этой части IP-адреса, мы получим все IP-адреса в этой сети.
адрес сети
0..............................0
* если два узла относятся к одной сети, то адрес сети у них одинаковый
1. Определить номер компьютера в сети, если маска подсети 255.255.255.192, а IP-адрес компьютера в сети 10.18.134.220.
IP-адрес:
Маска:
адрес узла
Решение:
Ответ: 28.
2. Для некоторой подсети используется маска 255.255.254.0. Сколько различных адресов компьютеров теоретически допускает эта маска, если два адреса (адрес сети и широковещательный) не используют?
Маска:
часть, отвечающая за адрес узла
Решение:
Но два адреса не используется, тогда
Ответ: 510.
3. Для узла с IP-адресом 220.128.112.142 адрес сети равен 220.128.96.0. Чему равен третий слева байт маски? Ответ запишите в виде десятичного числа.
IP-адрес:
Маска:
Решение:
Адрес сети:
Восстанавливаем маску
Третий байт слева:
Ответ: 224.
4. Два узла, находящиеся в одной сети, имеют IP-адреса 115.127.30.120 и 115.127.151.120. Укажите наибольшее возможное значение третьего слева байта маски сети. Ответ запишите в виде десятичного числа.
IP-адрес-1:
Решение:
Ответ: 0.
IP-адрес-2:
Маска:
Максимальное совпадение слева
Третий байт слева:
единиц слева больше быть не может
4.2. Два узла, находящиеся в одной сети, имеют IP-адреса 152.217.69.70 и 152.217.125.80. Укажите наибольшее возможное значение третьего слева байта маски сети. Ответ запишите в виде десятичного числа.
IP-адрес-1:
Решение:
Ответ: 192.
IP-адрес-2:
Маска:
Максимальное совпадение слева
Третий байт слева:
единиц слева больше быть не может
5. Для узла с IP-адресом 111.81.208.27 адрес сети равен 111.81.192.0. Чему равно наименьшее возможное значение третьего слева байта маски? Ответ запишите в виде десятичного числа.
IP-адрес:
Решение:
Ответ: 192.
Адрес сети:
Маска (min):
Третий байт слева:
единиц слева может быть больше, но требуется наименьшее возможное (показано в следующей строке)
Восстанавливаем маску
Маска (max):
маска заполняется единицами максимально, на столько, на сколько позволяет адрес сети
ipaddress
from ipaddress import * # подключение библиотеки
Функция ip_address()
позволяет создать объект — IP-адрес. В качестве аргумента функции мы указываем строку, в которой записано значение IP-адреса:
from ipaddress import *
ip = ip_address('192.168.0.1')
print(ip) # => 192.168.0.1
from ipaddress import *
ip = bin(int(ip_address('57.179.208.27')))[2:].zfill(32)
print(ip) # => 00111001101100111101000000011011
Вывод двоичной записи IP-адреса:
ipaddress
Функция ip_network()
создает объект сети. Каждая сеть задаётся IP-адресом и маской сети, поэтому в качестве аргумента функции указывается строка, содержащая IP-адрес сети и маску разделённые /. Маска может указываться либо полной записью, либо профиксной (указанием числа единиц в маске).
from ipaddress import *
net = ip_network('192.168.10.0/255.255.255.0')
print(net) # => 192.168.10.0/24
from ipaddress import *
net = ip_network('192.168.10.0/24')
print(net) # => 192.168.10.0/24
или так:
ipaddress
Чтобы определить принадлежит ли IP-адрес сети необходимо использовать оператор принадлежности in
:
from ipaddress import *
if ip_address('192.168.10.100') in ip_network('192.168.10.0/24'):
print('IP-адрес 192.168.10.100 принадлежит сети.')
else:
print('IP-адрес 192.168.10.100 не принадлежит сети.')
1. Сеть задана IP-адресом 172.16.168.0 и маской сети 255.255.248.0. Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса не кратно 5?
from ipaddress import *
net = ip_network(f'172.16.168.0/255.255.248.0', strict=False)
cnt = 0
for ip in net:
if (bin(int(ip))[2:]).count('1') % 5 != 0:
cnt += 1
print(cnt)
перебор всевозможных IP-адресов в данной сети
если адрес не является сетевым ip_network()
вызывает исключение; данная конструкция исключит это
2. Для узла с IP-адресом 154.112.144.160 адрес сети равен 154.112.144.0. Для скольких различных значений маски это возможно?
from ipaddress import *
for mask in range(33):
net = ip_network('154.112.144.160/' + srt(mask), 0)
print(net)
аналог strict=False
Ищем в списке сеть 154.112.144.0 и записываем количество масок
Аналитически быстрее!
3. Для узла с IP-адресом 108.133.75.91 адрес сети равен 108.133.75.64. Чему равно наибольшее количество возможных адресов в этой сети?
from ipaddress import *
for mask in range(33):
net = ip_network('108.133.75.91/' + str(mask), 0)
print(net)
Ищем в списке сеть 108.133.75.64 и определяем наименьшее кол-во единиц в маске (нули отвечают за количество IP-адресов в сети (их количество должно быть наибольшим):
Аналитически быстрее!
Кол-во IP-адресов:
4. Узлы с IP-адресами 206.123.209.193 и 206.123.210.118 принадлежат одной сети. Какое наименьшее количество IP-адресов, в двоичной записи которых ровно 15 единиц, может содержаться в этой сети?
from ipaddress import *
ip1 = ip_address('206.123.209.193')
ip2 = ip_address('206.123.210.118')
answer = []
for mask in range(16,33):
net = ip_network('206.123.209.193/' + str(mask), strict=False)
if (ip1 in net) and (ip2 in net):
count = 0
for ip in net:
b = bin(int(ip))[2:]
if b.count('1') == 15:
count += 1
answer.append(count)
print(min(answer))
5. Узел с IP-адресом 156.38.155.174 принадлежит подсети, в которой 45 адресов, двоичная запись которых содержит 12 единиц. Сколько единиц в двоичной записи маски этой подсети?
from ipaddress import *
given_ip = ip_address('156.38.155.174')
for mask in range(0,33):
net = ip_network(f'156.38.155.174/{mask}', strict=False)
if (given_ip in net):
count = 0
for ip in net:
if bin(int(ip))[2:].count('1') == 12:
count += 1
if count > 45:
break
if count == 45:
print(net)
форматная постановка