Предлагаем Вашему вниманию интервью с Jeffrey Amelynck aka hidnplayr (на Хабре hidnplayr), бельгийским разработчиком в проекте KolibriOS. Ранее о некоторых его разработках уже была статья. Поговорим о Google Summer of Сode, Бельгии, сетевом стеке и перспективах сетевых программ для KolibriOS.

Интервью было проведено Сергеем Кузьминым aka Wildwest (на Хабре W__W)

Представься: где учился, что изучал, в каких ОС довелось поработать.

Я учился в академии, в прошлом известной как KAHO Sint-Lieven, которая сейчас является подразделением крупнейшего университета Бельгии KU-Leuven. Там я получил степень бакалавра по специальности «Электроника и инфокоммуникационные технологии» (специализация «Электроника»).



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

Помогла ли тебе работа над KolibriOS в твоем обучении, работе или карьере?

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



Например, некоторые сетевые карты (*кашлянул* Tulip *кашлянул*) примечательны тем, что нужно много программных хаков, чтобы заставить все доступные карты этого семейства работать.



Расскажи о Бельгии. Расскажи, что в Бельгии есть такого, о чем мало знают за границей (пример: недавно человек из Эквадора рассказывал, что у них в стране растет очень много бамбука. Я об этом не знал.).

Бельгия широко известна из-за пива, шоколада и картофеля фри, но наша любовь к гастрономической кухне не кончается на этом. Знаешь ли ты, что у нас столько же звезд Мишлена на жителя, как во Франции?

Не знал этого. Как и когда ты узнал о MenuetOS и KolibriOS?

В юном возрасте 13 лет я искал альтернативные операционные системы. Я пробовал несколько дистрибутивов Linux, но были проблемы с запуском на моем старом компьютере. Конфигурирование, особенно драйверов видеокарт и X Window System, доставляло головные боли. Я нашел MenuetOS и сразу же был впечатлен. Из-за MenuetOS я решил изучить программирование на ассемблере.

Некоторое время назад твой ник был profkid13, но потом ты его сменил на hidnplayr. Расскажи про эти ники, причину смены.

Profkid13 был моим первым ником, как ты догадываешься, в возрасте 13 лет. Он отражал идею того, кем я хотел быть в то время: умный новичок. Конечно, ничего из этого еще не было правдой, я не знал как учиться в интернете и задавал неправильные вопросы на разных форумах. Позже, когда я понял это, я решил, что настало время для нового ника, чтобы избавиться от плохого имиджа.
Ник произошел из чата, в котором я провел много часов моей юности. Это был публичный чат, где можно было играть в игры с другими пользователями. Я нашел способ скрыть себя из списка пользователей и поэтому выбрал имя «hidden player», который позже сократился до «hidnplayr». Этот ник прижился и я никогда не думал сменить его.

Одна из спорных тем — это история MenuetOS и последующее разделение коллектива разработчиков на тех, кто поддержал Menuet64 и тех, кто поддержал KolibriOS. Расскажи свою версию событий периода 2003-2007 годов. Почему ты поддержал KolibriOS?

Я не помню, когда именно я нашел KolibriOS, но было очевидно, что она лучше, чем MenuetOS, по крайнем мере в моих глазах. У меня всегда был интерес к компьютерным сетям и я решил изучить это в KolibriOS.
KolibriOS была лучше для меня, потому что она имела такие качества как (лучший) менеджер памяти и более живое сообщество.
Первой программой, которую я закоммитил на SVN, была программа «autodhcp». Она объединяла две существующие программы «DHCP client» и «network configuration», чтобы автоматически получать настройки сети от сервера DHCP и применить их после загрузки.



Расскажи про свои программы для KolibriOS, в том числе про irc клиент и программу для работы с COM портом.

Я написал простой клиент VNC и хотел написать больше сетевых программ, но потом заметил ограничения существовавшего сетевого стека в KolibriOS.



