Tuesday, October 23, 2012

​CDN, общие идеи

Это описание абстрактной реализации, 
не имеющей ничего общего с реальными реализациями.

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


Общая логика работы: 
  • при получения запроса от клиента ближайший узел к клиенту ищет сервер который является наиболее близким к исходному узлу назначения; 
  • после нахождения наилучшего пути, узел с первого уровня получает контент с конечного узла и генерирует хеш от данных и другие идентифицирующие контент данные и передает на третий уровень; 
  • если у третьего уровня нет подобных данных он запрашивает данные с первого уровня, через второй уровень который может быть пиринговой сетью; 
  • все данные при передаче должны быть сжаты и по возможности очищены от не критичных для результата данных, таких как переводы строчек и пробелы. Если возможно то и от описания изображений вида даты создания которые не критичны для пользователя; 
  • внутри сети передачи и на конечных узлах данных идентифицируются по описателям характерным для сжатого контента с сохранением изначальных характеристик - для последующей идентификации изменения исходных данных; 
  • на узлах первого уровня контент хранится также в исходном в виде - чтобы избежать вероятности коллизий хеш функции и позволяет перепроверять данные, при последующем получении подобных; 
  • при новом запросе клиента - делается только дополнительный запрос на первый уровень и если изменений нет, то передается оригинальный заголовок. Данные разбиваются на две части заголовки запроса и контент запроса. Что позволяет кешировать и передавать их отдельно. 

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

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

Thursday, October 11, 2012

CDN

​Идея относительно оптимизации обновления кеша в CDN(впрочем как и любого reverse proxy): можно запоминать кроме самого контента и максимального времени хранения с параметрами обновления (хеш и время обновления) еще время за которое контент был получен. И на основе количества запросов к контенту после первого получения делать для топового контента запрос перед окончанием времени хранения, как раз на время получение первого результата, дополнительный запрос для получения обновления контента. Перед этой операцией также анализировать эффективность данного решения: и для быстро генерируемого, контента который генерируется за время сравнимое с временем кеширования или редко запрашиваемого предварительный запросы не делать. Также можно на первый запрос после окончания времени кешированияно до окончания времени ожидания ответа на изначальный запрос, еще выдавать старый контент, если это время еще в пределах разумного.

Wednesday, October 3, 2012

Android прошивки

​Существуют общность возможно даже недостаток прошивок Android и стабильных версий дистрибутивов и в общем-то любых прошивок - используются старые версии библиотек. Но все же ближе к обычным прошивкам - так как после релиза не вносятся изменения в базовые компоненты. Возможно, что версия библиотек определяется как последняя стабильная версия на момент начала разработок, и основные изменения вносятся только во внутренние части продуктов, разрабатываемых внутри компании и как следствие представляющие наибольший интерес для компании разработчика.
Было бы удобно, если бы бекпортировали изменения в ядре и библиотеках связанных с безопасностью openssl, openvpn и тому подобное. И обновляли все библиотеки у которых не меняется внешний интерфейс, например libxml и bash и sudo. И прошивка для телефонов поддерживающих по каким-то причинам только версию 2.3.* с обновленными ssl библиотеками и браузером, была достаточно полезна. Так же было бы не неплохо иметь возможность устанавливать и обновлять все пользовательские приложения не относящиеся к базовой функциональности в виде пакетов, например обновлять браузер(не html движок)и телефонное приложение, а в базовой обновляющееся только с прошивкой: сервисы, виртуальная машина и все остальные части в отдельном обновляемом разделе, который можно перекрывать как сейчас, когда обновленные версии хранятся в отдельном разделе.
Результатом моей попытки по обновления компонентов которые собираются без проблем со старым abi без изменений в критических компонентах к которым привязаны бинарные библиотеки для поддержки аппаратуры можно посмотреть сдесь.

Saturday, August 18, 2012

iOS и Android


IPhone все же лучше чем Android, из-за дикого разнообразия устройств, даже если не учитывать разнообразие версий Apple очень строго контролирует свою экосистему, и новые устройства хоть и отстают технически по объему памяти и мощности процессора - всегда имеют четко продуманный дизайн и отличный экран и камеру. Благодаря строгому ограничению мощности и компиляции под аппаратуру в бинарном виде и попыткам исключить любые интерпретаторы и бессмысленное выполнение в фоне, они получили продукт который в основном не вызывает недовольства у пользователя своей заторможенностью, имея при этом далеко не передовые аппаратные средства. 

В Android выбран режим виртуальной машины широко распространенного языка Java что конечно дало возможность получить большое количество разработчиков, но добавило проблем с лицензией на использование и патентами на реализацию, которая внутренно не совместимо с изначальной реализацией виртуальной машины. Выбрав как язык виртуальной машины python или другой подобный язык удалось бы возможно избежать некоторых проблем с лицензией, но все-же не решило всех проблем - так лицензионное разбирательство происходило не столько из-за использования языка сколько из-за вопроса реализации виртуальной машины. И никто не может сказать чтобы было выбери они другое решение. А тихое ожидание и скрытые проблемы с лицензиями и патентами только вредят продукту- зная что именно нарушено в 235 патентах, можно реализовать по другому функциональность или добиться решения о аннулировании патентов. И если продолжаются скрытые соглашения о крослицензировании для OpenSourse проекта, разработчиком может не захочется открывать/ сообщать о своих улучшениях, если в какой-то момент окажется, что ты не можешь использовать свои наработки и вынужден за них кому-то платить. 

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

