О чём заметка

Это полный текст видео номер 1 из серии о том, как работает Zapret 2, разбитый по сценам, с анимированными схемами. Каждую сцену можно читать отдельно.

Как читать пометки

«В нашем тесте» значит настоящий запуск в лаборатории проекта: клиент, роутер, сервер. «По коду» значит, что мы прочитали исходники, но не запускали. «По общим сведениям» значит, что это вне нашего кода и лаборатории. О настоящем оборудовании ТСПУ мы ничего не утверждаем: наш «инспектор» это модель.

Знакомая ситуация и первые слова

Здравствуйте. Это первый выпуск серии о том, как работает zapret2.

Но начнём мы не с программы, не с команд и не с кода. Начнём с ситуации, которую знает почти каждый. Вы открываете сайт. Колёсико крутится, страница не грузится. Через минуту браузер сдаётся и пишет ошибку. При этом интернет работает: соседние вкладки открываются, видео играет. Не открывается именно этот сайт.

Прежде чем идти дальше, договоримся о словах, потому что они будут встречаться на каждом шагу.

Первое слово: запрос. Когда вы вводите адрес сайта, браузер отправляет серверу сообщение, которое по смыслу значит «пришли мне эту страницу». Вот как оно выглядит в простейшем случае, без шифрования. Первая строка: GET, путь к странице и версия протокола. Вторая: Host, имя сайта, например www.example.com. Дальше несколько служебных строк, и всё. Это обычный текст, его можно прочитать глазами. Сервер отвечает таким же сообщением, и страница, которую вы видите, это результат десятков таких обменов: сначала текст страницы, потом картинки, стили, скрипты.

