Стабильный релиз | 1.0 [1] / 27 марта 2013 г. ( 27 марта 2013 ) |
---|---|
Репозиторий |
|
Платформа | встроенные системы |
Тип | Стек TCP/IP |
Лицензия | БСД |
uIP — это реализация стека сетевых протоколов TCP/IP с открытым исходным кодом, предназначенная для использования с крошечными 8- и 16-битными микроконтроллерами . Первоначально она была разработана Адамом Данкелсом из группы сетевых встраиваемых систем в Шведском институте компьютерных наук , лицензирована по лицензии в стиле BSD и в дальнейшем дорабатывалась большой группой разработчиков.
uIP может быть очень полезен во встраиваемых системах , поскольку он требует очень небольшого количества кода и оперативной памяти. Он был перенесен на несколько платформ, [2] [3] [4] включая платформы DSP . [5]
В октябре 2008 года компании Cisco , Atmel и SICS анонсировали полностью совместимое расширение IPv6 для uIP, названное uIPv6. [6]
uIP делает много необычных решений в дизайне, чтобы сократить требуемые ресурсы. Собственный программный интерфейс uIP разработан для небольших компьютерных систем без операционной системы. Его можно вызывать в синхронизированном цикле, и вызов управляет всеми повторными попытками и другим поведением сети. Драйвер оборудования вызывается после вызова uIP. uIP создает пакет, а затем драйвер отправляет его и, при необходимости, получает ответ.
Для программного обеспечения стека протокола IP нормально хранить много копий различных пакетов IP для передачи, приема и сохранять копии на случай, если их нужно будет повторно отправить. uIP экономичен в использовании памяти, поскольку использует только один буфер пакетов. Во-первых, он использует буфер пакетов полудуплексным способом, используя его поочередно для передачи и приема. Кроме того, когда uIP необходимо повторно передать пакет, он вызывает код приложения таким образом, что запрашивает воспроизведение предыдущих данных.
Другая странность заключается в том, как uIP управляет соединениями. Большинство реализаций IP имеют одну задачу на соединение, и задача взаимодействует с задачей на удаленном компьютере на другом конце соединения. В uIP не предполагается многозадачная операционная система. Соединения хранятся в массиве. При каждом вызове uIP пытается обслужить соединение, выполняя вызов подпрограммы к коду приложения, который отвечает на данные или отправляет их. Размер массива соединений — это число, которое можно изменить при перекомпиляции uIP.
uIP полностью соответствует RFC , определяющим TCP , UDP и IP . Он также реализует обязательный протокол обслуживания ICMP .
uIP 0.9 [7] — версия с наименьшей зависимостью от операционных систем, наименьшим использованием ресурсов и единственная версия, которая представляет собой API чистого цикла событий , но в своей исходной форме не поддерживает IP версии 6, а только более старый, более распространенный IPv4. Может использоваться во встроенных системах с очень небольшим количеством ресурсов.
Он был поставлен с набором примеров протоколов более высокого уровня, которые также работают в системе цикла событий, включая HTTP (простой веб-сервер), SMTP (простой протокол передачи почты), FTP (протокол передачи файлов), telnet (эмуляция терминала) и другие. Несмотря на примеры и его небольшой размер, uIP 0.9 может быть трудно применять, поскольку он не использует никакой формы API сокетов . [8]
uIP — широко используемый код с хорошо известными недостатками. Конструкция минимизирует и разделяет 32-битную арифметику, чтобы ее можно было настроить или оптимизировать для 8- и 16-битных ЦП. Кроме того, 16-битные программные таймеры (распространенные на небольших микроконтроллерах) могут переполняться и вызывать дефектную работу. Это можно исправить с помощью системы таймеров, которая не переполняется (например, таймеры ведут обратный отсчет или используют модульную арифметику ).
Другая проблема заключается в том, что его единственный пакетный буфер может иметь существенные проблемы с пропускной способностью, поскольку хост ПК обычно задерживает пакет "ACK", ожидая больше пакетов. В медленных реализациях последовательного порта пропускную способность ack можно исправить, изменив uIP для отправки каждого пакета в виде двух полупакетных фрагментов. Системы uIP с быстрым Ethernet или WiFi могут изменить аппаратный драйвер для отправки каждого пакета дважды. [5]
Некоторые ПК некорректно реагируют на быструю систему uIP в локальной сети Ethernet, поскольку система uIP может начать ответный пакет до того, как ПК будет готов его получить. [ сомнительно – обсудить ] Решение состоит в том, чтобы вызывать систему uIP реже в основном цикле (ПК с Windows рассчитаны на время отклика около 1 миллисекунды). Типичные реализации uIP имеют фиксированный IP-адрес, что может сделать их непрактичными в реальных сетях, хотя некоторые из них реализовали DHCP . [9] [10]
Более поздние версии uIP, включая эталонную версию uIPv6, интегрированы с Contiki , операционной системой, которая использует сопрограммы для кооперативной многозадачности. Contiki обеспечивает многозадачность, необходимую для упрощенного API сокетов , упрощая использование uIP. Однако эти версии могут быть менее популярны, чем 0.9. Многие примеры встроенного кода не используют их. [11] [12] [13]