История создания утилиты PING

Автор: | 26/07/2013

flack-story-pingОригинал статьи можно найти тут>>>.

Домашняя страница автора Майка Муса (Mike Muuss).

Да, совершенно верно – я автор UNIX-утилиты Ping. Ping – небольшая программа в тысячу строк, написанная мной одним вечером.

Я назвал её так  по аналогии со звуком, издаваемым гидролокатором, вдохновлённый принципом эхолокации. В колледже я увлекался моделированием радио- и эхолокационных систем, и аналогия с ними в кибер-пространстве показалась мне весьма подходящей. В Ping используется тот же принцип, применённый к новой области технологий – IP/ICMP ECHO_REQUEST и ECHO_REPLY пакеты, для проверки “дистанции” до узла назначения.

Стимулом для написания Ping для операционной системы 4.2a BSD UNIX явился комментарий, сделанный доктором Дэвидом Милсом (Dave Mills) в июле 1983, когда мы встретились в Норвегии, в одной из лабораторий DARPA, в котором он описывал его работу с системой “Fuzzball” LSI-11, которая заключалась в её использовании для измерения задержек прохождения сигналов, с применением специальных ICMP Echo-пакетов с учётом временных интервалов.

В декабре 1983 года я столкнулся со странным поведением IP-сети в BRL. Вспомнив комментарий доктора Милса, я быстро написал программу Ping, которая по ICMP опрашивала открытые сокеты типа SOCK_RAW AF_INET. Код был скомпилирован верно, но он не работал – в ядре системы не оказалось поддержки “сырых сокетовICMP (raw ICMP sockets). Рассердившись, я написал патч, добавлявший их поддержку ядром (прим.: Версия BSD 4.2. системы UNIX была первой версией, в которой TCP/IP был включен в состав ядра операционной системы, и в которой был предложен программный интерфейс этого протокола : сокеты (sockets)), и к утру всё работало без проблем. Правда, Чак Кеннеди (Chuck Kennedy aka “Kermit“) нашёл и устранил проблему в сети до того, как я успел запустить мою первую версию той самой программы Ping. Однако, мне довелось её использовать несколько раз позднее. Если бы я знал, что она окажется моим самым большим достижением в жизни, я бы поработал над ней ещё день или два и добавил бы ещё больше возможностей.

Сотрудники из Бекркли немедленно приняли мои изменения к ядру и исходный код самой программы Ping, и с тех пор они стали частью Berkeley UNIX. Так как программа распространялась свободно, с тех пор она была портирована на многие другие системы, даже такие как Microsoft Windows95 и WindowsNT. Вы можете узнать её по особым сообщениям, которые она выводит во время работы, выглядят они примерно так:

PING vapor.arl.army.mil (128.63.240.80): 56 data bytes
64 bytes from 128.63.240.80: icmp_seq=0 time=16 ms
64 bytes from 128.63.240.80: icmp_seq=1 time=9 ms
64 bytes from 128.63.240.80: icmp_seq=2 time=9 ms
64 bytes from 128.63.240.80: icmp_seq=3 time=8 ms
64 bytes from 128.63.240.80: icmp_seq=4 time=8 ms
^C
----vapor.arl.army.mil PING Statistics----
5 packets transmitted, 5 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 8/10/16

Вы можете получить исходный код программы тут: source code  (40k)

По моему мнению, Ping не является аббревиатурой от “Packet InterNet Grouper“, а имеет такое название из-за схожести с гидролокатором. Однако, я слышал что такое название предложил сам Девид Миллс, так что возможно, что правы мы оба. Надо же – а я всегда думал что только правительство умеет придумывать такие странные аббревиатуры!

Фил Дикстер (Phil Dykstra) добавил возможность записи маршрута ICMP к моему Ping, однако в те времена пакеты обрабатывались несколькими роутерами, что делало такую возможность практически бесполезной. Ограничение в количество хопов, которые могли быть записаны в заголовок пакета, ограничивали их использование для измерения длинных маршрутов.

Я очень завидую Ван Джейкобсу (Van Jacobson) из LBL, который использовал мою модификацию ядра для поддержки ICMP что бы написать программу Traceroute, реализовав возможность получения ICMP сообщений Time-to-Live Exceeded, смодулировав IP Time To Life (TTL). Я должен был и сам догадаться до такого. Конечно, Traceroute использует UDP, так как роутеры не умеют составлять сообщения об ошибках для ICMP.

Самая интересная история об использовании Ping была услышана мной на одной из конференций USENIX, когда один системный администратор, столкнувшийся с периодическим падением сети, объединил Ping с его вокодером, просто дописав:

ping goodhost | sed -e 's/.*/ping/' | vocoder

Он объединил вывод его вокодера с аудисистемой в офисе, и выкрутил громкость на максимум. Его компьютер просто повторял каждую секунду “Ping, ping, ping…“, а он бродил по офису, шевеля коннекторы в разных уголках здания, пока звук не пропал. Так он и нашёл проблемный участок сети.