Несколько простых изменений (сокративших копирование данных ядром ОС) сильно улучшило производительность, но всё еще было подоптимальным. Я никогда публично не показывал эти фиксы ядра. Одна вещь, которая быстро была включена в ядро, была новая системная функция, которая позволяла читать больше, чем 1 байт за раз из сокета.
Вместо улучшения старого кода я решил начать с нуля новый сетевой стек. Я хотел избавиться от внутриядерных сетевых драйверов и заменить существующий сетевой API на индустриальный стандарт BSD сокетов.

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







Программа терминала была написана после просьбы на форуме о таком приложении. Я написал её за несколько часов, показав какой простой может быть такая программа.



К сожалению, было невозможно назначить запрос на прерывание (IRQ) COM порта в программе без написания специального драйвера.
Я решил, что не буду этого делать, ведь лучше подождать поддержки COM порта на уровне ОС.
И к счастью, это может скоро случиться, когда программист gtament (который написал драйвер переходника FTDI USB-RS232; на Хабре gtament) закончит этот API.

Расскажи про paste.kolibrios.org и программу для посылки текстов из KolibriOS на этот сайт.

Сайт paste.kolibrios.org это публично доступный pastebin, такой же, как pastie.
Моя программа «pasta» была написана для демонстрации того, как использовать библиотеку http library (Примечание — ниже будет рассказано про библиотеку) с куками и методом post из HTTP. Она позволяет послать текст из файла или буфера обмена на сайт.



Каких сетевых программ еще не хватает в KolibriOS? Появятся ли когда-нибудь аналоги команды netstat (Примечание — это команда в cmd.exe из Windows, есть программы с такой же функцией — TCPView и Anvir) и программа для показа списка открытых и закрытых портов с возможностью управлять их состоянием? Как обстоят дела с серверным софтом?

Такие программы точно будут написаны, единственный вопрос — когда это будет. Поскольку для меня это хобби, я не могу назвать сроки.
Программа Socketdbg может прочитать все значения в ядре для конкретного сокета, но это очень нижний уровень конечно.
Демон FTP (или сервер, если угодно) доступен и должен работать.



Сервер HTTP тоже доступен, но не в основном дистрибутиве, потому что использует специальную библиотеку, которая отсутствует на SVN.
Он называется photonweb и на самом деле это мультиплатформенный сервер HTTP, написанный в «Fresh IDE» программистом johnfound. Написание HTTP сервера специально для KolibriOS находится не на высоком месте в моем личном списке приоритетов.

Как насчет Samba, печати по сети?

Samba видимо требует большого объема работы и поэтому также не на высоком месте в моем личном списке приоритетов. Но определенно было бы приятно иметь её поддержку.
Некоторые сетевые принтеры позволяют послать документы на них через протокол FTP, так что это уже возможно, если сможешь разобраться в том, как это сделать.
Но поскольку нет поддержки диспетчера очереди печати (spooler) и всех прочих требуемых сервисов для принтеров, то для меня нет смысла исследовать протоколы принтеров.

Что входит в список приоритетов?

Он постоянно меняется и вообще это что-то в моей голове, что я не могу записать.

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

Я поддерживаю страницу на вики, где можно найти информацию и отслеживать прогресс: wiki.kolibrios.org/wiki/New_stack
Основными целями для нового сетевого стека являлись более высокая производительность (пропускная способность), поддержка многих сетевых интерфейсов и API, совместимое с BSD сокетами, для упрощения написания/портирования сетевых программ.

Для увеличения производительности я уменьшил копирование сетевых пакетов (в MenuetOS они копировались каждым обработчиком протокола (protocol handler)).

Я также выбрал реализацию драйверов такую, которая поддерживает прерывания, хотя я недавно узнал, что подход опроса (polling approach) может дать лучшую пропускную способность с трафиком из малых пакетов. (К счастью, опрос может быть легко реализован в текущих драйверах, когда понадобится.)

В настоящий момент работа с несколькими сетевыми картами поддерживается, но самонастройка (DHCP) работает только на первой обнаруженной сетевой карте.

Маршрутизация в ядре также нуждается в улучшении для работы с несколькими сетевыми картами. (Некоторые функции жестко привязаны к первой сетевой карте).
Код TCP, который не так сложен, но велик, в целом работает, но не является полным и должен быть должным образом протестирован. Текущий код TCP — это вручную переписанная реализация кода TCP из 4.4BSD, и поэтому для современного интернета немного устарел.

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