P.S.: Я не владелец iPhone. Поэтому мое мнение сугубо субъективное.

Saturday, August 11, 2012

Samsung ML-1861

Очень хороший достаточно быстрый принтер, но имеет одно неудобство, для его поддержки в  Linux нужно поставить универсальный драйвера Samsung, которые не имеют исходников. Если его не установить (или opensource аналог о котором пойдет дальше речь), то в Ubuntu 12.04 будет установлен драйвер для ML-1750 и при попытке напечатать что либо - печаталась страница:
position: 0x0(0)
system: h6fw_5.49/xl_op
line:180
Version: SPL 5.49 10-20-2010
Сообщая, что переданный документ не соответствуют формату и нужно использовать другую версию языка описания страниц SPL.

Свободной реализацией этого языка занимался проект SPLIX, который является проектом по реверс инжинирингу этого языка и достиг значительных успехов в поддержке принтеров, но вот уже долгое время не развивается и о новых принтерах ничего не знает. Именно через него происходит вывод на печать в Ubuntu, но так как выбрана не правильная версия драйвера - используется не правильная версия языка. Для решения этой проблемы нужно зайти на CUPS и поменять драйвер на принтер о котором бы знали драйвера, как о поддерживающем именно эту версию языка, Samsung CLP-310, правда он цветной, но нам никто не мешает его использовать для черно-белой печати. (Возможно нужно кроме cups доставить splix.)

