Все больше и больше популярных в последнее время систем "Умный дом" подключаются к сети Интернет и требуют микроконтроллер для связи с другими сетевыми устройствами. Встраиваемый Веб-сервер на микроконтроллере AVR поможет упростить процесс проектирования приложений со встраиваемыми Веб-серверами. В состав разработки встраиваемого Веб-сервера на МК AVR входит завершенный Веб-сервер с поддержкой TCP/IP и интерфейсом Ethernet. Он также поддерживает отправку писем и содержит программу для автоматической конфигурации Веб-сервера в сети. Опорная разработка Веб-сервера на МК AVR содержит полный исходный код программы, написанный на Си. Подробное руководство по всем компонентам сервера позволит разработчикам встраиваемых систем быстро освоить разработку встраиваемых Веб-серверов.
2. Описание системы
Опорная разработка встраиваемого Веб-сервера на основе МК AVR предназначена для интеграции в цифровое оборудование. Она также может быть подключена к любому интерфейсу Ethernet, при этом, поддерживается связь со стандартным Web-браузером. На рисунке 2 приведены некоторые ситуации, в которых необходим web-сервер.
Как показано на рисунке 2 разнообразная пользовательская электроника может управляться компьютером через сеть Интернет. Web-страницей для встраиваемого Web-сервера на МК AVR является "Control Center" (центр управления).
Рисунок 1. Встраиваемый Веб-сервер на микроконтроллере AVR
Предположим, что встраиваемый Web-сервер на МК AVR интегрирован в несколько бытовых блоков. Каждый сервер подключен к сети. Домашний компьютер, как показано на рисунке 2, управляет всеми устройствами и может принимать запросы от других компьютеров через Internet. Web-сервер идентифицирован своим собственным уникальным IP-адресом и может управляться дистанционно из любого места по всему миру при наличии авторизация.
Рисунок 2. Контроль за бытовым оборудованием из офиса
3. Протокольный набор TCP/IP
Протокольный набор TCP/IP позволяет компьютерам любой конфигурации, работающих под различными операционными системами, связываться между собой. Он является основой для построения так называемой всемирной сети Internet, связывающей несколько миллионов компьютеров.
3.1. Набор слоев TCP/IP
Набор слоев TCP/IP - сочетание различных протоколов на различных слоях. TCP/IP обычно рассматривается, как 4-слойная система, как показано на рисунке 3.
Рисунок 3. Четыре слоя протокольного набора TCP/IP
3.1.1. Прикладной слой
Прикладной слой манипулирует над деталями конкретного приложения. К общим приложениям TCP/IP относятся:
Telnet (сетевой теледоступ) для удаленного входа в систему
Поддержка браузера для отображения web-страниц
Приложения передачи файлов
Приложения электронной почты
Три последних слоя не рассматривают специфику самого приложения, а только отвечают за особенности организации связи.
3.1.2. Транспортный слой
TCP отвечает за надежную передачу потока данных между двумя хостами. Обычно TCP разделяет данные на куски определенного размера, отправляет их в более низкий сетевой слой, ожидает подтверждения и при необходимости повторно отправляет потерянные пакеты. Поскольку вопросы надежной передачи потока данных относятся к транспортному слою, то в прикладном слое они не затрагиваются.
UDP (протокол передачи дейтаграмм пользователя) - наиболее прост для прикладного слоя в плане взаимодействия с ним. Он отправляет пакеты данных, называемые дейтаграммы, от одного хоста другому, но, не гарантируя, что дейтаграммы достигнуть другого конца. Желаемый уровень надежности должен быть добавлен на прикладном уровне.
3.1.3. Сетевой слой
Данный слой по-другому называется слой Интернета. Он манипулирует над передачей пакетов данных по сети. Например, здесь выполняется маршрутизация пакетов. IP (протокол Интернет) и ICMP (протокол управления сообщениями Интернета) составляют сетевой слой протокола TCP/IP.
3.1.4. Канальный слой
По иному данный слой называется слой канала данных или слой сетевого интерфейса. Канальный слой обычно содержит драйвер устройства в операционной системе и соответствующий сетевой интерфейс (сетевая карта) в компьютере. Совместно они отвечают за взаимодействие с электронной частью и физическое подключение к кабелю.
На рисунке 4 показывается пример с двумя хостами в локальной сети (LAN) Ethernet с использованием HTTP.
Рисунок 4. Пример с указанием протоколов
На одной стороне расположен клиент, а на другой сервер. Сервер выполняет некоторый тип функций для клиента. В данном случае это доступ к web-страницам на сервере. Каждый слой имеет один или более протоколов для связи с равноправным пользователем на одном и том же слое. Один протокол, например, позволяет связаться двум слоям TCP, а другие слои позволяют связать два IP-слоя.
Прикладной слой обычно реализуется на уровне пользовательского ПО, а остальные три уровни реализуются в ядре операционной системы.
3.1.5. Номера порта
Некоторые приложения могут использовать TCP или UDP в любое время. Протоколы транспортного слоя записывают идентификатор в заголовки, которые они генерируют для идентификации приложения. TCP и UDP используют 16-разрядные номера портов для идентификации приложений. TCP и UDP запоминают номер исходящего порта и номер порта назначения в этих соответствующих заголовках. Серверы обычно знают собственный номер порта. Каждая реализация TCP/IP с сервером FTP выполняют данное обслуживание на порте 21 TCP. Каждый сервер Telnet работает через порт 23 TCP. Обслуживание, выполняемое любой реализацией, осуществляется через хорошо известные номера портов между 1 и 1023. За назначение этих портов отвечает "Центральный координатор по присвоению уникальных параметров протоколов Internet (IANA)".
Клиент обычно не беспокоится о том, какой номер порта он использует на своей стороне. Независимо, какой номер порта он использует, для удостоверения ему необходим только уникальный номер своего хоста. Номера портов клиента называются эфемерными, что означает их непродолжительное время существования. Это связано с тем, что клиент действует только тогда, когда пользователь запускает необходимые функции клиента, а серверы обычно действуют все время пока есть питание. Большинство реализаций TCP/IP назначают эфемерные номера портов между 1024 и 5000. Номера портов выше 5000 предусмотрены для других функций (которые не распространены в сети Интернет). Сочетание IP-адреса и номера порта называется сокет (от socket).
3.2. Инкапсуляция
Если приложение отправляет данные с помощью TCP, то данные отправляют вниз по протокольному стеку вплоть до отправки их в виде битового потока по сети. Каждый слой добавляет информацию к данным путем присоединения заголовков и добавления трейлеров к получаемым данным. На рисунке 5 показан данный процесс.
Рисунок 5. Демонстрации инкапсуляции данных вниз по протокольному стеку
Некоторые сокращения:
Сегмент TCP: блок данных, которые TCP отправляет к IP.
IP дейтаграмма: блок данных, которые IP отправляет к сетевому интерфейсу.
Посылка: битовый поток, передаваемый по Ethernet.
IP (протокол Интернет) добавляет идентификатор к IP-заголовку для индикации, к какому слою принадлежат данные. IP выполняет это путем добавления 8-разрядного значения в свой заголовок, называемое протокольным полем. Аналогично, многие разнообразные приложения могут использовать TCP или UDP в любое время. Протокол транспортного слоя запоминает идентификатор в заголовке, который он генерирует для идентификации приложения. TCP и UDP используют 16-разрядные номера портов для идентификации приложений. TCP и UDP запоминают исходный номер порта и номер порта назначения в их соответствующих заголовках. Сетевой интерфейс отправляет и принимает посылки от имени IP, ARP, RARP. В заголовке Ethernet должна быть некоторая форма идентификации, показывающая, какой сетевой протокольный слой генерирует данные. Для выполнения этого в заголовке Ethernet предусмотрено 16-разрядное поле типа посылки.
3.3. Адреса Интернет
Каждый интерфейс в Интернет имеет свой уникальный адрес (IP-адрес). Адрес задается 32-разрядным числом. На рисунке 6 показана структура и 5 различных классов адресов Интернет.
Рисунок 6. Пять различных классов адресов Интернет
Ссылки по теме:
32-рарзядный адрес обычно записывается как 4 десятичных числа, которые выражают значение каждого байта адреса (см. таблицу 1). Данное представление называется десятичным с разделительными точками. Поскольку каждый интерфейс в Интернет должен иметь свой уникальный IP-адрес, то должна быть централизованная организация, которая отвечает за распределение адресов в Интернет. Такой организацией является NIC (Internet Network Information Center, центр сетевой информации Internet).
Таблица 1. Диапазоны IP-адресов различных классов
Класс
Диапазон
A
0.0.0.0…127.255.255.255
B
128.0.0.0…191.255.255.255
C
192.0.0.0…223.255.255.255
D
224.0.0.0…239.255.255.255
E
240.0.0.0…255.255.255.255
Всего существует три типа IP-адресов: одиночный (от Unicast, предназначен для одного хоста), широковещательный (от Broadcast, предназначен для всех хостов в данной сети) и мультивещательный (от Multicast, предназначен для нескольких выделенных компьютеров (группе)).
4. IP: протокол Интернет
Все TCP-, UDP- и ICMP-данные передаются, как IP-дейтаграммы. IP является ненадежной службой доставки сообщений, которая не требует установления связи. Она не гарантирует успешность доставки IP-дейтаграммы по назначению. Если что-либо выполняется не правильно, то IP использует простой алгоритм обработки ошибок: отбрасывается дейтаграмма и выполняется попытка отправки ICMP-сообщения обратно к источнику. Необходимый уровень надежности должен быть обеспечен верхними слоями. Отсутствие установления связи означает, что IP не обрабатывает какую-либо информацию об успешности передачи дейтаграмм. Каждая дейтаграмма обрабатывается независимо от всех других дейтаграмм. Это означает, что IP-дейтаграммы могут быть доставлены в нарушенном состоянии.
4.1. IP-заголовок
На рисунке 7 показан формат IP-дейтаграммы. Нормальный размер IP-заголовка равен 20 байтам, если исключены опции.
Старший значащий бит имеет номер 0 и расположен слева, а младший значащий бит 32-разрядного значения имеет номер 31 и расположен справа. 4 байта в 32-разрядном значении передаются в следующем порядке: разряды 0 - 7, затем биты 8 - 15 и т.д. Такой порядок называется "Big-Endian" и используется во всех бинарных целых в заголовках TCP/IP, передаваемых по сети. В связи с этим, такой порядок назван сетевым порядком байт.
Поля IP-заголовка описаны ниже.
4.1.1. Версия
В настоящее время используется 4-ая версия протокола, поэтому, IP иногда называется IPv4.
Рисунок 7. Поля заголовка
4.1.2. Длина заголовка
Длина заголовка - количество 32-разрядных слов (4 байта на слово) в заголовке, включая любые опции. Этим ограничивается длина заголовка до 60 байт.
4.1.3. Тип обслуживания (TOS)
Поле TOS состоит из 32-разрядного предшествующего поля (которое в текущий момент игнорируется), 4 бит TOS и неиспользуемого бита, который должен быть равен 0. 4 бита TOS минимизируют задержку, максимизируют производительность, максимизируют надежность и минимизируют денежную стоимость. Только 1 из этих 4 бит может быть равен 1. Если все 4 бита равны 0, то подразумевается обычное обслуживание.
4.1.4. Общий размер
Это общая длина IP-дейтаграммы в байтах. Используя данное поле и поле длины заголовка, мы знаем, где начинается порция данных IP-дейтаграммы и ее длину. Поскольку поле 16-разрядное, то максимальный размер IP-дейтаграммы 65535 байт.
4.1.5. Идентификация
Данное поле однозначно идентифицирует каждую дейтаграмму, отправленную хостом. Оно обычно увеличивается на 1 при каждой отправке дейтаграммы.
4.1.6. Время существования
Время существования устанавливает верхний предел по количеству маршрутов, по которым может передаваться дейтаграмма. Этим ограничивается время существования дейтаграммы. Количество маршрутов инициализируется отправителем к некоторому значению (часто 32 или 64) и декрементируется на 1 при прохождении каждого маршрута. Когда данное поле достигает 0, дейтаграмма отвергается и отправитель уведомляется ICMP-сообщением. Этим предотвращается зацикливание передачи пакета.
4.1.7. Протокол
Протокол используется IP для демультиплексирования входящих дейтаграмм. Он идентифицирует, какой протокол дал данные IP для отправки.
4.1.8. Контрольная сумма заголовка
Контрольная сумма заголовка вычисляется только для IP-заголовка, не охватывая каких-либо данных вслед за заголовком. ICMP, UDP и TCP имеют контрольную сумму в своем собственном заголовке для охвата их собственного заголовка и данных. Каждая IP-дейтаграмма содержит IP-адрес источника и IP-адрес назначения. Они являются 32-разрядными значениями.
4.1.9. Опциональное поле
Это список переменной длины опциональной информации для дейтаграмм. Опции редко используются и не все хосты и маршрутизаторы поддерживают опции.
5. UDP: протокол дейтаграммы пользователя
UDP обеспечивает для приложения путь отправки инкапсулированных необработанных IP-дейтаграмм и отправляет их без необходимости установки связи. Протокол ориентирован на трансакции. Доставка и двойная защита не гарантируется.
5.1. Заголовок UDP
Заголовок UDP состоит из 8 байт. Длина поля UDP равна длине байт дейтаграммы пользователя, включая заголовок и данные. Контрольная сумма UDP вычисляется и запоминается отправителем, а затем проверяется получателем. Процедура такая же, как при использовании TCP.
Рисунок 8. Заголовок UDP
6. TCP: протокол управления передачей
TCP и UDP используют один и тот же сетевой слой (IP), но TCP выполняет полностью другое обслуживание в прикладном слое. TCP отвечает за надежную передачу байтового потока на уровне соединения. Термин на уровне соединения означает, что два приложения, использующие TCP, (обычно рассматривается клиент и сервер) должны установить TCP-соединение друг с другом прежде, чем они начнут обмен данными.
TCP обеспечивает надежность за счет следующего:
TCP выбирает лучшие размерные куски данных для отправки. Это существенно отличается от UDP, где каждая запись приложением генерирует UDP-дейтаграмму данного размера. Единица информации, пропускаемая с помощью TCP к IP, называется сегментом.
После передачи сегмента запускается таймер, который отсчитывает задержку на получение подтверждения сегмента с другого конца соединения. Если в течение определенного интервала времени подтверждение не получено, то сегмент передается повторно.
Когда TCP принимает данные из другого конца соединения, то он отправляет подтверждение. Данное подтверждение отправляется не сразу, а, как правило, задерживается на доли секунды.
TCP содержит контрольную сумму на своей странице заголовка данных. Это сквозная контрольная сумма, задачей которой является детекция любых изменений данных в пути. Если сегмент поступает с неверной контрольной суммой, то TCP отбраковывает его и не подтверждает его прием. Отправитель ожидает ответа в течение определенного времени, а затем повторно отправляет данные.
Поскольку TCP-сегменты передаются, как дейтаграммы, и т.к. IP-дейтаграммы могут поступать неупорядоченно, то TCP-сегменты могут также поступать неупорядоченно. В процессе приема, если необходимо, данные переупорядочиваются, передавая их приложению в корректной последовательности.
Поскольку IP-дейтаграммы могут продублироваться, то приемный TCP должен отказаться от дублированных данных.
TCP также выполняет управление потоком. В каждом конце TCP-соединения имеется конечное количество буферного пространства. Приемный TCP позволяет противоположной стороне отправлять столько данных, сколько позволяет размер приемного буфера. Этим предотвращается ситуация, когда более быстрый хост переполнит весь буфер более медленного хоста.
Поток 8-разрядных байт передается поперек TCP-соединения между двумя приложениями. При этом нет каких-либо маркеров записи, автоматически вставляемых TCP. Это называется обслуживанием байтного потока. Если приложение на одном конце записывает 10 байт, затем 20 байт, а затем 50 байт, то приложение на другом конце может считать 80 байт за четыре подхода по 20 байт в каждом. В одном конце поток байт помещается в TCP и такой же идентичный поток байт появляется на другом конце. Однако TCP вообще не интерпретирует содержимое байт. TCP понятия не имеет в какой форме передаются обмениваемые данные: в двоичной, в виде символов ASCII или другой форме. Интерпретация данного байтного потока выполняется приложением на каждом конце соединения.
6.1. Заголовок TCP
TCP-данные инкапсулируются в IP-дейтаграмму, как показано на рисунке 9.
Рисунок 9. Инкапсуляция TCP-данных в IP-дейтаграмму
На рисунке 10 показан формат TCP-заголовка. Его нормальный размер равен 20 байтам, если не выбран другой размер.
Каждый TCP-сегмент содержит номер порта источника и получателя для идентификации отправляющего и принимающего приложения. Эти два значения вместе с IP-адресами источника и получателя в IP-заголовке однозначно идентифицирую каждое соединение.
Сочетание IP-адреса и номера порта называется "сокет". TCP - полнодуплексная служба, что означает возможность следования данных в обоих направлениях, независимо один от другого. Таким образом, в каждом конце соединения должен содержаться порядковый номер данных, следующих в каждом направлении.
6.2. Порядковый номер
Он идентифицирует байтовый поток данных от передающего TCP до принимающего TCP, который в этом сегменте представляет первый байт данных. TCP присваивает каждому байту порядковый номер. Порядковый номер - 32-разрядное беззнаковое значение, которое переходит к 0 после достижения 232-1.
6.3. Номер подтверждения
Он содержит номер следующей последовательности, которую отправитель подтверждения ожидает принять. Таким образом, имеется порядковый номер + 1 последнего успешно принятого байта данных. Данное поле действительно только в том случае, если установлен флаг ACK. 32-разрядное поле номера подтверждения всегда является частью заголовка, когда есть флаг ACK. Данное поле всегда устанавливается и флаг ACK всегда включен.
6.4. Длина заголовка
Представляет длину заголовка в 32-разрядных словах. Это требуется в связи с тем, что длина поля может варьироваться. Если поле 4-разрядное, то размер заголовка TCP ограничен 60 байтами. Однако если не было особых выборов, то нормальный размер равен 20 байтам.
Рисунок 10. Заголовок TCP
6.5. Битовые флаги
Имеется шесть битовых флагов в заголовке TCP - один или более из них могут измениться одновременно:
URG - указатель срочности действителен.
ACK - номер подтверждения действителен.
PSH - приемник должен пропустить данные к приложению при первой возможности.
RST - сброс подключения.
SYN - синхронизация порядковых номеров для инициации соединения.
FIN - отправитель закончил отправку данных.
6.6. Размер окна
Управление потоком со стороны TCP выполняется в конце каждого объявленного размера окна. Размер окна - количество байт, начиная с первого байта поля номера подтверждения, которое приемник желает принять.16-разрядное поле ограничивает размер окна 65535 байтами.
6.7. Контрольная сумма
Контрольная сумма охватывает TCP-сегмент: TCP-заголовок и TCP-данные. Это обязательное поле и оно должно вычисляться и запоминаться отправителем, а затем проверяться получателем.
6.8. Указатель срочности
Указатель срочность действителен, только если установлен флаг URG. Данный указатель - положительное смещение, которое необходимо добавить к порядковому номеру поля сегмента, чтобы определить номер сегмента последнего байта срочных данных. Срочный режим TCP - способ для отправителя передать важные данные на другой конец.
6.9. Контрольная сумма
Наиболее типичная опция этого поля - MSS (максимальный размер сегмента). В каждом конце соединения обычно задается данная опция после обмена первым сегментом (первая отправка с установленным флагом SYN для установления связи). Этим определяется максимальный размер сегмента, который отправитель ожидает принять.
6.10. Данные
Часть данных в заголовке TCP является опциональной. Заголовок без данных используется для подтверждения принятых данных, если нет данных для передачи в этом направлении. Имеются некоторые случаи, связанные с истечением выдержек времени ожидания, когда сегмент передается без каких-либо данных.
6.11. Ethernet-инкапсуляция
Термин Ethernet обычно ссылается на стандарт, опубликованный в 1982 году компаниями Digital Equipment, Intel и Xerox. Он является преобладающей формой локальных сетевых технологий, используемых в настоящее время совместно с TCP/IP. Он использует метод доступа, называемый CSMA/CD (множественный доступ с контролем несущей и обнаружением конфликтов). Он ориентирован на скорости 10/100 Мбит/сек и использует 48-разрядные адреса. Используется две инкапсуляции, описываемых RFC 1042 и RFC 894. Наиболее часто используется инкапсуляция RFC 894. Рисунок 11 демонстрирует инкапсуляцию RFC 894.
Формат посылки использует 48-разрядные (6-байтные) адреса назначения и источника. Протоколы ARP и RARP устанавливают соответствие между 32-разрядными IP-адресами и 48-разрядными аппаратными адресами.
Рисунок 11. Ethernet-инкапсуляция (RFC 894)
6.11.1. Адрес назначения
Определяет 48-разрядный адрес назначения.
6.11.2. Адрес источника
Определяет 48-разрядный адрес источника.
6.11.3. Тип Ethernet
Идентифицирует тип следуемых данных.
6.11.4. CRC
Циклическая избыточностная контрольная сумма, используемая для детекции ошибок в оставшейся части посылки.
6.11.5. Минимальный размер
Для посылки Ethernet это 46 байт. Для выполнения этого в посылку вставляются холостые байты до достижения требуемого размера.
6.12. ARP и RARP - протокол разрешения адресов и протокол определения сетевого адреса по местоположению узла
Разрешение адреса заключается в установлении соответствия между двумя различными формами адресов: 32-разрядным IP-адресом и любым типом адреса, который используется в канальном слое. Протокол ARP определен в RFC 826.
ARP динамически устанавливает соответствие IP-адреса соответствующему аппаратному адресу. Термин динамический употреблен в связи с автоматическим выполнением процесса, который обычно не требует внимания ни со стороны пользователя приложения, ни со стороны системного администратора.
Протокол RARP используется многими бездисковыми системами для получения их IP-адресов по завершении начальной загрузки. Формат пакета RARP практически идентичен ARP-пакету.
Для эффективной работы ARP каждому хосту важно иметь кэш. В кэше хранятся недавно установленные соответствия Интернет-адресов и аппаратных адресов. Нормальное время истечения входа в кэш равно 20 минутам с момента создания кэша.
6.12.1. Формат ARP пакета
На рисунке 12 показан формат ARP пакета запроса и ответа, которые используются в сетях Ethernet для разрешения IP-адреса.
6.12.2. Ethernet-адреса источника и назначения
Специальный Ethernet адрес назначения из всех 48 единичных бит (0xFFFFFFFFFFFF) является широковещательным адресом. Все интерфейсы Ethernet в локальной сети принимают данные посылки.
6.12.3. Тип посылки Ethernet
Тип посылки определяет тип следуемых данных. Для ARP запроса или ARP ответа данное поле равно 0x0806.
Определения "аппаратный" и "протокольный" используются для описания полей ARP-пакетов. Например, ARP-запрос отвечает за соответствие аппаратного адреса протокольному адресу.
6.12.4. Аппаратный тип
Определяет тип аппаратного адреса. Для Ethernet его значение равно 1.
6.12.5. Протокольный тип
Определяет тип протокольного адреса. Его значение равно 0x0800 для IP-адреса.
6.12.6. Аппаратный размер и протокольный размер
Аппаратный размер и протокольный размер задают размеры в байтах аппаратного адреса и протокольных адресов. Для ARP запроса или ответа для IP-адреса в сети Ethernet они равны 6 и 4, соответственно.
6.12.7. Код операции
Определяет, является ли операция ARP-запросом (значение 1), ARP-ответом (2), RARP-запросом (3), RARP-ответом (4). Данное поле требуется, т.к. поле типа посылки одинаково и для ARP-запроса и для ARP-ответа.
6.12.8. Отправитель аппаратного адреса
В этом примере Ethernet-адрес, протокольный адрес отправителя (IP-адрес), целевой аппаратный адрес и целевой протокольный адрес.
Для ARP-запроса все поля заполнены, за исключением целевого аппаратного адреса. Когда система принимает ARP-запрос, то заполняется аппаратный адрес, обмениваются два адреса отправителя с двумя целевыми аппаратными адресами, устанавливается поле OP равным 2 и отправляется ответ.
DHCP отвечает за конфигурацию параметров Internet-хостов. Хосты могут отправлять DHCP-пакет во время загрузки, а DHCP-серверы (если присутствует) отвечает на это сообщение и предоставляет хосту параметры, необходимые для перезагрузки.
Рисунок 12. Формат ARP-запроса или ответного пакета при использовании в Ethernet
Рисунок 13. Заголовок DHCP
DHCP предоставляет следующие параметры: IP-адрес, IP-адрес шлюза, IP-адрес DHCP-сервера, имя хоста сервера и срок предоставления IP-адреса. Этим обеспечивается динамичность и простота обслуживания сети и IP-адресов для сетевого администратора, а также автоматическая конфигурация сетевых клиентов. IP-адрес дается на определенный период, обычно на 90 дней, но может быть отменен, если хост в нем более не нуждается. Если адрес используется половину времени предоставления, то хост должен запросить новое время предоставления. Если время предоставления адреса не обновлено, то по истечении текущего срока предоставления адреса хост должен отказаться от своего IP-адреса и ожидать выделение нового IP-адреса.
8. HTTP - протокол передачи гипертекстовых файлов
HTTP-протокол, который позволяет (web) клиенту запросить файлы или другие ресурсы из сервера. Ряд типов запросов могут отправляться клиентом. Основными запросами являются "GET" и "POST", которые используются для выборки и отправки данных, соответственно. Сервер обрабатывает запрос, возвращает заголовок с кодом статуса, а также файл или HTML-документ за заголовком. В итоге, сервер закрывает соединение.
8.1. HTTP - сообщение
HTTP-сообщение состоит из запросов от клиента к серверу и ответов сервера клиенту. Формат сообщения очень похож на используемый в Internet Mail и Multipurpose Internet Mail Extension (MIME, многоцелевые расширения электронной почты в сети Internet), определенные в RFC 822 и RFC 1521.
8.1.1. HTTP запрос сообщения
Запрос сообщения состоит из строки-запроса, которая следует за некоторой строкой заголовка, определяющего запрос. Пример (POST) запроса показан в таблице 2.
агент пользователя: Mozilla/4.0 (совместимый; MSIE 5.01; Windows NT® 5.0)
Заголовки объекта
принятое шифрование: gzip, deflate
Тип содержимого: application/x-www-form-urlencoded
Длина содержимого: 113
CRLF
возврат каретки с переводом строки
Тело объекта
action=add&form=resource
8.1.2. HTTP сообщение отклика
Сообщения отклика состоят из строки запроса, следующей за строками заголовка и телом объекта. Тело объекта разделено от заголовков пустой линией. Пример (GET) отклика показан в таблице 3.
Таблица 3. Пример отклика GET
Строка состояния
HTTP/1.0 200 OK
Заголовки отклика
Сервер: Atmel AVR EWS
Заголовки объекта
Тип содержимого:
image/gif
Длина содержимого: 1340
CRLF
возврат каретки с переводом строки
Тело объекта
<здесь следует содержимое файла >
8.2. HTTP-методы
Первое слово в строке запроса - имя метода, подлежащего исполнению. Поскольку метод определен таким способом, то HTTP может быть расширен для охвата потребностей будущих объектно-ориентированных приложений. Общие методы перечислены ниже в таблице 4.
Таблица 4. Типичные встроенные методы HTTP-запросов
Метод
Описание
GET
Запрос на чтение web-страницы или любой информации идентифицированной запросом URI.
POST
Добавление в конец к именованному ресурсу (например, Web-страница), или предоставление блока данных для процесса обработки данных на сервере.
HEAD
Запрос на считывание заголовка web-страницы
PUT
Запрос на сохранение web-страницы.
DELETE
Удаление web-страницы.
LINK
Подключение двух существующих ресурсов.
UNLINK
Прерывание существующего соединения между двумя ресурсами.
8.3. Коды статуса
На каждый запрос дается отклик, начиная со строки статуса. Строка статуса состоит из версии протокола, который следует за числовым кодом статуса и связанной с ним текстовой фразой. Типичные коды статуса протокола HTTP/1.0 приведены ниже в таблице 5.
Таблица 5. Типичные коды статуса
Числовой код
Описание
200
OK
201
Создано
202
Принято
204
Нет содержимого
301
Перемещено постоянно
302
Перемещено временно
304
Нет изменения
400
Плохой запрос
401
Нет авторизации
403
Запрещено
404
Не найдено
500
Внутренняя ошибка сервера
501
Не осуществлено
502
Плохой шлюз
503
Служба недоступна
9. SMTP - простой протокол электронной почты
Протокол SMTP определен в RFC 821. Он разработан для передачи электронных писем через надежный канал с упорядоченным потоком данных. При отправке писем через Internet для транспортировки используется протокол TCP.
9.1. Передача писем с помощью SMTP
Отправитель устанавливает соединение с приемником через порт и идентифицирует себя с помощью команды HELO. Затем отправитель передает адреса источника и назначения с помощью команд MAIL и RCPT. Если приемник может принять почту, то каждая из этих команд повторяется 250 раз. Затем отправитель передает команду DATA. Если получатель ответит значением 354, то отправитель может начать передачу сообщения. Конец сообщения индицируется <CRLF>. После успешного приема получатель отвечает значением 250, а отправитель затем может отправить команду QUIT для закрытия соединения.
Получатель может отвечать различными кодами ошибок в процессе выполнения всех описанных выше шагов.
Таблица 6. Наиболее часто используемые SMTP-команды
Команда
Описание
Пример
HELO
Используется для идентификации SMTP-отправителя SMTP-получателем
HELO EWS
MAIL
Используется для определения адреса отправителя
MAIL FROM: <avr@atmel.com>
RCPT
Используется для определения адреса получателя письма
RCPT TO: <itanium@intel.com>
DATA
Используется отправителем для инициации передачи сообщения
Как правило, в диагностических целях используются программы ping и traceroute. Они могут работать из Unix или из MSDOS. Программа Ping была написана Майком Муссом и предназначена для тестирования любого доступного хоста. Программа отправляет хосту ICMP сообщение запроса отклика, а затем ожидает возврат ICMP отклика. Ping измеряет время передачи сообщения туда и обратно, что косвенно индицирует, на сколько далеко расположен хост.
Программа Ping, которая отправляет запрос отклика, называется клиент, а адресованный хост называется сервер. Большинство TCP/IP реализаций поддерживают Ping-сервер непосредственно ядром, т.к. сервер это не пользовательский процесс.
Рисунок 14 показывает ICMP запрос отклика.
Рисунок 14. Формат ICMP-сообщения для запроса отклика и его повтора
Также как и на другие ICMP сообщения запроса сервер должен отправить отклик с полями идентификатора и порядковым номером. Кроме того, на опциональные данные, отправленные клиентом, должен поступить отклик. Порядковый номер начинается с 0 и инкрементируется всякий раз, когда отправляется запрос на новый отклик. Ping выводит на экран порядковый номер каждого возвращенного пакета, что позволяет заметить пропущенные, переупорядоченные и дублированные пакеты. IP - самая мощная служба по доставке дейтаграмм, т.к. любое из этих трех условий может возникнуть.
После возврата ICMP отклика на экран выводится порядковый номер, затем TTL и общее время прохождения запроса и отклика на него.
10. Аппаратная часть
Встраиваемый web-сервер на основе микроконтроллера AVR разработан с учетом возможности его доработки. Основной функцией web-сервера является организация связи через Ethernet-соединение. Однако он также может установить связь путем SLIP и модемного соединения с помощью встроенного УАПП. В опорную разработку входит программируемая логика CPLD, которая позволяет передать системе функцию распределения памяти внешних устройств. Как только статическое ОЗУ и контроллер Ethernet будут подключены к шине данных - CPLD может быть извлечена.
Рисунок 15 показывает, как микроконтроллер связывается через Ethernet и последовательное соединение.
Рисунок 15. Представление потоков данных между компонентами
Гибкость аппаратного решения опорной разработки позволяет ее адаптировать под многие приложения. Она может быть доработана для организации Ethernet, SLIP или PPP соединений, для связи через локальные сети, любой компьютер или через коммутируемое (телефонное) соединение. Также имеется возможность подключить к системе другие внешние периферийные устройства. Внутриплатная флэш-память может быть расширена без каких-либо аппаратных изменений.
10.1. Память
web-сервер содержит достаточный объем памяти для разработки большинства приложений. Внешнее статическое ОЗУ размером 32 кбайт используется для буферизации данных. Внешняя флэш-память DataFlash размером 2 Мбит используется для хранения web-страниц, тем самым, позволяя запомнить большое количество страниц. Статическое ОЗУ подключено к шине адреса и шине данных. Для обмена данными с DataFlash используется последовательный интерфейс SPI.
10.2. Контроллер Ethernet
Контроллер Ethernet первоначально был 16-разрядным устройством с шиной ISA, но он может также управляться в 8-разрядном режиме. Контроллер Ethernet сконфигурирован как 8-разрядное устройство. Он содержит внутреннюю память размером 4 кбайт, которая доступна через регистры ввода-вывода или непосредственно, как часть всей памяти.
По умолчанию контроллер Ethernet работает в режиме ввода-вывода и имеет адрес 0300h. Поскольку подключены только адресные линии A0 - A12 (необходимо только 4 кбайтное адресное пространство), то регистрам ввода-вывода назначены адреса 8300h - 830Fh (режим ввода-вывода, когда адресные линии в программируемом логическом устройстве имеют следующую конфигурацию: разряд 15 - старший, а разряд 14 - младший). Путем конфигурации контроллера Ethernet адреса можно изменить через регистры ввода-вывода, а также можно изменит режим памяти. Действия в режиме памяти могут быть отнесены к адресному пространству C000h - D000h.
10.3. Ограничения
web-сервер не имеет очевидных ограничений. Статическое ОЗУ микроконтроллера ограничено размером 32 кбайт, но этого объема должно быть достаточно для связи разрабатываемого web-сервера с рядом приложений, использующих стек TCP/IP. Микроконтроллер ATmega103 содержит 128 кбайт внутренней программируемой флэш-памяти, которой достаточно для большинства приложений. web-сервер работает при тактовой частоте 4.608 МГц, при которой микроконтроллер способен обрабатывать входящие запросы и остается время на решение других прикладных задач.
10.3.1. Связь и платы расширения
В дополнение к контроллеру Ethernet плата имеет один УАПП, что позволяет организовать SLIP/PPP-соединение или отправку отладочной информации компьютеру.
Также предусмотрен 20-выводной разъем для дополнительной платы. Это может быть плата измерения температуры или плата с реле для решения специальных задач, например открытие и закрытие окна. В разъеме имеются выводы питания платы расширения, сигнал синхронизации частотой 20 МГц, а также 8 входов и 8 выходов. Входы подключены к аналогово-цифровому преобразователю микроконтроллера, поэтому, они могут использоваться или как цифровые линии ввода-вывода или как аналоговые входы 10-разрядного АЦП.
11. Программа для микроконтроллера AVR
Программа, выполняемая во встраиваемом web-сервере на основе микроконтроллера AVR, следует той же структуре построения слоев, как и у набора протоколов TCP/IP. Каждый слой действует отдельно от другого. Драйвер контроллера Ethernet управляет интерфейсом Ethernet. Протокол разрешения адресов (ARP) преобразовывает IP-адреса в Ethernet MAC адреса (и наоборот). Интернет-протокол (IP) предоставляет пакеты для протокола управления передачей (TCP), UDP и протокола управляющих сообщений в сети Internet (ICMP), ICMP отвечает на запросы PING, а TCP/UDP предоставляет данные приложению. Приложения могут связываться с транспортным слоем через буферы с данными и переменными, в которых содержится управляющая информация. В данном разделе объясняется, как набор протоколов TCP/IP реализован в данном приложении.
Рисунок 16. Протокольный стек
11.1. Канальный слой
Контроллер Ethernet настроен на генерацию прерывания при каждом поступлении пакета адресованного непосредственно по Ethernet-адресу или при поступлении широковещательного пакета. При возникновении прерывания микроконтроллер полностью считывает Ethernet-посылку в память.
11.1.1. Драйвер Ethernet
Максимальная длина посылки в сети Ethernet составляет 1514 байт. С учетом этого предусмотрен буфер такого же размера. Сразу после передачи в микроконтроллер посылки проверяется заголовок Ethernet, чтобы гарантировать невозможность приема некорректной посылки. Если адрес Ethernet, обнаруженный получателем, является или широковещательным (все лог. 1) или специфическим адресом Ethernet-устройства, то посылка передается в следующий слой или протокол согласно полю, типу протокола в заголовке Ethernet.
11.2. Сетевой слой
Сетевой слой управляет связью между хостами в сети Ethernet. При этом нет какой-либо формы управления передачей, которая бы гарантировала поступление IP-дейтаграмм хосту или прием всех IP-дейтаграмм от другого хоста. Это делает слой достаточно простым в использовании. ICMP отвечает за передачу сообщений между хостами и используется только для ответа на PING-запросы от хоста. IP управляет связью для перекрытия транспортного слоя.
11.2.1. ARP: протокол разрешения адреса
Если в заголовке Ethernet указан тип 0x0806, то посылка отправлена для ARP, который вычисляет контрольную сумму. Вычисленная контрольная сумма должна быть всегда равна нулю. Если контрольная сумма корректная, то микроконтроллер проверяет, поступил ли запрос на IP-адрес или ответ на отправленный микроконтроллером запрос. Если имеется запрос, то возвращается ответ с адресом Ethernet, входящий в состав Ethernet-адреса отправителя. Запрос на Ethernet-адрес может быть также инициирован со стороны TCP или UDP. TCP или UDP проверяет доступность для пользователя Ethernet-адреса и, если нет, то отправляет запрос. После возращения ответа на запрос ARP вносит Ethernet-адрес в таблицу преобразования адресов Ethernet/IP. В этой таблице содержатся последние 10 Ethernet-адресов, которые связывались с web-сервером.
11.2.2. IP: Internet-протокол
IP-дейтаграмма содержит TCP-сегмент, UDP-дейтаграмму и ICMP-сообщение или другой сегмент протокола управления транспортировкой. IP выполняет доставку без гарантирования надежности и без установления логического соединения. В данной реализации встраиваемого web-сервера IP используется только для проверки дейтаграмм на наличие ошибок и направления данных к корректному протоколу.
После получения IP-дейтаграммы проверяется контрольная сумма и, если она корректная, то проверяется протокольное поле в заголовке. В таблице 7 показаны типы протоколов и соответствующие типы сообщений для IP-протоколов. Непоказанные на рисунке 7 протоколы исключены.
Таблица 7. Типы IP-протоколов и сообщений
Протокол
Тип сообщения
0x01
ICMP
0x06
TCP
0x11
UDP
После получения IP сообщения или сегмента от ICMP, TCP или UDP создается новый заголовок для дейтаграммы и перед ее отправкой в канальный слой вычисляется контрольная сумма.
Данный протокол реализован в соответствии с требованиями RFC2131. В текущей реализации DHCP используется только для получения IP-адреса. Дополнительные конфигурационные параметры от DHCP-сервера игнорируются.
11.3.1. Интерфейс
Для запуска DHCP-клиента необходимо однократно вызвать процедуру dhcp(). Затем выполняется запрос на IP-адрес и в конечном счете web-сервер получит IP-адрес на определенный срок и вводит состояние BOUND. Для обновления времени предоставления адреса web-сервер должен регулярно вызывать функцию dhcp(). Истечение срока предоставления адреса контролируется. За накопление счетчика отвечает функция checkDHCP(). Данная функция должна вызываться в теле функции обработки прерывания таймера 0.
11.3.2. Инициализация
DHCP используется для начальной конфигурации перед тем, как будет настроена программа TCP/IP. В процессе соединения с DHCP-сервером происходит отправка и получение UDP-пакетов. Таким образом, требуется, чтобы IP-слой был в состоянии передавать пакеты в UDP-слой, даже перед предоставлением ему IP-адреса. Для выполнения данного требования IP-слой проверяет состояние флага dhcpConf. Если флаг установлен, то IP передает любой пакет, независимо от адреса. Флаг сбрасывается, когда DHCP достигает состояния BOUND.
11.3.3. Срок предоставления адреса
Срок предоставления адреса - квант времени, в течение которого DHCP-сервер может предоставить предложенный IP-адрес. Если срок предоставления принят из сервера, то он преобразовывается из секунд в минуты для снижения размера хранимых переменных. Счетчик, который контролирует срок предоставления адреса dhcpStatus.min, инкрементируется каждую минуту. Это выполняется в процедуре checkDHCP(), которая вызывается при каждом прерывании таймера 0. Константа DHCP_MINUTE предназначена для масштабирования и позволяет согласовать счет времени с используемой частотой синхронизации.
При тактовой частоте 4,6МГц значение DhcpStatus.min ограничено 45 днями. Поскольку DhcpStatus. min должна быть способна считать до значения T1, которое равно половине срока предоставления адреса, то максимальный срок предоставления адреса может достигать 90 дней. Сроки предоставления адреса свыше 90 дней будут интерпретироваться как 90 дней.
11.3.4. Прочие модификации и ограничения
DHCP-клиент запоминает предоставленный IP-адрес в ЭСППЗУ. После перезагрузки клиент считывает данный IP-адрес и отправляет запрос DHCP-серверу со старым IP-адресом в поле запрашиваемого IP-адреса.
Если ответ об обнаружении и сообщение запроса не поступят, то по истечении короткого интервала времени сообщения будут повторно отправлены. Функция wait(unsigned char time) вызывается для опроса порта UDP на наличие входящих пакетов. Входное значение данной функции определяет время задержки кратно 3,64 секунды (зависит от тактовой частоты).
Клиент просто принимает первое поступившее предложение в ответ на обнаруженное сообщение без попыток выбора среди серверов.
Отклонение и высвобождение сообщений не реализовано. Это означает, клиент не имеет возможности освободить предоставленный IP-адрес.
11.3.5. ICMP: протокол управляющих сообщений в сети Internet
ICMP используется только для ответа на PING-запросы клиента. Все другие сообщения игнорируются. После получения ICMP-сообщения проверяется контрольная сумма и, если сообщение является запросом отклика, то микроконтроллер изменяет запрос на ответ, вычисляет новую контрольную сумму и возвращает сообщение клиенту.
11.4. Транспортный слой
В транспортном слое используются два основных протокола, которые предлагают два различных вида услуг: TCP, который отвечает за надежность доставки, и UDP, который выполняет функции без гарантии надежности. TCP также отвечает за управление потоком при повторной передаче сегментов и подтверждении принятых сегментов.
11.4.1. TCP - протокол управления передачей
TCP - наиболее сложный протокол из протокольного стека TCP/IP. TCP выполняет связь с установлением логического соединения, отвечает за надежность доставки данных и управляет потоком между двумя хостами. Перед установкой соединения два хоста выполняют квитирование установления связи, чтобы быть уверенным в готовности установления связи. Перед отключением соединения оба хоста должны подтвердить прекращение связи. С помощью плавающего окна необходимо убедиться, что хосты не отправляют сегменты, который другой хост не способен принять. Обычно, размер плавающего окна находится в диапазоне 512 - 8192 байт.
11.4.2. Цифровой автомат TCP
Цифровой автомат управляет соединением. На рисунке 17 показан цифровой автомат в соответствии со стандартом, описанном в RFC 793.
Рисунок 17. Цифровой автомат TCP в соответствии со стандартом, описанном в RFC 793
Реализация встраиваемого web-сервера на МК AVR выполнена в соответствии со стандартом, приведенного в RFC 793 (протокол управления передачей) и RFC 1122 (требования для Интернет-хостов), за исключением особых случаев:
Срочность и преимущество. Использование срочных указателей и преимуществ в данной реализации рассматривается как не обязательное и, поэтому, они вообще не реализовывались. Такие опции игнорируются.
Повторные передачи. Алгоритмы для вычисления времен повторной передачи, например, алгоритм медленного старта Якобсона и алгоритм Карно, не включены в состав данной реализации.
Прикладной слой - интерфейс TCP. Стандарт RFC 1122 требует, чтобы в реализации TCP поддерживался механизм генерации сообщений об ошибках. Данный механизм и другие механизмы для связи между TCP и приложением также не включены в состав опорной разработки.
11.4.3. LISTEN
В состоянии LISTEN TCP ожидает либо инициации передачи приложением, либо запрос соединения другим хостом. Когда сегмент TCP находится в состоянии LISTEN, то TCP вначале проверяет, установлен ли флаг сброса RST. Если флаг установлен, то сегмент отвергается. Затем TCP смотрит на подтверждение, которого в данном случае не должно быть, и отправляет RST обратно пользователю, если ACK установлен. Далее оценивается состояние SYN. Если флаг SYN установлен и имеется место для другого сокета, то создаются блок управления передачей (TCB) и сокет, вводится следующее состояние SYN_RCVD и возвращается SYN/ACK.
11.4.4. SYN_SENT
Цифровой автомат вводит данное состояние, когда сервер приложения инициирует передачу и отправлен SYN. Когда сегмент переходит в это состояние, TCP проверяет ACK. Если флаг ACK установлен и подтвержденный порядковый номер меньше или равен отправленному порядковому номеру, то отправляется RST (если флаг RST не установлен в сегменте). Затем сегменты опускаются и TCP-соединение удаляется. Если подтвержденный порядковый номер - корректный и SYN установлен, то возвращается ACK и вводится следующее состояние ESTABLISHED. Если флаг ACK не установлен, но установлен SYN, то хосту возвращается SYN/ACK и следующим состоянием будет SYN_RCVD. В других случаях сегмент опускается.
11.4.5. SYN_RCVD
Данное состояние возникает, если принят SYN в состоянии LISTEN или SYN_SENT. Вначале проверяется, подходит ли порядковый номер (т.е. попадает ли он в определенные пределы). Если порядковый номер не подходит, то отправляется ответ с ACK и опускается сегмент. Если порядковый номер подходит, то проверяется RST. Если флаг RST был установлен, то удаляется TCB и опускается сегмент. Затем проверяется флаг SYN. Если флаг SYN был установлен, то отправляется ответ с RST, опускается сегмент и удаляется TCB. Если флаг ACK установлен, то следующим состоянием вводится ESTABLISHED. Если флаг ACK не был установлен, то посылка опускается.
11.4.6. Established
Состояние Established - основное состояние цифрового автомата TCP. Из этого состояния возникает большинство передач данных. По аналогии с действиями в состоянии SYN_RCVD, сначала проверяется приемлемость порядкового номера и состояние флагов RST и SYN. Если один из этих флагов установлен, то формируется ответ RST и TCB удаляется. Далее проверяется ACK. Если флаг ACK установлен, то обновляется окно и удаляются элементы, подтвержденные из очереди повторной передачи. Далее выполняется обработка данных в сегменте. Это означает копирование содержимого в приемный буфер и обновление размера окна. Если флаг FIN установлен, то вводится состояние CLOSE_WAIT и подтверждается FIN. Если приложение желает прекратить соединение, то отправляется FIN и вводится состояние FIN_WAIT1.
11.4.7. FIN_WAIT1
В данном состоянии выполняется обработка по аналогии с состоянием ESTABLISHED. Единственное исключение, когда на все отправленные сегменты будет получено подтверждение, то следующим состоянием будет FIN_WAIT2.
11.4.8. FIN_WAIT2
Аналогично FIN_WAIT1 в данном состоянии сегменты обрабатываются так же, как в состоянии ESTABLISHED. Единственное исключение, когда принимается флаг FIN, то возвращается подтверждение и следующим состоянием будет TIME_WAIT.
11.4.9. CLOSE_WAIT
В этом состоянии для отправки сообщений выполняется только подтверждение поступающих сообщений. Другой хост выполняет отправку данных до тех пор, пока для отправки из сервера не будет данных, после чего отправляется FIN и соединение закрывается. Вначале проверяется наличие приемлемого порядкового номера и состояние флагов RST и SYN. Если один из этих флагов установлен, то отправляется ответ RST и TCB удаляется. Далее проверяется ACK. Если флаг ACK установлен, то обновляется окно и удаляются элементы, подтвержденные из очереди повторной передачи. Когда приложение желает закрыть соединение, то отправляется FIN и следующим состоянием будет LAST_ACK.
11.4.10. LAST_ACK
В этом состоянии подтверждаются только ожидаемые сегменты: предыдущие сегменты данных или FIN. Если FIN не имеет подтверждения, то снижается таблица. В противном случае удаляется TCB и следующим состоянием будет LISTEN.
11.4.11. TIME_WAIT
После того, как сервер закрывает соединение, он должен продолжать следить, чтобы другой хост принял последние сегменты из буфера повторной передачи. В этом состоянии ничего не выполняется помимо нормальной обработки повторной передачи. Поистечении выдержки времени TCB удаляется.
11.4.12. Сокеты и окна
После установки соединения создается блок управления передачей (TCB). Блок содержит информацию относительно соединения и указатель для ввода и вывода буферов. Размер буфера определен константой TCP_WIN_SIZE, а максимальное значение блоков TCB задано константой TCP_MAX_SOCKETS. Если соединение установлено и принято подтверждение, то размер окна обновляется. Это означает, что сегменты с порядковым номером выше подтвержденного порядкового номера плюс размер окна не должны ни отправляться, ни приниматься. Если сегмент поступает неупорядоченно, то он обрабатывается, а затем данные запоминаются в буфере по корректным адресам.
11.5. Приложения
В составе встраиваемого web-сервера на основе МК AVR может выполняться несколько приложений. Основные ограничения - используемая память и быстродействие. Одновременное выполнение нескольких приложений означает снижение производительности. Для микроконтроллера AVR реализованы следующие приложения: HTTPD, FTPD и почтовый клиент. HTTPD - HTTP- сервер, который позволяет просматривать web-страницы через стандартный web-браузер. FTPD - FTP-сервер, который позволяет пользователю удаленно скачать содержимое сервера из любого места в сети. SMTP - почтовый клиент для отправки заданной пользователем почты с помощью специального почтового сервера.
11.5.1. Протокол передачи файлов (FTP) Daemon
Протокол передачи файлов реализован в соответствии с RFC 959, но с некоторыми исключениями. В соответствии с RFC 959 в минимальном исполнении FTP-протокол должен поддерживать следующие команды: USER, QUIT, PORT, TYPE, MODE, STRU, RETR, STOR и NOOP. Команды MODE, STRU и TYPE должны быть реализованы для поддерживаемых значений. Поскольку MODE и STRU могут иметь только одно значение в рассматриваемой реализации, то данные команды не реализованы и возвращается "500 Command not understood." (500 команд не понимается). Команда TYPE поддерживает типы ASCII и BINARY, которых достаточно для передачи текстовых и двоичных файлов. Остальная часть команд в перечне реализована в дополнение к PASS для отправки пароля, LIST и NLST для получения информации о директориях.
Другим ограничением FTP является то, что только один пользователь может организовать соединение единовременно. Если происходит попытка установить новое соединение, когда уже одно активно, то клиент получит сообщение, что превышено максимально допустимое количество соединений и соединение закроется.
FTP использует хорошо известный порт 21 для управления соединениями. Когда клиент или пользователь желает передать данные, то должно быть открыто соединение. Данное соединение использует порт 21.
Протокол FTP daemon реализован как цифровой автомат со следующими состояниями:
UNLOCKED - FTP свободен и готов для нового соединения. После установки соединения сервер отправляет приветственное сообщение клиенту и запрашивает имя пользователя. После отправки сообщения вводится состояние USER.
USER - в этом состоянии принимается только команда USER с именем пользователя. После приема команды USER отправляется запрос на получение пароля и вводится состояние PASS.
PASS - в этом состоянии воспринимается только команда PASS с паролем пользователя. После приема команды PASS устанавливается корректность пароля, а затем FTP вводит состояние IDLE и отправляет клиенту подтверждение о регистрации пользователя. В случае некорректности пароля соединение прекращается и FTP вводит состояние UNLOCKED.
IDLE - данное состояние используется при использовании остальных команд. Если принимается команда, которая требует передачи данных, то FTP вводит состояние DATA. Если же принимается какая-либо другая команда, то FTP выполняет надлежащее действие и остается в состоянии IDLE.
DATA - когда FTP находится в состоянии DATA, то обработка команд не выполняется. FTP снабжает TCP данными, если клиент запрашивал данные, и запоминает входящие данные в файле, если клиент желает сохранения данных.
Таблица 8. FTP-команды
Команда
Употребление
Описание
USER
USER <имя_пользователя>
Используется при входе в систему. Сервер возвращает запрос на ввод пароля пользователем и вводит состояние PASS.
PASS
PASS <пароль>
Используется при входе в систему. Если пароль корректен для указанного пользователя, то вход в систему разрешается.
TYPE
TYPE <тип>
Сервер сообщает, какой тип файла передан. Возможные типы I (двоичный) и A (ASCII). Во встраиваемом web-сервере на основе МК AVR нет разницы между этими двумя типами.
PORT
PORT 192,168,1,2,4,231
Порт сообщает серверу, какой IP-адрес и номер порта должен использоваться при открытии сеанса связи. Первые четыре числа показывают IP-адрес, а два последних - номер порта. В данном примере номер порта 4 x 256 + 231 = 1255.
RETR
RETR <имя_файла>
Используется, когда клиент ожидает загрузку файла. Сервер открывает соединение для IP-адреса и номера порта, предоставленных командой PORT и передает файл с помощью типа, заданного TYPE.
STOR
STOR <имя_файла>
Используется, когда клиент ожидает передачу файла удаленному ПК. Сервер открывает соединение для IP-адреса, заданной командой PORT и получает файл, отправленный клиентом.
LIST
LIST
Получение большого перечня директорий с атрибутами, размером файлов и именами файлов. Открывается соединение тем же способом, что и при использовании команды отправки файла (RETR). Вслед за последним файлом отправляется общее свободное пространство.
NLST
NLST
Получение сокращенного перечня имен директорий с указанием только имен файлов.
QUIT
QUIT
Используется клиентом для закрытия соединения. Сервер отправляет клиенту 'Goodbye' и закрывает соединение.
11.6. Файловая система флэш-памяти
Файловая система для встраиваемого web-сервера на основе микроконтроллера AVR разработана для запоминания web-страниц и изображений вместе с конфигурационными файлами. Данные файлы обычно не требуют частых обновлений. Это означает, что эффективность чтения - наиболее важный показатель. Другой важной проблемой в файловой системе для флэш-памяти является поддержание равномерности распределения циклов записи, т.к. для каждой страницы памяти DataFlash гарантируется только 10 тысяч циклов перезаписи. Применение файловой системы с таблицей размещения файлов (FAT), которая является частью флэш-памяти, нежелательно, т.к. в этом случае будет иметь место неравномерность распределения циклов записи.
Файловая система поддерживает традиционные имена файлов MS-DOS с 8 + 3 символами и является чувствительной к регистру. Максимальное число файлов ограничено только количеством страниц и доступным пространством. Количество текущих открытых файлов ограничено значением FILE_MAX_OPEN_FILES, которое определено в файле file.h. Для записи может быть открыт только один файл.
11.6.1. Линейная файловая система
Рисунок 18. Блочная организация файловой системы
На рисунке 18 показана организация блоков в памяти DataFlash. Размер блока равен размеру страницы. Информация о файловой системе записана в ЭСППЗУ в таблице статуса информации. Данная таблица изменяется при каждой записи или удалении файла. Если файл удален, то номер страницы записывается в таблицу к заголовку файла. Страницы, содержащие удаленный файл, сразу не освобождаются, а только открепляются. Когда число открепленных файлов превысит определенное значение или когда не осталось свободных страниц, то открепленные страницы восстанавливаются и в дальнейшем свободны для использования. Восстановление выполняется путем сортировки перечня удаленных файлов в порядке увеличения номеров страниц и вычисления смещения для каждого файла после удаленных файлов. Все страницы перемещаются в соответствии со смещением. В результате все свободные страницы окажутся за последним файлом и смогут использоваться снова.
Рисунок 19. Таблица информационного статуса
Рисунок 20. Заголовок файла
На рисунках 19 и 20 показано, как отформатирована таблица информационного статуса и заголовок файла. В данном решении при записи файла или при перемещении исправленных страниц предусмотрена только страничная запись. Обычно исправление возникает, когда размер записанных файлов равен размеру памяти DataFlash. Это означает, что циклы записи практически равномерно распределены в пределах DataFlash.
11.6.2. Время доступа и производительность
Поскольку данная файловая система в основном рассчитана на частое чтение и несистематическую запись, то скорость записи не имеет приоритета. Поэтому, здесь рассматривается только доступ для чтения.
Для доступа к данному файлу файл-менеджер выполняет линейный поиск, начиная с первого файла. Для каждого файла необходим один доступ для чтения. Среднее число доступов, таким образом, равно:
т.е. необходимое количество блоков плюс заголовок файла. SPI использует четвертую часть частоты ядра микроконтроллера и при каждом периоде синхронизации SPI считывается один бит. Таким образом, приблизительное время доступа к одной странице составляет 1,86 мс. С учетом этого среднее время чтения одного файла равно:
Таким образом, максимальная производительность при заполнении одним файлом всей DataFlash составляет 0,14 Мбайт/сек.
Эффективность записи в файловую систему будет близка к эффективности чтения, но, если запись инициирует процесс исправления, то потребуется больше времени.
11.7. Приложения Ethernet/TCP/IP/
Каждое событие по приему инициируется запросом на прерывание от контроллера Ethernet. Данное прерывание имеет наивысший приоритет, т.к. все остальные действия мгновенно прекращаются. Реакция на принятый пакет отправляется при обработке данного прерывания.
Данные, отправляемые из TCP-протокола, отправляются периодически с помощью прерывания по переполнению таймера. При каждом возникновении данного прерывания инкрементируется счетчик. Данный счетчик определяет момент повторной передачи пакета.
Приложения выполняются в то время, когда не передаются пакеты. Это означает, что, при работе нескольких приложений, каждое приложение должно активизироваться циклическим способом. Распределение времени и памяти должен выполнить программист.
11.8. Ограничения
Поскольку программа для данного web-сервера оптимизирована по размеру и быстродействию, то для web-сервера имеются некоторые ограничения. В протоколах нижних слоев (Ethernet - IP) необходимо реализовать только возможности для реагирования на нормальные заголовки. TCP упрощенно, но практически полностью реализован.
12. Защита
При подключении к незащищенной сети необходимо предпринять некоторые меры предосторожности. Данное еще более важно, если оборудование выполняет критичные действия или содержит чувствительную информацию. Встраиваемый web-сервер на основе микроконтроллера AVR не решает данные проблемы, даже если сервер способен управлять критичными системами. Имеется несколько способов предотвращения несанкционированного доступа к web-серверу на микроконтроллере AVR. Некоторые из этих методов описаны ниже.
12.1. Ограничение доступа
Самый простой доступ предотвращения доступа к приложениям, работающих на вершине TCP, со стороны посторонних пользователей - организация возможности слежения за соединением только с одного определенного клиента. Это достигается путем предоставления IP-адреса, когда сервер начинает следить за портом.
TCPpopen (21, 0xc0a80102)
Данный пример показывает, как разрешить слежение за соединением на порте 21 (FTP) с хостом, у которого IP-адрес 0xc0a80102 (192.168.1.2). Другие запросы через данный порт отклоняются. Также можно указать несколько IP-адресов, для которых разрешен доступ к серверу. Это выполняется путем вызова TCPpopen несколько раз.
Несмотря на кажущуюся безопасность данного метода для обычных приложений необходимо учесть, что соединение не подвергается шифрованию, т.о. каждый может "следить" за данным соединением. Кроме того, IP-адрес может быть украден и регистрация может произойти из другого IP-положения. Если IP-адрес web-сервера сконфигурирован DHCP, то сервер изменит IP-адрес без уведомления пользователя.
12.2. Шифрование
Более эффективным методом является шифрование соединения с сервером. Вместо непосредственной отправки данных приложению на вершине стека TCP/IP, данные пропускаются через алгоритм шифрации/дешифрации. Это означает, что другие пользователи не смогут "следить" за соединением и что они, не имея корректного ключа, не смогут связаться с сервером. Примером такой службы является SSL. Кроме этого, имеются ряд других подобных реализаций.
12.3. Отказ от обслуживания (DOS)
Поскольку при реализации сервера не учитывалось обслуживание нескольких пользователей и не принято во внимание, что одновременно могут поступать 100 запросов на соединение, то враждебный пользователь может "подвесить" сервер путем превышения максимальной загрузки сервера. До тех пор, пока враждебные пользователи будут подключены к такому серверу, как встраиваемый web-сервер на МК AVR, нет возможности избежать данной проблемы. Лучший выход из этой ситуации - ограничение количества пользователей, подключаемых к серверу.
Несмотря на то, что нет 100%-ой гарантии подавить активность враждебного пользователя, все-таки некоторые меры можно предпринять. Одна из них - использовать брандмауэр между встраиваемым web-сервером и внешними пользователями. Брандмауэр может остановить других пользователей для входа в сеть и поддерживает необходимые функции, доступные для правильных пользователей. В сочетании с применением шифрования сервер будет достаточно безопасным в обычных приложениях.
13. Конфигурация
Файл server.ini, расположенный в DataFlash, конфигурирует web-сервер. Данный файл может быть записан с помощью Y-модема (протокол синхронной передачи файлов блоками по 1024 байта) или FTP. Поскольку FTP может использоваться только при доступности Web-сервера в сети Ethernet, то использование последовательной связи будет правильным выбором для начальной конфигурации или, если сервер функционирует некорректно ввиду нарушения конфигурации. Поскольку для последовательной связи используется модем, то можно использовать любую программу, поддерживающей y-модем. Для простоты конфигурации и загрузки файла server.ini может использоваться графический интерфейс "ATMEL AVR Embedded Web Server Terminal".
13.1. Запуск
В процессе запуска вызывается процедура config(), которая открывает файл server.ini и считывает следующие опции:
MAC-адрес
Включение/отключение DHCP
Статический IP, если DHCP отключен
Если config() не может считать все требуемые опции (например, если файл не существует), то возвращается 0. В этом случае вызывается DefaultConfig() и далее используются значения по умолчанию, заданные в config.h.
13.2. server.ini
Конфигурационный файл необходимо отформатировать следующим образом:
[Заголовок_1]
имя_1=значение_1
имя_2=значение_2
[Заголовок_2]
имя_3=значение_3
При вызове config() из файла server.ini считываются поля, представленные в таблице 9.
Таблица 9. Установки в файле server.ini
Метка
Описание
Пример
MAC0
16 старших бит MAC-адреса в шестнадцатиричном коде.
MAC0=0001
MAC1
Разряды 17-32 MAC-адреса в шестнадцатиричном коде.
MAC1=0A0B
MAC2
16 младших бит MAC-адреса в шестнадцатиричном коде.
MAC2=0C0D
DHCP
Разрешение/запрет DHCP (1/0)
DHCP=0
IP0
16 старших бит IP -адреса (если DHCP отключен) в шестнадцатиричном коде.
IP0=0ABF
IP1
16 младших бит IP -адреса (если DHCP отключен) в шестнадцатиричном коде.
IP1=FF9D
Поля должны быть размещены под заголовком [System].
Server.ini может также использоваться для конфигурации приложений; для каждого приложения должен быть создан заголовок. Доступ к значениям выполняется с помощью функции getOption() в файле config.c. В настоящее время только SMTP и FTP используют server.ini для конфигурации. Более подробная информация может быть найдена в документации на SMTP и FTP.
14. Взаимосвязь протоколов
На рисунке 21 показана взаимосвязь протоколов, реализованных в виде модулей в рассматриваемой опорной разработке. Протоколы описаны ниже:
Рисунок 21. Взаимосвязь протоколов
httpd.c (присоединенная процедура протокола передачи гипертекста)
Для работы HTTPD необходимы TCP и файловая система для памяти DataFlash.
ftpd.c (присоединенная процедура протокола передачи файлов)
Для работы FTPD необходимы TCP и файловая система для памяти DataFlash.
smtp.c (протокол простой отправки почты)
Для работы SMTP необходима запущенная реализация TCP.
dhcp.c (протокол динамической конфигурации хоста)
Для работы DHCP необходимы IP и UDP. На фазе инициализации DHCP требует, чтобы протоколы IP и UDP передавали любые IP-пакеты до настройки IP-адреса. Флаг dhcpConf используется для сигнализации, что DHCP находится на фазе инициализации.
tcp.c (протокол управления передачей)
Для работы TCP необходим IP.
udp.c (протокол дейтаграмм пользователя)
Для работы UDP необходим IP.
icmp.c (протокол управляющих сообщений в сети Internet)
Для работы ICMP необходим IP.
ip.c (протокол Internet)
Для работы IP необходим ETHERNET.
arp.c (протокол разрешения адреса)
Для работы ARP необходим ETHERNET.
ethernet.c (драйвер контроллера Ethernet)
ETHERNET зависит только от аппаратного контроллера Ethernet.
config.c (программа автоматической конфигурации)
Для CONFIG необходима файловая система для DataFlash, чтобы считать конфигурационный файл. Если конфигурационный файл недоступен, то возможен возврат стандартных значений.
file.c (файловая система)
Для работы FILE необходима DATAFLASH.
dataflash.c (интерфейс с DataFlash)
DATAFLASH зависит только от микросхемы DataFlash.
main.c (основной цикл)
MAIN должна инициализировать Ethernet, DataFlash, файловую систему, TCP, DHCP и HTTPD, если данные протоколы используются.
Для работы DHCP, FTPD и HTTPD их необходимо опрашивать раздельно.
Рисунок 22. Принципиальная электрическая схема
15. Описание выводов
Таблица 1. Описание выводов микроконтроллера Atmel ATmega103
Номер вывода
Наименование вывода
Описание
1
PEN
Разрешение режима низковольтного последовательного программирования. Подтянут к плюсу.
2
PE0(PDI/RXD)
Ввод данных при программировании для ISP и прием данных для УАПП1. Подключен к мультиплексору, который переключает между двумя этими устройствами.
3
PE1(PDO/TXD)
Вывод данных при программировании для ISP и передача для УАПП1. Подключен к мультиплексору, который переключает между двумя этими устройствами.
4
PE2
Подключен к CPLD для дальнейших расширений.
5, 7, 8, 9, 14, 15, 16, 17
PE3, PE5, PE6, PE7, PB4, PB5, PB6, PB7
Выходы [0:7]. Подключены к разъему 10x2. Могут использоваться для подключения другой платы к web-серверу. Данные выводы также могут использоваться как входы.
6
PE4(INT4)
Линия запроса прерывания от контроллера Ethernet.
10
PB0(SS)
Выбор подчиненного режима SPI. Связан с DataFlash
11
PB1(SCK)
Вход синхронизации последовательного программирования ISP и выход синхронизации SPI. Связан с мультиплексором, который переключает между двумя данными устройствами.
12
PB2(MOSI)
Выход ведущего SPI. Подключен к DataFlash.
13
PB3(MISO)
Вход ведущего SPI. Подключен к DataFlash.
18
TOSC2
Не используется.
19
TOSC1
Не используется.
20
RESET
Сигнал сброса микроконтроллера. Подключен к схеме сброса MAX707.
23
XTAL2
Выход кварцевого генератора.
24
XTAL1
Вход кварцевого генератора.
25
PD0(INT0)
Сброс контроллера Ethernet.
26
PD1(INT1)
Подключен к CPLD для дальнейшего расширения.
27
PD2(INT2)
Вход приема УАПП2.
28
PD3(INT3)
Выход передачи УАПП2.
29
PD4(IC1)
TCK. синхронизация интерфейса JTAG. Подключен к CPLD для ее программирования CPLD.
30
PD5
TDO. JTAG. Подключен к CPLD для ее программирования.
31
PD6(T1)
TDI. JTAG. Подключен к CPLD для ее программирования.
32
PD7(T2)
TMS. JTAG. Подключен к CPLD для ее программирования.
33
WR
Сигнал записи внешнего статического ОЗУ. Подключен к CPLD.
34
RD
Сигнал чтения внешнего статического ОЗУ. Подключен к CPLD.
35 -42
PC[0:7]
Адресные линии 8…15.
43
ALE
Разрешение фиксации адреса. Подключен к CPLD.
44 -51
PA[7:0]
Адресные линии 7…0 и линии данных 7…0. Подключены к CPLD, статическому ОЗУ и контроллеру Ethernet.
54 -61
PF[7:0]
Входы [0:7]. Подключены к разъему 10x2. Могут использоваться для подключения другой платы к web-серверу. Данный порт также связан с аналогово-цифровым преобразователем (АЦП). Предназначены только для ввода.
62
AREF
Аналоговое опорное напряжение.
Таблица 11. Кристалл CS8900
Номер вывода
Наименование
Описание
2, 3, 4, 5, 6, 17
ELCS, EECS, EESK, EEDataOut, EEDataIn, CSOUT
Интерфейс ЭСППЗУ и загрузочного ПЗУ
7
CHIPSEL
Используется совместно с внешней логикой дешифрации мультиплексированной шины. Подтянут к общему.
11, 13, 15
DMARQ[2:0]
Запрос на прямой доступ к памяти. Не используется.
12, 14, 16
DMACK[2:0]
Подтверждение ПДП. Активный низкий уровень. Подтянут к плюсу.
18, 19, 20, 21, 24, 25, 26, 27
SD[15:8]
Линии данных [15:8]. Не используется. Подтянут к общему.
28
MEMW
Запись в память. Подключен к CPLD.
29
MEMR
Чтение из памяти. Подключен к CPLD.
30, 31, 35
INTRQ[3:1]
Линии запроса прерывания 3…1. Не используются.
32
Линия запроса прерывания 0. Подключен к микроконтроллеру.
INTRQ0
33
IOCS16
16 разряд выбора микросхемы ввода-вывода. Выход, генерируемый CS8900 при распознавании адреса на шине ISA, соответствующего назначенному пространству ввода-вывода.
34
MEMCS16
16 разряд выбора микросхемы памяти. Выход, генерируемый CS8900 при распознавании адреса на шине ISA, соответствующего назначенному пространству ввода-вывода.
36
SBHE
Вход разрешения системной старшей шины данных. Вход с активным низким уровнем, индицирующий данные на SD[15:8]. Связан с CPLD.
Описание: initEthernet инициализирует контроллер Ethernet. initEthernet конфигурирует прерывание по пакетам с индивидуальными адресами или широковещательными адресами контроллера Ethernet, выделяет память для контроллера Ethernet в памяти микроконтроллера и предоставляет контроллеру Ethernet неповторяемый адрес.
receiveEvent
Наименование: receiveEvent - считывает посылку из контроллера Ethernet.
Применение: #include "ethernet.h"
void receiveEvent(void);
Файл с прототипом функции: ethernet.h
Описание: receiveEvent должна вызываться при каждом приеме пакета контроллером Ethernet (по прерыванию 4). receiveEvent считывает пакет и передает управление ARP или IP в зависимости от указанного в поле заголовка номера протокола.
sendFrame
Наименование: sendFrame - записывает посылку в контроллер Ethernet для отправки.
Применение: #include "ethernet.h"
char sendFrame(unsigned int length, unsigned int type, unsigned int ip0, unsigned int ip1);
Файл с прототипом функции: ethernet.h
Описание: sendFrame отправляет данные из глобального буфера посылки. type используется для указания адреса получателея. ip0 и ip1 используются для поиска адреса Ethernet получателя. Если Ethernet-адрес не представлен в таблице ARP, то посылка отклоняется и отправляется ARP-запрос на IP-адрес. Отправитель отвечает за повторную передачу посылки в случае неудачного отправления.
Возвращаемое значение: sendFrame возвращает 1 в случае успешного и 0 в случае неуспешного завершения.
getMAC
Наименование: getMAC - проверяет наличие Ethernet-адреса в ARP-таблице.
Применение: #include "ethernet.h"
char getMAC(unsigned int ip0, unsigned int ip1);
Файл с прототипом функции: ethernet.h
Описание: getMAC проверяет, имеется ли в ARP-таблице Ethernet (управление информационным доступом) адрес для заданного IP-адреса. Если нет, то отправляется ARP-запрос.
Возврашаемое значение: Если Ethernet-адрес найден в ARP-таблице, то возвращается 1, иначе - 0.
dhcpMAC
Наименование: dhcpMAC - сохраняет Ethernet-адрес dhcp-сервера для долговременного хранения.
Применение: #include "ethernet.h"
void dhcpMAC(unsigned int ip0, unsigned int ip1);
Файл с прототипом функции: ethernet.h
Описание: dhcpMAC вызывается первый раз после приема предложения от dhcp. Представленный в посылке Ethernet-адрес запоминается для дальнейшего долговременного использования.
ARP
receiveARP
Наименование: receiveARP - обработка ARP-запроса.
Применение: #include "arp.h"
void receiveARP(void);
Файл с прототипом функции: arp.h
Описание: receiveARP вызывается канальным слоем, когда принятая посылка является ARP-запросом. receiveARP изменяет запрос на ответ и вызывает send-Frame для отправки посылки.
sendARP
Наименование: sendARP - отправка ARP-запроса.
Применение: #include "arp.h"
void sendARP (unsigned int ip0, unsigned int ip1);
Файл с прототипом функции: arp.h
Описание: sendARP выполняет ARP-запрос, запрашивая IP-адрес, и вызывает sendFrame для отправки посылки
IP
transmitIP
Наименование: transmitIP - заполняет IP-заголовок и отправляет посылку в канальный слой.
Применение: #include "ip.h"
void transmitIP(int length, unsigned int ip0, unsigned int ip1, char type);
Файл с прототипом функции: ip.h
Описание: transmitIP вызывается из слоя передачи при необходимости отправить посылку. transmitIP создает IP-заголовок и вызывает канальный слой для отправки посылки.
receiveIP
Наименование: receiveIP - принимает IP-пакет.
Применение: #include "ip.h"
void receiveIP(unsigned int length);
Файл с прототипом функции: ip.h
Описание: receiveIP должен вызываться из канального слоя (Ethernet) после приема IP-пакета. receiveIP проверяет IP-заголовок и вызывает ICMP, TCP или UDP.
ICMP
receiveICMP
Наименование: receiveICMP - принимает ICMP-пакет.
Применение: #include "icmp.h"
void receiveICMP(unsigned int *frame, int length, unsigned int ip0, unsigned int ip1);
Файл с прототипом функции: icmp.h
Описание: receiveICMP должен вызываться IP после приема ICMP-пакета. receiveICMP проверяет поля ICMP-заголвка и отвечает на запросы.
UDP
receiveUDP
Наименование: receiveUDP - принимает UDP-дейтаграмму из IP.
Применение: Void receiveUDP(unsigned int UDPStart, unsigned int UDPLength, unsigned int hisIP0, unsigned int hisIP1, unsigned int myIP0, unsigned int myIP1).
Файл с прототипом функции: udp.h
Описание: receiveUDP вызывается из IP-слоя, информируя UDP-слой, что данные доступны в глобальном буфере посылки. Данные копируются из посылки в буфер в UDP-слое. UDPStart указывает на позицию в посылке, с которой начинается UDP-дейтаграмма. UDPLength - длина UDP-дейтаграммы.
hisIP0 - 16 старших бит IP-адреса отправителя.
hisIP1 - 16 младших бит IP-адреса отправителя.
myIP0 - 16 старших бит IP-адреса получателя, т.к. он обнаружен в принятом IP-заголовке.
myIP1 - 16 младших бит IP-адреса получателя, т.к. он обнаружен в принятом IP-заголовке.
Причиной необходимости прохождения IP-адреса в UDP-слой является то, что при вычислении контрольной суммы должен быть известен IP-адрес приемника. В процессе настройки DHCP клиента последний не принимает IP и нуждается в IP-адресе из IP-заголовка для корректного вычисления контрольной суммы.
sendUDP
Наименование: sendUDP - отправка UDP-дейтаграммы.
Применение: Unsigned char sendUDP(unsigned char * data, unsigned int dataLength, unsigned int hisIP0, unsigned int hisIP1, unsigned int myPort, unsigned int hisPort).
Файл с прототипом функции: udp.h
Описание: SendUDP отправляет UDP- дейтаграмму.
data -указатель на данные, подлежащие отправке.
dataLength - длина данных.
hisIP0 - 16 старших бит IP-адреса назначения.
hisIP1 - 16 младших бит IP-адреса назначения.
myPort - порт отправителя.
hisPort - порт назначения.
Возвращаемое значение: Если дейтаграмма отправлена, то возвращается 1, если нет, то 0. Если в ARP-таблице не найдено назначение, то отправляется ARP-запрос и возвращается 0; дейтаграмму необходимо повтороно передать позже.
readUDP
Наименование: readUDP - опрос UDP-буфера.
Применение: Unsigned char readUDP(unsigned int port, UDPB * appBuffer).
Файл с прототипом функции: udp.h
Описание: Вызывается приложением для проверки появления новых данных. Если новые данные обнаружены, то они копируются в прикладной буфер. AppBuffer - указатель на буфер, в который должны быть скопированы данные.
Возвращаемое значение: возвращает 1, если найдены и скопированы в буфер новые данные, иначе - 0.
TCP
TCPpopen
Наименование: TCPpopen - открытие порта для наблюдения
Применение: #include "tcp.h"
char TCPpopen (unsigned int port, unsigned long ip);
Файл с прототипом функции: tcp.h
Описание: TCPpopen oткрывает порт и начинает наблюдать за соединением. port отображает номер наблюдаемого порта, а ip указывает на IP, которому разрешено использовать данный порт. Если ip равен 0, то нет ограничений по IP-адресу.
Возвращаемое значение: при успешном октрытии порта TCPpopen возвращает 1, иначе - 0.
TCPaopen
Наименование: TCPaopen - активное открытие соединения на данном порте.
Применение: #include "tcp.h"
SOCKET *TCPaopen (unsigned int port, unsigned int ip0, unsigned int ip1, unsigned int myport);
Файл с прототипом функции: tcp.h
Описание: TCPaopen активно открытвает соединение по заданным IP и порту из MYport. Если MYport равен 0, то номер порта назначается TCPaopen. После завершения TCPaopen данные могут быть отправлены с помощью TCPsend.
Возвращаемое значение: TCPaopen возвращает указатель на недавно открытый сокет при успешном завершении и пустой указатель при неудачном завершении.
TCPlistenPort
Наименование: TCPlistenPort - проверка, выполняется ли наблюдение за портом?
Применение: #include "tcp.h"
char TCPlistenPort(unsigned int port, unsigned long ip);
Файл с прототипом функции: tcp.h
Описание: TCPlistenPort отвечает, имеется ли на заданном порте сокет. port указывает номер порта, а ip - IP-адрес.
Возвращаемое значение: если порт под наблюдением, то TCPlistenPort возвращает 1, иначе - 0.
TCPstop
Наименование: TCPstop - прекращение наблюдения за портом.
Применение: #include "tcp.h"
void TCPstop(unsigned int port, unsigned long ip);
Файл с прототипом функции: tcp.h
Описание: TCPstop прекращает наблюдение заданного порта. port указывает на порт, а ip на IP-адрес (см. TCPpopen).
TCPfindSockets
Наименование: TCPfindSockets - поиск соединения на заданном порте.
Применение: #include "tcp.h"
SOCKET *TCPfindSockets(unsigned int port);
Файл с прототипом функции: tcp.h
Описание: TCPfindSockets ищет все соединения на заданном порте. По завершении поиска возвращается перечень сокетов.
Возвращаемое значение: TCPfindSockets возвращает указатель на первый сокет порт, если найдены существующие соединения, в противном случае возвращается пустой указатель.
TCPget
Наименование: TCPget - чтение входящих данных из TCP-буфера.
Применение: #include "tcp.h"
int TCPget(SOCKET * socket, int maxSize, char * buffer);
Файл с прототипом функции: tcp.h
Описание: TCPget считывает данные из TCP-буфера. Указатель на текущую позицию перемещается и буферное пространство освобождается для новых данных. socket указывает на считываемые сокет, maxSize содержит максимальный размер для считывания, а buffer - указатель на буфер, в котором должны быть сохранены данные.
Возвращаемое значение: TCPget возвращает количество байт, считываемых из буфера. Если в буфере нет новых данных, то возвращается 0.
TCPread
Наименование: TCPread - считывает данные из буфера TCP без перемещения указателя.
Применение: #include "tcp.h"
int TCPread(SOCKET * socket, int maxSize, char * buffer, char reset);
Файл с прототипом функции: tcp.h
Описание: TCPread считывает данные из буфера TCP. Указатель на текущую позицию не перемещается. Вместо временного указателя показывается, откуда считывать при следующем вызове TCPread. TCPread должна вызываться с положительным значением Reset. Положительное значение Reset устанавливает временный указатель в ту же позицию, что и указатель текущей позиции (см. TCPget).
Возвращаемое значение: TCPread возвращает количество считанных байт.
TCPreadln
Наименование: TCPreadln - считывает одну строку из буфера TCP.
Применение: #include "tcp.h"
int TCPreadln(SOCKET * socket, int maxSize, char * buffer, char reset);
Файл с прототипом функции: tcp.h
Описание: TCPreadln действует аналогично TCPread, за исключением того, что за один вызов TCPreadln считывает только одну строку. Если строка очень длинная для буфера, то возвращается только maxSizebytes байт TCP-буфера. При следующем вызове TCPreadln считывается оставшаяся часть строки.
Возвращаемое значение: TCPreadln количество считанных байт.
TCPsend
Наименование: TCPsend - запись данных в буфер TCP для отправки.
Применение: #include "tcp.h"
int TCPsend(SOCKET * socket, int size, char * buffer);
Файл с прототипом функции: tcp.h
Описание: TCPsend записывает, заданное переменной size, количество байт из буфера в TCP-буфер для отправки по сокету.
Возвращаемое значение: TCPsend возвращает количество байт при успешной их отправке, в противном случае возврщается 0.
TCPsend_P
Наименование: TCPsend_P - запись данных из памяти программ в TCP-буфер для отправки.
Применение: #include "tcp.h"
int TCPsend_P(SOCKET * socket, int size, char flash * buffer);
Файл с прототипом функции: tcp.h
Описание: TCPsend_P записывает, заданное переменной size, количество байт из буфера памяти программ в TCP-буфер для отправки через сокет.
Возвращаемое значение: TCPsend_P возвращает количество отправленных байт в случае успешной передачи и 0 в противном случае.
TCPclose
Наименование: TCPclose - закрытие соединения.
Применение: #include "tcp.h"
void TCPclose(SOCKET * socket);
Файл с прототипом функции: tcp.h
Описание: TCPclose закрывает соединение на сокете. Если установлено состояние TCP, то TCP ожидает передачи всех данных, а затем вводится состояние fin_wait1. Если текущее TCP-состояние - close_wait, то TCP ожидает отправки всех данных и вводит состояние last_ack. После отправки всех данных и закрытия соединения обеими хостами сокет удаляется и подготавливаетя для нового соединения.
TCPsize
Наименование: TCPsize - возвращает количество несчитанных байт TCP-буфере.
Применение: #include "tcp.h"
int TCPsize(SOCKET * socket);
Файл с прототипом функции: tcp.h
Описание: TCPsize возвращает число несчитанных байт из TCP-буфера. После вызова TCPget размер уменьшается на значение, возвращенное TCPget.
Возвращаемое значение: TCPsize возвращает количество байт в TCP-буфере; если сокет не существует или нет данных в TCP-буфере, то возвращается 0.
TCPbufferSpace
Наименование: TCPbufferSpace - возврат свободного пространства в TCP-буфере.
Применение: #include "tcp.h"
int TCPbufferSpace(SOCKET * socket);
Файл с прототипом функции: tcp.h
Описание: TCPbufferSpace возвращает количество свободного простанста TCP-буфере. TCPbufferSpace необходимо вызвать перед TCPsend, что быть уверенным в наличии места для данных, записываемых TCPsend.
Возвращаемое значение: TCPbufferSpace возвращает количество свободных байте в буфере TCP.
TCPabort
Наименование: TCPabort - прерывание связи.
Применение: #include "tcp.h"
void TCPabort(SOCKET * socket);
Файл с прототипом функции: tcp.h
Описание: TCPabort прерывает соединение на сокете. Перед удалением сокета отправляется сброс другому хосту.
TCPinit
Наименование: TCPinit - инициализация TCP.
Применение: #include "tcp.h"
void TCPinit(void);
Файл с прототипом функции: tcp.h
Описание: TCPinit необходимо вызвать перед запуском TCP.
checkTCP
Наименование: checkTCP - проверка соединений и отправка неотправленных посылок.
Применение: #include "tcp.h"
void checkTCP(void);
Файл с прототипом функции: tcp.h
Описание: checkTCP проверяет все сокеты на предмет наличия данных для отправки или необходимость закрытия соединения. checkTCP также проверяет буфер повторной передачи на предмет наличия каких-либо посылок, которые необходимо отправить или удалить из буфера повторной передачи.
receiveTCP
Наименование: receiveTCP - принимает посылку TCP.
Применение: #include "tcp.h"
void receiveTCP(int length, unsigned int ip0, unsigned int ip1);
Файл с прототипом функции: tcp.h
Описание: receiveTCP должна вызываться IP при приеме каждой посылки TCP. receiveTCP отвечает за TCP-управление данными и подтверждение принятых данных.
Присоединенная процедура FTP
ftpd
Наименование: ftpd -протокол передачи файлов.
Применение: void ftpd (void)
Файл с прототипом функции: ftpd.h
Описание: ftpd должна быть частью основого цикла. При каждом вызове она проверяет наличие FTP-соединения и управляет им. ftpd отвечает за передачу данных с помощью протокола FTP.
DHCP
DHCP
Наименование: DHCP - конфигурирует и обслуживает DHCP-клиента.
Применение: void DHCP(void);
Файл с прототипом функции: dhcp.h
Описание: Первоначально DHCP конфигурирует сервер IP-адресом и устанавливает срок его действия. После конфигурации DHCP необходимо вызывать периодически для контроля за цифровым автоматом DHCP. Цифровой автомат отвечает за обновление срока предоставления адреса.
checkDHCP
Наименование: checkDHCP - таймерная функция DHCP.
Применение: void checkDHCP(void);
Файл с прототипом функции: dhcp.h
Описание: checkDHCP вызывается при каждом прерывании по переполнению таймера, т.е. с постоянной периодичностью. Для компенсации частоты, с которой вызывается checkDHCP, необходимо соответственно подстроить DHCP_MINUT.
Описание: Присоединенная процедура HTTP наблюдает за 80-ым портом TCP и обрабатывает входящие запросы GET и POST. Запуск процедуры должен опрашиваться в основной программе.
Описание: отправляет почту по почтовому адресу, указанному в файле server.ini с помощью почтового сервера, заданного в файле server.ini.
subject - уазатель на начало subject, который должен закончиться '\0'
message - указатель на начало сообщения, которое должно закончиться '\0'.
Обратите внимание, что максимальная длина двух строк зависит от выбранного размера буфера.
Возвращаемое значение: sendMail возвращает 1, если почта отправлена успешно и 0 в противном случае.
DataFlash
read_page
Наименование: read_page - чтение страницы из DataFlash.
Применение: #include "dataflash.h"
char read_page(int pageNr, char * buffer, int length);
Файл с прототипом функции: dataflash.h
Описание: read_page считывает, заданное length, количество байт из страницы DataFlash, заданной pageNr. Значение pageNr не должно превышать количество страниц в памяти DataFlash.
Возвращаемое значение: в случае успешного считывания возвращается значение 1.
write_page
Наименование: write_page - запись буфера в страницу DataFlash.
Применение: #include "dataflash.h"
char write_page (int pageNr, char * buffer);
Файл с прототипом функции: dataflash.h
Описание: write_page записывает 264 байта из буфера в страницу DataFlash с номером, заданным pageNr. Значение pageNr не должно быть больше количества страниц памяти DataFlash.
copy_page
Наименование: copy_page - копирование страницы DataFlash в другую страницу DataFlash.
Применение: #include "dataflash.h"
char copy_page (int toPage, int fromPage);
Файл с прототипом функции: dataflash.h
Описание: copy_page копирует содержимое из одной страницы в другую.
Возвращаемое значение: copy_page возвращает 1 при успешном завершении.
EEput
Наименование: EEput - запись одного байта в ЭСППЗУ.
Применение: #include "dataflash.h"
void EEput(int uiAddress, char cValue);
Файл с прототипом функции: dataflash.h
Описание: EEput выполняет защищенную запись в ЭСППЗУ. Значение cValue записывается по адресу uiAddress.
EEget
Наименование: EEget - чтение одного байта из ЭСППЗУ.
Применение: #include "dataflash.h"
char EEget (int uiAddress);
Файл с прототипом функции: dataflash.h
Описание: EEget выполняет защищенное чтение из ЭСППЗУ.
Описание: fopen открывает файл с именем, заданным filename, и связанный с ним поток. fopen возвращает указатель, необходимый для идентификации потока при последующих действиях. Символьная переменная type может иметь следующие значения:
r - открытие только для чтения;
w - создание для записи.
Возвращаемое значение: после успешного завершения fopen возвращает открытый поток. В случае ошибки fopen возвращает NULL.
fclose
Наименование: fclose - закрытие потока.
Применение: #include "file.h"
char fclose(FILE * stream);
Файл с прототипом функции: file.h
Описание: fclose закрывает именованный поток. Буферы, связанные с этим потоком, уничтожаются при закрытии.
Возвращаемое значение: fclose возвращает 1 при успешном завершении и 0 в противном случае.
fget
Наименование: fget - возвращает сивол из потока.
Применение: #include "file.h"
char fget(FILE * stream);
Файл с прототипом функции: file.h
Описание: при успешном выполнении fget возвращает символ из потока. При достижении конца файла или ошибки возвращается 0.
fput
Наименование: fput - помещение символа в поток.
Применение: #include "file.h"
void fput(FILE * stream, const char ch);
Файл с прототипом функции: file.h
Описание: При успешном выполнении fput помещает символ в поток. Если файловая система не может записать символ в DataFlash, то для пользователя никакая индикация не предусмотрена.
Возвращаемое значение: fdelete возвращает 1 при успешном завершении. Если файл не может быть удален, то возвращается 0.
format
Наименование: format - форматирование DataFlash.
Применение: #include "file.h"
void format (void);
Файл с прототипом функции: file.h
Описание: format перезаписывает таблицу информационного статуса с информацией о файлах в файловой системе и делает все пространство файловой системы доступной для новых файлов. Старые файлы физически не удаляются, а удаляются ссылки на них.
read
Наименование: read - чтение из файла.
Применение: #include "file.h"
int read (FILE * stream, char * buffer, int size);
Файл с прототипом функции: file.h
Описание: read выполняет чтение, указанного переменной size, количества байт. read использует fget для считывания из файла одного байта и путем многократного ее вызова заполняет буфер.
Возвращаемое значение: read возвращает количество считанных байт. Если read не может выполнить чтение из файла, когда файл не открыт или достигнут конец файла, то возвращается 0.
write
Наименование: write - запись в файл.
Применение: #include "file.h"
int write(FILE * stream, char * buffer, int size);
Файл с прототипом функции: file.h
Описание: write выполняет запись, указанного в size, количества байт из буфера в файл. write использует fput для записи одного байта из буфера.
Возвращаемое значение: write возвращает количество успешно записанных байт. Если write не может записать в файл, то возвращается 0.
readln
Наименование: readln - чтение одной строки из файла.
Применение: #include "file.h"
int readln(FILE * stream, char * buffer, int size);
Файл с прототипом функции: file.h
Описание: readln считывает одну строку из файла. Если размер строки превышает значение size, то считываются только первые байты потока в количестве, заданном size. По завершении указатель перемещается и при следующем вызове readln считываются следующие байты, из той же строки в количестве, заданном size.
Возвращаемое значение: readln возвращает количество считанных байт. Если readln не может считать из файла, например, когда файл не открыт или достигнут конец файла, то возвращается 0.
feof
Наименование: feof - проверка достижения конца файла.
Применение: #include "file.h"
char feof(FILE * stream);
Файл с прототипом функции: file.h
Описание: feof проверяет, достигнут ли конец файла (EOF)?
Возвращаемое значение: если feof возвращает 1, то EOF достигнут, иначе - 0.
finit
Наименование: finit - инициализация файловой системы.
Применение: #include "file.h"
char finit(void);
Файл с прототипом функции: file.h
Описание: finit инициализирует файловую систему и вызывается перед ее использованием.
Возвращаемое значение: finit возвращает 1 после успешной инициализации, иначе - 0.
findFile
Наименование: findFile - поиск файла в DataFlash.
Применение: #include "file.h"
int findFile(char * filename, char * fileext);
Файл с прототипом функции:file.h
Описание: findFile ищет файл с заданным именем filename и расширением fileext. findFile может использоваться для проверки на наличие файла перед его открытием для чтения.
Возвращаемое значение: findFile возвращает номер страницы, где расположен заголовок файла, в случае успешного поиска и FNULL (0xffff), если поиск не дал результата.
opendir
Наименование: opendir - открытие директории для чтения.
Применение: #include "file.h"
DIR *opendir(void);
Файл с прототипом функции: file.h
Описание: opendir открывает директорию для чтения. Единовременно может быть открыта только одна директория.
Возвращемое значение: fopendir возвращает указатель на поток директории при успешном выполнении. Если директория не может быть открыта для чтения, то возвращается NULL.
readdir
Наименование: readdir - вывод одной строки из листинга директории.
Применение: #include "file.h"
char *readdir(DIR * _dir);
Файл с прототипом функции: file.h
Описание: readdir считывает при каждом вызове одно имя файла. Для считывания всей директории readdir необходимо вызвать несколько раз вплоть до полного считывания директории.
Возвращаемое значение: readdir возвращает указатель на строку с именем файла и CRLF (конец строки). По завершении чтения листинга возвращается пустой указатель.
readwdir
Наименование: readwdir - вывод одной строки из листинга директории.
Применение: ##include "file.h"
char *readwdir(DIR * _dir);
Файл с прототипом функции: file.h
Описание: readwdir считывает имя одного файла и информацию об этом файле. После считывания всех файлов возвращается размер свободного пространства. См. readdir.
Возвращаемое значение: readwdir возвращает указатель на строку с именем файла и CRLF (конец строки). По завершении считывания указатель на строку содержит "Free space: xxxx", где x - размер в байтах свободного пространства. Если readwdir вызывается в другое время, то возвращается пустой указатель.
rewinddir
Наименование: rewinddir - сброс указателя на листинг директории.
Применение: #include "file.h"
void rewinddir(DIR * _dir);
Файл с прототипом функции: file.h
Описание: rewinddir сбрасывает указатель на листинг директории, чтобы после последующего вызова readdir или readwdir возвращался первый файл из листинга.
[RFC1945] Berners-Lee, Fielding, T. R., Irvine, H. UC, Frystyk. Request for Comments: 1945, May 1996. http://www.faqs.org/rfcs/rfc1945.html [AccessedMars 2000].
[RCF793] Postel, Jon., Information Sciences Institute. University of Southern California., Request For Comments:793, September 1981. http://www.faqs.org/rfcs/std/std7.html [Accessed Mars 2000].
[RCF791] Postel, Jon., Information Sciences Institute. University of Southern California., Network Working Group, Request For Comments: 791, September 1981. http://www.faqs.org/rfcs/rfc791.html [Accessed Mars 2000].
[RFC826] Plummer, David C., NetworkWorking Group. Request For Comments: 826, November 1982 http://www.faqs.org/rfcs/rfc826.html [Accessed Mars 2000].
[RFC894] Hornig, Charles., Network Working Group.,Symbolics Cambridge Research Center, Network Working Group, Request For Comments: 894, April 1984 http://www.faqs.org/rfcs/rfc894.html [Accessed Mars 2000].
[RCF792] Postel, Jon., Information Sciences Institute. University of Southern California., Network Working Group, Request For Comments: 792, September 1981 http://www.faqs.org/rfcs/rfc792.html [Accessed Mars 2000].
[WST94] Richard Stevens, W., TCP/IP Illustrated, Volume 1, The Protocols, USA, Addison-Wesley,. 1994
[IAR99] Руководство по программированию с помощью Си-компилятора IAR Systems AT90S, сентябрь 1996
[AVR99] Atmel Corporation., AVR, 8-bit RISC Microcontrollers, Data Book, USA August 1999. (справочник по 8-разрядным AVR RISC микроконтроллерам)
[INT98] Рекомендации по применению Intel AP-686: Руководство по выбору файловой системы для флэш-памяти, 1998