Есть ли проблемы или ограничения в сетевом стеке? Сколько соединений может быть запущено одновременно? Какое значение трафика DDoS является проблемой для KolibriOS?

Проблемы могут быть багами или нереализованными свойствами.
Полное тестирование необходимо и запланировано после реализации некоторых свойств, таких как очередь сборки TCP (TCP re-assembly queue).
Максимальное количество сетевых буферов и соединений настраивается в коде ядра. Выдержка из stack.inc:
NET_DEVICES_MAX = 16
NET_BUFFERS = 512
NET_BUFFER_SIZE = 2048
Количество сокетов ограничено только доступной памятью в соответствующий момент, но в дальнейшем может быть легко ограничено цифрой, настраиваемой пользователем.

Расскажи, как работает сетевой стек.

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

Когда пакет принимается по проводу сетевой картой, генерируется прерывание.

Это прерывание обрабатывается драйвером, который помещает пришедший пакет в оперативную память компьютера (если аппаратура еще этого не сделала) и посылает указатель на этот сетевой пакет в ядро. Ядро помещает этот указатель в очередь пакетов, ожидающих обработки так скоро, насколько это возможно, но не в обработчике прерываний. Через небольшой промежуток времени ядро начнет обработку входящих пакетов и вызовет соответствующие обработчики протоколов в ядре. Например, ответ на запрос отклика ICMP (ICMP echo request) будет сделан ядром, ARP пакеты будут обработаны также ядром, но пакеты/сегменты UDP и TCP могут привести к данным, находящимся в очереди в сокет.

Когда такие данные прибывают, владелец процесса сокета будет оповещен, что данные доступны и данные могут быть приняты через системную функцию 75, 7 (Получить из сокета).

Этот системный вызов скопирует данные из буфера сетевых пакетов (в пространстве ядра) в место, выбранное программой (в пространстве пользователя).

Буфер сетевых пакетов тогда отмечается как пустой и готовый к повторному использованию системой.



Если программа хочет послать данные, то она вызывает системную функцию 75, 6 (Послать в сокет).
Это приведет к тому, что ядро выделить место под сетевой буфер, сгенерирует необходимые заголовки протокола в этом буфере, и скопирует данные из пространства пользователя в сетевой буфер.
Ядро затем вызовет соответствующий сетевой драйвер, который скопирует сетевой буфер в аппаратный буфер и наконец пошлет пакет по проводу.

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



Как использовать HTTPlib (http.obj)?

Так, во-первых, надо знать как использовать библиотеки в KolibriOS. Эта статья в вики KolibriOS должна быть хорошим началом: wiki.kolibrios.org/wiki/Libraries.
Когда ты разобрался в этом и знаешь основы того, как работает HTTP, ты можешь найти API библиотеки http library: websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fhttp%2Fhttp_en.txt
и некоторые примеры: websvn.kolibrios.org/listing.php?repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fhttp%2Fexamples%2F&#afd06bd681cc25e97cbe85f78ea95257a.



(Примечание — для разнообразия в этой статье скриншоты браузера NetSurf. Cкриншоты браузера WebView и почтового клиента Liza в соответствующих темах на форуме)

Какие сетевые протоколы поддерживаются, кроме HTTP?

Ядро поддерживает сетевые и транспортные протоколы, такие как Ethernet, ipv4, ARP, UDP, TCP.





HTTP технически считается протоколом прикладного уровня и именно так он и реализован в KolibriOS (в библиотеке).
Существуют программы или библиотеки, которые используют протоколы FTP, TFTP, DNS, DHCP, Telnet и Synergy (для совместного использования клавиатуры и мышки по сети).











Клиент VNC нуждается в некоторой доработке, чтобы быть реально полезным.



Что с работой в локальной сети? Можно ли ограничить трафик сетевого соединения (установить квоту)?

Компьютеры с KolibriOS могут связываться через демоны и клиенты HTTP и FTP.
Раньше программ было больше, но они не были мною портированы под новый сетевой стек.





Ограничение трафика в любом виде сейчас не поддерживается.

