Я не знаю, было ли это только у меня или это случается со всеми, чей жизненный путь пересекает в какой-то момент времени понятия сетевых протоколов. Мне было очень трудно понять, что на самом деле представляют собой эти протоколы. Это не преувеличение. Мне потребовались годы, чтобы понять сетевые протоколы. Я не собираюсь учиться тому, что они делают. Я имею в виду, чтобы действительно понять, что они собой представляют. И, на мой взгляд, это произошло из-за того, что в библиографии и в нескольких ссылках в Интернете фразы, которые преобладали для описания этого конкретного пространства знаний, делают много предположений о ранее существовавших знаниях, которыми обладает читатель, и в конечном итоге немного вводит в заблуждение кого-то нового на поле.

Цель этой статьи не в том, чтобы описать сетевые протоколы, а в том, чтобы объяснить, что они из себя представляют, и дать некоторое объяснение, на мой взгляд, сбивающим с толку часто используемым метафорическим фразам, таким как «HTTP работает поверх TCP». Это то, что стоит прочитать, прежде чем вдаваться в подробности о них. Надеюсь, он будет полезен нескольким людям, только начинающим свой путь к сетевым протоколам.

Что могут делать протоколы?

Представьте, что вам нужно узнать, что такое протокол TCP, поэтому вы заходите в Википедию и читаете, среди прочего, что «Протокол TCP используется многими интернет-приложениями». или что «TCP отслеживает сегменты» и многое другое, что есть и делает TCP. Это смущает. Вы только что узнали, что если вы являетесь протоколом, вы можете делать что-то. В порядке. Поэтому следующий вопрос неизбежно заключается в том, что на самом деле представляет собой (коммуникационный) протокол и может ли он на самом деле делать все эти вещи.

Итак, давайте снова обратимся к Википедии. Протокол связи — это система правил, которая….. Он определяет правила, синтаксис, семантику…. Это теперь ясно? Я так не думаю. Давайте будем более конкретными и найдем протокол TCP, чтобы получить более полное представление о протоколах. Так что вы гуглите и попадаете сюда https://tools.ietf.org/html/rfc793. Это лист бумаги, текст, описывающий несколько вещей. Это оно.

Если мы объединим наши поиски выше, мы поймем, что протокол — это не более чем лист бумаги, описывающий «систему правил, синтаксис, семантику и т. д.». Проще говоря, это рецепт построения программы. Точно так же есть рецепты, как приготовить курицу, есть также рецепты, как составить программу, называемую протоколами.

Вопрос здесь в том, сказали бы вы когда-нибудь, что «Этот рецепт курицы приятно пахнет или имеет приятный вкус»? Или уточните, что именно курица, приготовленная по этому конкретному рецепту, имеет приятный запах или вкус? Я бы сделал второе, но понимаю, что многие из соображений краткости сделали бы первое.

Тем не менее, независимо от того, к какому типу людей вы относитесь, именно это и происходит с протоколами. В библиографии вы читаете, что они что-то делают, но ничего не делают, потому что это просто инструкции на листе бумаги. Именно программы, построенные на основе инструкций, описанных в этих документах, делают что-то. Возвращаясь к тому, с чего мы начали, «TCP используется многими интернет-приложениями» на самом деле означает, что программа, созданная кем-то на основе протокола TCP, на самом деле используется многими интернет-приложениями. Иначе и быть не могло. Программы общаются с другими программами не бумажками с инструкциями. Опять же, «TCP отслеживает сегменты» означает, что программа, основанная на протоколе TCP, отслеживает сегменты. Протоколы ничего не делают. Программы делают.

Вот хитрость. Вы можете попытаться заменить в уме слово «протокол» словом «программа» везде, где вы его видите, как новое на поле. Все станет намного яснее. Как только вы начнете понимать концепции, вам будет легче различать протокол и программу в разных контекстах.

Где находятся сетевые протоколы?

Видеть? Еще одно метафорическое слово. Проживать. Не удержался от соблазна воспользоваться. Ответ нигде. Как мы уже говорили, протоколы — это просто листы бумаги, к которым можно получить доступ из Интернета, например, протокол TCP, который мы видели выше. Однако правильный вопрос будет заключаться в том, где установлены программы, основанные на сетевых протоколах. Ответ в самом очевидном месте. В вашем ПК.

