Отсутствующий в MS-DOS стек протоколов TCP/IP всегда был поводом для жарких дискуссий – и это при том, что изначально его поддержка в ОС не планировалась вовсе. И дело вовсе не в том, что MS-DOS он был бы не по силам. TCP/IP на момент разработки DOS еще не был реализован самой Microsoft. Разве что в Windows 3.11 промелькнул IPX/SPX. Окончательно утвердился стек TCP/IP только в Windows 95.
Тем не менее, благодаря потрясающей работе по созданию бэкпортов, проделанной множеством энтузиастов по всему миру, TCP/IP всё же удалось заставить работать в MS-DOS. В эмуляторе 86Box можно установить виртуальную сетевую карту, загрузить её драйверы и запустить TCP/IP. При этом получится даже просматривать веб-страницы. Но сейчас мы сделаем нечто еще более дикое. Заставим нашу виртуальную MS-DOS машину работать в качестве веб-сервера и разместим на нем свою HTML-страницу. Приступим!
![](https://habrastorage.org/getpro/habr/upload_files/2c4/a77/1bc/2c4a771bc7dd75308d1d3a9f35469691.png)
Виртуальное шаманство
![Фото от Фредди Джекоба на Unsplash Фото от Фредди Джекоба на Unsplash](https://habrastorage.org/getpro/habr/upload_files/419/bad/04e/419bad04e83c09a1ae88bc74d2623187.jpeg)
Первым делом определимся с конфигурацией 86Box. Я выбрал Intel 80386 и сетевую карту AMD, так как стек TCP/IP привередлив и работает лишь с избранными картами. В частности, используемая по умолчанию Novel NE2000 ему не подходит. Зато AMD и Realtek RTL8019AS успешно прошли тест. Конфигурация системы в результате будет такой:
![Конфигурация для машины Intel 80386 в 86Box Конфигурация для машины Intel 80386 в 86Box](https://habrastorage.org/getpro/habr/upload_files/cf6/63d/625/cf663d625434db6aa7ff7f3f1dd4d1f7.png)
Обратите внимание на скромный объем оперативной памяти и процессор с частотой 33 МГц. В ходе своих зверских экспериментов я хотел подвергнуть процессор максимальной нагрузке. Теперь переходим к сетевой карте:
![Виртуальная сетевая карта AMD в 86box Виртуальная сетевая карта AMD в 86box](https://habrastorage.org/getpro/habr/upload_files/bc0/e79/727/bc0e797278dbde4abfc4fa5f0e35b340.png)
Для виртуальной сетевой карты AMD PCnet ISA мы будем использовать режим SLiRP. Это означает установленный в 86Box-машине виртуальный маршрутизатор, подключенный к виртуальному DHCP-серверу. Он и предоставит ей IP-адрес 10.0.2.15 с подсетью 225.225.225.0 и DNS 10.0.2.2. 86Box будет иметь доступ к интернету через хост, но он сам к ней обращаться не сможет.
Поскольку мы хотим использовать систему в качестве веб-сервера, необходима дополнительная настройка. Для этого открываем файл 86box.cfg, хранящийся в папке виртуальной машины:
![Файл конфигурации виртуальной машины MS-DOS в 86Box Файл конфигурации виртуальной машины MS-DOS в 86Box](https://habrastorage.org/getpro/habr/upload_files/e2b/08e/3f7/e2b08e3f7089f07e8a08dd8283e77016.png)
Добавим код для переадресации портов:
[SLiRP Port Forwarding #1]
0_external = 8080
0_internal = 80
Таким образом мы добавили переадресацию портов для нашей виртуальной сетевой карты AMD ISA. Весь трафик с внешнего порта 8080 перенаправится на внутренний 80-й порт. Это означает, что виртуальная машина 86Box будет обслуживать HTML-контент через порт 80, а хост-машина запрашивать его через порт 8080. Иначе говоря, веб-сервер MS-DOS, прослушивая порт 80, получит мои запросы через браузер реальной машины по адресу 127.0.0.1:8080.
Обратите внимание на параметры 0_internal и 0_external. Ноль обозначает индекс правила переадресации портов. Правил может быть несколько. Например, для переадресации как TCP, так и UDP нужно добавить следующие строки:
[SLiRP Port Forwarding #1]
0_external = 8080
0_internal = 80
1_external = 5000
1_internal = 50
1_protocol = udp
Наш файл 86box.cfg в конечном итоге будет выглядеть так:
![Файл 86box.cfg в VSCode с добавленной переадресацией портов Файл 86box.cfg в VSCode с добавленной переадресацией портов](https://habrastorage.org/getpro/habr/upload_files/47b/082/a5d/47b082a5dd59b73230a955c6ab547511.png)
Сетевые драйверы и стеки TCP/IP
![Настроенная для работы с сетью виртуальная машина в 86Box Настроенная для работы с сетью виртуальная машина в 86Box](https://habrastorage.org/getpro/habr/upload_files/e90/1b0/3d5/e901b03d5d0cf65f51dbfb44b3510cf3.png)
Настройка оборудования завершена, пришло время включить виртуальную машину. На показанном выше скриншоте виден результат. Осталось только запустить сетевой драйвер. Можно скачать его здесь или с моей страницы на GitHub. Архив на моем GitHub называется amdnet.zip и содержит как драйвер сетевой карты, так и драйвер стека TCP/IP. Драйвер сетевой карты называется pcntpk.exe, и можно запустить его, указав адрес сетевой карты (по умолчанию 0x60):
C:\>PCNTPK INT=0x60
После установки карты мы получим MAC-адрес:
![Установка сетевой карты AMD PCI в 86Box прошла успешно Установка сетевой карты AMD PCI в 86Box прошла успешно](https://habrastorage.org/getpro/habr/upload_files/d81/171/815/d81171815116cdd1d4f3a2e296e215a5.png)
Следующим шагом будет установка стека TCP/IP. Для этого запустим ntcpdrv.exe без параметров:
![Стек TCP/IP установлен Стек TCP/IP установлен](https://habrastorage.org/getpro/habr/upload_files/a40/675/5c0/a406755c0318adccc8286a8dee9d667e.png)
IP-адрес 10.0.2.15, упоминаемый ранее, получен. Всё готово для работы с HTML-файлами!
Веб-серверы
![Фото от NASA на Unsplash Фото от NASA на Unsplash](https://habrastorage.org/getpro/habr/upload_files/b65/cd8/5cf/b65cd85cf29a8c315e407ccf1665ac47.jpeg)
Поначалу казалось, что поиск веб-серверов для MS-DOS будет нелёгким занятием. Но ситуация оказалась более похожа на хороший нуарный фильм с неожиданными поворотами сюжета. Как выяснилось, существует множество веб-серверов для MS-DOS, а некоторые из них даже реализуют обработку нескольких запросов одновременно. Один из веб-серверов даже построен на Бейсике. Разработчики MS-DOS могли бы гордиться!
Первый, из опробованных мной, назывался Sioux и мог обрабатывать несколько запросов одновременно. Разработчик даже поделился ссылкой на драйверы. Именно она предоставлена мной выше для сетевой карты AMD. Но, к сожалению, у меня этот вариант не сработал:
![Загадочная ошибка при запуске веб-сервера Sioux Загадочная ошибка при запуске веб-сервера Sioux](https://habrastorage.org/getpro/habr/upload_files/863/605/17f/86360517f052ff09a42b61572951bbc8.png)
Повсюду я пытался найти описание этой ошибки. Наталкивался на упоминания об отказе в доступе, о чём-то совершенно ином. Что, вероятно, это каким-то боком связано с PowerBasic. Но ничего путного я так и не узнал ни о самой ошибке, ни о том, что за ней стоит. О PowerBasic я вообще никакого представления не имею, поэтому стал тестировать другой веб-сервер. И этот заработал. Написан он был на Бейсике и оказался весьма заморочным. Но при этом обладал даже лаконичным текстовым пользовательским интерфейсом:
![Запуск webserv.exe на машине Intel 386 в 86Box Запуск webserv.exe на машине Intel 386 в 86Box](https://habrastorage.org/getpro/habr/upload_files/aa1/eb0/391/aa1eb039176902831c235d52b5179c90.png)
После его запуска для прослушивания выбирается порт 80. Переадресация уже настроена, осталось только открыть браузер, набрать адрес локального хоста и порт 8080. Перед нами веб-страница по умолчанию:
![Наш веб-сервер MS-DOS готов к работе Наш веб-сервер MS-DOS готов к работе](https://habrastorage.org/getpro/habr/upload_files/6d0/088/1bf/6d00881bf275f61cc4e7de253cfd1db1.png)
Веб-файлы загружаются из папки HTDOCS:
![Список файлов в папке WebServ веб-сервера MS-DOS Список файлов в папке WebServ веб-сервера MS-DOS](https://habrastorage.org/getpro/habr/upload_files/0d6/e66/cb7/0d6e66cb7065abe879f4511073aa0735.png)
В ней находятся файл index.htm и изображение инопланетянина с большим пальцем вверх:
![Файлы веб-сайта по умолчанию Файлы веб-сайта по умолчанию](https://habrastorage.org/getpro/habr/upload_files/5f0/948/49c/5f094849ccc381f6295c6831a312f071.png)
Как и было заявлено, веб-сервер поддерживает CGI-скрипты, что позволяет отправлять данные на страницу с помощью HTML-форм. Оказалось, что это не последняя версия данного веб-сервера (версия 0.9). На одном забытом форуме обнаружилась еще более новая под названием QuikServ 1.1, обладающая рядом преимуществ, включая одновременную обработку нескольких запросов. Структура файлов несколько изменилась, но обслуживаемая веб-страница по-прежнему находится в той же папке HTDOCS:
![Файловая структура QuikServ 1.1 в 86Box Файловая структура QuikServ 1.1 в 86Box](https://habrastorage.org/getpro/habr/upload_files/531/e31/8a9/531e318a9e8ff7b35d6d948b16d67955.png)
Запустив сервер, мы видим несколько изменённый интерфейс, а также информацию о еще одной недавно реализованной функции — поддержке FTP:
![Текстовый интерфейс QuikServ 1.1 Текстовый интерфейс QuikServ 1.1](https://habrastorage.org/getpro/habr/upload_files/c15/a9d/ee6/c15a9dee6c3ca6189cfd533804580790.png)
Теперь проверим веб-сайт по умолчанию:
![Веб-сайт по умолчанию, предлагаемый QuikServ 1.1 Веб-сайт по умолчанию, предлагаемый QuikServ 1.1](https://habrastorage.org/getpro/habr/upload_files/718/789/1cc/7187891cc82b1e4d228949956f057386.png)
Но на этом попытки не закончились. Мне удалось найти еще один веб-сервер, написанный на MoonRock, языке программирования, разработанном автором веб-сервера. Создать целый язык программирования и веб-сервер на нём, да ещё для MS-DOS — как вам это?
Очевидно, MS-DOS умерла слишком рано:
![Каталог с простым названием WWW содержит короткий список файлов Каталог с простым названием WWW содержит короткий список файлов](https://habrastorage.org/getpro/habr/upload_files/33c/d20/2d2/33cd202d2d5952a5e27f24c02b4e7110.png)
Итак, давайте запустим его, набрав команду www.com:
![Текстовый пользовательский интерфейс веб-сервера WWW Текстовый пользовательский интерфейс веб-сервера WWW](https://habrastorage.org/getpro/habr/upload_files/078/32e/8be/07832e8be6933cc0b2ce181d49d61869.png)
Текстовый интерфейс достаточно удобный и приятный. К сожалению, этот сервер не предоставляет веб-сайт по умолчанию, поэтому вызов его через порт 8080 локального хоста ничего нам не даст:
![Странная ошибка 404 от веб-сервера MS-DOS Странная ошибка 404 от веб-сервера MS-DOS](https://habrastorage.org/getpro/habr/upload_files/15b/8b9/fb1/15b8b9fb1af3731e777bfc449bacc760.png)
Однако сам сервер распознает вызов и дает полное описание неисправности:
![Объект index.html не найден Объект index.html не найден](https://habrastorage.org/getpro/habr/upload_files/b10/618/9b4/b106189b4e84fdc58f1cc53dd2470c25.png)
На этом и закончим. Обширное семейство веб-серверов MS-DOS... Одни из них написаны на BASIC, другие на PowerBasic, а третьи по загадочным причинам на MoonRock. Сказать по правде, такое упорство меня просто восхищает! Да и вообще при написании этой статьи каждая мелочь, каждая деталь доставляла удовольствие. Надеюсь, что и вы почувствуете нечто подобное, возможно, даже и опробуете некоторые из этих серверов. В таком случае труд энтузиастов-программистов будет по достоинству вознаграждён! Спасибо за чтение, до следующих встреч!