#005 Time to Live или как IP защищается от петель маршрутизации
Господа, дамы, здравствуйте!
В прошлом видео мы разобрались со структурой IP-пакета в целом, но о некоторых полях стоит поговорить отдельно и посмотреть на них более пристально, одним из таких полей на мой взгляд является TTL, о котором далее.
Зачем нужно поле TTL?
Назначение поля TTL довольно простое: не допустить бесконечного хождения пакета по сети в том случае, если произошла петля маршрутизации. Особенность этого поля используется такими утилитами как tracert, mtr, winmtr. Рассматривать назначение этого поля будем на вот такой схеме:
Но для начала коротко поясню как узлы работают с TTL. Представим, что пакет пришел на узел, он его получает и смотрит на значение поля TTL:
если значение равно единице, это значит, что пакет уже не будет передан следующему узлу: если пакет со значением 1 пришел на узел получатель, то он будет обработан и передан вышестоящему процессу, если же узел не конечный, то такой пакет будет уничтожен;
если значение поля TTL больше единицы, то пакет можно передать следующему узлу, если это требуется, либо если узел конечный, то он вскроет IP-заголовок и передаст содержимое пакета своему вышестоящему процессу;
если пакет нужно передать следующему узлу, то из значения TTL будет вычтена единица, произойдет пересчет контрольной суммы и пакет будет отправлен дальше.
Ничего сложного.
Топология сети и некоторые пояснения
Немного поясню по топологии сети: роутеры это образы Cisco 3725, хосты это образы Debian 10. На схеме показаны сети, которые настроены на линках между роутерами, для удобства нумерация была организована по следующему принципу:
1. Первый октет всегда равен десяти.
2. Второй октет это всегда меньший номер роутера.
3. Третий октет номер всегда номер большего роутера.
4. Четвертый октет равен номеру роутера.
5. Маска всегда /24.
Если бы у нас был линк R1 <-> R5. То на интерфейсе R1 был бы назначен адрес 10.1.5.1/24, на R5 такой: 10.1.5.5/24. Сети хостов назначил случайно и никакой системы в нумерации там нет.
Как работает Time to Live
Работает TTL на самом деле очень просто. Обратимся к нашей схеме. Узел Host_1 отправляет пакеты узлу Host_2, если значение TTL будет равно 4, то пакет будет уничтожен роутером R5, но если значение будет равно 5 или больше, то Host_2 получит пакет.
В этом легко убедиться, сделаем ping с Host_1. Для начала зададим TTL=4.
user@debian:~$ ping -t 4 192.168.2.12
PING 192.168.2.12 (192.168.2.12) 56(84) bytes of data.
From 10.4.5.5 icmp_seq=1 Time to live exceeded
From 10.4.5.5 icmp_seq=2 Time to live exceeded
From 10.4.5.5 icmp_seq=3 Time to live exceeded
From 10.4.5.5 icmp_seq=4 Time to live exceeded
From 10.4.5.5 icmp_seq=5 Time to live exceeded
From 10.4.5.5 icmp_seq=6 Time to live exceeded
^C
--- 192.168.2.12 ping statistics ---
6 packets transmitted, 0 received, +6 errors, 100% packet loss, time 13ms
Параметр t команды ping задает значение TTL. Трассировка подтверждает результаты пинга:
user@debian:~$ traceroute -m 4 192.168.2.12
traceroute to 192.168.2.12 (192.168.2.12), 4 hops max, 60 byte packets
1 192.168.1.155 (192.168.1.155) 1.836 ms 12.191 ms 22.688 ms
2 10.1.3.3 (10.1.3.3) 33.218 ms 43.708 ms 54.255 ms
3 10.3.4.4 (10.3.4.4) 64.698 ms 75.194 ms 85.180 ms
4 10.4.5.5 (10.4.5.5) 95.679 ms 106.314 ms 116.695 ms
Параметр m команде traceroute задает значение TTL, видим, что было пройдено четыре транзитных узла и пакет был уничтожен на четвертом (пятым узлом должен был быть Host_2). А теперь сделаем то же самое для TTL=5.
user@debian:~$ traceroute -m 5 192.168.2.12
traceroute to 192.168.2.12 (192.168.2.12), 5 hops max, 60 byte packets
1 192.168.1.155 (192.168.1.155) 4.686 ms 15.048 ms 25.488 ms
2 10.1.3.3 (10.1.3.3) 35.552 ms 46.068 ms 56.597 ms
3 10.3.4.4 (10.3.4.4) 67.063 ms 77.378 ms 87.591 ms
4 10.4.5.5 (10.4.5.5) 98.109 ms 108.930 ms 119.038 ms
5 192.168.2.12 (192.168.2.12) 129.545 ms 140.033 ms 150.561 ms
user@debian:~$
Успешный успех. Если мы попытаемся пропинговать адрес 192.168.2.17 с TTL=4, пинг у нас пройдет, т.к. этот адрес настроен на R5.
user@debian:~$ traceroute -t 4 192.168.2.17
traceroute to 192.168.2.17 (192.168.2.17), 30 hops max, 60 byte packets
1 192.168.1.155 (192.168.1.155) 3.694 ms 14.099 ms 24.630 ms
2 10.1.3.3 (10.1.3.3) 35.064 ms 45.116 ms 55.612 ms
3 10.3.4.4 (10.3.4.4) 66.078 ms 76.583 ms 87.074 ms
4 10.4.5.5 (10.4.5.5) 97.065 ms * *
user@debian:~$ ping -t 4 192.168.2.17
PING 192.168.2.17 (192.168.2.17) 56(84) bytes of data.
64 bytes from 192.168.2.17: icmp_seq=1 ttl=252 time=33.3 ms
64 bytes from 192.168.2.17: icmp_seq=2 ttl=252 time=34.0 ms
64 bytes from 192.168.2.17: icmp_seq=3 ttl=252 time=36.6 ms
64 bytes from 192.168.2.17: icmp_seq=4 ttl=252 time=49.1 ms
64 bytes from 192.168.2.17: icmp_seq=5 ttl=252 time=40.0 ms
^C
--- 192.168.2.17 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 10ms
rtt min/avg/max/mdev = 33.285/38.610/49.147/5.771 ms
user@debian:~$
Вопрос: почему четвертым хопом мы видим 10.4.5.5, а не 192.168.2.17? Ведь трассировку мы делаем до 192 адреса.
Создадим на сети петлю маршрутизации
Во всех этих примерах на сети не было петли маршрутизации, давайте ее создадим и посмотрим что будет. Петля маршрутизации была создана на линке R3 <-> R4, для этого со стороны R4 был добавлен вот такой статический маршрут в сторону R3:
ip route 192.168.2.12 255.255.255.255 10.3.4.3
Теперь пинг с первого хоста до второго не проходит:
user@debian:~$ ping 192.168.2.12
PING 192.168.2.12 (192.168.2.12) 56(84) bytes of data.
From 10.3.4.3 icmp_seq=1 Time to live exceeded
From 10.3.4.3 icmp_seq=2 Time to live exceeded
From 10.3.4.3 icmp_seq=3 Time to live exceeded
From 10.3.4.3 icmp_seq=4 Time to live exceeded
From 10.3.4.3 icmp_seq=5 Time to live exceeded
From 10.3.4.3 icmp_seq=6 Time to live exceeded
^C
--- 192.168.2.12 ping statistics ---
6 packets transmitted, 0 received, +6 errors, 100% packet loss, time 12ms
user@debian:~$
Вот трассировка, значение TTL по умолчанию для команды traceroute равно 30, так говорит man, петля подтверждает сведения, полученные из man:
user@debian:~$ traceroute 192.168.2.12
traceroute to 192.168.2.12 (192.168.2.12), 30 hops max, 60 byte packets
1 192.168.1.155 (192.168.1.155) 7.676 ms 17.985 ms 28.523 ms
2 10.1.3.3 (10.1.3.3) 38.995 ms 49.491 ms 59.979 ms
3 10.3.4.4 (10.3.4.4) 70.815 ms 80.969 ms 91.496 ms
4 10.3.4.3 (10.3.4.3) 101.949 ms 112.461 ms 122.974 ms
5 10.3.4.4 (10.3.4.4) 143.964 ms 154.418 ms 164.945 ms
6 10.3.4.3 (10.3.4.3) 175.578 ms 185.533 ms 142.816 ms
7 10.3.4.4 (10.3.4.4) 247.771 ms 258.300 ms 268.446 ms
8 10.3.4.3 (10.3.4.3) 278.805 ms 312.816 ms 323.311 ms
9 10.3.4.4 (10.3.4.4) 479.835 ms 626.355 ms 636.819 ms
10 10.3.4.3 (10.3.4.3) 556.593 ms 588.117 ms 598.524 ms
11 10.3.4.4 (10.3.4.4) 755.650 ms 797.647 ms 839.148 ms
12 10.3.4.3 (10.3.4.3) 849.913 ms 804.939 ms 805.743 ms
13 10.3.4.4 (10.3.4.4) 973.320 ms 1015.224 ms 962.095 ms
14 10.3.4.3 (10.3.4.3) 993.059 ms 952.398 ms 971.923 ms
15 10.3.4.4 (10.3.4.4) 1170.728 ms 1109.510 ms 1151.391 ms
16 10.3.4.3 (10.3.4.3) 1161.844 ms 1097.333 ms 1170.133 ms
17 10.3.4.4 (10.3.4.4) 1304.082 ms 1313.947 ms 1334.797 ms
18 10.3.4.3 (10.3.4.3) 1346.658 ms 1300.740 ms 1321.627 ms
19 10.3.4.4 (10.3.4.4) 1530.698 ms 1544.993 ms 1515.161 ms
20 10.3.4.3 (10.3.4.3) 1536.287 ms 1471.464 ms 1502.896 ms
21 10.3.4.4 (10.3.4.4) 1711.457 ms 1689.732 ms 1724.093 ms
22 10.3.4.3 (10.3.4.3) 1661.657 ms 1682.391 ms 1672.738 ms
23 10.3.4.4 (10.3.4.4) 1829.791 ms 1820.323 ms 1810.250 ms
24 10.3.4.3 (10.3.4.3) 1831.317 ms 1841.253 ms 1841.213 ms
25 10.3.4.4 (10.3.4.4) 1976.711 ms 1996.839 ms 2007.309 ms
26 10.3.4.3 (10.3.4.3) 1986.232 ms 1947.299 ms 1957.688 ms
27 10.3.4.4 (10.3.4.4) 2090.287 ms 2083.092 ms 2006.741 ms
28 10.3.4.3 (10.3.4.3) 2006.771 ms 1904.826 ms 1890.734 ms
29 10.3.4.4 (10.3.4.4) 1889.694 ms 1813.301 ms 1670.634 ms
30 10.3.4.3 (10.3.4.3) 1628.703 ms 1389.763 ms 1252.525 ms
user@debian:~$
В данном случае петля маршрутизации видна в трассировке, и по адресам мы можем сказать, что проблема на линке R3<->R4. Но при помощи трассировки не всегда можно локализовать проблему.
В дампе Wireshark петля будет выглядеть так:
Для того, чтобы получить этот дамп, выполнялся вот такой пинг:
user@debian:~$ ping 192.168.2.12 -c 4 -t 12
PING 192.168.2.12 (192.168.2.12) 56(84) bytes of data.
From 10.3.4.3 icmp_seq=1 Time to live exceeded
From 10.3.4.3 icmp_seq=2 Time to live exceeded
From 10.3.4.3 icmp_seq=3 Time to live exceeded
From 10.3.4.3 icmp_seq=4 Time to live exceeded
--- 192.168.2.12 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 9ms
user@debian:~$
В сторону Host_2 было направлено четыре пакета с TTL = 12. В дампе нас интересуют поля Source, Destination и TTL, дамп снимался с интерфейса R4 в сторону R3, по нему видно что на R4 пакет приходит с TTL равным 10, далее R4 этот пакет отправляет в сторону R3, а тот в свою очередь шлет пакет в R4 и так происходит до тех пор, пока TTL не станет равным 1. Если бы не было TTL, пакет на этом линке мог бы ходить до бесконечности.
Напоследок еще один вопрос, если я изменяю статический маршрут на R4, с помощью которого организуется петля, на такой (next-hop меняется на имя интерфейса в сторону R3):
ip route 192.168.2.12 255.255.255.255 fa0/0
Трассировка с первого хоста до второго становится такой:
user@debian:~$ traceroute 192.168.2.12
traceroute to 192.168.2.12 (192.168.2.12), 30 hops max, 60 byte packets
1 192.168.1.155 (192.168.1.155) 15.593 ms 26.071 ms 36.524 ms
2 10.1.3.3 (10.1.3.3) 47.051 ms 57.558 ms 78.591 ms
3 10.3.4.4 (10.3.4.4) 68.039 ms 89.026 ms 99.513 ms
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
user@debian:~$
По трассировке мы сейчас не можем сделать однозначный вывод о том, что произошла петля. Вопрос: почему трассировка стала такой?
Следующий пост будет без видео, в нем будет краткая инструкция о том, как подготовить данную лабу, делать краткую инструкцию how to в виде длинного видео не вижу особого смысла.
Видео версия
Для тех, кому проще смотреть, чем читать, есть видео версия.
#004 IP-пакет и структура его заголовка
Господа, дамы, здравствуйте!
Пока у нас в Новосибирске было не очень жарко, удалось написать пару постов и записать парочку видео для цикла про IPv4.
Напомню, что ранее мы разобрались с IP-адресами и, как мне кажется, разобрались. Теперь нужно поговорить о единицах измерения: массу мы измеряем в килограммах, длину в метрах, давления в паскалях, а вот фрагменты данных на сетевом уровне мы измеряем в пакетах, в общем случае фрагмент данных, передаваемый тем или иным протоколом, называется Protocol Data Unit или PDU, пакет это PDU в IP, пакет и будем разбирать.
Общая структура IP-пакета
Глобально IP-пакет состоит из двух частей: заголовка и поля данных, в которое помещается полезная для пользователей информация. В заголовке содержится вся необходимая служебная информация для обработки пакета узлами сети.
В поле данных помещаются данные, которые приходят с транспортного уровня, либо любого другого протокола, который хочет воспользоваться услугами IP. Список протоколов, который можно запихнуть внутрь пакета, легко найти (на вики, сайт IANA).
Ниже три структуры IP-пакета: первая устаревшая, вторая устаревшая, но переведена на рус-яз с ин-яза, третья актуальная.
Общего у них то, что пакет делится на ячейки, каждая ячейка имеет свой размер и свое имя, такая ячейка называется полем. Разница между представленными выше структурами в том, что в первых двух случаях есть поля Type of Service, но на самом деле это поле сейчас заменено на DSCP и ECN. Если говорить совсем просто, то поле ToS использовалось для того, чтобы узел мог отличить важный пакет от неважного и в первую очередь обрабатывать важные пакеты, а неважные уже по возможности. О DSCP и ECN поговорим ниже.
Важно понимать, что узлы ничего не знают ни о каких пакетах, пакет это лишь удобная абстракция для людей. Для компьютеров и роутеров это последовательность нулей и единиц. IP заголовок можно разбить на пять строк(если не считать опции, которые не обязательны) и длина каждой строки получится 32 бита или 4 байта, такая строка в RFC называется 32 битным словом. Поле заголовка не может начинаться на одном слове, а заканчиваться на другом.
Такой строгий подход к структуре заголовка не случаен, для себя я выделил две основные причины этого, которые в общем-то взаимосвязаны:
Сам IP размер пакетов считает не в битах или байтах, а в словах.
Процессоры сетевых узлов обрабатывают не байты или биты, а слова, если длина слова IP будет равна или кратна машинному слову процессора, то его будет проще обработать.
Кстати говоря, мы уже знаем размер типичного заголовка, он составляет 20 байт, т.к. у нас пять слов (если не считать поля с опциями) и каждое слово 4 байта.
Поля IP заголовка
Теперь разберемся с каждым полем в отдельности. Начнем с версии и размера заголовка.
Версия (Version)
Это версия протокола IP, под него выделено четыре бита, для протокола IPv4 здесь всегда неизменное значение – 4. Хочу заметить, что в IPv4 четверка не связана с количество октетов в IP-адресе, просто такое совпадение.
Размер заголовка (Internet Header Length)
Поле нужно, чтобы узел мог понять: где заканчивается заголовок и начинаются данные, т.к. поле опций не обязательное и их может быть больше чем одна. Под размер заголовка выделено четыре бита, значение данного поля это число, которое равно числу слов в заголовке. Понятно, что максимальное количество слов в заголовке равно пятнадцати.
DSCP и ECN
Под поле DSCP (Differentiated Services Code Point), выделено 6 бит, используется для разделения трафика на классы обслуживания.
Поле ECN (Explicit Congestion Notification) или указатель перегрузки имеет размер два бита. При помощи этого поля узлы могут сигнализировать о перегрузке. Не каждое устройство с этим полем умеет работать, сигнализация через ECN будет работать только в том случае, если узлы сети умеют его обрабатывать.
Размер пакета (Total Length)
Далее обсудим четыре поля, которые имеют отношение к размеру IP-пакета и его фрагментации, начнем с размера.
Это поле позволяет обрабатывающему устройству понять полный размер пакета, то есть заголовок + данные. Под поле выделено два байта, мы уже понимаем, что минимальный размер IP-пакета равен 20 байт, то есть это заголовок без опций и данных, а максимальный размер равен 65535 байт, это максимальное число, которое можно записать при помощи двух байт.
Идентификатор (Identification)
Чаще всего это поле используется в тех ситуация, когда пакет фрагментируется, чтобы принимающая сторона понимала, как из полученных кусочков правильно собрать пакет. У фрагментированных пакетов, которые являются частью одного целого, значение в этом поле должны быть одинаковыми.
Флаги (Flags)
Под флаги выделено три бита, используются для контроля над фрагментацией пакетов. Нумерация бит в поле начинается с нуля, крайний левый бит старший, а крайний правый – младший:
нулевой бит зарезервирован и должен быть всегда равен нулю;
если значение первого бита ноль, то допускается фрагментация пакетов, если единица (бит DF или Do not Fragment), то фрагментация запрещена и, если размер пакета при запрещенной фрагментации будет больше, чем разрешенный на канале, то такой пакет в канал отправлен не будет;
второй бит служит для того, чтобы конечные узлы понимали, где начинается последовательность фрагментированных пакетов, а где она заканчивается, если значение этого бита равно единице (MF More Fragments), то узел понимает, что этот пакет не последний и нужно ждать еще фрагментированные пакеты, чтобы собрать изначально разделенный пакет.
Поскольку тема фрагментации важная, то про нее будет отдельный пост и видео.
Смещение фрагмента (Fragment Offset)
Это поле используется в тех случаях, когда выполняется фрагментация пакетов, размер этого поля равен 13 бит. Об этом поле мы поговорим отдельно и детально, когда будем разбираться с фрагментацией пакетов.
Время жизни (Time to Live, TTL)
TTL имеет размер один байт или восемь бит, поле выполняет функцию защиты от петель маршрутизации. Благодаря TTL пакет не блуждает по сети до бесконечности в ситуациях, когда из-за неверной конфигурации роутеров произошла петля маршрутизации. TTL это число от 0 до 255, это число определяет максимально допустимое число узлов, через которое может пройти пакет, перед тем, как он будет уничтожен.
Время жизни для пакета задается узлом источником и изначально оно измерялось в секундах (то есть максимально возможное время жизни IP пакета раньше было 255 секунд), современные маршрутизаторы обрабатывают пакеты гораздо быстрее, чем за секунду, поэтому сейчас TTL – это значение, которое определяет число транзитных узлов, которые может пройти пакет, прежде чем он будет уничтожен.
Протокол (Protocol)
Под поле выделено 8 бит, поле использует узел получатель, чтобы понять какому процессу передать данные, когда IP-заголовок будет снят. В данное поле записывается код протокола, который был помещен отправителем в IP-пакет, коды регламентированы и их можно найти на сайте IANA.
Контрольная сумма заголовка (Header Checksum)
Под поле выделено два байта и как понятно из названия: протокол IP не имеет механизма проверки целостности данных, поскольку поле «контрольная сумма заголовка» не учитывает поле данных при проверке. Не забываем, что TTL меняется от узла к узлу, а это значит, что и контрольная сумма будет меняться от узла к узлу, то есть каждый транзитный маршрутизатор сперва принимает IP-пакет, вычисляет его контрольную сумму, сравнивает со значением, записанным в поле «контрольная сумма заголовка», затем изменяет поле TTL, вычисляет новую контрольную сумму и отправляет пакет следующему соседу.
Стоит отметить, что если значение контрольной суммы, которую посчитал узел, отличается от контрольной суммы, которая записана в пакете, то он просто уничтожается.
IP-адрес источника
Поле IP-адрес источника имеет размер 32 бита и не изменяется при передаче пакета по сети (если не рассматриваем ситуации с NAT), это поле важно для узла получателя, чтобы знать кому отвечать.
IP-адрес назначения
Данное поле имеет размер четыре байта, в него записывается IP-адрес узла, которому данный пакет предназначен, роутеры смотрят на этот поле при принятии решения о том куда направлять пакет.
Поле данных в IP-пакете
Поле данных в IP-пакете служит контейнером для других протоколов, которым IP оказывает услуги транспорта. Если учитывать, что максимально возможный размер IP-пакета 65535 байт, то максимально возможный размер поля данных 65515 байт.
Поле опций
С большой долей вероятности вы либо не будете использовать опции, либо будете пользоваться ими очень редко, поскольку для штатной передачи трафика опции обычно не используются, поэтому и останавливаться на них сейчас не буду, для самых любознательных дам ссылку.
Если кому интересно, то выше показана структура пакета с опциями Record Route.
Вопросы для ваших ответов
В конце каждого поста обычно стараюсь придумать несколько вопросов, но к данной теме как-то не очень получается, здесь в основном была справочная информация на запоминание.
Видео версия
А вот видео версия у нас есть в наличии, кому больше нравится смотреть - смотрите.
К-Телеком контора 3,14дарасов
С 4 мая в пгт. Дружинино началось отключение интернета и телевидения.
Горячая линия незнает никаких слов кроме "мы не знаем в чëм проблема, специалисты пробуют устранить проблемы", " Никаких сроков дать не можем, специалисты заняты устранением проблемы", "проверьте лампочки у себе на роутере...а у вас у всего пгт нет интернета, тогда составьте массово заявки... А уже составлены, ну тогда не знаем чем вам помочь... Бросают трубку"
С 11 числа практически всë пгт. Без интернета и телевидения с 12 уже и на Лазаревское дошло это - у горячей линии 3 ответа выше изложенных
До и каких пор эта контора 3,14дарасов будет людям мозги сношать???
Может прокуратуре проверить их на причастность к ВСУ* ибо 12 числа они просто сбрасывали все звонки от
*запрещëнная организация в РФ
Минцифры рекомендовало дать выходной в понедельник сотрудникам ряда отраслей
Минцифры опубликовало официальную рекомендацию дать сотрудникам ИТ, СМИ и телеком-компаний выходной в понедельник. Об этом ведомство заявило на своих ресурсах.
Ранее нерабочий день в понедельник объявили в Москве. Это связано с субботними событиями на фоне военного мятежа ЧВК «Вагнер». В столице, напомним, на один день вводился режим КТО.
В Минцифры подчеркнули, что суббота была очень эмоциональным и напряжённым днем.
— Рекомендуем даже непрерывно действующим ИТ-компаниям, операторам связи и СМИ, работающим в регионах, которые были вчера в эпицентре событий, дать завтра выходной тем сотрудникам, которые не задействованы в выполнении критически важных функций, — подчеркнули в министерстве.
Там же заявили, что дали выходной всем своим сотрудникам, задействованным в минувшую субботу.
Ответ на пост «Первая зарплата»47
В 2003 году работал админом в компьютерном клубе, там был целый комплекс с кафе и dvd кинозалом. Работодатель обеспечивал нас питанием - завтрак, обед, ужин. Но это были далеко не все плюшки! Самое главное безлимитный интернет на скорости 100мбит/с по оптоволоконной линии!!! В 2003, мать его, году!
На смену приходил со своим винтом и целый день тянул с различных FTP серверов, а позже и p2p хабов, музыку, фильмы, софт, игры. Которыми позже делился со своими друзьями, не имевшими на тот момент доступа в интернет на таких скоростях.
С первой зарплаты купил 100 мегабитный коммутатор на 16 портов и начал строить свою домашнюю компьютерную сеть. Обтянул свой дом, собрал единомышленников, и мы уже вместе тянули сеть по соседним домам.
Подняли файловый сервер и локальный чат, я всё так же таскал винты на работу и выкачивал то что заказывали друзья и участники нашей сети :)
Где-то через год-два один из провайдеров таки затянул линию на наш район и мы сделали коллективное подключение, сеть стала полноценной :)
20 лет прошло...
С тех пор работаю в IT и телекомах.
Тружусь с душой!
Строю эти ваши интернеты! ))















