• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Web-сервер на ESP8266 на LwIP с возможностью upload файлов

hd44780

New member
Проблема такая: нужен web-сервер на базе LwIP и с поддержкой upload файлов. На базе LwIP находил много, но с аплоадом не попадались.

Работаю на базе веб-свалки, тамошний веб-сервер всё вышеперечисленное умеет, но мне не нравится его архитектура - в частности некий общий обработчик всех параметров, прилетающих из браузера. Как-то ближе структура как в тех же apache+php - html-страница стучится в свою персональную функцию. Такая архитектура в eshttpd, но там пресловутый espconn и нет upload.

Я, конечно, могу скрестить козла с бараном и перенести eshttpd на LwIP (ну или на прослойку tcp_srv_conn из той же свалки), заодно добавив в него upload (опять же выдрав это из свалки), но может я буду изобретать велосипед ...

Может ли кто что-то посоветовать? Спасибо.
 

pvvx

Активный участник сообщества
как в тех же apache+php - html-страница стучится в свою персональную функцию.
Кто вам мешает разбить массив if-ов переменных на ветки с названиями html страниц или маркеров в них?
apache+php = пару ГБ RAM + TБ SSD + 4ГГц CLK*16 ядра :) На меньшем оно не пашет без лагов :p
 

hd44780

New member
Ага, тогда уж Raspberry Pi 3 туды :D

Если серьёзно, я попробую переделать ифы на набор страниц и посмотрю, что из этого выйдет. Пока без наворотов. Потом посмотрим.
 

pvvx

Активный участник сообщества
Ага, тогда уж Raspberry Pi 3 туды :D
При стандартном наборе программ не годится для web. Только для однопоточного и большие проблемы в стеке TCP с TIME_WAIT. Т.е. до 2-х одновременных запросов и обращений к web раз в час.
Если серьёзно, я попробую переделать ифы на набор страниц и посмотрю, что из этого выйдет. Пока без наворотов. Потом посмотрим.
Для нормальной всеобъемлющей поддержки 'upload' в web требуется много RAM. Необходимо учитывать более 50-ти форматных переменных заголовка эксплоера и прочих переключателей, которые дают факториал веток и должны обслуживаться (обрабатываться) до конца обработки запроса 'upload' ... У ESP, даже ESP32 c доп.памятью банально не хватает памяти для хранения TCP с TIME_WAIT чтобы удовлетворить спецификацию TCP, не говоря уже об прочем :p
 

pvvx

Активный участник сообщества
Единственный способ получить не переливающиеся по несколько секунд web страницы c устройства с малыми ресурсами – параллельное (одновременное) обслуживание не менее 7..10 tcp web запросов (одновременно открытых TCP соединений). Желательно более, т.к. любой современный эксплорер на одну страницу с различным контекстом (кол-во вложенных файлов и прочих отдельно загружаемых элементов на странице) строит в среднем от 5 одновременных соединений. При этом не менее одного соединения всегда остается открытым до закрытия отображаемой страницы. Т.е. открыли 5 вкладок на ваш web – получили не менее 5-ти открытых на всё время их отображения соединений на вашем устройстве. А во время их открытия – от 5-ти на каждую вкладку. Если ваш web будет сбрасывать соединения, оставляя рабочим всего одно (как это принято у ардуинщиков), то скорость загрузки страниц будет никакая. Об таком web и говорить не стоит...

Для однопоточного web скорость загрузки сильно зависит от времени пинга и размера окна TCP стека. У ESP(32) TCP окно до 2..4 пакетов и даже при хорошей оптимизации передачи посылается до 2-х пакетов на один подтверждающий ACK. Реализации с передачей более 2-х (стартового + одного пакета вперед) пока не встречалось на ESP. У современных эксплореров размер TCP стека на каждое соединение 64..128 килобайт (40..100 пакетов TCP с MTU 1500+) - можно послать сразу десятки вперед без ожидания подтверждения. Из этого, к примеру, при пинге в 10 ms (удаленное обращение, пусть с GSM канала) выходит, что макс. теор. скорость передачи файла или потока данных с ESP идет пачками по 2 пакета (3 кило) + 10 мс, что без учета времени передачи самих данных дает ограничение до 300 килобайт в сек. В таких случаях увеличение скорости загрузки страниц можно достичь только увеличением кол-ва потоков (кол-ва одновременно открытых и обрабатываемых TCP соединений устройством).

И чем больше одновременно обрабатываемых TCP соединений с учетом правильной обработки TCP и оптимизации процедур открытия и закрытия соединений, тем сложнее создать DDOS такому web серверу. При некой границе, когда скорость обработки более ширины канала сетевого адаптера, ему вообще не страшен DDOS. И такое запросто достигается для 100 Мегабитного Ethernet на одноядерном CPU в 300 MHz… Но apache на PI3++ не могет …. :) :)
 

hd44780

New member
pvvx, спасибо большое. Я посмотрю, что там получится.
По upload у меня тоже сомнения, но пока не попробуешь, не поймёшь.
 
Сверху Снизу