Gopher (англ. gopher [ˈɡoʊfər] — го́уфер, го́фер) — сетевой протокол распределённого поиска и передачи документов, который был широко распространён в Интернет вплоть до 1993 года. Протокол предназначается в основном для предоставления доступа к документам через Интернет, но имеет меньше возможностей, чем HTTP и HTTPS, из-за чего впоследствии был практически полностью вытеснен ими. Тем не менее, gopher также был предназначен для предоставления ссылок на ресурсы, отличные от gopher, включая telnet, wais, nntp и даже http.
Протокол gopher имеет более жёсткую структуру размещения информации, очень похожую на структуру каталогов в файловой системе, которая состоит из вложенных друг в друга каталогов и файлов. Иерархическая структура ссылок позволила пользователям текстовых терминалов и простейших компьютеров, в основном в университетах, очень быстро находить нужную информацию.
Протокол был разработан в Университете Миннесоты весной 1991 года и документирован в RFC 1436.
В феврале 1993 года Университет Миннесоты объявил о намерении взимать лицензионные отчислoения за использование созданной им реализации сервера Gopher. В результате пользователи и разработчики стали отдавать предпочтение развивавшейся тогда технологии World Wide Web, имевшей и ряд других преимуществ. В сентябре 2000 года Университет Миннесоты выпустил программное обеспечение Gopher (клиент и сервер) под лицензией GNU GPL.
Протокол основан на клиент-серверной технологии, за ним закреплён 70-й порт TCP. После того, как клиент установит TCP-подключение с сервером, он посылает строку (заканчивающуюся CR LF), которая содержит запрос на нужный документ либо пустую строку для получения первой страницы сайта. Сервер отвечает и закрывает соединение.
Каталог состоит из последовательности строк, описывающих данные, которые можно из него получить — файлы, другие каталоги и ссылки на ресурсы, доступные по другим протоколам. Строки содержат пять полей и заканчиваются CR LF. Первое поле содержит один символ и не отделено от второго, остальные разделяются табуляцией.
- Тип содержимого
- 0 = текстовый файл
- 1 = каталог
- 2 = сервер имён CSO
- 3 = ошибка
- 4 = файл Macintosh в формате BinHex
- 5 = архив ZIP
- 6 = файл UNIX, закодированный uuencode
- 7 = поисковый сервер
- 8 = ссылка на telnet-сессию
- 9 = бинарный файл
- + = запасной сервер
- h = файл в формате HTML
- g = графический файл в формате GIF
- i = информационный текст
- I = графический файл (отображение определяется клиентом)
- T = ссылка на сессию терминала IBM 3270
- Строка описания
- Путь (обычно в файловой системе)
- DNS имя сервера
- Номер порта сервера
На начало 2013 года в Интернете существует около 180 gopher-серверов. Большинство из них более не обновляется, но некоторые поддерживаются энтузиастами протокола Gopher. Несколько десятков новых серверов было запущено с 1999 года. Сегодня Gopher напоминает почти заброшенный уголок Интернета — можно, например, публиковать адреса электронной почты, не беспокоясь о спаме, и публиковать любую информацию, не заботясь об объёмах трафика. При этом многие серверы Gopher до сих пор регулярно посещаются. Протокол Gopher в той или иной мере поддерживает почти каждый современный веб-браузер.
Благодаря простоте протокола создано огромное множество реализаций серверов на самых разных языках программирования:
- На C:
- UMN Gopherd — классический сервер, разработанный в Университете Миннесоты, не поддерживается
- Geomyidae
- GN
- GoFish
- Gophernicus
- gophrier
- mgod
- Motsognir
- На Python:
- PyGopherd
- PyGS
- На Java:
- Aftershoc
- На Perl:
- Bucktooth
- На FreeBASIC:
- GOPHSERV
- Grumpy (поддержка Gopher прекращена)
- На Scheme:
- Goscher
- На платформе .NET Framework 3.5:
- Gopher Cannon
- На node.JS (Javascript)
- node-gopher
Также существовала поддержка Gopher в программе Microsoft Internet Information Server, но во времена Windows NT 4 она была убрана во время очередного обновления системы.