![](https://habrastorage.org/storage2/ee7/df3/f83/ee7df3f839bbbfc0146d7da9f6033287.jpg)
Все верно, я — автор программы ping для UNIX. Ping — это программа в тысячу строк длиной, которую я написал за один вечер и о которой почти все наверняка знают. :-)
Я назвал ее в честь звука, издаваемого гидролокатором. В колледже я много занимался моделированием гидроаккустических и радиолокационных систем, так что аналогия с “Киберпространством” казалась весьма уместной. В ping используется та же идея: равномерно посылать IP/ICMP-пакеты
ECHO_REQUEST
и ECHO_REPLY
, чтобы измерить “расстояние” до целевого компьютера.Мое первоначальное желание написать ping для 4.2a BSD UNIX возникло после небрежного замечания Дэвида Миллса, сделанного им в июле 1983 года на заседании DARPA в Норвегии, о проделанной им работе в замере задержки прохождения ICMP пакетов в системах Fuzball LSI-11.
Создание
В декабре 1983 года я столкнулся со странным поведением сети в Лаборатории Баллистических Исследований. Вспоминая замечания Миллса, я быстро закодил ping, которая открывала сырой ICMP сокет. Код без проблем скомпилировался, но не работал — в ядре не было поддержки сырых ICMP сокетов! Возмущенный, я закодил и ее, таким образом заставив все работать до утра. Неудивительно, что Чак Кеннеди уже исправил проблемы с сетью до того, как я отправил первый пакет “ping”. Позже, однако, я использовал свою программу несколько раз. *Усмехаясь* Если бы я только знал, что это будет самым большим достижением в моей жизни, я бы поработал над ней еще пару дней и добавил несколько опций.
Парни из Беркли охотно приняли мои изменения в ядре и исходники ping, так что с тех пор они являются стандартной частью Berkeley UNIX. Поскольку ping была бесплатной, ее портировали на множество других платформ, включая Microsoft Windows 95 и Windows NT. Вы можете определить это по характерным сообщениям, которые выглядят примерно так:
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
После создания
В 1993, спустя десять лет после написания ping, ассоциация USENIX вручила мне красивую грамоту, объявляющую меня одним из получателем премии ассоциации USENIX Lifetime Achievement Award, вручаемую исследовательской группе университета Беркли. “Вручается за основательное интеллектуальное достижение и беспримерную услугу нашему сообществу. По распоряжению руководителей исследовательской группы мы таким образом признаем нижеследующие лица и организации помощниками и участниками исследовательской группы...”. Вот это да!
Кстати, хотите увидеть исходники?
С моей точки зрения, “ping” — это не акроним для Packet InterNet Grouper, а аналогия с гидролокатором. Хотя кто-то говорил мне, что Дейв Миллс использовал именно такое объяснение, так что, возможно, мы оба правы. Черт, а я-то думал, правительство занимается растягиванием акронимов! :-)
Фил Дайкстра добавил поддержку record route в ping, но в те далекие времена лишь немногие роутеры обрабатывали их, что делало эту фичу бесполезной. Ограничение на количество прыжков, записываемых в заголовок IP пакета, препятствовало отслеживанию очень длинных маршрутов.
Я безумно завидовал Вану Якобсону из Национальной лаборатории имени Лоуренса в Беркли, когда тот использовал мой код поддержки ICMP в ядре, чтобы написать traceroute. Он понял, что может получать ICMP Time-To-Live exceeded сообщения, изменяя поле TTL IP-пакета. Ну почему я не додумался до такого! :-) Конечно, на самом деле traceroute использует дейтаграммы UDP, поскольку роутеры не должны генерировать сообщения об ошибке в ответ на ICMP-сообщения.
История
Самую лучшую историю о ping мне рассказали на конференции USENIX: сетевой администратор с проблемной Ethernet сетью связал ping с устройством для синтеза речи, написав, по существу, следующее:
ping goodhost | sed -e 's/.*/ping/' | vocoder
После он подключил выход синтезатора к колонкам в офисе и выкрутил громкость до предела. Компьютер стал выкрикивать “Ping, ping, ping” каждую секунду, а администратор пошел проверять каждый Ethernet коннектор в здании. В тот момент, когда компьютер умолк, пробой в сети был найден.
Ссылки:
Оригинал статьи
Об авторе программы (англ.)
От переводчика:
Буду рад услышать замечания о неточностях в переводе терминов и названий упомянутых учреждений. В самое ближайшее время планирую опубликовать перевод статьи «Ten Things I Hate About Object-Oriented Programming», в дальнейшем буду выкладывать статьи-переводы о программировании и людях, причастных к нему.