Запрос браузера: обычный текст Простейший HTTP-запрос без шифрования выглядит как четыре строки текста: первая строка задаёт метод GET, путь к странице и версию протокола, вторая называет сайт в поле Host, остальные служебные; сервер отвечает таким же сообщением, а страница складывается из десятков таких обменов. пример: запрос без шифрования, обычный текст Браузер говорит серверу: «пришли мне эту страницу». GET /index.html HTTP/1.1 Host: www.example.com User-Agent: lab Accept: */* метод GET, путь к странице, версия протокола Host: имя сайта служебные строки Это обычный текст: его можно прочитать глазами. Сервер отвечает таким же сообщением. Страница, которую вы видите, это десятки таких обменов: текст страницы картинки стили скрипты

Второе слово: соединение. Прежде чем обмениваться запросами и ответами, браузер и сервер договариваются, что будут разговаривать. Как два человека, которые сначала здороваются, потом беседуют, потом прощаются. В сети это три коротких пакета. Клиент отправляет «давай соединимся», сервер отвечает «давай», клиент подтверждает. В нашей лаборатории они прошли за пять сотых миллисекунды. После этого стороны говорят друг с другом, и вся эта договорённость, вместе с общим состоянием, которое помнят обе стороны, и вместе с самим разговором называется соединением. Если соединение не удаётся создать или пакеты пропадают, страница крутится. Если соединение обрывают, ошибка появляется сразу.

Соединение: три пакета рукопожатия Перед запросом браузер и сервер обмениваются тремя короткими пакетами: SYN клиента в момент 0,000 мс, SYN-ACK сервера через 0,032 мс и ACK клиента через 0,045 мс, порты 39220 и 443; после этого обе стороны помнят общее состояние, это и есть соединение; если пакеты пропадают, страница крутится, если соединение обрывают, ошибка появляется сразу. лаборатория: рукопожатие перед запросом, три пакета Клиент10.1.0.1 : порт 39220 Сервер10.2.0.2 : порт 443 время, мс SYN«давай соединимся» 0,000 SYN-ACK«давай» +0,032 ACK«подтверждаю» +0,045 соединение установлено: обе стороны помнят состояние три пакета за 0,045 мс что видно снаружи, если что-то идёт не так не создаётся или пакеты пропали: страница крутится соединение оборвали: ошибка появляется сразу

Третье слово: блокировка. В этой серии мы используем его в узком смысле. Блокировка это когда кто-то на пути вашего запроса намеренно мешает вам получить конкретный сайт. Это не то же самое, что сайт сломался или сервер лёг. Различить можно по признаку: сломанный сайт не открывается ни из какой сети, а заблокированный не открывается из вашей сети, хотя из другой сети или другим путём открывается. Снаружи она выглядит по-разному: страница может зависнуть, может быстро вылететь ошибка, а может появиться страница-заглушка. Мы разберём все три случая на настоящих пакетах. Почему сайту мешают и кто в этом прав, обсуждать не будем: нас интересует, как это устроено технически.

Из этого получаются три вопроса. Что на самом деле происходит с вашим запросом по дороге к серверу? Кто решает, что с ним делать? И что здесь можно сделать технически?

Эти три вопроса станут планом выпуска. Сначала мы разберёмся, кто стоит на пути пакетов и что он умеет. Потом посмотрим, что именно он видит. Потом поймём, почему против такого наблюдателя вообще возможны приёмы. И в конце познакомимся с программой, которая эти приёмы применяет, и посмотрим на результаты нашей лаборатории.

Письмо и сортировщик

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

Сортировочный центр. Письма едут по ленте одно за другим, сотни в минуту.

Сортировщик не вскрывает конверты. Ему некогда, да и незачем: решение нужно принять за долю секунды, а работы много.

Поэтому он смотрит только в окошко, где написан адрес. Адрес из чёрного списка, и письмо падает в корзину. Адрес обычный, и письмо едет дальше, к почтовому ящику.

Сортировщик смотрит только в окошко Письма едут по ленте, сортировщик не вскрывает конверты и смотрит только в окошко с адресом: письмо с адресом из чёрного списка падает в корзину, письмо с обычным адресом едет дальше, к почтовому ящику; адреса и список условные, это пример. аналогия: сортировочный центр, адреса условные (пример) чёрный список (пример)Чёрная, 13 Сортировщикне вскрывает конверты корзина почтовый ящик Чёрная, 13 Лесная, 5 смотрит только в окошко с адресом в списке: падает в корзину обычный адрес: едет дальше Письма едут по ленте одно за другим, сотни в минуту. Сортировщик не вскрывает конверты: решение нужно принять за долю секунды. Адрес обычный, и письмо едет дальше, к почтовому ящику.

Заметьте две особенности этого сортировщика. Первая: он торопится и не вникает. Вторая: он смотрит только туда, куда ему положено, в окошко. Всё остальное для него не существует.

А теперь представьте отправителя, который знает, как устроен центр. Он не пытается подкупить сортировщика и не прячет письмо. Он делает другое. Он задаёт себе вопрос: что, если изменить не письмо, а то, как оно выглядит на ленте? Например, аккуратно разрезать конверт на две половинки, так, чтобы окошко с адресом оказалось разрезано пополам.

Адресат получит обе половинки и склеит их, ничего не пропадёт. А вот сортировщик, который смотрит на каждое письмо мельком, возможно, не сумеет прочитать адрес целиком. Запомните эту картинку: в конце выпуска мы увидим её на настоящих пакетах, с настоящими байтами.

Разрезанный конверт: окошко пополам Отправитель режет конверт так, что окошко с адресом оказывается разрезано пополам; сортировщик, который смотрит мельком, видит половинки по отдельности и, возможно, не прочтёт адрес целиком, а получатель склеивает обе половинки, и ничего не пропадает; справа ключ аналогии: письмо это пакет, окошко с адресом имя сайта, сортировщик наблюдатель, ящик сервер. 1. Отправитель режет конверт 2. Сортировщик смотрит мельком 3. Получатель склеивает Сортировщикбыстро, мельком Чёрная, 13 окошко разрезано пополам Чёрная, 13 Чёрная, 13 адрес целиком не прочитать (возможно) Чёрная, 13 склеено: ничего не пропало аналогия: что есть что письмо=пакет окошко с адресом=имя сайта сортировщик=наблюдатель ящик=сервер

Итак, у нас две роли. Сортировщик быстрый: он смотрит в окошко и решает по адресу. Получатель никуда не спешит и собирает письмо целиком. Вся наша серия о том, как использовать разницу между ними. В настоящей сети наблюдатель читает чуть глубже, чем окошко, и об этом дальше.

Пакет, подробно

Теперь перенесём эту картину в сеть. Письмо превратится в пакет.

Что такое пакет? Когда браузер отправляет запрос, он не посылает его одним куском. Каналы связи общие, на них одновременно работают миллионы устройств, и один огромный кусок данных занимал бы канал надолго. Поэтому данные режут на порции, и каждая порция упаковывается в свой конверт и отправляется в путь отдельно. Эта порция вместе с конвертом и называется пакетом. Если быть точным, в протоколе TCP такую порцию называют сегментом, а в протоколе IP датаграммой, но мы для простоты везде говорим «пакет».

Посмотрим на настоящий пакет из нашей лаборатории. Это один пакет длиной триста шестнадцать байт. У него две части: конверт, который в сетевой терминологии называется заголовком, и содержимое, которое называется полезной нагрузкой. В нашем пакете заголовок занимает шестьдесят шесть байт, а нагрузка двести пятьдесят. Заголовок сам состоит из слоёв: четырнадцать байт для соседнего устройства, двадцать байт для сети в целом и тридцать два байта для соединения.

Что лежит в этих слоях? В сетевом слое, это двадцать байт, записано, от кого и кому. Адрес отправителя десять точка один точка ноль точка один, адрес получателя десять точка два точка ноль точка два, в шестнадцатеричном виде это ноль а, ноль два, ноль ноль, ноль два. Там же записано, сколько байт во всём пакете, триста два без первого слоя, и число, которое называется временем жизни. У нашего пакета оно шестьдесят четыре.

В слое соединения записаны два номера порта. Адрес выбирает устройство, как номер дома, а порт выбирает программу на нём, как номер квартиры. Порт отправителя у нас тридцать девять тысяч двести двадцать, это случайное окно, которое браузер открыл для этого разговора. Порт получателя четыреста сорок три: так принято на сайтах, работающих по защищённому протоколу. Там же записан порядковый номер первого байта нагрузки, но о нём мы поговорим чуть позже.

Пакет изнутри: 316 байт Настоящий пакет из лаборатории длиной 316 байт состоит из заголовка в 66 байт (Ethernet 14, IP 20, TCP 32) и полезной нагрузки в 250 байт; в IP-заголовке записаны версия 4, длина 302, время жизни 64, протокол 6 (TCP), отправитель 10.1.0.1 и получатель 10.2.0.2; в TCP-заголовке порт отправителя 39220, порт получателя 443 и флаги PSH+ACK. лаборатория: один пакет с запросом, 316 байт 14 20 32 250 байт данных заголовок: 66 байт полезная нагрузка: 250 байт 0143466315 номера байтов в кадре Ethernet, 14 байт: для соседнего устройства IP, 20 байт: для сети в целом (от кого и кому) TCP, 32 байта: для соединения (порты) данные, 250 байт: сам запрос IP-заголовок, 20 байт, в шестнадцатеричном виде 4500012efa05400040062bbf0a0100010a020002 45версия 4 012eдлина пакета 302 40время жизни 64 06протокол 6 = TCP 0a010001отправитель 10.1.0.1 0a020002получатель 10.2.0.2 TCP-заголовок, 32 байта: порты, флаги, окно, опции 99 3401 bb…1800 3f…опции: метки времениномерподтв. 99 34порт отправителя 39220 01 bbпорт получателя 443 18флаги PSH+ACK (0x18) 00 3fокно 63

Теперь о размере. В обычных сетях сетевой кадр ограничен примерно полутора тысячами байт, точная цифра зависит от оборудования. Наш запрос короткий, двести пятьдесят байт, и поэтому он уместился в один пакет. А длинный запрос режется на несколько пакетов, и каждый едет по сети самостоятельно. Роутер решает, куда переслать каждый пакет, по его адресу и без памяти о предыдущих. Поэтому два соседних пакета могут поехать разными дорогами, прибыть в другом порядке, а один из них может потеряться. Окончательно запрос собирается у получателя.

Теперь о тех, кто возит пакеты. Роутер, или маршрутизатор, это устройство, которое соединяет несколько сетей и пересылает между ними пакеты. Получив пакет, он читает адрес получателя, находит в своей таблице маршрутов подходящую запись, решает, в какую сторону передать, уменьшает время жизни на единицу и передаёт. Это его главная работа. У вас дома это коробочка, которая обычно совмещает роутер с точкой Wi-Fi, а у оператора, то есть у компании, которая подключает вас к интернету, и которую ещё называют провайдером, это мощные шкафы в машинных залах. Принцип тот же.

Давайте проследим за нашим пакетом. В лаборатории мы снимали его в четырёх точках. Вот он выходит из клиента: время ноль, время жизни шестьдесят четыре. Через две микросекунды он входит в роутер, время жизни всё ещё шестьдесят четыре. Через пять микросекунд выходит из роутера, и время жизни теперь шестьдесят три: роутер вычел единицу. Через шесть микросекунд пакет достигает сервера, неизменный, те же триста шестнадцать байт. Весь путь занял шесть миллионных долей секунды.

Путь пакета в четырёх точках Один и тот же пакет в 316 байт снят в четырёх точках: c0 при выходе из клиента в момент 0,000 мс с временем жизни 64, r0 при входе в роутер через 0,002 мс с временем жизни 64, r1 при выходе из роутера через 0,005 мс с временем жизни 63 и s0 у сервера через 0,006 мс с временем жизни 63; роутер вычел единицу, весь путь занял шесть микросекунд. лаборатория: один пакет, четыре точки съёма Клиент10.1.0.1 Роутерпересылает по адресу Сервер10.2.0.2 c0выходит из клиента0,000 мсTTL 64 r0входит в роутер+0,002 мсTTL 64 r1выходит из роутера+0,005 мсTTL 63 s0достигает сервера+0,006 мсTTL 63 здесь мог бы стоять наблюдатель (модель) роутер: TTL −1 316 байт весь путь: 0,006 мс, это 6 микросекунд Размер тот же, 316 байт; роутер только вычел единицу из времени жизни (TTL).

И последнее слово: сервер. Сервер это программа, которая принимает соединения, и компьютер, на котором она работает. Сайт может жить на одном сервере, а может на многих за балансировщиком. Сервер принимает пакеты, собирает из них запрос, понимает его и отвечает.

В настоящей сети дорога длиннее. Сначала домашний роутер. Потом сеть провайдера. Потом несколько роутеров в интернете, у каждого своя работа и свой хозяин. И наконец сервер сайта. А если на этом пути стоит ещё кто-то, кому нужно решать, пропускать ли пакет, то он оказывается в положении нашего сортировщика.

Итак, запрос превращается в пакеты: порции данных в конвертах с адресом. В нашем примере один пакет в триста шестнадцать байт, из них шестьдесят шесть заголовок и двести пятьдесят нагрузка, прошёл от клиента к серверу за шесть микросекунд, и роутер по дороге вычел единицу из времени жизни. В настоящей сети пакеты едут через роутеры провайдера и интернета, и на этом пути может стоять наблюдатель.

Сортировщик на пути: ТСПУ как модель

Где же в этой цепочке сортировщик?

У российских операторов связи он стоит в сети провайдера. Оборудование называется ТСПУ: технические средства противодействия угрозам. Для нашей истории это и есть сортировщик.

Что такое ТСПУ? Это название целой системы, а не одной программы. В открытых источниках основным производителем называют компанию РДП точка ру, а настраивают и обслуживают оборудование, по этим же описаниям, специалисты Роскомнадзора. По описанию производителя, это серийные серверы на процессорах архитектуры икс восемьдесят шесть. Устанавливают их в сетях операторов, то есть у тех самых компаний, что подключают вас к интернету. У оборудования есть правила: какие имена, адреса или протоколы нужно пропускать, а с какими что-то делать. Оно сверяет с этими правилами то, что видит в пакетах.

Где на пути пакета стоит ТСПУ Путь пакета от клиента через домашний роутер и сеть провайдера, где по открытым описаниям стоит оборудование ТСПУ (в нашей истории модель), через роутеры интернета к серверу; ниже что известно об этом оборудовании по открытым описаниям и что публично не известно. Клиентваш компьютер Роутеру вас дома Провайдерсеть оператора Роутерыинтернета Серверсайт ТСПУмодель стоит в сети оператора Пакет идёт слева направо; ТСПУ стоит у него на пути. В этой серии это модель. По открытым описаниям производитель в источниках: РДП.РУ серийные серверы x86 (по описанию производителя) правила: какие имена, адреса, протоколы пропускать исследования: работает на пути трафика (пересказ) Публично не известно режим у оператора: в линии или на копии как оборудование собирает пакеты одинаково ли оно работает у всех что включено на каждом блоке паспорт производителя, одна модель: до 2,3 млн новых соединений в секунду (не проверено)

Где именно оно стоит, имеет значение, и тут есть два принципиально разных способа. «В линии» означает, что весь трафик физически идёт через устройство, как поток машин через шлагбаум. Оно может задержать или остановить любой пакет. «На копии» означает, что трафик едет мимо, а устройству отдают только копию, как запись с камеры. Остановить настоящий пакет оно уже не может, но может отправить свой собственный, и если тот добежит раньше настоящего и подойдёт по номерам, получатель может его принять.

В линии и на копии Две схемы подряд. В линии: весь трафик идёт через устройство, как через шлагбаум, и оно может остановить любой пакет. На копии: настоящие пакеты едут мимо, устройству отдают только копию; остановить пакет оно уже не может, но может отправить свой, и если тот придёт раньше и подойдёт по номерам, получатель может его принять. В линии: как шлагбаумКлиентСерверТСПУ (модель)на пути трафика стоп Весь трафик идёт через устройство: оно может задержать или остановить любой пакет. 1 2 3 На копии: как камерасхема, скорости условныеКлиентСерверТСПУ (модель)смотрит копиюкопиясвой пакет Настоящий пакет остановить нельзя, но можно отправить свой. Придёт раньше и подойдёт по номерам: получатель может его принять. 1

Какой способ у ТСПУ? В открытых исследованиях его описывают как работающее на пути трафика, то есть в линии, а производитель предлагает оба варианта. Как именно оборудование включено у конкретного оператора, публично не известно. Закон обязывает операторов пропускать трафик через ТСПУ, а за обход этого оборудования с первого января две тысячи двадцать третьего года предусмотрена ответственность.

Трафика через такую коробку идёт очень много. В таблице на wiki точка zapret точка moe для одной из моделей указано до двух и трёх десятых миллиона новых соединений в секунду. Это цифра из описания производителя, мы её сами не проверяли. Но даже если она завышена, порядок ясен: на каждое соединение у оборудования считанные мгновения. Совсем как у сортировщика на ленте.

Теперь важная оговорка. Как именно устроена конкретная коробка у конкретного оператора, мы не знаем. Как она собирает пакеты. Одинаково ли работает у всех. Что именно включено на каждом блоке. Открытые описания об этом молчат или расходятся между собой.

Поэтому в этой серии ТСПУ это модель. Мы разбираем, что такое оборудование может видеть технически, и не выдаём догадки за факты. Всё, что проверено, мы так и назовём: проверено в коде или измерено в нашей лаборатории.

Итак, на пути пакетов, в сети провайдера, стоит оборудование ТСПУ. Оно может стоять в линии, и тогда видит и останавливает весь трафик, или на копии, и тогда только наблюдает и подсовывает свои пакеты. По открытым описаниям, у него считанные мгновения на каждое соединение. Как оно устроено у конкретного оператора, мы не знаем, поэтому дальше работаем с моделью.

Повтор и что оборудование может сделать

Коротко напомним, где мы. Запрос режется на пакеты, пакеты едут по сети к серверу, а на их пути, в сети провайдера, по нашей модели стоит быстрый сортировщик, оборудование ТСПУ.

Что оно делает с пакетами, когда решило, что сайт в списке? Открытые описания называют несколько действий. Мы покажем каждое на примере. Для этого в нашей лаборатории мы поставили в роутер игрушечный инспектор. Он не ТСПУ. Он очень простой: смотрит на каждый пакет по отдельности, и если внутри лежит имя сайта www.example.com, делает то, что мы ему скажем.

Первое действие: выбросить пакеты. Пакет получают и молча отбрасывают, никого не предупреждая. Что видит клиент? Он отправил запрос в полторы миллисекунды. Подтверждения нет. Через двести двенадцать миллисекунд он отправляет тот же пакет ещё раз. Подтверждения снова нет. Через четыреста двадцать восемь миллисекунд третья попытка, через восемьсот сорок восемь четвёртая, через тысячу шестьсот семьдесят восемь пятая. Паузы растут, потому что так устроен протокол: чем дольше нет ответа, тем реже он повторяет. А сервер всё это время не получил ни одного байта. Браузер ждёт и в конце концов может сдаться по таймауту, то есть по истечении времени ожидания. Здесь два разных таймера: повторы с растущими паузами ведёт сама операционная система, а предел ожидания страницы задаёт браузер. Для вас это вечно крутящееся колёсико.

Выброс пакетов: повторы клиента Опыт лаборатории: игрушечный инспектор в роутере молча выбрасывает пакет с именем www.example.com; клиент повторяет отправку через 1,6; 212; 428; 848 и 1678 мс с растущими паузами, каждая попытка упирается в роутер, а сервер получает 0 байт. Выброс: подтверждения нет, клиент повторяет отправкувремя, мсКлиентпауза, мсРоутермодель инспектораСервер 11,6 2212≈210 3428≈216 4848≈420 51678≈830 получил 0 байт: ни одного пакета Повторы с растущими паузами ведёт операционная система клиента. Браузер ждёт и в конце концов может сдаться по таймауту.

Второе действие: оборвать соединение. Внутри соединения ходят не только данные, но и служебные признаки, которыми управляют самим соединением. Один из них называется сброс, по-английски RST, и означает он «закрываю соединение немедленно». В нашем опыте клиент отправляет запрос, и через одну сотую миллисекунды получает пакет со сбросом, как будто от сервера. Ошибка «соединение сброшено» появляется мгновенно. Но обратите внимание на одну деталь: у подделки время жизни шестьдесят четыре, а у настоящих пакетов сервера шестьдесят три. Подделку породил роутер, и по этому признаку её можно отличить. Получатель обрывает соединение, если номер в сбросе подходит, и сообщает об этом программе как об ошибке.

Сброс соединения: пакет RST Опыт лаборатории: клиент отправляет 250 байт, игрушечный инспектор в роутере не пропускает их дальше и через 0,01 мс присылает клиенту пакет RST как будто от сервера, с TTL 64 (у настоящих пакетов сервера TTL 63); клиент сразу получает ошибку, сервер получает 0 байт. Клиентотправил запросРоутермодель инспектораСерверпрограмма-приёмник данные, 250 байт дальше не идут RST «от сервера», TTL 64 0,01 мс Ошибка сразу: соединение сброшеноConnection reset by peer получил 0 байт подделку породил роутер: TTL 64 настоящие пакеты сервера: TTL 63 Инспектор смотрит каждый пакет отдельно. Это не ТСПУ, а игрушечная модель.

Третье действие: перенаправить. Если запрос не зашифрован, он читается открыто, и тогда вместо ответа сайта клиент может получить ответ, который по смыслу значит «идите на другой адрес». Например, статус триста два, «найдено», и строка с новым адресом. Браузер послушно идёт и показывает вам страницу-заглушку. Это действие, по описанию производителя, умеет оборудование. Мы его в лаборатории не воспроизводили.

Четвёртое действие: замедлить. Оборудование не обрывает соединение, а ограничивает скорость, например отбрасывая часть пакетов. Страница не ломается совсем, но грузится мучительно медленно. В одном задокументированном случае исследователи измерили: в две тысячи двадцать первом году доступ к Твиттеру в России замедлили примерно до ста тридцати или ста пятидесяти килобит в секунду, и замедление включалось по имени сайта.

Долгое зависание, быстрая ошибка, заглушка и медленная загрузка выглядят по-разному, и по симптому можно примерно угадать, какое действие вы видите. Но только примерно: те же симптомы дают и обычные сбои.

Итак, оборудование может выбросить пакеты, и тогда клиент повторяет их с растущими паузами, а страница зависает по таймауту. Может отправить сброс, и тогда ошибка приходит почти мгновенно. Может перенаправить на заглушку или замедлить загрузку. По симптому действие можно угадать лишь приблизительно.

Что видит роутер, а что ТСПУ

Теперь главный вопрос этой части: что наблюдатель видит? Сравним его с обычным роутером на нашем настоящем пакете.

Помните триста шестнадцать байт? Роутеру нужны только самые первые. Сетевой слой начинается с четырнадцатого байта, а адрес получателя лежит в четырёх байтах, с тридцатого по тридцать третий: ноль а, ноль два, ноль ноль, ноль два, то есть десять точка два точка ноль точка два. По этим четырём байтам роутер выбирает дорогу и пересылает пакет. Остальные двести восемьдесят с лишним байт ему для пересылки не нужны.

Что нужно роутеру Пакет из лаборатории в 316 байт (Ethernet 14, IP 20, TCP 32, данные 250): чтобы переслать пакет, роутеру нужны только четыре байта адреса получателя 0a 02 00 02 (10.2.0.2) в кадре с 30 по 33, остальные 312 байт для пересылки не нужны. Один пакет из лаборатории: 316 байт, номера байтов с нуляEthIPTCPданные: 250 байт0143466315142032250 0a020002= 10.2.0.2: адрес получателябайты 30..33 кадра Роутер: пересылаювыбирает дорогу по адресу По этим 4 байтам из 316 роутер выбирает дорогу. Остальные 312 байт ему для пересылки не нужны.

А что в остальных байтах? Во второй части заголовка номера порта и порядковые номера. Они нужны получателю, чтобы собрать пакеты в правильной последовательности. А в самом конце лежит нагрузка. Чтобы понять, что в ней можно увидеть, нужно знать слово «шифрование».

Большинство сайтов сегодня работают по протоколу HTTPS. Это обычный обмен запросами и ответами, только завёрнутый в шифрование, которое называется TLS. Когда шифрованный канал установлен, содержимое страницы видят только браузер и сервер, а посредник на пути видит адреса, порты, размеры пакетов и время, но не сам текст страницы. А ещё он видит то, что открыто в первом сообщении, о котором сейчас речь.

Но канал нужно сначала установить. И первые сообщения, которыми браузер и сервер договариваются о шифровании, идут ещё открытым текстом. Первое называется ClientHello, «привет от клиента». В нашем пакете оно занимает все двести пятьдесят байт нагрузки. Первые пять байт это запись: шестнадцать означает «рукопожатие», ноль три ноль один версия, ноль ноль эф пять длина, двести сорок пять. Дальше ноль один: это и есть ClientHello. Среди расширений есть одно, где браузер называет имя сайта, с которым хочет говорить. Оно начинается с байтов ноль ноль, ноль ноль, длина двадцать, и дальше пятнадцать байт: семьдесят семь, семьдесят семь, семьдесят семь, два е, шестьдесят пять и так далее. В текстовом виде это www.example.com. Эти пятнадцать байт лежат в нагрузке с девяносто седьмого по сто одиннадцатый.

Что видит DPI в первом сообщении Те же 316 байт: DPI разбирает начало данных (запись TLS 16 03 01 00 f5, ClientHello 01 00 00 f1, расширение имени), находит 15 байт имени www.example.com (в данных 97..111, в кадре 163..177) и сверяет их со списком; после рукопожатия содержимое страницы зашифровано. Те же 316 байт: DPI заглядывает в данныеEthIPTCPданные: 250 байт0143466315 163..177 Начало данных по байтам (в скобках номера байтов данных, с нуля): 16030100f5запись: тип 16, версия 03 01, длина 245 (0..4) 010000f1ClientHello: тип 01, длина 241 (5..8) 00000014001200000fрасширение «имя сайта», длина имени 15 (88..96) 7777772e6578616d706c652e636f6d= www.example.com, 15 байт (97..111) 15 байт именикадр 163..177 сверка со спискомправила модели если имя в спискеобрыв, замедление, перенаправление После рукопожатия: шифрование (TLS)содержимое страницы видно только браузеру и серверу; посредник видит адреса, порты, размеры и время

Это имя технически называется SNI, от английского Server Name Indication, «указание имени сервера». Подробнее об этом в следующем выпуске. Оно открыто не случайно: на одном адресе может жить множество сайтов, и серверу нужно сразу узнать, с каким вы хотите говорить, чтобы показать правильный сертификат. Браузер обычно его называет. Существует способ зашифровать и это имя, но он включён далеко не везде.

Оборудование для глубокого разбора пакетов заглядывает глубже. Его называют DPI, от английского deep packet inspection, глубокая инспекция пакетов. Обычный роутер смотрит в основном на адреса, а иногда на порты. А DPI разбирает и содержимое: определяет протокол, часто по первым байтам, а иногда по нескольким пакетам, читает имена, вычисляет отпечатки клиента, например по параметрам шифрования, а в некоторых системах наблюдает и за поведением соединения. Такие устройства бывают не только для блокировок: ими пользуются корпоративные межсетевые экраны, антивирусные шлюзы, системы учёта трафика. В этой серии слово DPI означает любое устройство, которое разбирает пакеты глубже заголовка, а слово ТСПУ означает российскую систему такого типа.

В нашей модели инспектор читает именно те пятнадцать байт и сверяет их со своим списком. В описанных исследованиях решение принимается по имени сайта, хотя бывает и по адресу сервера, это тоже документировано.

Имя в списке, и соединение обрывается, замедляется или перенаправляется. Это общая картина. Сколько пакетов оборудование собирает вместе, насколько внимательно и каждый ли раз, зависит от конкретной модели. Открытые описания называют свои цифры, но сами пишут, что это авторские оценки.

Итак, роутеру нужен только адрес получателя, четыре байта из тридцати. DPI заглядывает в данные: он распознаёт протокол и находит имя сайта, пятнадцать байт внутри первого открытого сообщения. В описанных случаях именно имя становится поводом оборвать соединение, а бывает и адрес сервера. Насколько глубоко и внимательно оборудование читает, зависит от модели.

Почему против наблюдателя вообще возможны приёмы

Мы выяснили, что наблюдатель торопится и читает данные. Теперь вопрос, ради которого всё затевалось: почему с этим вообще можно что-то сделать?

Ответ в том, что сеть по своей природе неряшлива. Пакеты теряются, приходят в другом порядке, режутся на части. Это нормально, и поэтому сервер устроен терпеливо. Весь ваш запрос для сервера это поток байтов внутри одного соединения, и у каждого байта в потоке есть порядковый номер. В каждом пакете записано, с какого номера начинаются его данные. Наш запрос это байты с первого по двести пятидесятый. Если он поедет двумя пакетами, в одном будут байты с первого по сто четвёртый, в другом со сто пятого по двести пятидесятый, и сервер по номерам поставит их на места. Если пакеты придут в обратном порядке, он подождёт и поставит.

Давайте это увидим. В нашей лаборатории мы включили zapret2 с правилом: разрезать запрос посередине второго по старшинству доменного имени, то есть посередине слова example. Вместо одного пакета в триста шестнадцать байт ушли два: на сто семьдесят и на двести двенадцать байт кадра. Первый несёт сто четыре байта нагрузки и кончается на «www.exa». Второй, через четыре миллисекунды, несёт сто сорок шесть байт и начинается с «mple.com». Сервер получил оба, поставил по номерам и собрал все двести пятьдесят байт без единого отличия от оригинала.

Один запрос, разрезанный на два пакета Запрос в 250 байт данных уходит двумя пакетами (кадры 170 и 212 байт, байты 1–104 и 105–250, пауза 3,972 мс) с разрезом посередине «www.exa|mple.com», и сервер собирает по номерам все 250 байт. было: один пакет, 250 байт данных (лаборатория) 14 20 32 данные: 250 байт www.example.com · 97–111 Ethernet 14 + IP 20 + TCP 32 = 66 байткадр 316 байт разрез после байта 104 стало: два пакета (multisplit, pos=midsld) пакет 1: кадр 170 байт = 66 + 104заголовки 66байты 1–104 через 3,972 мс пакет 2: кадр 212 байт = 66 + 146заголовки 66байты 105–250 …www.exa mple.com… сервер байты 1–104 байты 105–250 собрал по номерам 250 байт, равные оригиналу

А теперь представьте инспектора, который, как наш игрушечный, смотрит на каждый пакет по отдельности. В первом он видит «www.exa». Во втором «mple.com». Ни то, ни другое не совпадает со списком, и он пропускает оба. Мы проверили это на настоящих пакетах дважды. Когда игрушечный инспектор выбрасывал обычный запрос, разрезанный запрос проходил, счётчик правила показывал ноль сработавших пакетов, а сервер получал все двести пятьдесят байт. Когда он отвечал сбросом, результат был тот же.

Игрушечный инспектор смотрит на каждый пакет отдельно Игрушечный инспектор (модель) читает каждый пакет отдельно: «www.exa» и «mple.com» не совпадают с именем, оба пакета проходят, а обычный запрос в одном пакете совпал бы и был бы выброшен или сброшен. Клиентzapret2 режет Игрушечный инспектормодель, а не ТСПУчитает пакеты по одному Сервер 250 байт что инспектор видитсовпало?что он делает «www.exa»пакет 1 из разрезанетпропускает «mple.com»пакет 2 из разрезанетпропускает для сравнения «www.example.com»обычный запросдавыбрасывает (m01) или сбрасывает (m03) Разрезанный запрос прошёл: счётчик правила 0, сервер получил 250 байт (опыты m02 и m04). Это модель: она смотрит на каждый пакет отдельно и ничего не собирает. пакет 1 пакет 2

Теперь сравним с настоящим наблюдателем. Чтобы прочитать имя сайта, которое лежит в начале запроса, ему нужно запрос дождаться, а если он разрезан на части, собрать его самому: запомнить первую часть, дождаться второй, сложить. Обычно это требует хранить состояние каждого соединения и тратить память и время. А времени, как мы помним, у оборудования мало. Умеет ли конкретное оборудование это делать, и всегда ли, мы не знаем.

Значит, возможна разница в поведении. Получатель, у которого есть время и номера байтов, соберёт запрос из частей по правилам своей системы. А наблюдатель, который торопится, может понять его иначе или не собрать вовсе. Мы говорим «может»: это гипотеза. Игрушечный инспектор подтвердил, что такое возможно в принципе. Но он очень простой, а настоящее оборудование мы проверить не можем.

Теперь назовём то, что мы ищем. Обход блокировки, или просто обход: это любое действие, после которого фильтр не срабатывает, а получатель всё равно получает ваш запрос и отвечает на него. Заметьте, чего в этом определении нет. Обход не взламывает шифрование и не подменяет адрес отправителя. Туннели и чужие серверы сюда тоже не входят. Он меняет то, как идёт ваш трафик: режет, переставляет пакеты, добавляет подделки, а иногда выбрасывает оригинал. И обход бывает успешным или нет: это зависит от оборудования на пути и меняется со временем.

Приёмов много, но их можно собрать в три семьи. Резать пакеты на части, как мы только что сделали. Менять порядок, в котором они едут. И подкладывать подделки, которые получатель выбросит, а сортировщик, возможно, примет за настоящие. Каждой семье в серии посвящено несколько выпусков.

Итак, сеть неряшлива, и получатель собирает запрос по номерам байтов, как бы он ни приехал. Наблюдатель, у которого мало времени, может понять тот же запрос иначе. В лаборатории игрушечный инспектор, смотрящий на каждый пакет отдельно, пропустил разрезанный запрос и выбросил обычный. Помогает ли это против настоящего оборудования, проверяется, а не обещается.

Повтор и что такое zapret2

Коротко напомним. Запрос режется на пакеты. На их пути стоит быстрый наблюдатель, который читает имя сайта. А получатель терпеливо собирает запрос по номерам, как бы он ни приехал. Против этого и придуманы приёмы обхода.

Теперь о том, кто эти приёмы применяет.

zapret2 это программа, которая работает на вашем компьютере или роутере, на пути пакетов, между браузером и сетью. Операционная система передаёт ей пакеты, она смотрит на каждый и решает: пропустить как есть, изменить или выбросить. Это называется перехватом. В нашей лаборатории он включается одной строкой правила. Смотрите: в очередь программы попадают пакеты на порты восемьдесят и четыреста сорок три, и только те, у которых номер в соединении от первого до двенадцатого. Остальные идут мимо. Так сказано в примере из документации, и это только пример для экспериментов, но он хорошо показывает идею: самое важное лежит в начале соединения.

Перехват: какие пакеты попадают в zapret2 Правило перехвата из документации отправляет в zapret2 только пакеты на порты 80 и 443 с номерами 1–12 в соединении, остальные идут мимо, а по каждому перехваченному пакету решение PASS, MODIFY или DROP. Браузерваш запрос zapret2на вашем устройстве Сетьи сайт за ней правило перехвата tcp dport {80,443} ct original packets 1-12 queue num 200 bypassпример из документации порты 80 и 443 первые 12 пакетов в очередь программы пакеты одного соединения, клиент → сервер, по порядку 1 2 3 4 5 6 7 8 9 10 11 12 13 14 … в очередь программы: решает zapret2 идут мимо решение по каждому перехваченному пакету PASSпропустить как есть MODIFYизменить пакет DROPвыбросить

Что программа делает с перехваченными пакетами, решает стратегия. Стратегия это сценарий воздействия на пакеты. Он собирается из вызовов функций, и вот как это выглядит в нашем опыте: в команде написано «lua-desync равно multisplit, двоеточие, pos равно midsld». Это значит: вызвать функцию multisplit и передать ей параметр, где резать, посередине домена второго уровня. Эта функция написана на языке Lua. Lua это компактный язык сценариев, который встраивается в другие программы как библиотека, так что поведение можно менять, не пересобирая саму программу. Ядро на языке Си перехватывает и разбирает пакеты, а то, как их менять, решают функции на Lua.

Стратегия: команда и функция на Lua Командная строка опыта разобрана по словам: ядро на Си перехватывает пакет, а Lua-функция multisplit с параметром pos=midsld режет его на два пакета в 104 и 146 байт данных. команда из нашего опыта --payload=tls_client_hello --lua-desync=multisplit:pos=midsld для первого сообщения TLS вызвать функцию её имя (Lua) параметр: где резать midsld: середина домена второго уровня Функции написаны на Lua:стратегию можно менятьбез пересборки программы что происходит с одним пакетом Пакеткадр 316 байт Ядро (Си)перехват и разбор Функция multisplit (Lua)решает, как менять Два пакета104 + 146 байт Ядро на Си перехватывает и разбирает пакеты, а как их менять решают функции на Lua. Здесь: резать посередине слова example, по байтам 1–104 и 105–250.

Главное отличие второй версии как раз в этом. В первой стратегии были зашиты в код на Си, и написать новую было непросто: нужен был Си, квалификация и много времени. Цель второй версии такова: чтобы стратегию мог написать любой, кто разбирается в сетях и умеет программировать на базовом уровне. А подключаются стратегии как Lua-файлы, без пересборки программы.

Ей не нужен VPN и не нужны чужие серверы. Что такое VPN? Это виртуальная частная сеть. Вы устанавливаете зашифрованный туннель до стороннего сервера, и ваш трафик, обычно весь, идёт внутри туннеля, а в интернет выходит уже с адреса того сервера. Наблюдатель на пути видит внешнюю оболочку туннеля: адрес VPN-сервера, сам факт туннеля и нередко его протокол. Содержимое и конечные адреса он не видит, но сам туннель может распознать и заблокировать. Цена такой схемы в том, что нужен чужой сервер, ему приходится доверять, а трафик идёт кружным путём. У zapret2 всё иначе: трафик идёт прямо к сайту, адрес в пакетах остаётся вашим, а программа меняет сами пакеты по дороге: режет, переставляет, добавляет подделки, иногда выбрасывает оригинал.

Проект нацелен прежде всего на роутеры с OpenWrt. Это свободная операционная система на основе Linux для роутеров и других встраиваемых устройств, она заменяет заводскую прошивку. Кроме роутеров с OpenWrt, программа работает на обычном Linux, на FreeBSD, на OpenBSD и на Windows. Под macOS, по словам автора, не поддерживается и вряд ли будет, из-за технических причин.

Автор проекта прямо пишет, что это не готовое решение для чайников. Это инструмент для тех, кто хочет разобраться. Поэтому наша серия для сетевых инженеров.

Итак, zapret2 стоит между браузером и сетью на вашем устройстве. Он перехватывает пакеты, например, только первые двенадцать пакетов соединения, и по решению стратегии пропускает, меняет или выбрасывает их. Стратегии собираются из функций на Lua. Ему не нужен VPN и чужие серверы, и это инструмент для тех, кто хочет разобраться, а не готовое решение в одну кнопку.

Все четыре опыта лаборатории

Покажем, как всё это мы проверили.

Лаборатория это три узла в изолированных сетевых пространствах: клиент, роутер и сервер, соединённые виртуальными кабелями. Настоящего ТСПУ там нет, а вместо него в роутере стоит игрушечный инспектор. Мы записывали каждый пакет. Такая запись называется захватом пакетов: как видеорегистратор, который снимает всё, что проходит через точку сети, а потом можно разглядывать запись покадрово. Мы снимали в четырёх точках пути: у клиента, при входе в роутер, при выходе из него и у сервера. Всего мы провели девяносто шесть экспериментов, из них четыре, о которых мы сегодня рассказывали.

Лаборатория: три узла и четыре точки съёмки Лаборатория: клиент 10.1.0.1, роутер и сервер 10.2.0.2 в изолированных пространствах, пакет в 316 байт записан в четырёх точках c0, r0, r1, s0 (0,000 / +0,002 / +0,005 / +0,006 мс, TTL 64, 64, 63, 63). лаборатория: три узла, четыре точки съёмки точка захвата пакетов Клиент10.1.0.1 Роутер Сервер10.2.0.2 Инспектор-модельв опытах m01–m04 каждый узел в своём изолированном сетевом пространстве, кабели виртуальные c0 c0: из клиентавремя0,000 мсTTL64 r0 r0: в роутервремя+0,002 мсTTL64 r1 r1: из роутеравремя+0,005 мсTTL63 (−1) s0 s0: на сервервремя+0,006 мсTTL63 пакет Роутер отнял единицу из TTL, пакет не менялся; на весь путь ушло 6 микросекунд. Замер: обычный запрос без разреза, опыт t00_baseline, тот же пакет в 316 байт во всех четырёх точках.

Опыт первый. Игрушечный инспектор выбрасывает пакеты с именем сайта. Клиент отправляет обычный запрос. Результат: сервер получил ноль байт, клиент повторяет отправку с растущими паузами и не получает ответа.

Опыт второй. Тот же инспектор, но на клиенте работает zapret2 и режет запрос посередине слова example. Результат: правило инспектора не сработало ни разу, сервер получил двести пятьдесят байт и ответил.

Опыт третий. Инспектор теперь отвечает сбросом. Обычный запрос. Результат: клиент через одну сотую миллисекунды получает сброс и сразу видит ошибку, сервер получил ноль байт.

Опыт четвёртый. Инспектор со сбросом, а на клиенте zapret2 с тем же разрезом. Результат: сброса нет, сервер получил все двести пятьдесят байт.

Четыре опыта лаборатории Таблица четырёх опытов m01–m04: обычный запрос выброшен или сброшен и не дошёл до сервера (0 байт), а запрос, разрезанный на 104 и 146 байт, дошёл целиком (250 байт) в обоих случаях. четыре опыта лаборатории обычный запросодин пакет, 250 байтразрезанный запрос104 + 146 байт (multisplit) инспекторвыбрасываетпакет инспекторотвечаетсбросом (RST) m01не дошёлклиент: повторяет отправку, ответа нетповторы в 212, 428, 848, 1678 мссервер получил: 0 байтсчётчик правила: 6 m02дошёл до сервераклиент: сервер ответилсервер получил: 250 байт (104 + 146)счётчик правила: 0 m03не дошёлклиент: сброс через 0,01 мс, ошибка сразусервер получил: 0 байт m04дошёл до сервераклиент: сброса нетсервер получил: 250 байтсчётчик правила: 0 Инспектор смотрит на каждый пакет отдельно.Против настоящего оборудования это не проверялось. Показаны 4 опыта из 96 опытов лаборатории.

Это ещё не результат против ТСПУ, и мы сразу хотим быть честными. Игрушечный инспектор смотрит на каждый пакет по отдельности и ничего не собирает. Если бы он собирал запрос, разрез ему бы не помешал. Реальное оборудование мы проверить не можем и обещать ничего не будем. Мы разбираем механику.

Итак, в лаборатории с игрушечным инспектором, который смотрит на каждый пакет отдельно, обычный запрос был выброшен или сброшен, а запрос, разрезанный посередине слова example на два пакета с данными в сто четыре и сто сорок шесть байт, дошёл до сервера целиком. Против настоящего оборудования это не проверялось.

Как мы будем это изучать

Сразу скажу, чего в серии не будет. Не будет готовых строчек, которые вы скопируете, чтобы всё заработало. Стратегии, которые работали вчера, завтра могут перестать, потому что меняется сам DPI и способы обхода: автор проекта пишет об этом прямо. Поэтому мы учимся понимать механику: тогда вы сможете сами понять, почему стратегия работает, и придумать свою.

Как устроена серия. Часть первая, три выпуска: идея, что видит DPI и как zapret2 перехватывает пакеты. Часть вторая внутри программы: как она разбирает пакеты, помнит соединения, выбирает правила и запускает стратегии. Часть третья сами приёмы: резать, перемешивать, подделывать. А потом инструменты вокруг.

План серии обновился

В видео этот абзац рассказывает первоначальный план из четырёх частей. Порядок изменили: сначала всё, что нужно для обхода, потом устройство программы для тех, кому нужно больше. Актуальный порядок такой.

  1. «Письмо в сортировочном центре» (это видео), 2. «Что видит наблюдатель», 3. «Читаем командную строку zapret2», 4. «Где резать: метки».
  2. Сами приёмы: «multisplit: резать на части», «Перемешать: disorder», «Фейк и его условия», «Резать и подделывать вместе», «Фокусы рукопожатия», «Другие слои».
  3. Инструменты: «Читаем и отлаживаем стратегии», затем выпуски про blockcheck2, автоматическую ротацию стратегий, установку и запуск, обфускацию.
  4. Под капотом: «Внутри программы», «От байтов к таблице», «Память о соединении», «Тип нагрузки и имя сайта», «Профили: как программа выбирает», «Lua внутри программы», «Сборка и повторный проигрыш».

Каждый выпуск начинается с короткого повтора, так что можно смотреть с любого места. Сложное мы будем добавлять слоями: сначала картинка, потом слово, потом детали. И каждое утверждение с пометкой, откуда оно: из кода, из лаборатории или из общих знаний. Как сегодня с нашим игрушечным инспектором: мы называли его игрушечным, потому что он модель.

А там, где речь о коде, мы будем открывать сам код и читать его, а не пересказывать.

Слои и источники утверждений Как устроена серия: каждый выпуск начинается с короткого повтора; сложное добавляется слоями (картинка, слово, детали; пример: письмо на ленте, слово «пакет», 316 байт = 14 + 20 + 32 + 250); у каждого утверждения пометка источника (код, лаборатория или общие знания); где речь о коде, открывается сам код: lua/zapret-antidpi.lua, строка 483, function multisplit(ctx, desync). в начале каждого выпуска короткий повторпоэтому смотреть можно с любого места сложное добавляем слоями (пример) 1. картинкаписьма едут по ленте 2. словоэтому письму даём имя: пакет 3. детали316 байт = 14 + 20 + 32 + 250Ethernet + IP + TCP + данные у каждого утверждения пометка: откуда оно (пример) из кодафункция multisplit:lua/zapret-antidpi.lua:483 из лабораторииTTL пакета до роутера 64,после роутера 63 из общих знанийпакеты могут терятьсяи приходить не по порядку где речь о коде: открываем сам код lua/zapret-antidpi.lua483function multisplit(ctx, desync) читаем его,а не пересказываем

Итак, готовых рецептов не будет, будет механика. Серия идёт слоями: сначала идея, потом устройство программы, потом сами приёмы, потом инструменты вокруг. Каждое утверждение помечено источником, а код мы читаем, а не пересказываем.

Итог выпуска

Подведём итог всего выпуска.

Запрос превращается в пакеты, как письма на ленте. Наш запрос в двести пятьдесят байт уехал одним пакетом в триста шестнадцать байт за шесть микросекунд.

В сети провайдера на их пути стоит оборудование ТСПУ. Мы считаем его сортировщиком, который торопится и читает глубже, чем обычный роутер: ему нужно пятнадцать байт с именем сайта.

zapret2 стоит на вашем устройстве и меняет то, как пакеты выглядят на этом пути, не прячась за чужими серверами. Разрезанный посередине слова example запрос прошёл мимо игрушечного инспектора.

Итог выпуска: три карточки Итог выпуска тремя карточками с теми же цифрами. Пакеты: запрос в 250 байт уехал одним пакетом в 316 байт (14 + 20 + 32 + 250) за шесть микросекунд, от 0,000 до 0,006 мс. ТСПУ как модель сортировщика: читает глубже обычного роутера, ему нужны 15 байт с именем сайта. zapret2: меняет вид пакетов на вашем устройстве; запрос разрезан на 104 и 146 байт и в лаборатории прошёл мимо игрушечного инспектора. итог выпуска: три карточки 1. Пакетыкак письма на ленте запрос 250 Бпакет 316 Б 14 + 20 + 32 + 250Ethernet + IP + TCP + данные в пути 6 микросекундc0 → s0: 0,000 → 0,006 мс 2. ТСПУ (модель)сортировщик на пути пакета данные запроса, 250 байт читает глубже обычного роутера:ему нужны 15 байтс именем сайта www.example.com 3. zapret2стоит на вашем устройстве тот же запрос, разрезанный104146 меняет вид пакетов на пути,не прячась за чужими серверами в лаборатории разрезанныйзапрос прошёл мимоигрушечного инспектора Против настоящего оборудования это не проверялось: ТСПУ здесь модель. Пакеты как письма. ТСПУ как сортировщик (модель). zapret2 меняет вид пакетов.

В следующем выпуске мы заглянем внутрь пакета и найдём, где в нём спрятано имя сайта. До встречи.

Анонс: что внутри пакета Анонс выпуска 02: пакет из лаборатории в 316 байт (Ethernet 14, IP 20, TCP 32, данные 250; не в масштабе), блок данных увеличен на всю ширину, внутри него отмечено место с 15 байтами имени сайта и вопрос, где именно оно спрятано; ответ даст выпуск 02. выпуск 02: заглянем внутрь пакета (кадр 316 байт, не в масштабе) Ethernet · 14 IP · 20 TCP · 32 данные · 250 байт байт 1байт 250 ? Где здесь 15 байт с именем сайта? Найдём в выпуске 02.

Итак, в нашей аналогии пакеты это письма, а в нашей модели ТСПУ это сортировщик на пути. zapret2 меняет вид пакетов. Дальше заглянем внутрь пакета.


🤖 Эти статьи открыты — можно обучать на них ИИ

При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование доступно в Forgejo: исходник этой заметки · скачать весь репозиторий одним zip-архивом.