Мы будем использовать в качестве справки приведенную ниже таблицу из Википедии.

Первый раздел называется прикладной уровень и включает в себя несколько очень известных протоколов, таких как HTTP, HTTPS, TLS, SSH и т. д. Слово «уровень» является метафорическим словом, пытающимся классифицировать различные протоколы в соответствии с тому, кто их разрабатывает и в каком порядке программы, разработанные на их основе, выполняются во время сетевого общения. Это должно проясниться ниже.

Программы, работающие на вашем компьютере, могут быть примерно двух видов. Они либо включены в существующие приложения, либо работают как их часть, либо, наоборот, включены в вашу операционную систему. Google Прикладное программное обеспечение и системное программное обеспечение для получения дополнительной информации.

Все протоколы прикладного уровня относятся, как вы уже догадались, к первому варианту. Они соответствуют программам, включенным в приложения, работающие в вашей операционной системе. Очень распространенным примером является интернет-браузер. Независимо от того, какой из них вы используете, ваш интернет-браузер поставляется со встроенной версией программы HTTP, то есть программой, которая реализует протокол HTTP. Другой пример — протокол FTP. Вы когда-нибудь использовали FileZilla или любой другой ftp-клиент? Это приложения, которые вы можете загрузить из Интернета и которые поставляются со встроенной программой, которая является реализацией, которая, другими словами, была построена в соответствии с инструкциями, установленными на листе бумаги, называемом FTP-протоколом.

Далее идут протоколы транспортного и интернет-уровня. Они соответствуют программам второго типа, которые вы получаете при установке операционной системы. Это означает, что когда вы устанавливаете Windows, Linux или любую другую операционную систему среди сотен или тысяч подпрограмм, из которых она состоит, вы также получаете программу с именем TCP (транспортный уровень) и программу с именем IP (интернет-уровень).

Если вы мне не верите, давайте посмотрим код этих программ на примере операционной системы linux. Здесь https://github.com/torvalds/linux/tree/master/net/ipv4 все файлы, начинающиеся с tcp_, состоят из реализации программы tcp, тогда как все файлы, начинающиеся с ip_, состоят из реализации программа ИП.

Это подводит нас к последнему слою, слою ссылок. Здесь программное и аппаратное обеспечение напрямую связаны друг с другом. Программы этого уровня получают укусы от программы IP (или любой другой программы интернет-уровня) и преобразуют их в импульсы электричества для отправки по проводу на какое-то удаленное соединение. Это драйвер сетевой карты.

Как (программы, которые реализуют) сетевые протоколы взаимодействуют друг с другом?

Я создал этот раздел только для того, чтобы обратиться к супер-метафорической и, как мне кажется, запутанной фразе, которую я видел миллион раз, говорящей о том, что протокол работает поверх другого протокола. Эта фраза, вероятно, возникла из стека протоколов, как показано на изображении выше. В этом стеке каждый протокол находится выше или ниже другого. Я предполагаю, что если бы вместо стека превалировал конвейер протоколов, то сейчас мы бы говорили о протоколе, работающем бок о бок с другим.

В любом случае, давайте познакомимся с некоторыми из самых основных концепций программирования. Что такое простое описание основных функций программы? Программа представляет собой фрагмент кода, который получает входные данные, преобразует их и производит выходные данные. Так, например, программа, реализующая протокол HTTP, «представляет собой фрагмент кода, который получает входные данные, преобразует их и производит выходные данные». Что теперь происходит с этим выводом? Эти выходные данные передаются в качестве входных данных какой-либо другой программе, так что в конечном итоге они будут отправлены по сети в какое-то удаленное место. Может ли эта программа быть реализацией протоколов интернет-уровня? Нет, так как эти программы не распознают вывод программы HTTP как свой ввод. Данные и их формат не подходят для обработки. Может это программа канального уровня? Нет по той же причине. Так что остаются только программы с транспортного уровня.

Как мы можем быть уверены, что программы транспортного уровня распознают выходные данные программы HTTP как надлежащие входные данные для них. Ну вот и огромная полезность сетевых протоколов, инструкции по сборке программ. Независимо от того, как вы реализуете сетевые программы, их входы и выходы должны соответствовать очень конкретным правилам, которые очень подробно описаны в каждом протоколе.