Страница 2 из 3

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 22 май 2009, 18:39
h0rr0rr_drag0n
Здравствуйте. Судя по всему, работу я над практикой я продолжу летом - сейчас времени дико не хватает. :(
Наработки видимо буду посылать через этот форум. Пока что есть черновой набросок протокола для общения АРМ->сервер->терминал. Чем то он напоминает протокол FTP - по одному соединению команды для соединения, по другому данные (команды для терминалов\рабочих мест).

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 22 май 2009, 19:06
kluchev
Это хорошо.

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

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 23 май 2009, 08:10
h0rr0rr_drag0n
С радостью сходил бы, но у меня сейчас начинается зачетная неделя и после сессия :o
А на следующий день после сессии я уже уезжаю из города.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 09 июл 2009, 21:51
h0rr0rr_drag0n
Наконец-то сессия кончилась и появилось свободное время. Написал описание используемого прикладного протокола, на его основе уже пишу управляющую программу для терминала - как следствие менять протокол думаю уже не буду. Если поменяю - выложу изменения сюда.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 10 июл 2009, 17:32
kluchev
h0rr0rr_drag0n писал(а):Наконец-то сессия кончилась и появилось свободное время. Написал описание используемого прикладного протокола, на его основе уже пишу управляющую программу для терминала - как следствие менять протокол думаю уже не буду. Если поменяю - выложу изменения сюда.


Выложи просто PDF. Заархивированный pdf - моветон некомильфастый...

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 11 июл 2009, 15:39
h0rr0rr_drag0n
Привык место экономить.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 13 июл 2009, 11:15
kluchev
h0rr0rr_drag0n писал(а):Привык место экономить.


Не у всех под рукой есть bzip, пожалей людей...

Прочитал, замечания следующие.
1. У документа должны быть название и автор. Еще, полезно ставить дату создания. Иначе, когда таких документов много, создаётся дикая путаница. У меня их очень много.
2. Для описания протокола мало формата пакетов. Нужно еще, как минимум, описать порядок взаимодействия между узлами. Иначе, это описание можно трактовать кучей способов, оно неоднозначно.

Для описания протоколов можно использовать UML. Отдельные узлы хорошо описываются конечным автоматом (диаграмма состояний), а особо злачные примеры сценариев взаимодействия узлов - диаграммой последовательности.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 19 июл 2009, 23:21
h0rr0rr_drag0n
Исправил.
Предпочитаемый язык программирования: для клиента-терминала и сервера - C. Для клиента-АРМ - С++.
protodesc.pdf
Описание протокола, вторая версия.
(292.47 Кб) Скачиваний: 352

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 22 июл 2009, 12:46
kluchev
h0rr0rr_drag0n писал(а):Исправил.
Предпочитаемый язык программирования: для клиента-терминала и сервера - C. Для клиента-АРМ - С++.
protodesc.pdf


Ну, уже получше. По поводу формата пакетов у меня вопрос. А как понять порядок байтов у двухбайтовых значений?
И еще, какие уровни реализованы в рамках семиуровневой модели ISO/OSI ?

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 22 июл 2009, 22:43
h0rr0rr_drag0n
Поскольку заранее неизвестно, совпадает ли порядок байтов на узлах клиентов, то все двух- и четырехбайтовые (размер блока данных) значения в заголовках пакетов будут приводиться к сетевому порядку байтов функциями htons() и htonl(), а лишь потом отправляться получателю. На стороне получателя эти значения будут приводится к порядку байтов, принятому на узле функциями ntohs() и ntohl(), а лишь потом использоваться. Массив зашифрованных данных будет отправляться как есть (если в нем будут передаваться двух- или четырехбайтовые значения, то будем поступать так же, как и описано выше).
Если верить http://ru.wikipedia.org/wiki/Сетевая_модель_OSI, то я реализовал прикладной, представительский и сеансовый уровни (надо же O_o...).
Библиотекой, предоставляющей мне готовые функции для шифрования блоков данных по алгоритму RSA, будет OpenSSL
Описание протокола со всеми сделанными изменениями выложу завтра.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 23 июл 2009, 12:22
kluchev
h0rr0rr_drag0n писал(а):Поскольку заранее неизвестно, совпадает ли порядок байтов на узлах клиентов, то все двух- и четырехбайтовые (размер блока данных) значения в заголовках пакетов будут приводиться к сетевому порядку байтов функциями htons() и htonl(), а лишь потом отправляться получателю.


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

Если верить http://ru.wikipedia.org/wiki/Сетевая_модель_OSI, то я реализовал прикладной, представительский и сеансовый уровни (надо же O_o...).
Библиотекой, предоставляющей мне готовые функции для шифрования блоков данных по алгоритму RSA, будет OpenSSL
Описание протокола со всеми сделанными изменениями выложу завтра.


Тогда вопрос, если у нас аж три уровня, то в реализации это должно быть как-то отражено. Ведь общение между хостами идёт парралельно, между тремя уровнями сразу (уровень(i) - уровень(i) ). Для каждого уровня свой протокол (свои пакеты, свой алгоритм обмена этими пакетами). Как всё это реализовано?

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 23 июл 2009, 22:11
h0rr0rr_drag0n
На прикладном уровне мы формируем блок данных или код ошибки\команды. Формат блока данных в описании не определен, потому что заранее неизвестно, какие именно данные будут передаваться по сети. Это обеспечивает возможность адаптировать протокол под любой набор данных, который мы пожелаем передать по сети.
Далее данные, сформированные на прикладном уровне, передаются на представительский уровень. На этом уровне блок данных шифруется, считается его размер и CRC. Код ошибки\команды не затрагиваются. Добавляются null-terminate байт в конец и адрес отправителя в заголовок.
Блок данных, сформированный на представительском уровне, передается вниз на сеансовый уровень. На сеансовом уровне к заголовку пакета добавляется адрес получателя и байт типа пакета (переданный с предыдущих уровней). Затем уже сформированный пакет отправляется в сеть.
Отправкой и получением пакетов занимается только сеансовый уровень. Алгоритмы его работы для узлов сети уже даны в описании протокола.
При получении пакета приложением, пакет проходит все уровни в обратном порядке. Ошибка, произошедшая на любом из этих трех уровней, вызывает формирование кода ошибки и посылку пакета с ошибкой по сети. Обработка полученного пакета естественно прекращается.
Сервер, координирующий работу всего этого работает на сеансовом уровне. Два оставшихся уровня ему не нужны.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 03 авг 2009, 19:32
h0rr0rr_drag0n
Выкладываю измененный protodesc - все, что писал здесь на форуме + уточнены детали шифрования пакетов, чтобы не было вольного толкования этого процесса.
Также выложен исходный код сервера, клиента - АРМ и клиента - терминала. В данный момент отлаживаю все это...
protodesc.pdf
Описание протокола - свежая версия.
(292.55 Кб) Скачиваний: 385

termprogs.tar.gz
(20.02 Кб) Скачиваний: 312

termprogs.zip
(36.95 Кб) Скачиваний: 327


Контрольные суммы:
16287f6075065b270afb35d0ead0f998 termprogs.tar.gz
a2461d7fde5c469ff8a13ebf5aff30c5 termprogs.zip

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 10 авг 2009, 08:30
h0rr0rr_drag0n
Исправлено много ошибок - теперь все работает.
Сервер можно скомпилировать через make debug - он будет выводить отладочную информацию о подключившихся клиентах и пришедших пакетах. После запуска сервера (termserv) нужно запустить программу обеспечивающую работу терминала - termemu. Затем надо запустить управляющую программу (termanage), указав ей в качестве аргументов (подробнее termanage --help) IP и порт запущенного клиента-терминала (можно посмотреть в отладочном выводе сервера). Управляющая программа пошлет терминалу два запроса данных, выведет ответ на терминал, затем пошлет код завершения работы терминала и завершится.
В качестве "данных" используется строка "Hello world!". В принципе, легко использовать любые данные, надо лишь заново описать формат блока с данными для обоих типов клиентов.
Шифрования пока нет, код отвечающий за него пока закомментирован, но оно скоро будет.
Вместе с исходным кодом поставляются конфиги (sample.config) использующие интерфейс lo для работы программ. Указать путь к этому конфигу, вместо стандартного, можно указав опцию --config ./sample.config .
termprogs.tar.gz
(21.99 Кб) Скачиваний: 405

termprogs.zip
(38.54 Кб) Скачиваний: 229

MD5 суммы:
Код: Выделить всё
e1c8da43e82a620ed001bcb273034f41  termprogs.tar.gz
ccfd0507333234d5b2d7d6b9d8188301  termprogs.zip

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 10 авг 2009, 11:04
kluchev
h0rr0rr_drag0n писал(а):Исправлено много ошибок - теперь все работает.[/code]


Посмотрел исходники, скомпилировал, запустил. Сервер жрёт 99% ресурсов CPU. Это не дело, нужно осваивать треды, процессы, IPC. Еще есть замечательная функция select, рекомендую.

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 10 авг 2009, 18:59
h0rr0rr_drag0n
Раньше не имел привычки следить за тем, сколько ресурсов процессора жрут мои приложения. Теперь буду.
Сервер жрет столько ресурсов, потому что он в бесконечном цикле опрашивает наборы сокетов на готовность чтения или записи. В принципе, можно блокироваться в первом вызове select() ожидая прихода данных от клиента, поскольку, пока данные не придут, проверять набор сокетов на готовность к записи и посылать что-либо по сети бессмысленно. Это исправление я и сделал - теперь в топе top'а ни сервер, ни клиенты не показываются.
Контекстный патч для termserv/net.c:
Код: Выделить всё
*** ../net.c   2009-08-09 20:16:29.000000000 +0400
--- net.c   2009-08-10 14:10:28.000000000 +0400
***************
*** 344,359 ****
 
     while (1) {
        rset = allset;
!       memset(&tivl, 0, sizeof(tivl));
!       tivl.tv_sec = 0;
!       tivl.tv_usec = 0;
!       if ((nready = select(maxfd + 1, &rset, NULL, NULL, &tivl)) < 0) {
           syslog(LOG_ERR, "Error select(): %s\n", strerror(errno));
           goto shutdown;
        }
-       if (nready == 0){
-          goto selectwrite;
-       }
        /* соединение с новым клиентом */
        if (FD_ISSET(lawsfd, &rset)) {
           if ((connfd = accept(lawsfd, (struct sockaddr *)&cliaddr,
--- 344,353 ----
 
     while (1) {
        rset = allset;
!       if ((nready = select(maxfd + 1, &rset, NULL, NULL, NULL)) < 0) {
           syslog(LOG_ERR, "Error select(): %s\n", strerror(errno));
           goto shutdown;
        }
        /* соединение с новым клиентом */
        if (FD_ISSET(lawsfd, &rset)) {
           if ((connfd = accept(lawsfd, (struct sockaddr *)&cliaddr,
***************
*** 459,467 ****
           }
        }
 
- selectwrite:
        memset(&tivl, 0, sizeof(tivl));
!       tivl.tv_sec = 0;
        tivl.tv_usec = 0;
        FD_ZERO(&wset);
        wset = allset;
--- 453,460 ----
           }
        }
 
        memset(&tivl, 0, sizeof(tivl));
!       tivl.tv_sec = TIME;
        tivl.tv_usec = 0;
        FD_ZERO(&wset);
        wset = allset;

Также заметил, что termemu не обрабатывает завершение сервера, а так и продолжает крутиться в бэкграунде. Ну тут все исправилось довольно просто - нужно обрабатывать EOF, получаемый read(), в случае закрытия другой стороны соединения.
Контекстный патч для termemu/net.c:
Код: Выделить всё
*** ../net.c   2009-08-10 14:31:49.000000000 +0400
--- net.c   2009-08-10 18:36:34.000000000 +0400
***************
*** 170,175 ****
--- 170,177 ----
        if (readretval == -1) {
           syslog(LOG_ERR, "Error reading packet from socket: %s\n", strerror(errno));
           goto shutdown;
+       } else if (readretval == 0) { /* сервер закрыл соединение */
+          goto shutdown;
        }
        /* Мы прочитали пакет до конца, не прервавшись по таймауту.
         * Переходим к обработке полученного пакета
***************
*** 208,214 ****
              default: /* получили то, что не должны были получить */
                 break;
           } /* switch (incoming_pckt[0]) */
!       } /* if (readretval != -2) */
 
        /* Проверяем буфер отправки данных.
         * Если он не пуст - отправляем из него данные в сеть.
--- 210,216 ----
              default: /* получили то, что не должны были получить */
                 break;
           } /* switch (incoming_pckt[0]) */
!       } /* if (readretval > 0) */
 
        /* Проверяем буфер отправки данных.
         * Если он не пуст - отправляем из него данные в сеть.

Для тех, у кого отсутствует patch - архивы с termemu и termserv:
termemu_and_termserv.zip
(26.79 Кб) Скачиваний: 225

termemu_and_termserv.tar.gz
(17.27 Кб) Скачиваний: 323

MD5 суммы:
Код: Выделить всё
d3c01f63548fbca3998b0f2303f4fccb  termemu_and_termserv.tar.gz
032521140ddc10afd74be7b39b3262ee  termemu_and_termserv.zip

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 12 авг 2009, 12:24
h0rr0rr_drag0n
Отладил код отвечающий за шифрование. Вместе с клиентом для АРМ и для терминала поставляются закрытый и открытый ключи соответственно. Сгенерировать ключи можно командами:
Код: Выделить всё
openssl genrsa -out privkey.pem 2048
openssl rsa -in privkey.pem -out pubkey.pem -pubout

Также исправил потенциальную уязвимость в сервере - можно было заполнить очередь пакетов пакетами для несуществующего получателя и полезным пакетам не осталось бы места. Теперь в конце бесконечного цикла сервера вызывается функция, чистящая буфер пакетов от пакетов для неподключенных к серверу получателей.
termprogs.tar.gz
(22.06 Кб) Скачиваний: 294

termprogs.zip
(39.9 Кб) Скачиваний: 214

MD5 суммы:
Код: Выделить всё
4ff968a0f6dc45b7bf7d3ccd339f2c6e  termprogs.tar.gz
d3a9b7a81caf93f46c5070080ef2a107  termprogs.zip

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 15 авг 2009, 19:52
h0rr0rr_drag0n
Насколько я помню, нужно написать еще некую статью о практике в местной вики. Есть ли какой-нибудь шаблон для этих целей или стиль написания свободный?
И еще у меня нет доступа к самой местной вики; страница http://embedded.ifmo.ru/wiki/ запрашивает некие логин с паролем... Как их можно получить?

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 16 авг 2009, 14:08
Интегральный вычислитель
Есть ли какой-нибудь шаблон для этих целей или стиль написания свободный?

Думаю ты будешь первопроходцем;
И еще у меня нет доступа к самой местной вики; страница http://embedded.ifmo.ru/wiki/ запрашивает некие логин с паролем... Как их можно получить?


Пароли в личку

Re: Практика, 2 курс, руководитель Ключев А.О.

СообщениеДобавлено: 17 авг 2009, 11:33
kluchev
h0rr0rr_drag0n писал(а):Насколько я помню, нужно написать еще некую статью о практике в местной вики. Есть ли какой-нибудь шаблон для этих целей или стиль написания свободный?
И еще у меня нет доступа к самой местной вики; страница http://embedded.ifmo.ru/wiki/ запрашивает некие логин с паролем... Как их можно получить?


Примерно так:

Название статьи: Фамилия_И_О_Nгруппы_Месяц_Год
Категория: Практика на кафедре ВТ

Так у нас не будет пересечения между разными практикантами.

В отчёте перечисляется то, что сделано. Особое внимание нужно уделить тем вещам, которые на практике были наиболее интересны. Неплохо изложить техническую часть работы (примерно так, как это было сделано в представленном PDF). Отчёт желательно викифицировать (сделать ссылки на существующие статьи). Если каких либо статей нет, при желании их можно добавить (при этом необходимо использовать шаблон {{student}}).

http://embedded.ifmo.ru/wiki/index.php5 ... beddedWiki

Справки по нашей EmbeddedWiki: http://embedded.ifmo.ru/wiki/index.php5 ... 0%BA%D0%B0