Несколько дней назад я возился с докер-контейнерами, когда столкнулся с привычной ошибкой:
Error: port 8081 already in use.
Я и раньше много раз видел подобные сообщения, но на этот раз у меня возник вопрос: с чего вдруг нас учили запускать приложения на портах 8080, 3000 и других популярных портах, а не на каких-нибудь случайных вроде 6666 или 1234? Что ж, эта статья посвящена тому, что мне удалось выяснить, и моему исследованию истории некоторых портов.
Итак, напомню, что порт — это «конечная точка сетевого взаимодействия [...] однозначно определяемая номером». Тем не менее, порты не являются дефицитным ресурсом в компьютере: их всего 65 536 (включая 0), из которых диапазон от 1024 до 49 151 относится к зарегистрированным/пользовательским портам (то есть по сути доступным). Так что похоже, что выбор одних и тех же 10–20 портов по умолчанию во всех программах имеет под собой куда более сложную историю, чем простое «так было доступно».
Порт 3000
Давайте представим себя на месте умных разработчиков из прошлого. Они ищут узнаваемый порт, находящийся ниже 49 151, но выше 1024. Ну... 3000. Мне не очень нравится эта версия, но боюсь, что порт появился именно так.
Одним из ранних популяризаторов этого порта стал Ruby on Rails, и вполне возможно, что DHH просто приглянулось это число.
Ruby on Rails был одним из самых ранних примеров использования популярного порта 3000 в 2004 году. Вы можете увидеть число 3000 в первом коммите, а в ранней документации уже упоминается номер порта 3000.
Тем.»прочем, несмотря на то, что Ruby стал главным ранним популяризатором, он не был первым, кто использовал этот порт. Например, Palantir (не тот самый Palantir, а сервер потокового видео/аудио для Linux) использовал порт 3000 в качестве порта HTTP по умолчанию еще в 2002 году. Но в архивном реестре IANA от сентября 2001 года уже было перечислено несколько служб на порту 3000, включая HBCI и RemoteWare Client, и мне так и не удалось точно проследить первое документированное появление этого номера порта, что делает порт 3000 еще более загадочным для меня.
Порт 8080
Среди системных портов с номерами 0–1023 (требующих административных привилегий) есть несколько особо важных. В частности, примечателен порт 80, поскольку это стандартный порт, на котором прослушивается HTTP. Хорошо, если вы разрабатываете протокол для работы с HTTP, вам бы хотелось логически привязать его к 80-му порту. Именно это и рекомендовалось в документации по установке CERN HTTPD в 1998 году для непривилегированных тестовых портов: «часто 8001, 8080 или подобные». Вы берете 80 и прибавляете еще один 80 для порядка, так и получается популярный порт 8080.
Еще раньше, в Debian netbase 2.14 от 16.06.1997, были добавлены webcache 8080/tcp и webcache 8080/udp в качестве «службы кэширования WWW», а в архивном снимке IANA за 2001 год порт http-alt 8080 указан как «Альтернативный HTTP (см. порт 80).».
Наконец, в стандартной конфигурации Tomcat использовался порт 8080, а появившиеся позже инструменты, такие как Jenkins, помогли сделать этот номер привычным в мире Java-разработки.
Вариации этого подхода проявились в виде порта 8000 для HTTP-сервера Python и 8888 для Jupyter Notebook — все они, судя по всему, следовали вариации соглашения вокруг 80-го порта.
Порт 5173
К моменту появления Vite стандартные порты уже захватили рынок. Порт 3000 к тому моменту был просто Майклом Джорданом среди портов. Но Vite был готов ворваться на сцену с новым портом 5173. И за этим стояла остроумная игра слов:
- 51 = VI (технически VI — это 6 римскими цифрами, но не будем придираться)
- 73 = TE
то есть VITE. Очень гиково и очень умно. Я хочу жить в мире, где разработчики Vite придумывают названия, это было бы намного веселее. Порт 5173, возможно, не так популярен, как 3000, но наверняка столь же запоминающийся для тех, кто знает историю его создания.
Порт 6379
Я родился и вырос в Италии, но до пару лет назад не знал, что основатель Redis тоже итальянец — Сальваторе Санфилиппо. Узнав об этом, я захотел узнать о нем как можно больше, ведь программное обеспечение такого масштаба редко родом из страны, которая обычно ассоциируется скорее со спагетти, чем со стабильным интернет-соединением.
В ходе поисков я узнал, что стандартный порт Redis — 6379. Звучит довольно случайно, но причина забавная: если набрать 6379 на телефоне, получится «Merz». Это отсылка к Алессии Мерц, итальянской модели, которая среди Сальваторе и его друзей стала синонимом «глупости». «Но со временем значение сместилось в сторону чего-то настолько глупого, что аж бессмысленного». Так что использование порта Redis по умолчанию... бессмысленно?
Порты 31337 и 1337
Порты 31337 и 1337 также стали довольно известными благодаря написанию в стиле leetspeak слов «elite» и «leet» соответственно, в результате чего они стали ассоциироваться с хакерской культурой. Множество проектов, хотевших подчеркнуть свою связь с хакерским сообществом, негласно выбрали эти порты.
Ожидаемо, это привлекло к данным портам и вредоносное ПО, например троян ShadyShell, который организовывал бэкдор-доступ к зараженным системам.
Точка Шеллинга для портов
Мне хотелось бы верить, что у всего есть причина. Но правда, скорее всего, в том, что зачастую её нет. Пытаясь докопаться до истории какого-нибудь порта, я чаще всего натыкался на следующую цепочку: я знаю, что порт N использовался протоколом X. Протокол X, вероятно, взял его у протокола Y. Протокол Y, возможно, заимствовал его у протокола Z. А дальше тишина. Создавалось впечатление, что в какой-то момент кто-то просто выбрал порт, и он завирусился. Так было, например, с портами 3000 и 5000.
Это убедило меня, что номера портов — это вариация классической точки Шеллинга применительно к программистам. То есть на заре разработки было не так много людей, которые популяризировали и использовали эти порты. Первый задействовал порт 3000, а все последующие, будучи рациональными, не видели смысла что-то менять. Первый разработчик выбрал 3000 по какой-то логичной причине, думали они. Смена номера может привести к ненужным ошибкам, так что лучше я придержусь этого варианта.
Вероятно, именно поэтому историю этих портов так сложно проследить. Здесь нет четкого журнала, где один протокол вдохновляет другой; скорее, множество рациональных людей одновременно приходят к одному и тому же решению и соглашаются с ним, даже не общаясь друг с другом.
Например, в случае с портом 3000 — из уважения, равнодушия или просто ради простоты — Node.js, Next.js, React и другие стали использовать то же соглашение, что и предшественники, что и привело к его популяризации. Это было время, когда люди еще читали документацию софта, поэтому строчка в Node.js:
app.listen(3000, () => console.log('Server running on port 3000'));
должна была стать мощнейшим евангелистом порта 3000. И я готов поспорить, что ленивые буткэмпы, процветавшие в те дни, не обладали творческим потенциалом, чтобы заменить этот порт на что-то более нестандартное, что, вероятно, помогло ему распространиться еще быстрее.
В любом случае, это была интересная тема для погружения, и хотя практической пользы в ней немного, я вынес для себя одно: в следующий раз, поднимая порт, я придумаю что-то более запоминающееся, чем скучные стандартные значения. Может быть, порт 7373 для Чак Норриса среди портов или 27182, если проект начинается с буквы e.
Если вам понравилась статья, вы можете подписаться на Substack или следить за обновлениями через RSS.
Дисклеймер: возможно, часть найденной мной информации является неточной или неполной, и в таком случае я сделаю все возможное, чтобы актуализировать контент.
Комментарии (0)
Пока нет комментариев — будьте первым.