Какие сетевые карты поддерживаются? Поддерживаются ли несколько сетевых карт? Как выбирается сетевая карта в этом случае?

Да, я взял на себя задачу поддержки существующих сетевых драйверов и даже написал некоторые новые. Поддерживаются
3Com Fast EtherLink (3c59x/450/555/556/575/900/905/980), dec21x4x (called Tulip in linux), nVidia nForce chipsets (forcedeth)
Intel eepro/100 (i8255x, i82562, i82801,..), Intel PRO/1000 (i8254x), Myson MTD803, AMD PCnet (79c970, 79c978, 79c973,..),
RDC Semiconductors R6040, VIA Rhine II and III, Realtek 8029/8019, ne2000 PCI, Realtek 8139 and clones, Realtek 8110/8111/8167/8168/8169
Silicon Integrated Systems SiS900, 7016

(Примечание — фото, сделанное 2,5 года назад. Слева находятся поддерживаемые сетевые карты, справа — не поддерживаемые сетевые карты).


(Примечание — актуальное фото. Количество поддерживаемых сетевых карт значительно выросло).





Что насчет софт модемов, Wi-Fi?

Оба не поддерживаются сейчас и не находятся в моем списке приоритетов.
Софт модемы (я подозреваю, что ты имеешь в виду древние модемы стандарта V92 ) мне малоинтересны, у меня даже нет телефонной линии дома.
Я могу начать изучать WiFi, когда я буду полностью удовлетворен производительностью и безопасностью основного сетевого стека. (Но я надеюсь, мы не будем ждать этого так долго и кто-то другой возьмется за эту задачу.)

Поддерживает ли твой сетевой стек IPv6? Что с трансляцией имен доменов с кириллицей?

Некоторые небольшие части кода IPv6 написаны, но отключены, потому что он пока не полностью реализован. Это точно входит в мой список приоритетов.

Имена доменов с кириллицей — это интересный вопрос. Я даже не знал, что такие вещи существуют.
Видимо есть система Punycode для декодирования кириллических URL, но она не поддерживается сейчас.

Часто ли читаешь RFC, касающиеся сетевых стандартов?

Документы RFC длинные и не особо притягательны для чтения, так что я нечасто читаю их от начала до конца перед началом реализации протокола.
Часто легче использовать краткое описание протокола и обращаться к RFC, когда информация отсутствует или когда сомневаешься. Существует много книг на эту тему, которые часто легче читать.

Что думаешь про новые стандарты WebSocket, SPDY, QUIC, HTTP/2?

Преемник текущего HTTP, работающего через TCP, определенно нужен. Я постараюсь следовать стандартам индустрии.

Ты был ментором в Google Summer of Code. Расскажи о своем опыте в этом мероприятии и поездке в Google в прошлом году.

Я наслаждался работой со студентами и займусь этим снова, если мы найдем другого спонсора и у меня будет время.
Возможность посетить Google Summer of Сode Reunion — это было превосходно. Это был мой первый опыт общения с сообществом открытого кода в реальной жизни.


Главная суть «Summer of Сode Reunion» была в том, чтобы разработчики собрались вместе и встретились в реальной жизни. Были помещения для конференций, доступные тем, кто хотел программировать (do some hacking) или дать/посетить лекцию. Но ничего из этого не было обязательным.



К сожалению, ни dunkaist (другой ментор в Summer of Сode от KolibriOS), ни Yogev (на Хабре yogev_ezra) не смогли посетить это воссоединение, потому что не смогли вовремя сделать визы.
Были некоторые запланированные мероприятия, такие как путешествия в музеи, парки развлечений, офисы Google и т.д.
В перерывах я проводил большую часть времени в главном зале, где общался с другими разработчиками.



Я не был в США до этого, так что это было приключением само по себе. Кремниевую долину было приятно посмотреть, но я не хотел бы здесь жить. Еда не так плоха, но и не хороша, и так высоко превозносимая свобода там чувствуется гораздо более ограниченной, чем в Бельгии.

После воссоединения я посетил другие мероприятия общества с открытым кодом, такие как FOSDEM в Бельгии (где я наконец встретил Yogev'а), и планирую продолжить посещение таких мероприятий по возможности.

Комментарии (2)