Как-то давно я просматривал опции для команды ping и обратил внимание, что можно задавать размер ICMP пакета. "Хм", — подумал я: "Можно же сложить в сам пакет какую-то полезную нагрузку". Эта идея время от времени всплывала у меня в голове, но что именно можно хранить в пакете ICMP придумать не удавалось. Однако, недавно пришло понимание, что если хранить данные в ICMP пакете, то они не будут занимать место в оперативной памяти! То есть можно сделать key-value хранилище, где все данные будут храниться внутри сети. Key-value хранилище слушает порт 4242. Под капотом приложение после чтения POST запроса отправляет ICMP пакет с данными. Когда пакет возвращается, то снова отправляется в сеть и тд. Когда у приложения появляется какой-то запрос на чтение пакета, то приложение ждёт некоторое время, пока из сети не вернётся нужный пакет, затем возвращает данные.  Я решил реализовать задачу на Nodejs, но думаю что для реального применения нужно использовать какой-то низкоуровневый язык. Сначала я хотел сделать возможность использовать любые строки в качестве ключей, но потом решил ограничиться просто цифрами, которые одновременно являются уникальным идентификатором ICMP пакета. Если же использовать строки, то нужно помещать их в начале данных пакета и обработку писать несколько по-другому.
 Приложение запускается и слушает запросы на порту 4242. Новые записи ключ-значение создаются для обработанных POST запросов. Основная хранилища находится в callback функции pingHost. Эта функция исполняется, когда отправленный пинг уже вернулся. Аргументы resKey — это идентификатор ICMP пакета, то есть наш ключ. А resValue — это значение, которое мы передавали. То есть как только мы получаем ответ от хоста, то сразу же отправляет данные обратно на хост.  Все запросы на чтение мы складываем в reqStore и еще добавляем туда timeoutID, чтобы по истечении 2 секунд мы могли отправить сообщение о том, что ключ не был найден. pingHost Проверка сохраненных в reqStore запросов происходит уже внутри колбэка функции pingHost. Если искомый ключ найден, то значение отправляется в ответе на запрос, таймаут очищается, а ключ удаляется из reqStore Удаление организовано примерно так же, как и чтение. Запросы на удаление записываются в keysToDelete. Проверка сохраненных в keysToDelete запросов происходит так же внутри колбэка функции pingHost. И если ключ вернувшегося ICMP пакета найден, то отправляется ответ об успешном удалении, в противном случае продолжается цикл отправки запросов на целевой хост. Вот собственно и вся логика. Рабочий репозиторий можно найти на Гитхабе. Запускать приложение нужно командой sudo nodejs serv.js, потому что приложению необходимы разрешения для работы с сокетами. Я потестировал создание, получение и удаление записей. Всё работает.  Прикладываю скриншоты из Wireshark, по которым видно, что отправляемые и получаемые пинги содержат нужные данные. Отправленный ICMP пакет:  Принятый ICMP пакет:  В приложении я использую только один IP адрес для пинга, который я выбрал совершенно случайно. Но вообще нужно использовать целый пул адресов и неплохо бы дублировать запросы на разные IP, чтобы избежать потери данных. У меня нет идей о том как именно использовать такое хранилище и где это может быть полезно. Возможно какой-то исполняемый код можно будет прятать в сети, чтобы в час X собрать и запустить. Разработчик