Kiddie labor
Jun. 14th, 2007 06:58 pmhttp://kika.livejournal.com/32433.html?thread=188849#t188849
Вопрос простой - а где у нас в ЗАО РФ нынче учат на программистов? В смысле учат, а не "учат", то есть не читают лекции про эльбарроуз, а откуда выходят неплохие хакеры, способные аргументированно обсуждать стиль написания ядра Линукса и BSD. Ну или еще что-либо такое же высокодуховное и бесполезное.
Вопрос простой - а где у нас в ЗАО РФ нынче учат на программистов? В смысле учат, а не "учат", то есть не читают лекции про эльбарроуз, а откуда выходят неплохие хакеры, способные аргументированно обсуждать стиль написания ядра Линукса и BSD. Ну или еще что-либо такое же высокодуховное и бесполезное.
no subject
Date: 2007-06-14 05:25 pm (UTC)А по поводу проектов - http://swsoft.mipt.ru/projects.shtml
no subject
Date: 2007-06-14 05:49 pm (UTC)Представим себе линуксный лабтоп. У него есть 2 сетевые карты: Ethernet и какой-нибудь WiFi. Машинка ведет очень хаотическую сетевую жизнь: в любой момент ее могит подключить/отключить к Ethernet'у, или она может подключиться/отключиться к беспроводной сети.
Типичный линух ведет себя в такой ситуации довольно плохо. А именно:
1. в качестве DNS-сервера будет использоваться последний, о котором машинка узнала по DHCP. Если последний не работает, машинка останется без DNS'а (предудущий она уже потерла).
2. Если есть 2 равнозначных default route, то линукс будет упорно использовать какой-то один из них, даже если он не работает, и никогда не попробует другой. Такое бывает, например, если линукс зацепился за Access Point, не подключенный к Интернету (а через Ethernet выход наружу есть).
Соотсветственно, предлагается написать софтварий, который все это исправит. Софтварий должен включать в себя:
1. Следилку за состоянием сетевых интерфейсов - мне кажется, проще написать свою, чем интегрироваться с ifplugd (http://0pointer.de/lennart/projects/ifplugd/)
2. DHCP клиент, или интеграцию к существующему
3. DNS-мультиплексор, который узнает от DHCP клиента список возможных DNS-серверов, и пытается сам выбирать из них работающий(ие) методом проб и ошибок, с учетом состояния сетевых интерфейсов.
4. Интеграцию с wpa_supplicant'ом, для управления WiFi roaming'ом. Кстати, надо не забыть, что DHCP клиент должен запускаться после окончания WPA handshake, а не до (нотификация о том, что интерфейс зацепился за медию приходит до WPA handshake)
5. Управление линуксным фаирволом в более простом виде, чем iptables
6. Систему конфигурирования всего этого хозяйства
7. Управляющую гуевую морду.
Неочевидные вопросы:
1. Как понять, что дефолтовый роутинг ведет в никуда?
2. В отличии от Ethernet'а, настройки WiFi в принципе могут на многопользовательской машинке принадлежать пользователю, а не системе (например, пароль для доступа в сеть). Как аккуратно поделить сетевую карту между пользователями?
Гм...
Date: 2007-06-16 09:04 am (UTC)Re: Гм...
Date: 2007-06-16 04:17 pm (UTC)Винда, насколько я понимаю 1) при автиконфигурации (DHCP и т.п.) никогда не расставляет одинаковые метрики на default routes через разные интерфейсы 2) если она чует, что с интерфейсом что-то не так, она может поменать метрику соответствующего роута.
Как именно она чует, не очень понятно. Вероятно, учитывает неудачи при попытке установить TCP соединение.
Re: Гм...
Date: 2007-06-17 12:13 am (UTC)Может это мне так не везет, но у меня она вообще не справляется и при наличии нескольких дефолтов на ethernet всегда (не иногда, а именно всегда) выбирается тот, который не работает.
А вот, например, при наличии Ethernet (технолан с выходом в инет) и GPRS (другая технологическая сеть без выхода в инет) без всякой матстатистики лучшим выбирается дефолт через GPRS, наверное потому что скорость в нем на три-четыре порядке меньше. :>
Как именно она чует, не очень понятно. Вероятно, учитывает неудачи при попытке установить TCP соединение.
Так как раз в том и прикол, то в случае captive portal все tcp-соединения будут (если так настроить) успешно устанавливаться, но заворачиваться на этот портал, который будет пытаться сказать юзеру по различным протоколам (чаще всего ограничиваются http): авторизуйся, а то никуда не пущу. А этот captive portal может быть как раз из случайно подцепленой wifi сетки, где авторизоваться при всем желании не получится.
Re: Гм...
Date: 2007-06-17 11:06 am (UTC)Re: Гм...
Date: 2007-06-18 07:42 am (UTC)На мой взгляд, решение вопроса возможно только частичное, типа какой-нить перловый модуль, где в одну строчку можно проверить arp, интерфейсы, раутинг, доступность узла N по протоколу M и пр., чтобы юзер, зная, куда он ходит, критерии работоспособности каждой конкретной сети и пр., мог бы написать мегаскрипт, который уже делает то что задумано.
Но тем не менее, это достаточно экзотическая ситуация.
Смотря где. В университетских сетях, наверное, дико экзотическая, а вообще не такая уж и редкая, Cisco и многие другие подобные решения активно впаривают, особенно для беспроводных и мобильных сетей (у Cisco см. SSG, ISG, CMX; у Huawei тоже SSG и еще не помню что).
Re: Гм...
From:Re: Гм...
From:Re: Гм...
From:Re: Гм...
From:Re: Гм...
From:Re: Гм...
From:Re: Гм...
From:Re: Гм...
From:no subject
Date: 2007-06-14 05:52 pm (UTC)Есть програмка fuse (http://fuse.sourceforge.net/), позволяющая реализовать файловую систему в user space.
Предлагается написать аналог для реализации в user space сетевого протокола (т.е., address family).
Назвать можно suse :-) (от слова socket).
no subject
Date: 2007-06-14 09:47 pm (UTC)no subject
Date: 2007-06-14 10:25 pm (UTC)В винде аналогичные вещи делаются с помощью layered service provider: http://en.wikipedia.org/wiki/Layered_Service_Provider
Но конечно, хотелось бы получить не столь замороченную конструкцию.
no subject
Date: 2007-06-14 10:36 pm (UTC)Прием-передача пакетов -- через bpf, разделение ресурсов (аналог портов TCP/UDP) через shared memory.
Не очень эффективно, прежде всего из-за независимых фильтров в каждом процессе. Небезопасно: процессы имеют доступ к любому трафику, никак не изолированы от общесистемных данных. Но работать будет, причем относительно просто и без модификации ядра.
no subject
Date: 2007-06-14 11:15 pm (UTC)1. Перекрытие сокетного API
2. Собственно реализация протокола
Давай для начала ограничимся IP-based (или даже UDP-based) протоколами. Тогда возню с BDF'ом можно отложить на потом. Да и вообще, как послать/принять сырой пакет более-менее понятно.
Что касается перекрытия сокетного API, да, конечно, это можно сделать, подсунув библиотеку, перекрывающую socket(), close(), send(), recv(), read(), write(), ...
Некоторые так и делают
Однако есть определенные сложности:
1. В такой архитектуре очень сложно сделать select(), позволяющий смешивать наши сокеты с настоящими. Микрософту это не удалось :-)
2. Ненастоящесть наших сокетов будет вылезать из других интересных мест. Например, если я запускаю из себя процесс, перенаправив его ввод/вывод в такой сокет, но в этот процесс наша библиотека не загружена, то это работать не будет. То же самое, если я передам такой сокет другому процессу через sendmsg()
Ну и в конце концов, псевдотерминалы и файловые системы тоже можно было бы сделать в shared library. Но однако так не делают, потому что аккуратно это сделать сложно и неудобно.
no subject
Date: 2007-06-15 07:40 am (UTC)Я-то на другое ориентировался: снижение общих накладных расходов на endnode, честная дележка между процессами и другие серверно-важные вещи. Тут можно вынести вообще все протоколы из ядра, оставить лишь продвинутый BPF и выделение уникальных ресурсов. Последнее можно и в shared memory держать, но в ядре будет безопаснее.
Не сам придумал, конечно, отсюда большую часть стянул: http://pdos.csail.mit.edu/~engler/dpf.html
(no subject)
From:no subject
Date: 2007-06-14 11:30 pm (UTC)Но я точно не знаю что он может, я его смотрел только на предмет изучения внутренностей netfilter
no subject
Date: 2007-06-14 11:42 pm (UTC)no subject
Date: 2007-06-15 12:02 am (UTC)Переформулирую задачу другими словами. Я хочу иметь возможность создать вызовом socket() объект, который выглядит как нормальный сокет. Т.е. позволяет делать над собой все те же операции, которые позволяет делать обычный сокет. В частности, может быть использован вместе с другими файловыми хендлами в select'е (poll'е), может быть передан как файловый хендл другому процессу, и позволяет использовать protocol-specific опции в setsockopt/getsockopt, и auxiliary data в sendmsg/recvmsg.
Но при этом содержательно все операции над ним обрабатываются в другой программе (на худой конец, в shared library, но в любом случае прозрачно для той программы, которая пользуется таким сокетом).
Вопрос о том, каким транспортом пользуется определенный таким образом протокол, я предлагаю рассматривать совершенно отдельно.
no subject
Date: 2007-06-15 12:30 am (UTC)А вот если бы в линаксе (в обычном) можно было создавать хэндлы в в юзер спэйс, было бы гораздо легче.
no subject
Date: 2007-06-15 07:56 am (UTC)Другой вопрос, что в BSD, например, эти таблицы статические, но это не непреодолимое препятствие, всё можно изменить.
no subject
Date: 2007-06-15 11:50 am (UTC)(no subject)
From:no subject
Date: 2007-06-14 06:12 pm (UTC)Почему у нас не видно такой практики? Для студента должно быть очень приятно написать опенсорсную программу, вошедшую в дистрибутивы линукса. Я думаю, для становления молодого специалиста это гораздо полезнее, чем (анонимно!) написать какую-нибудь маленькую запчасть от какого-нибудь Parallels Desktop.
Что это, отсутствие у нас толковых студенческих работ, или желание компаний на корню подгрести всех вменяемых студентив под себя?
no subject
Date: 2007-06-14 06:25 pm (UTC)no subject
Date: 2007-06-14 06:40 pm (UTC)no subject
Date: 2007-06-14 06:42 pm (UTC)no subject
Date: 2007-06-14 06:46 pm (UTC)А gnome по-моему вообще никто не спосирует = создается энтузиастами. (Возможно совсем не прав).
no subject
Date: 2007-06-14 06:49 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: