Бит — это единица компьютерной информации. Дискретная. Может принимать ровно два значения: ноль и единица.

Байт = 8 бит. Другими словами, байт состоит из восьми ячеек, каждая из которых может принимать ровно два разных значения: нулик или единичку. По основам комбинаторики такая конструкция может принимать 28=256 значений. То есть, одним байтом можно закодировать 256 разных значений, от 0 до 255 включительно. При этом 0=[00000000], а 255=[11111111] (в угловых скобках — значение каждого из 8 бит в байте).

Число10Число2
000000000
100000001
200000010
300000011
......
25411111110
25511111111

Число10 — это число в привычном нам десятичном представлении. Иногда ещё говорят, что оно имеет основание 10.
Число2 — число в двоичном представлении, с основанием 2.

В IP-адресе (IPv4) — 4 байта, то есть 32 бита. В привычном нам написании типа 192.168.0.1 через точки указаны значения каждого байта в десятичной системе. Именно поэтому каждое из чисел в IP может принимать значения от 0 до 255 включительно, не больше и не меньше.

IP-адрес может быть записан одним десятичным числом. Например, рассмотрим адрес 192.168.0.1. Мы уже знаем, что каждое число, разделённое точками — это 1 байт, то есть 8 бит в компьютерном представлении. 192=[11000000], 168=[10101000], 0=[00000000], 1=[00000001]. Это означает, что весь данный IP-адрес в компьютере выглядит как 192.168.0.1=[11000000101010000000000000000001]. Если теперь перевести двоичное число в угловых скобках в десятичную систему, но не блоками по 8 бит, а всё сразу, то получим число 3232235521. То есть, IP-адрес 192.168.0.1 можно записать одним десятичным числом 3232235521.

Тип INT (целое число) в компьютере состоит тоже из четырёх байт (как правило). Причём он может быть как знаковым (включать в себя отрицательные числа), так и беззнаковым (только положительные числа).
В первом случае за знак числа отвечает первый из 32 бит, оставшийся 31 бит задаёт число по модулю. То есть, INT может принимать значения от -231 до 231-1.
Во втором случае (UNSIGNED INT) используются все 32 бита и число может быть только положительным, от 0 до 232-1 включительно.

Здесь речь идёт именно о беззнаковом целом, UNSIGNED INT.

Для многих является откровением, что вместо ping 192.168.0.1 можно написать ping 3232235521 и всё будет работать.

user@comp:~$ ping 3232235521 PING 3232235521 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=62 time=0.557 ms 64 bytes from 192.168.0.1: icmp_seq=2 ttl=62 time=0.532 ms 64 bytes from 192.168.0.1: icmp_seq=3 ttl=62 time=0.602 ms 64 bytes from 192.168.0.1: icmp_seq=4 ttl=62 time=0.410 ms

Более того, ip-адрес — это изначально четырёхбайтовая структура, не привязанная к какому-либо представлению. Привычное нам представление из четырёх чисел, разделённых точками, сделано для более удобного восприятия человеком.

Маска подсети — это конструкция из 4 байт, которая служит для операций над IP-адресом. Эти операции не так очевидны в привычном нам десятичном представлении, но ст́оит записать адрес и маску в двоичном виде, как всё становится на свои места. Например, рассмотрим IP-адрес 192.168.0.1 с маской 255.255.255.0.

Для удобства разделим пробелами байты в двоичном представлении адресов.

192.168.0  .1 = [11000000 10101000 00000000 00000001]
255.255.255.0 = [11111111 11111111 11111111 00000000]

Дальше применяются побитовые логические операции И, ИЛИ и НЕ, и на этом надо остановиться подробнее.

Допустим, у нас есть два бита (b): b1 и b2. К битам могут быть применены следующие логические операции:

Логическая операция И (&). Результат операции b = b1 & b2 равен 1 только в том случае, когда b1 = b2 = 1, в противном случае результат равен 0. Другими словами, результат логической операции И равен 1 только в том случае, когда И первый, И второй операнды равны 1.

Логическая операция ИЛИ (|). Результат операции b = b1 | b2 равен 1 в том случае, когда ИЛИ b1 = 1, ИЛИ b2 = 1, в противном случае результат равен 0. Другими словами, результат логической операции ИЛИ равен 1 в том случае, когда хотя бы один из операндов равен 1.

Логическая операция НЕ (!) - унарная, в отличии от бинарных операций И и ИЛИ. Это означает то, что она действует только на один-единственный элемент. Логическая операция НЕ меняет значение бита на противоположное, то есть, если b = 0, то !b = 1 и наоборот, если b = 1 то !b = 0.

Побитовые операции применяются к каждому биту в цепочке.

Вернёмся к IP-адресам.

В IP-адресе и маске по 32 бита. Для того, чтобы определить подсеть, над маской и адресом применяется побитовая операция И:

11000000 10101000 00000000 00000001 ( = 192.168.0.1 )
&
11111111 11111111 11111111 00000000 ( = 255.255.255.0 )
=
11000000 10101000 00000000 00000000 ( = 192.168.0.0 )

То есть, мы находимся в подсети 192.168.0.0.

Для того, чтобы определить адрес компьютера в пределах подсети, над маской применяется унарная побитовая операция НЕ, а затем над результатом и IP-адресом применяется побитовая операция И:

!
11111111 11111111 11111111 00000000 ( = 255.255.255.0 )
=
00000000 00000000 00000000 11111111 ( = 0.0.0.255 )
&
11000000 10101000 00000000 00000001 ( = 192.168.0.1 )
=
00000000 00000000 00000000 00000001 ( = 0.0.0.1 )

То есть, в подсети 192.168.0.0 адрес нашего компьютера - 1.

Как выяснилось, для идентификации компьютера в сети важен не только его адрес, но и маска.

Для того, чтобы понять какие адреса могут быть во всей подсети — нужен её адрес и маска. Например, в подсети 192.168.0.0 с маской 255.255.255.0 могут существовать адреса в диапазоне от 192.168.0.1 до 192.168.0.255. Маска — обязательное значение для описания подсети.

В укороченной записи наша подсеть описывается как 192.168.0.0/24. Откуда берётся число 24 в конце?

Вернёмся к двоичному представлению маски и IP-адреса.

192.168.0  .1 = [11000000 10101000 00000000 00000001]
255.255.255.0 = [11111111 11111111 11111111 00000000]

24 — это количество единиц в начале маски (3 байта по 8 бит, 3 × 8 = 24). Укороченная запись возможна только тогда, когда маска выглядит как [блок_единиц][блок_нулей].

Например, подсеть 192.168.4.0/23 — это подсеть 192.168.4.0 с маской 255.255.254.0, в которой IP-адреса компьютеров могут принимать значения от 192.168.4.1 до 192.168.5.255 включительно.

255.255.254.0   = [11111111 11111111 11111110 00000000]
192.168.4  .1   = [11000000 10101000 00000100 00000001]
192.168.5  .255 = [11000000 10101000 00000101 11111111]

Первые 23 бита определяют подсеть, последние 9 бит — адреса компьютеров в подсети.

Обычно людям непонятно откуда берётся пятёрка в третьем байте IP-адреса (вместо четвёрки). При написании в двоичном представлении — это очевидно.


incubus
2010.12.16 06:02:06
#cid782

Ответить

Очень хорошо описано. Но все таки для полного чайника надо разжевать чуть-чуть по-подробнее.

2010.12.16 14:40:22
#cid786

Ответить

Очень хорошо описано. Но все таки для полного чайника надо разжевать чуть-чуть по-подробнее.

Тут изначально было допущено несколько косяков, исправляю потихоньку.
С другой стороны - куда подробнее-то?