Форум сайта python.su
294
млин, это обратная маска, модуль понимает это. . Но не все понимают обратную маску. Область применения обратной маски это условные операции с IP адресами в cisco like интерфейсе и идеологии. Наврядли ТС это нужно. но на крайний случай можно проверять не обратная ли это маска. перед основной проеркой.
[code python][/code]
Отредактировано PEHDOM (Апрель 8, 2017 17:47:42)
Офлайн
857
PEHDOMНу, и что это значит тогда? Что в модуле ошибка? Ты говоришь “это не маска”, модуль говорит “это маска”. Кто прав?
млин, это обратная маска, модуль понимает это
Отредактировано py.user.next (Апрель 8, 2017 17:53:33)
Офлайн
294
млин, что такое ИП адрес и что такое маска сети? на примере ipV4
ИП адрес это 32 бита, 4 октета. Состоит из единиц и нулей
Маска подсети указывает какая часть ИП адреса являеться адресом сети, а какая адресом узла в сети.
Адрес: 192.168.0.1 11000000 10101000 00000000 00000001
маска: 255.255.255.252 11111111 11111111 11111111 11111100
означает что сеть может иметь диапазон адресов от 192.168.0.1 до 192.168.0.2
При этом 192.168.0.0 это адрес подсети, а 192.168.0.3 это броадкаст.
теперь обратная маска для это подсети будет 00000000 00000000 00000000 00000011
но это в общем случае. У обратной маски область применения более широкая чем просто указывать область хоста в IP адресе.
повторюсь: Область применения обратной маски это условные операции с IP адресами в cisco like интерфейсе и идеологии. В частности списки доступа (ACL) – позволяя создавать не просто условия типа “хост из этой сети”, а гораздо более гибкие правила и определение сетей. Например можно указать что пропускать только четные хосты, всего одним выражением, а не перечислять все 128 хостов, при маске /24.
В обратной маске единицы это обозначение битов в IP адресе, которые могут меняться при проверке условий, а нули фиксируют неизменные биты. Поэтому проверить валидность обратной маски вообще нереально, там необязательно чтобы нули и единицы шли подряд. Это всего лишь УСЛОВИЕ при проверке на вхождение.
в твоем примере
ipaddress.IPv4Network('192.168.0.1/0.0.0.240') IPv4Network('192.168.0.1/32')
py.user.nextО_о прямые только так, нет никаких “историческисложилось” есть четкое определения что такое маска подсети, она же прямая маска и зачем она нужна, и как она должна выглядеть.
Ну, это так устоялось просто исторически, но это не факт, что можно только так маски применять.
>>> ipaddress.IPv4Address(3232235521) IPv4Address('192.168.0.1')
[code python][/code]
Отредактировано PEHDOM (Апрель 8, 2017 18:54:17)
Офлайн
857
PEHDOMМаска берёт своё название от битовой маски, а битовая маска происходит от слова маскировать. Так что то, что в ней должны идти единицы, а потом нули - это очень специфичное дополнение, связанное только с сетями, которые имели определённое историческое устройство.
О_о прямые только так, нет никаких “историческисложилось” есть четкое определения что такое маска подсети, она же прямая маска и зачем она нужна, и как она должна выглядеть.
PEHDOMТам в документации сказано, что 32-битное число можно подать в функцию формирования адреса, поэтому 0xc0a80001 вполне подходит. Ты же не думаешь, что адреса хранятся в виде 192.168.0.1 , они хранятся в 4-х байтах обычно для компактности, тогда как запись 192.168.0.1 занимает 11 байт.
значит ли это что 3232235521 это валидный ИП адрес?
Отредактировано py.user.next (Апрель 8, 2017 19:05:47)
Офлайн
294
py.user.nextну так ТС и писал
Так что то, что в ней должны идти единицы, а потом нули - это очень специфичное дополнение, связанное только с сетями, которые имели определённое историческое устройство.
alexbestalex
проверить корректность ввода маски подсети .
py.user.nextну я же писал что алгритм сложный, и нафиг не нужный, проще перевести в двоичную систему, а еще проще вобще создть кортеж, где перечислены все 33 возможные маски, много памяти это не займет, и потом просто проверять вхождение оператором in.
Вот этот код можно только дописать. Всё, что там уже есть, всё делается правильно. Для анализа последовательности битов надо использовать сдвиг в цикле без всяких рекурсий.
py.user.nextУгу я тоже умею читать документацию, там также сказано что ip_network прнимает в качестве аргумента через / или одно число которое явлеться к-вом байт в адресе сети(prefix), или строку ИП адреса, которая в дальнешем интерпретируеться как маска подсети если начинаеться с не нуля, или как маска хоста если начинаеться с нуля.
Там в документации сказано, что 32-битное число можно подать в функцию формирования адреса, поэтому 0xc0a80001 вполне подходит. Ты же не думаешь, что адреса хранятся в виде 192.168.0.1 , они хранятся в 4-х байтах обычно для компактности, тогда как запись 192.168.0.1 занимает 11 байт.
[code python][/code]
Отредактировано PEHDOM (Апрель 8, 2017 20:52:35)
Офлайн
294
да кстати мне https://www.python.org/shell/ выдает что твой пример не является маской.
>>> ipaddress.IPv4Network('192.168.0.1/0.0.0.240') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/ipaddress.py", line 1531, in __init__ self.netmask, self._prefixlen = self._make_netmask(arg) File "/usr/lib/python3.6/ipaddress.py", line 1094, in _make_netmask prefixlen = cls._prefix_from_ip_string(arg) File "/usr/lib/python3.6/ipaddress.py", line 533, in _prefix_from_ip_string cls._report_invalid_netmask(ip_str) File "/usr/lib/python3.6/ipaddress.py", line 474, in _report_invalid_netmask raise NetmaskValueError(msg) from None ipaddress.NetmaskValueError: '0.0.0.240' is not a valid netmask
[code python][/code]
Отредактировано PEHDOM (Апрель 8, 2017 21:34:33)
Офлайн
857
PEHDOM
Ты передаешь аргуметном маску хоста, и на основании того что ipaddress не выдал ошибку, утверждаешь что это маска сети.
PEHDOMТам, на самом деле, запутанная история. Наверное, ты прав, а в ipaddress ошибки всякие. Сейчас там в докстринге функции записано, что эти формы должны приниматься, но по факту они не принимаются.
выдает что твой пример не является маской.
class IPv4Network(_BaseV4, _BaseNetwork):
"""This class represents and manipulates 32-bit IPv4 network + addresses..
Attributes: [examples for IPv4Network('192.0.2.0/27')]
.network_address: IPv4Address('192.0.2.0')
.hostmask: IPv4Address('0.0.0.31')
.broadcast_address: IPv4Address('192.0.2.32')
.netmask: IPv4Address('255.255.255.224')
.prefixlen: 27
"""
# Class to use when creating address objects
_address_class = IPv4Address
def __init__(self, address, strict=True):
"""Instantiate a new IPv4 network object.
Args:
address: A string or integer representing the IP [& network].
'192.0.2.0/24'
'192.0.2.0/255.255.255.0'
'192.0.0.2/0.0.0.255'
are all functionally the same in IPv4. Similarly,
'192.0.2.1'
'192.0.2.1/255.255.255.255'
'192.0.2.1/32'
are also functionally equivalent. That is to say, failing to
provide a subnetmask will create an object with a mask of /32.
...
>>> import ipaddress >>> >>> ipaddress.IPv4Network('192.0.0.2/0.0.0.255') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/mnt/disk100a/guest/gitrepos/cpython/main/Lib/ipaddress.py", line 1536, in __init__ raise ValueError('%s has host bits set' % self) ValueError: 192.0.0.2/24 has host bits set >>>
Отредактировано py.user.next (Апрель 9, 2017 02:54:42)
Офлайн