Конечно, на самом деле, он оказался не настолько уж и велик — не просто же так нам потребовался IPv6. Однако, это уже другая история.
Дело в том, что IPv4 (самая широко используемая версия протокола IP) задает лимит адресов, равный 2??. Это означает, что у вас есть примерно 4,2 миллиарда IP-адресов, с которыми вы можете работать — хотя по правде это не совсем так, поскольку крупные секции недоступны для использования:
Диапазон IP | Применение |
---|---|
0.0.0.0/8 | Локальная система |
10.0.0.0/8 | Локальная LAN |
127.0.0.0/8 | Loopback |
169.254.0.0/16 | “Link Local” |
172.16.0.0/12 | Локальная LAN |
224.0.0.0/4 | Мультивещание (Multicast) |
240.0.0.0/4 | “Для использования в будущем” |
Однако, учитывая, что у нас остается 3 706 650 624 адресов, это вроде бы не так уж и много, и находится в идеальной достижимости для отправки пакета каждому из них.
Итак… Это конечно же не первый раз, когда кто-то пытается сделать подобное — в Интернете хватает достаточного количества «фонового шума» (незатребованных пакетов), большинство из них создается системами, которые пытаются взломать другие системы.
![image](https://habrastorage.org/getpro/habr/post_images/25a/41e/6f8/25a41e6f898f29fa2fc1a0db68e84cda.png)
Здесь мы можем наблюдать, что порт 23 гораздо выше (по логарифмической шкале), чем все остальные порта — и это порт для telnet, который часто используется в незащищенных маршрутизаторах и прочих IoT-устройствах.
Зная об этом, я ускорился и отправил ICMP-пинг каждому хосту в Интернете, чтобы посмотреть, как большая часть Интернета ответит на данный пинг (и покажет мне, есть ли на той стороне подключенный к сети компьютер).
Днем позже я отправил 3,7 миллиарда пакетов и получил большущий текстовый файл. Теперь нам остается лишь найти способ нарисовать эту карту!
Знакомимся с кривыми Гильберта
Проблема с отображением IP-адресов состоит в том, что они являются одномерными, изменяясь в сторону увеличения или уменьшения, а люди не настолько хороши в восприятии большого количества одномерных точек. Поэтому, нам нужно найти способ представить их таким образом, чтобы мы могли заполнить двумерное пространство ими, что также поможет нам получить более полезные графики.
К счастью, математика спешит нам на помощь — на этот раз в виде параметрических кривых Пеано (space filling curves):
![image](https://habrastorage.org/getpro/habr/post_images/f3c/26c/2e4/f3c26c2e460a576cf609f9b2e3502d1e.gif)
Для меня все никак не доходило, как можно это использовать, пока я не пронумеровал узлы, сквозь которые проходит кривая.
![image](https://habrastorage.org/getpro/habr/post_images/c67/1ce/916/c671ce9161b688c698528be8cf4ffa72.gif)
Еще больше времени у меня ушло, прежде чем я догадался, что мы снова можем отобразить эту же анимацию в одном измерении, «распутав» ее:
![image](https://habrastorage.org/getpro/habr/post_images/9f8/02a/944/9f802a944fa8707fc4be798541dbbd25.gif)
В общем, теперь когда мы разобрались, как работают эти графики, можем применить их к IP-адресам.
К счастью, существуют инструменты, которые позволяют строить подобные графики на основании собранных данных об IP-адресах, поэтому нам остается лишь «скормить» одному из них наши данные и дождаться результата:
cat ping.txt | pcregrep -o1 ': (\d+\.\d+\.\d+\.\d+)' | ./ipv4-heatmap -a ./labels/iana/iana-labels.txt -o out.png
Эта команда отрисует кривую Гильберта при помощи градинта, показываещуго, как много систем находятся онлайн в тех /24
И так, позвольте представить вам — карта IPv4 Интернета по состоянию на 16 апреля 2018 года:
![image](https://habrastorage.org/getpro/habr/post_images/45c/4f3/496/45c4f34964e4493bcd56f7e78715ae52.jpg)
Вы можете кликнуть по изображению и открыть несжатую версию в полном разрешении — только учтите, что весит оно 9 Мб.
Последний публичный скан, о котором мне известно, был выполнен в 2012 году ботнетом Carna размером 420 тысяч устройств. Используя полученные ботнетом данные, мы можем ясно увидеть некоторые изменения.
![image](https://habrastorage.org/getpro/habr/post_images/508/6ca/207/5086ca20713a354d1b5d4c2506bc28e3.png)
В 2012 году RIPE еще даже не трогала 185.0.0.0/8, позже это станет диапазоном, который они будут использовать для последних распределений, и будут давать лишь /22 от пространства IP каждому новому члену RIPE. Из-за этого диапазон 185.0.0.0/8 выглядит странно на фоне других диапазонов и в нем нет массовых аллокаций, поэтому он выглядит весьма «подтянутым» на фоне всех остальных.
RIPE — не единственные, кто полностью использовали диапазоны за прошедшее время. Ниже мы видим три других различных интернет-регистраторов (RIR), которые потребили свои диапазоны за прошедшие 6 лет:
![image](https://habrastorage.org/getpro/habr/post_images/37e/060/d22/37e060d222191e694851449e727a2410.png)
В придачу ко всему этому, я также просканировал несколько диапазонов IP в APNIC (Asia-Pacific Network Information Centre) каждые 30 минут в течение 24 часов. Данные, полученные мною из этого эксперимента, позволяют вам увидеть, как Интернет «дышит» по мере того, как клиенты выходят в онлайн утром и уходят в оффлайн ночью:
![image](https://habrastorage.org/getpro/habr/post_images/44c/2b5/d91/44c2b5d915d2de8311e08b6f766bfcf5.gif)
Самым интересным в этой «гифке» является то, как выглядит динамический пул IP от ISP, показывающий клиентов, выходящих онлайн на короткий промежуток времени, и затем присоединяющихся и получающих новый IP-адрес (вот почему более активные IP-адреса «переезжают» в течение дня):
![image](https://habrastorage.org/getpro/habr/post_images/9aa/8fb/d5d/9aa8fbd5d4f681da8b4ee56661873da9.gif)
Ах да, и если вам интересно, как выглядит IPv6 в таком формате и сколько адресов мы уже используем, то вот вам заключительный график:
![image](https://habrastorage.org/getpro/habr/post_images/b83/4bd/6f2/b834bd6f28be466b3a119ca674cb6bb0.gif)
Комментарии (22)
capslocky
21.04.2018 15:48Оборонка и IT компании еще понятно, но Ford и Daimler было неожиданно. Причем они получили эти блоки еще в середине 90-х. Чем-то похоже на киберсквоттинг.
capslocky
21.04.2018 16:05В 2011 году Microsoft купил 666 624 IP адреса за 7.5 миллионов долларов. По масштабам это немного больше чем /13 (524 286 адресов).
ATwn
22.04.2018 10:10Учитывая то, как «стремительно» внедряется IPv6, и как скоро заканчиваются IPv4 адреса, можно сказать, что Microsoft заплатил не такую уж и высокую цену. В какой-то момент этот актив конечно может обесцениться, но произойдет это скорее позже, чем раньше.
Apache02
21.04.2018 16:53Я так понял 1 пиксель = 256 адресов? В статью бы скинуть логику как зная для IP адреса A.B.C.0-255 A,B и С получить координаты (x,y) пикселя.
Alex_ME
21.04.2018 17:41Куда уж без этого
XKCDAndreyNagih
21.04.2018 21:10Так вот что, оказывается, Малевич нарисовал!
maxzhurkin
22.04.2018 17:47Это правильный квадрат, а Малевич нарисовал квадрат, у которого все стороны разные и нет ни одного угла 90%
k0ldbl00d
21.04.2018 23:07Извините, но «локальная LAN» звучит как «Соединённые США» или «Федеральная ФСБ»
shukshinivan
21.04.2018 23:31Было бы интересно на этой карте отразить заблокированные Роскомнадзором ресурсы, которые по wsdl можно вытащить — vigruzki.rkn.gov.ru/auto
shukshinivan
22.04.2018 01:25+1Отобразил выгрузку РКН (только диапазоны) в таком же представлении IPv4
картинка заблоченного и ссылка для того, чтобы поиграть зумом :)vlanko
24.04.2018 12:44а что означает прицел?
shukshinivan
24.04.2018 13:02наведите мышку, увидите «you are here». Это то, где открывший ссылку находится на данной карте :)
capslocky
22.04.2018 08:55Один из просчетов было отдать 127.0.0.0/8 под loopback. В теории, это может пригодится, чтобы использовать разные IP (127.0.0.2, 127.0.0.3… ) для разных соединений, но на практике достаточно разных портов на 127.0.0.1. Думаю, хватило бы и 127.0.0.0/24 для разных случаев. Может какой-нибудь highload это как-то использует, кто подскажет? Кстати, в IPv6 всего один адрес — ::1.
firk
22.04.2018 09:46Там 127.0.0.0/8 было крайней сетью класса А, и так и так непригодной для обычного использования. Так же как и 0.0.0.0/8, вот им и придумали спец. функции. Что касается идеи оставить всего 1 адрес — было бы неудобно, разные адреса реально иногда нужны, а вот /24 вполне хватило бы да.
Readme
Ммм, а зачем пытаться уложить линейный диапазон в кривую? Как мне кажется, проще и нагляднее, например, на одной оси отмечать первые 16 бит адреса (шкала от 0 до 65536), а на второй — хвост из тех же 16 бит. Дыры и плотные блоки как раз тогда должны выглядеть непрерывными более-менее прямоугольными «кирпичами», а не зигзагообразными паттернами. Можно даже поиграться и выбрать разные диапазоны (подсети, старшие биты) для рисования, хотя и получатся уже прямоугольники, а не квадраты (и можно даже при выборе пропорций руководствоваться минимизацией энтропии в результирующем изображении :).
lorc
Фокус этой кривой в том, что близко расположенные адреса будут находится близко на двумерной плоскости. А в вашем случае — в двух соседних столбцах или строках — будут абсолютно разные адреса.
Readme
Не совсем: предположим, по оси X откладываем младшие биты, по оси Y — старшие (подсеть). Тогда адреса, например, вида
xxx.yyy.*.*
(/16) будут занимать отрезок строкиxxx.yyy
. То есть, за исключением граничных случаев, близкие адреса будут находиться рядом на прямой. И со столбцами тоже спорно — по-моему, довольно распространенный случай, когда одному регистратору принадлежит агрегат диапазонов типа70.121.0.0/16 + 126.120.128.0/24 + ...
Но вы, вероятно, правы, т.к. необходимо разрешение порядка 65536 (216), чтобы разглядеть маленькие подсети (состоящие всего из одной-двух строк). Можно ли где-то найти сырые данные? Не проверишь, не узнаешь :)
Кстати говоря, помимо кривой Гильберта есть ещё много других семейств заполняющих кривых, и с разными элементарными паттернами — возможно, какие-то из них могут быть более или менее выразительны для визуализации/кластеризации именно диапазонов ip. Но тут уже можно улететь во фрактальную размерность, опять-таки минимизацию энтропии и прочие интересные дебри.