Шаги установки для проверки работоспособности:
  • Ставить бинарные драйвера с сайта samsung не нужно, все и так работает и обновляется вместе с системой.
  • Проверить установлен ли cups(можно через dpkg-query -l или synaptic), если нет устанавливаем через sudo apt-get install cups
  • Установить драйвера для поддержки языка разметки понимаемого принтером через sudo apt-get install printer-driver-splix
  • Зайти на CUPS (http://localhost:631/admin), и добавить новый принтер выбрав как модель Samsung CLP-310. (Administration->Add printer -> выбрать принтер подключенный по usb)
  • Попробовать напечатать что-нибудь и узнать поняли ли друг друга принтер с компьютером.

Sunday, August 5, 2012

Желания и мечты

​Не все желания выполнимы, после того как google официально объявило, что больше не будет поддерживать nexus one он же htc desire, htc объявило что запланированное обновление для desire hd тоже не выйдет - оно планировалось на июль-август - о чём как раз и было объявлено под конец этого срока. Пользователи уже создали петицию с просьбой выпустить еcли не полное обновление - то хотя бы код ядра и драйвера. В общем именно то чего не хватает альтернативным прошивкам для работы. С остальными устройствами в общем-то та же история - в основном прошивки сейчас есть только для последних устройств идущих с новым андроидом. Что будет с остальными устройствами не понятно, часть будет уже сейчас официально не поддерживаться в cyanogenmod 9+ версии, как не удовлетворяющая минимальным требованиям для андроида, так как на этих устройствах скорее всего будет проблемы с новыми приложениями рассчитанными на большие аппаратные возможности, и чтобы не создавать продукт которые вызовет только рост недовольных отзывов - решили официально не поддерживать. Относительно устройств которые удовлетворяют этим требованиям, но компании производители не хотят по своим внутренним причинам выпускать обновление прошивок, ответ похоже скорее всего - возможно, если смогут портировать драйвера с других устройств или через какие-то дополнительные абстракции, чтобы работали старые драйвера. Что в общем-то близко, но всё же отличается от обычных дистрибутивов линукса, где с большой вероятностью пользовательские устройства с более менее широкой распространённостью все же с большой вероятностью поддерживаются. Ноутбуки все же в большой степени остаются функциональными из-за широкой общности устройств и использования для удобства пользователя различных ухищрений с возможностью автоматической настройки устройств(USB, Plug and Play) - и скорее всего устройство как-то себе идентифицирует при загрузке, но всё же остаются различные проблемы вида сложностей обновления прошивок, так как производители не сообщают спецификацию и эта процедура может сильно отличаться между моделями, а может и нет - так как для прошивки используются приложения поставляемые производителем BIOS, а не устройства. Но всё же полной спецификации нет и CoreBoot может использоваться не на всех устройствах. Также есть проблемы когда производитель не поставляет драйвера или не обновляет их под новые ядра - но в основном это решается если устройство популярно.

Tuesday, July 17, 2012

DSL-модем

История мелкого разбора протокола

Решил немного проверить свои знания Linux/GNU философии. По идее все что создано руками человека может быть другим человеком понято и изменено, не будем рассматривать вариант разрушено, оставим на волю природы разрушать и очищать от неудачных творений человеческой разумности. И так есть устройство гордо именуемое как ADSL роутер обладающее очень важной особенностью признанной людьми в развитых странах осуществлять важнейшую потребность людей в глобальной общении и обладающий гигантским недостатком это изобретено не нами, нужно обязательно изучить и понять как же оно работает и восполнить жажду новой интересной, но совершенно не нужной информацией. Оно базируется на разработках которые вот уже лет десять воплощаются в серии устройство состоящих из множества интересных возможностей и технологий созданных на базе RISC архитектуры используемой во многих высокопроизводительных компьютерах.

Устройство содержит созданный на базе референсного дизайна adsl модема содержащего процессор с поддержкой usb, pci, rs232 портов, jtag дебаг интерфейсом, eth/wlan сетевым интерфейсом, adsl/vdsl модемами(отдельный DSP процессор). Система обычно содержит, если судить по известной мне информации вне процессора дополнительные сетевой маршрутизатор на 4 порта, внешний wifi модуль того-же производителя и дополнительный логику преобразования сигналов для dsl(ADSL2+ 5V Line Driver - похоже на каку-то трансформаторную развязку). Производители модемов в разной степени меняют эту реализации под свои нужды - но без значительны изменений между моделями различных производителей, и прошивку от одного модема при желании можно поставить на другой. Состав поддерживаемых интерфейсов/реализация элементов(внутри основного чипа/вне) изменяется между сериями, но тоже не значительно - в основном, как обычно, по пути расположения в основной чипе всей логики.

Из этого списка компонентов только dsl интерфейс не поддерживаться сторонними прошивками остальные части достаточно стандартные и благодаря открытой документации или реверс-инженерингу поддерживаются. Основным недостатком является отсутствие существенных обновлений прошивки даже самые новые прошивки одного производителя используют ядро 2.6.9 и для сборки требуют старые дистрибутивы (на fedora 9 - можно собирать DSL-2650U, 2640 - RedHat 9.0).

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

Но сначала нужно посмотреть что происходит на реальном оборудовании, когда мы пытаемся получить информацию о соединении, для случая с модема с usb это просто - на флешку отформатированую в fat32 скидываем откомпилированый strace и смотрим что происходит. strace выводит что adslcrl открывает файл устройства со стандартными флагами без каких-то нестандартных особенностей открытия и через ioctl передает первым параметром какую-то магическую константу, вторым параметром что-то похожее на адрес. Ничего туда не пишет и не читает. Делаем несколько запусков и убеждаемся что он всегда делает одни и те же действия с одинаковой константой и близкими значениями адреса.

Дальше мы уже можем переключиться на эмулятор чтобы получить больше подробностей.

Непосредственно брать образ файловой системы из образа прошивки не нужно - формат опять таки закрытый, но есть частичная документация получения реверс-инженерингом, можно поступить проще и взять этот образ из дерева исходных кодов при сборке. Он представляет собой обычный образ сжатой файловой системы Squashfs(targets/DSL-2650U/rootfs.img) старой версии(version 2.0) поэтому непосредственно открыть на новых дистрибутивах его нельзя, они уже эту версию не поддерживают - поэтому нужно создать образ с использованием более распространенной файловой системы:

  1. dd if=/dev/zero of=empty.img count=32768 
  2. mkfs.ext3 empty.img 

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

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

Если почитать блог можно подтвердить предположение, что для других модемов тоже используется магическая константа и адрес. Значит нужно создать модуль для того чтобы посмотреть что же все-же передается. В ранее указанном блоге делается подмена системных функций - более похожая на создании вируса c сокрытием процессов. Проще создать модуль который будет выдавать все что ему приходит и пробует вернуть похожее на реальный ответ назад. В ранее указанном блоге используется дамп 256 байт области переданной как второй параметр. Дампим пока этот объем - и видим что по этому адресу расположены выравненные по слову числа похожие на 3 адреса и пара констант. Далее пишем программу которая создает такой буфер с тремя выделениями памяти и смотрим, что записалось по этим адресам, если запустить программу на реальном оборудовании - сначала ставим размер буферов в 256 байт - видим что память по всем адресам изменилась, память выделенная под входные параметры не изменилась. Пробуем увеличивать размеры буферов до 512, 1024, 2048 - видим что значения записываемые модулем ядра на реальном оборудовании не влазят в буферы меньше 2k байт - похоже нужно использовать буферы в 2048. И сделав так видим что заполняется только первый буфер и так как мы используем выделение данных в куче адреса у нас немного отличаются от оригинальной программы. Поэтому предполагаем что она выделяет память в стеке, и мы просто видим дамп стека.

Далее инициализируем память для первого буфера в 0, смотрим на дамп, инициализируем в -1 смотрим в дамп и видим что в реальности меняется только примерно 1.5k байт, можем предположить, что это и есть реальный размер. Смотрим в дамп переданных ядру данных, и видим что одна константа совпадает с полученным размером, можно предположить, что именно так передается размер выделенной памяти. Уменьшаем размер передаваемых данных до 0x20 и видим что ничего не поменялось - можно предположить что это есть примерный размер входного буфера.

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

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