Содержание курса
Лекции Московского государственного университета имени М.В. Ломоносова
0/2
ОП.11 Компьютерные сети
Содержание урока:
Лекция 2.Основные принципы построения Интернета
Сегодня компьютерные сети пронизывают нашу жизнь, и эта тенденция продолжает усугубляться. Без понимания того, как устроены компьютерные сети, как они функционируют, многие вещи понять будет невозможно.
Технологический разрыв между поколениями можно измерить следующим экспериментом. Смогут ли полноценно функционировать ваши дедушка и бабушка, если попадут в современный мир? Они могут не знать, как работает мобильный телефон, что такое кредитная карта, как всё это организовано, что такое виртуальная реальность.
Пример. Есть голограмма танцующего Майкла Джексона вместе с реальными актёрами. Её уникальность заключается в том, что мы имеем дополненную виртуальную реальность, 3D-изображение в развёртке 180 градусов, и огромный зал, который смотрит с разных ракурсов на то, что происходит на сцене. Поскольку это голограмма, задники меняются за доли секунды. Голограмма непрозрачная. Майкл проходит перед живыми актёрами и сзади них, словно реальный человек. Потрясающий технологический прорыв.
Другой пример. Визит Путина в другую страну стоит огромных денег. Всё потому, что на сегодняшний день нет формы коммуникации, которая позволила бы людям почувствовать друг друга. В общении чрезвычайно большое значение имеет не только и не столько то, что мы говорим, но и то, как мы говорим, как мы себя ведём, как мы выглядим, как мы себя держим. Всё это очень важно при личном общении.
Та технология, которая впервые была продемонстрирована в Лос-Анджелесе в 2015 году, является огромным технологическим прорывом, поскольку позволяет вести коммуникации новым способом. В лучшем случае сегодня мы можем воспользоваться видеоконференцсвязью, когда на плоском экране появляется плоское изображение. Но в случае голограммы в пространстве создаётся 3D-изображение, которое во всех подробностях передаёт поведение человека при коммуникации.
Сетевые приложения: абстракция
Рассмотрим организацию приложений в компьютерных сетях. Квинтэссенция тех методов, на которых основаны все приложения в Интернете, – это некая абстракция, которая лежит в основе всех моделей приложений Интернета.
Если у нас есть два компьютера A и B, и мы хотим обеспечить взаимодействие между ними через сеть, то основная модель, абстракция реальных механизмов, которые используются в Интернет-приложениях, – это упорядоченный поток байтов на транспортном уровне, который направлен от компьютера A к компьютеру B.
При этом возникает множество вопросов. Мы используем в Интернете пакетную коммутацию, то есть весь передаваемый объём данных режется на маленькие кусочки, и эти кусочки передаются в Интернет, причём каждый кусочек идёт своим маршрутом. Образно говоря, в Интернете не работают очень многие законы физики. Например, нельзя ожидать, что ранее посланный пакет придёт раньше позднее посланного. Здесь всё может произойти наоборот. Многие законы времени в сети подвергнуты искажениям.
Вообще «программа и время» – огромная тема. Мы говорим о программах реального времени. Программа – сущность логическая. Откуда в ней появляется время? Нужно уметь каким-то образом оценивать, сколько времени потребуется созданной вами программе на отработку того или иного события. Бытовая электроника, все технически сложные объекты (самолёты, пароходы, ракеты, спутники, здания, всё, что угодно), управляются компьютерными сетями, но в этих компьютерных сетях нужно уметь писать программы так, чтобы работа этих программ укладывалась в жёстко определённые временные рамки.
Модель «Поток байтов». Экономические рамки компьютерной
сети. NAT
На рисунке изображена модель потока байтов (Рис. 2.1). Все байты пронумерованы. Тот же порядок нумерации должен получиться на стороне B.
Рис. 2.1. Модель «Поток байтов»
Тот факт, что коммуникация внутри сети не упорядоченная, в том смысле, что пакеты идут каждый своим путём, вызывает целый ряд вопросов: как восстанавливать этот порядок, как узнать, что какие-то пакеты не дошли, потому что в компьютерных сетях нет никаких гарантий. Это сети, которые работают по принципу «best effort» – по мере возможностей. Сеть делает всё, чтобы передать информацию, но не даёт гарантий успеха всех операций. Это означает, что само приложение должно позаботиться о том, чтобы восстановить порядок и попросить у отправителя повторно переслать не полученную информацию.
Компьютерная сеть – это общественное достояние. Если поместить в эту сеть слишком много сервисов, то она станет очень дорогой, а значит, не все смогут позволить себе ею пользоваться. Поэтому сеть стараются держать в экономически разумных рамках. А значит, количество сервисов, которое поддерживается сетью, относительно невелико. Это нужно, чтобы сдерживать стоимость сети. Тем не менее, эта стоимость огромная.
NAT (Network Address Translation) – технология, которая возникла из-за нехватки IP-адресов в протоколе IPv4. Внутри некого офиса программы и приложения взаимодействуют с помощью неких локальных адресов, а при выходе в глобальный Интернет они временно получают глобальный IP-адрес. Эта технология выполняет роль транслятора. Для Москвы такой сервис как NAT должен уметь одновременно поддерживать не менее 8 миллионов соединений – активно используемых адресов. В зависимости от количества сервисов, которые поддерживает NAT, стоимость одного соединения колеблется от 8 до 15 долларов. Если перемножить эти числа, получится стоимость только одного сервиса, – NAT, без которого очень трудно обойтись. Однако это касается только Москвы. По всей России и по всему миру числа будут гораздо больше.
Если через сеть работают только два приложения, пакеты нумеруются, и всё
отлично. Если работает много приложений, различать пакеты с номерами одного
приложения от пакетов с номерами другого приложения уже сложнее.
Domain Name Service (DNS)
Идея интернет-приложения Domain Name Service (DNS) заключается в том, что для того чтобы обратиться к какой-то машине или какому-то приложению, удобнее использовать их имена. Имя – это сущность, которая идентифицирует, с кем мы общаемся. «Смелянский Руслан Леонидович» – эти три слова говорят «кто», но не отвечают на вопрос «где?». На этот вопрос отвечает адрес. Необходимо чётко осознавать различия между именем и адресом. Для того чтобы уметь отображать имя
на адрес, используется система доменных имён – Domain Name Service (DNS).
Пример. Клиент хочет связаться с машиной с именем «TITAN.cs.msu.ru». Чтобы узнать её IP-адрес, клиент обращается к своему ближайшему DNS-серверу (Рис. 2.2). Если открыть на компьютере учётную запись, то можно увидеть довольно много записей с IP-адресом, а среди них – строку с названием DNS Server. Как только компьютер включается в сеть, ему сообщают IP-адрес ближайшего DNS-сервера. Этот DNS-сервер обслуживает тот домен, в котором находится данный компьютер. Все устройства, которые имеют имена в Интернет-сети, разбиты по доменам. Это не означает, что все они географически должны быть локализованы в одном и том же месте. Они локализованы в одном домене и имеют некую общую часть в своём имени.
Рис. 2.2. Domain Name Service (DNS)
После того, как клиент обратился к DNS-серверу, тот проверяет, обращался ли кто-нибудь к компьютеру с именем «TITAN.cs.msu.ru», в своих кэшах. DNS-сервер – это, по сути, база данных – таблица, куда занесены имена и какие-то атрибуты, характерные для объектов с этими именами. Если локальный DNS-сервис не находит в своих кэшах нужной записи, то он обращается к DNS-серверу домена ru. В этом домене он ищет, где располагается DNS-сервер домена msu. Дойдя до домена msu, он ищет DNS-сервер домена cs, потому что TITAN и присвоенный ему IP-адрес находятся в этом домене. Если такой записи в домене cs не будет обнаружено, то по цепочке пойдёт сообщение о том, что имя неизвестно, в сети нет устройства с таким именем, оно не зарегистрировано. А если такая запись обнаружена, то клиенту передаётся IP-адрес. Побайтно идёт текстовая строка, где в ASCII-коде кодируются символы, и шлётся запрос (Request). DNS-сервер – программа, которая стоит на компьютере и реализует некую базу данных. Происходит поиск в этой базе данных с помощью SQL-запросов. Получаем ответ. Если ответ негативный, то мы получаем IP-адрес DNS-сервера домена ru. Тот же самый SQL-запрос, – получаем IP-адрес DNS-сервера домена msu. Снова запрос, – и мы попадаем в cs и в результате ещё раз получаем IP-адрес. Все эти коммуникации происходят через поток упорядоченных байтов. Никаких исключений в этом случае нет.
e-Почта (SMTP)
Электронная почта – тоже приложение. В DNS-сервере домена находится список имён всех компьютеров, которые зарегистрированы в данном домене, в том числе почтовые сервера, веб-сервера и т. д. Поэтому когда, например, клиент A хочет послать письмо клиенту B, происходит следующее (Рис. 2.3).
Рис. 2.3. e-Почта (SMTP)
Клиент A формирует письмо: пишет «кому», тему и тело. В тело он может включить аудиофайл, видеофайл, набрать некий текст. При этом, когда клиент набрал имя абонента, например, [email protected], при отправке письма он преобразует это имя в IP-адрес через DNS-службу. Клиент знает, где находится его mail-Server, поскольку в своём локальном DNS он всегда знает IP-адрес сервера электронной почты домена cs, если находится в этом домене. Затем сервер ищет IP-адрес почтового сервера в домене клиента B. Найдя этот IP-адрес, он в виде упорядоченной последовательности байтов передаёт всё письмо вместе с заголовком, адресом, телом на почтовый сервер, ближайший к клиенту B. В определённое время, либо в автоматическом режиме, либо по инициативе пользователя, почтовый клиент на компьютере клиента B инициирует обмен между сервером и почтовым клиентом и перекачивает всю накопленную на сервере почту, адресованную ему, к себе на локальный компьютер.
World Wide Web (HTTP)
Всемирная паутина (World Wide Web). Протокол HTTP. В случае HTTP в запрос на доступ к какой-то странице входит команда GET и адрес этой страницы на веб-сервере. Причем веб-сервера зарегистрированы в DNS-домене, том, в котором они находятся. Клиент отправляет запрос с командой PUT, если нужно положить какую-то информацию на веб-сайт, и GET – если нужно получить её (Рис. 2.4).
Рис. 2.4. World Wide Web (HTTP)
Это ASCII-текст, алфавитно-цифровой текст, который может включать ссылки на графические файлы, которые будут динамически подкачиваться. Всё это в виде упорядоченной последовательности байтов перекачивается от клиента на сервер либо, если реализуется команда GET, с сервера на машину клиента. А дальше с помощью соответствующего браузера происходит визуализация страницы, записанной на языке HTML, размеченной специальными тегами, которые позволяют управлять размещением изображений, видеофайлов, шрифтами, цветом, и так далее.
Skype. Случаи нахождения одного или обоих клиентов за NAT
Skype. Взаимодействие по Skype (Рис. 2.5).
Рис. 2.5. Взаимодействие по Skype
В самом простом случае, если A и B знают свои имена, то с помощью DNS-службы они могут получить IP-адреса. Клиент A может запросить клиент B на готовность провести сессию. Клиент B, зная адрес IP A, который указывается при этом взаимодействии, связывается с клиентом A, при этом подтверждая свою готовность установить такую сессию. Затем в виде последовательности байтов начинает передаваться информация от A к B.
Если клиент B находится за NAT, у него нет глобального IP-адреса. В этом случае нет никакой возможности связаться с клиентом B, если он сам не проявит инициативу. Если клиент B сам проявит инициативу, то произойдёт следующее (Рис. 2.6).
Рис. 2.6. Взаимодействие по Skype через сервер Randezvous
Есть некий сервер, который называется Randezvous. После включения компьютера можно получать сообщения по Skype о том, что один из контактов находится в сети. Это означает, что клиент Skype вышел на сервер Randezvous и там зарегистрировался. Клиент B знает IP-адрес сервера Randezvous, который устанавливается при инициализации клиента. Как только клиент B выходит со своим локальным IP-адресом, на выходе через NAT ему будет присвоен глобальный IP-адрес. С помощью глобального IP-адреса, зная IP-адрес сервера Randezvous, он зайдёт на этот сервер и произведёт процедуру регистрации. В ходе этой процедуры он зафиксирует свой глобальный IP-адрес. Теперь если клиент A зайдёт на сервер Randezvous, то сможет запросить IP-адрес клиента B (а он там есть), и получить его. Если клиент A его знает, то он инициирует сессию к IP по IP-адресу B. NAT, получая глобальный IP-адрес B, осуществляет трансляцию в локальный IP-адрес, и клиент B получает соответствующую информацию.
Если сервера Randezvous нет, то единственная возможность взаимодействовать A и B заключается в том, что если B сам выйдет на A, тогда A узнает его глобальный IP-адрес и сможет взаимодействовать с клиентом B. Если клиент B не проявит инициативу, то никакой возможности для взаимодействия A и B не будет. Но в любом случае взаимодействие между A и B происходит в виде упорядоченной последовательности байтов, которые передаются между машиной A и B.
Рис. 2.7. Взаимодействие по Skype через сервер Rely
Если обе машины находятся за NAT, взаимодействие происходит через сервер, аналогичный Randezvous, но несколько иначе организованный (Рис. 2.7). Клиент B выходит на сервер Rely и фиксирует свой глобальный адрес. Клиент A тоже выходит на этот сервер и в нём регистрируется. Затем A и B через сервер Rely могут устанавливать сессию между собой и передавать данные в виде упорядоченного потока байтов.
Bit Torrent
Bit Torrent. Быстрая передача больших файлов. Каждый большой файл (например, фильм) режется на несколько частей и разбрасывается между клиентами. Это так называемые пиринговые сети. Все машины здесь равны, нет сервера, и
нет клиентов. Среди них выделяется один так называемый трекер машины, который хранит файл, где записано, какие части большого файла хранят у себя машины, и адреса этих машин. Группа этих машин вместе с трекером образует так называемую swarm-группу, по-русски «рой» (Рис. 2.8).
Рис. 2.8. Bit Torrent
Если клиент A хочет скачать себе какой-то фильм, он закачивает с трекера трекер файл, узнаёт swarm-группу, он знает, кто какую часть файла хранит, и параллельно инициирует сессии скачивания с нескольких машин разных частей одного и того же файла. А поскольку у этого клиента есть трекер-файл, то он знает, в каком порядке нужно компоновать эти части. Преимущества такой технологии в том, что: а) существенно ускоряется перекачка файлов (она идёт параллельно, а не последовательно); б) нет необходимости в одном большом хранилище, поскольку для передачи большого файла можно использовать небольшие хранилища, которые находятся на каждом из этих клиентов.
Модель «Поток байтов»: TCP, UDP и их различия
Основная модель, которая используется на сегодняшний день для взаимодействия в Интернете, – это модель «трубы», когда есть упорядоченная последовательность байтов, которая передаётся между двумя приложениями. Эта «труба» прокладывается поверх ненадёжного протокола IP. Внизу, под этой «трубой», находится протокол, который не гарантирует передачи всех пакетов. Этот протокол работает по принципу «best effort».
Для организации упорядоченной последовательности байтов используется TCP протокол (Transmission Control Protocol) – протокол управления передачей. Это протокол, который гарантирует получателю, что все посланные пакеты будут доставлены получателю в надлежащем порядке, и если какой-то из них будет пропущен, то это будет обнаружено, и отправителю поступит запрос повторно передать пропущенный фрагмент.
Существует более простой аналог протокола TCP, который не создаёт надёжного сервиса. Надёжный сервис означает, что передача происходит с подтверждением получения каждого посланного пакета, порядок гарантируется, и гарантируется, что
в случае если какой-то пакет будет потерян, то он будет передан повторно. Если столь сложный сервис не требуется, то можно воспользоваться протоколом UDP, который посылает каждый пакет как бы по отдельному соединению и не гарантирует успешной передачи.
Рекомендуемая литература
• Salam Baset, Henning Schulzrinne ”Skype: An Analysis of the Skype Peer-to-
Peer Telephony Protocol.”

• Смелянский Р. Л. Компьютерные сети, т.1, гл.1-2, т.2, гл.1
• Куроуз Дж., Росс К. Компьютерные сети. Многоуровневая архитектура Интернет, Питер, 2004, гл.1-2

Организация компьютерной сети с точки зрения приложения
Рис. 2.9. Организация компьютерной сети с точки зрения приложения
Абонентские машины – машины, на которых работают приложения, и за которыми работают люди. Эти машины с помощью так называемой системы передачи данных (СПД) подключены к транспортной среде (Рис. 2.9). Важным элементом
транспортной среды в традиционной компьютерной сети являются маршрутизаторы. Когда компьютер подключается через систему передачи данных, он попадает к маршрутизатору. Это машина, которая выстраивает маршрут следования для каждого полученного пакета. Она определяет, куда этот пакет должен быть передан. При этом все эти маршрутизаторы, или коммутационные машины, независимы. Каждый из них, взаимодействуя между собой через специальные служебные сообщения, формирует представление о глобальной конфигурации этой сети.
Сети могут соединяться между собой через шлюзы. Если сети работают по одним и тем же протоколам, то в принципе можно соединить системы передачи данных, образно говоря, проводом, и данные «побегут» из одной сети в другую. Хуже будет, если эти сети работают по разным протоколам. В этом случае потребуются устройства, которые называются шлюзами. Это специальные компьютеры, которые берут протокольные единицы данных одной архитектуры, сети, переформатируют в протокольные единицы данных другой сети и передают в соответствующую сеть.
Примерами систем передачи данных могут служить телефонная сеть, сотовая сеть, сеть Wi-Fi, Ethernet. На самом деле таких систем намного больше.
Проблемы, возникающие при передаче файла
При передаче файла от машины A к машине B прежде всего необходимо обеспечить сохранение формата передаваемого файла. Это можно сделать двумя способами. Первый способ – использование некоторого общего языка разметки файла,
который знает и понимает как машина A, так и машина B. Тогда, используя специальный язык разметки (примером такого языка является HTML), можно передавать этот файл и правильно воспроизводить его структуру на прикладном уровне.
Следующая проблема – как разбить файл на маленькие пакеты. Насколько пакет маленький, определяется тем, какого размера данные можно прокачать в определённый интервал времени через физическую среду – систему передачи данных. Каждый из названных протоколов (Ethernet, Wi-Fi, и т. д.) ограничивает максимальную длину пакета. Например, в IP-протоколе максимальный размер пакета – 64 Кб. Меньшие размеры пакетов допустимы. При передаче от A к B нужно уметь определять границы пакета, – где закончился один, и где начался другой.
Также нужно уметь обнаруживать ошибки передачи. Причём желательно уметь не только обнаруживать эти ошибки, но и исправлять их.
Необходимо заранее предвидеть одну проблему. Может оказаться так, что машина A – это мощный сервер, который имеет интерфейс в 10 Гбит, оптическую линию, к которой подключён маленький компьютер с маленьким процессором и сетевым
интерфейсом на 10 Мбит. В этом случае машина B просто захлебнётся. Машина A задавит её своим потоком данных, и весь переданный поток данных будет в значительной степени теряться. Такая ситуация называется управление потоком. Получатель должен каким-то образом предупредить отправителя об избытке данных. Если после получения и обработки каждого пакета говорить отправителю, что нужно переслать пакет дальше, это будет крайне неэффективным использованием канала. Если пакеты пролетают очень быстро, а машина медленная, то значительную долю времени работы канала он будет простаивать. Нужно как-то договариваться, и подтверждать не каждый пакет.
Чтобы пройти от одной машины к другой, нужно преодолеть несколько маршрутизаторов (Рис. 2.9). При этом может сложиться ситуация, когда и отправитель, и получатель обладают достаточными ресурсами, для того чтобы получать данные на высокой скорости. У коммутатора на рисунке четыре канала. Через него идут потоки в самых разных направлениях, и его ресурсы могут оказаться исчерпанными. В этом случае тормозить передачу данных будут не получатель и отправитель, а какой-то элемент в сети. В сети возникает перегрузка – очень опасное явление. С одной стороны, оно необходимо, для того чтобы максимально использовать ресурсы сети, а с другой стороны, оно чрезвычайно опасно, потому что приводит к потере пакетов. Когда ресурсы коммутатора перегружены, он начинает сбрасывать пакеты. Это означает, что все затраты на передачу пакета будут потеряны безвозвратно. Придётся делать всё заново. В 1986 году в Интернете произошёл коллапс из-за того, что люди не умели бороться с перегрузками. В результате один и тот же пакет приходилось пересылать по 5-7 раз, чтобы доставить его до получателя.
Маршрутизаторы решают две неравноценные задачи. Первая задача – задача маршрутизации, построения оптимального маршрута. Нужно определить, по какой линии надо отправить пакет, чтобы он оптимально достиг получателя. Если вы молодой студент и любите путешествовать, то оптимальный способ путешествия – это пригородные электрички: дёшево, есть время познакомиться с маленькими городками, и, если не брать в расчёт границы, то на пригородных поездах можно далеко уехать. С экономической точки зрения это очень эффективный способ путешествий. С точки зрения удобства — не очень. С точки зрения скорости — совсем плохой. Поэтому важно понимать, в каком смысле маршрут оптимален.
Существует много критериев оптимизации. А алгоритмы маршрутизации очень тяжёлые. С одной стороны, маршрутизатор должен решить задачу оптимизации, для которой он должен собрать информацию о всех изменениях, которые произошли в его окружении, для того чтобы понимать, что разорвали какую-то линию. Например, экскаватор подъехал, копнул и разорвал какую-то линию. Необходимо знать, кто главный враг сетей. Это экскаваторы, а также сварочные аппараты, которые дают помехи для радиосвязи. Когда пакет продвинулся до физической линии, нужно передать его по этой линии. Как только он доходит до физической линии, исчезают байты, пакеты. Есть только поток битов, и этот поток битов нужно уметь структурировать. Нужно уметь выделять заголовки, концевики, все структурные элементыпередаваемой информации в реальном масштабе времени.
Разбиение взаимодействий на уровни
Если попытаться под каждое приложение написать программу, которая всё это будет делать сразу, то ничего хорошего не выйдет. В 1968 году появился термин инженерия программного обеспечения (software engineering). Программные системы – это самое сложное, с чем столкнулись люди на тот момент. В инженерном плане сложность таких систем превышает интеллектуальные возможности людей. Единственный способ борьбы с такой сложностью – структурирование: разбиение системы на подсистемы, определение строгих интерфейсов между подсистемами и правил взаимодействия между подсистемами.
В компьютерных сетях было решено разбить все этапы взаимодействия между приложениями на уровни, причём так, что число этих уровней не должно быть большим, и границы каждого уровня должны быть очень чётко определены. Каждый уровень может взаимодействовать только с себе подобным, себе равным. Если на уровне 3 сформировать некоторый протокольный объект, несущий данные, то понять структуры этого объекта сможет только третий уровень другого компьютера в этой сети. Но передаваться этот пакет будет на уровень L2 через интерфейс.
Вышестоящий уровень может взаимодействовать с нижестоящим уровнем. Это взаимодействие будет означать: «Передай вниз эту протокольную единицу данных». Между уровнями определён набор элементарных команд, которые составляют интерфейс взаимодействия между уровнями. Но те единицы данных, которыми обмениваются между собой уровни, абсолютно не прозрачны. Для уровня L2 то, что передал L3, не прозрачно. Нижележащий уровень обеспечивает определённый набор сервисов для вышележащего. Каждый уровень независим. То, как реализован вышестоящий уровень, и то, как реализован вышестоящий уровень, никак между собой не связано. Это сделано специально, для того чтобы можно было осуществлять разработку и реализацию этих уровней независимо друг от друга.
TCP/IP: 4-х уровневая модель Интернета
4-х уровневая модель Интернета, которая используется в стеке протоколов TCP/IP. Первый уровень снизу – уровень канала данных. На этом уровне есть протокольные единицы – кадры. Сверху на транспортном уровне со стороны приложения мы получаем некоторое сообщение, которое разбивается на сегменты. Сегменты на сетевом уровне преобразуются в пакеты. Пакеты на канальном уровне преобразуются в кадры. Кадр преобразуется на физическом уровне в поток битов. Когда к
получателю доходит поток битов, он должен этот поток битов разбить на кадры. Затем кадры он должен трансформировать в пакеты. Пакеты должны трансформироваться в сегменты, а сегменты должны трансформироваться во всё сообщение.
Приложения в Интернете взаимодействуют в виде упорядоченного потока байтов. Но на сетевом уровне нельзя гарантировать безошибочную передачу этого потока. Более того, пакеты идут разными маршрутами. Поэтому необходимо уметь на каждом из этих уровней передавать протокольные единицы данных независимо друг от друга, а на всех вышележащих уровнях – восстанавливать этот порядок.
Также на каждом из этих уровней используется разная система адресации. Адреса на канальном уровне, адреса на сетевом уровне и адреса на транспортном уровне в компьютерных сетях разные. На канальном уровне, если в качестве системы передачи данных используется Ethernet, это будет MAC-адрес. Если используется IP-протокол, то на сетевом уровне будет IP-адрес. Причём на сегодняшний день есть два вида IP-адресов: IPv4 и IPv6, и нужно уметь различать, какой протокол используется. Над сетевым уровнем используется своя адресация транспортного уровня, и там работает два протокола: TCP и UDP. Каждый из уровней имеет свою структуру протокольной единицы данных, и эта протокольная единица данных структурирована под тот набор сервисов, который выполняет соответствующий уровень.
На сетевом уровне не гарантируется доставка пакета. Это значит, что на этом уровне мы не требуем подтверждения получения пакета. Подтверждение означает, что в заголовке пакета нужно предусмотреть какое-то поле, по которому мы могли бы определить, что пакет с определённым номером был получен. Если протокол соответствующего уровня не предполагает таких подтверждений, то нам и не нужно резервировать такое поле. Необходимо понимать, что все эти поля – это накладные расходы в чистом виде. Нам нужно передавать данные, а не служебную сетевую информацию. Чем меньше ресурсов сеть тратит на передачу своей служебной информации, тем эффективнее эта сеть.
Взаимодействие одноимённых уровней. Инкапсуляция
Взаимодействовать между собой будут только одноимённые уровни. Когда на канальном уровне мы получаем кадр и трансформируем его в пакет, то он будет прочитан только сетевым уровнем. Канальный уровень не может прочесть структуру пакета сетевого уровня.
Всё сообщение, которое приложение хочет передать, разбивается на сегменты. Сначала появляется тело сегмента. К нему добавляется заголовок, который говорит, какому другому приложению на стороне получателя нужно будет передать этот сегмент. В этот заголовок нужно включить номер этого сегмента, потому что необходимо обеспечить упорядоченность данных. Нужно включить какую-то информацию, которая гарантирует безошибочную передачу этого сегмента, и целый ряд другой служебной информации. После формирования сегмента на транспортном уровне нужно передать его на сетевой уровень. На сетевом уровне вся эта часть принимается как одно целое, поскольку структура, сформированная на транспортном уровне, на сетевом уровне нам не понятна. Поэтому к этому сегменту мы добавляем свой заголовок – заголовок пакета. Если в заголовке транспортного уровня указывается номер сегмента, подтверждение информации и многое другое, то на сетевом уровне подтверждения не нужны, всё, что нужно указать, – это IP-адрес получателя (destination IP), IP-адрес отправителя и некоторую служебную информацию. Затем это становится пакетом. Как только этот пакет попадает на канальный уровень, он становится непрозрачным для канального уровня. Канальный уровень не проверяет этот пакет. Он знает, что пакет надо передать по конкретному MAC-адресу. Тогда он формирует свой заголовок, где прописывает соответствующие адреса, соответствующую служебную информацию, и всё это превращается в поток битов, который по физической линии передаётся до другого канального уровня. На другом канальном уровне этот поток битов превращается в кадр. Канальный уровень забирает свой заголовок, отсекает его, прочитывает, что нужно сделать с этим кадром, и передаёт его на сетевой уровень. Сетевой уровень вскрывает этот пакет и затрагивает только его заголовок, но не тело. В заголовке он видит, куда надо отправить пакет, по этой информации он его маршрутизирует, и так далее.
Фактически, получив поток битов, мы преобразуем его в кадр. Для этого нужно уметь ловить заголовок кадра, начало кадра, конец кадра. Это тоже своего рода искусство. Выделив кадр из потока битов, мы формируем его, отсекаем заголовок и передаём пакет на сетевой уровень. На сетевом уровне соответствующая программа анализирует заголовок и определяет, куда должен быть отправлен этот пакет. Если это маршрутизатор, то в нём программное обеспечение реализует всего два уровня: канальный и сетевой. Эта программа смотрит на заголовок, определяет, куда должен быть отправлен пакет, формирует необходимые изменения в заголовке и передаёт пакет обратно на канальный уровень. Канальный уровень превращает пакет в кадр. Кадр в виде потока битов переходит к следующему маршрутизатору и так, шаг за шагом, всё это добирается до нужного получателя. (Рис. 2.10).
На рисунке голубым прямоугольником выделен пакет, совершенно непрозрачный для канального уровня. К нему приставляется заголовок канального уровня. Соответственно, к зелёному прямоугольнику приставляется заголовок сетевого уровня, и остаётся сегмент, который относится к транспортному уровню.
Рис. 2.10. Взаимодействие одноимённых уровней
На сетевом и транспортном уровнях необходимо решать задачу управления потоком. Причём на сетевом уровне, поскольку маршрутизаторы соединены непосредственно физической линией связи, не возникает проблемы перегрузки. Эта проблема возникает именно на транспортном уровне, поскольку перегруженным может оказаться не отправитель и не получатель, а один из промежуточных коммутаторов.
С помощью протокольных единиц данных взаимодействуют только одноимённые уровни в стеке протоколов. Часть протокольной единицы данных, доступная на соответствующем уровне, – это заголовок соответствующего уровня. Всё, что находится вне заголовка, для программного обеспечения соответствующего уровня недоступно. Так устроены протоколы в модели TCP/IP.
Технический приём инкапсуляции заключается в том, что протокольные единицы данных инкапсулируются друг в друга при прохождении через стек.
После того, как все сегменты будут получены, тела этих сегментов выстраиваются в порядке, в котором они были пронумерованы, и после этого формируется всё сообщение и передаётся на уровень приложения. На канальном уровне взаимодействие всегда происходит непосредственное. Здесь нет промежуточных посредников. На сетевом уровне – то же самое. Здесь происходит взаимодействие «точка-точка», всегда прямая линия. На транспортном уровне появляется новая проблема. Поскольку здесь возникают промежуточные узлы, то нужно решать не только проблему управления потоком, но и проблему выявления перегрузки на промежуточных узлах. Поток битов в промежуточном узле формируется в кадр. Кадр превращается в пакет. На сетевом уровне пакет маршрутизируется, после чего снова заворачивается в кадр, потому что здесь разные MAC-адреса. Когда мы определяем, на какой из портов перебросить этот пакет, то мы в нём IP-адрес не меняем (это будет IP-адрес destination – точки назначения), но меняем поле MAC-адреса, поле порта.
Кроме того, нужно ещё кое-что поменять в заголовках. Например, нельзя допускать, чтобы пакеты в случае ошибки бесконечно долго жили в сети. На самом деле сеть имеет очень сложную топологию. Если заранее не озаботиться, то пакет
может блуждать от маршрутизатора к маршрутизатору сколь угодно долго. Нужно понять, какие пакеты засоряют сеть, ухудшают пропускную способность каналов, создавая накладные расходы. Чтобы бороться с этой проблемой, на IP-уровне есть поле Time To Live – время жизни. Это поле модифицируется при каждом переходе от сетевого уровня к сетевому. Как только это поле обнуляется, пакет сбрасывается, уничтожается. Дальше по стеку протоколов мы поднимаемся наверх.
В 4-х уровневой модели протокольные единицы данных разбираются только на соответствующем уровне, и на всех других уровнях недоступны. В этом есть достоинство, но со временем это превратилось в недостаток. В новом поколении компьютерных сетей люди начинают от этого принципа отходить.
Прикладной уровень «работает» в User space – пользовательском пространстве. Транспортный уровень – это уровень операционной системы. Сетевой уровень, как правило, также реализован в операционной системе. Канальный уровень реализован
на сетевом интерфейсе компьютера, куда включается провод, если связь фиксированная, либо, в случае беспроводной связи, на сетевом интерфейсе сотовой или Wi-Fi связи.
IP как «клей» Интернета
Рис. 2.11. IP – это «клей» Интернета
IP-протокол – это, по сути, «клей» сети Интернет. Любая сеть, которая хочет включиться в сеть Интернет, должна использовать IP-протокол. Интернет – это сеть, которая состоит из других сетей. «Клей», который соединяет эти сети, – это как раз протокол IP (Рис. 2.11).
Любая сеть, работающая в Интернете, должна поддерживать протокол IP. Внизу могут использоваться самые разные физические среды. Это может быть оптоволокно, радиоканалы, кабельная сеть Ethernet, витая пара, коаксиальный кабель, и т. д. Поверх этого работают протоколы транспортного уровня и целый ряд приложений.
ISO/OSI: эталонная модель Интернета. Сопоставление TCP/IP и ISO/OSI
Очень часто сетевой уровень относят к уровню 3. В терминологии TCP/IP это уровень 2. Эта терминология пришла из эталонной модели OSI/ISO (Open Systems Interconnection – взаимодействие открытых систем), потому что компьютерная сеть является открытой системой. Открытая система – это такая организация системы, к которой всегда можно подключить какую-то новую подсистему. Нам известны интерфейсы этой системы. Например, любая информационная система – это открытая система. Она открывает свои интерфейсы для написания приложений, и для неё всегда можно написать новое приложение. То же самое касается компьютерных сетей.
Международный институт стандартизации (International Standardization Organization) разработал в 1970-е годы 7-ми уровневую модель. В ней сетевой уровень – это уровень L3. Поэтому очень часто говорят, что канальный уровень – это L2, сетевой –
L3. В 1989 году происходила острейшая борьба между стеками протоколов TCP/IP и OSI/ISO, и было совершенно не очевидно, что победит. Для разрешения этого спора в Международной школе по компьютерным сетям в Италии собралась команда международных специалистов. Но создание веб-приложений взорвало сеть, а они, конечно, работали на стеке протоколов TCP/IP. После этого всё стало ясно. Победил TCP/IP. Кроме того, американцы выбрали очень правильную стратегию. Это FreeBSD, Unix, открытый код, реализация TCP/IP-стека с открытым кодом, свободно распространяемое программное обеспечение.
Интернет устроен по этой 4-ёх уровневой модели. Канальный уровень системы передачи данных – это Ethernet, Wi-Fi. Сетевой уровень – это протокол IP. TCP объединяет в себе функциональность двух уровней: транспортного и уровня сес-
сии 7-ми уровневой модели. Все задачи, связанные с представлением информации, восстановлением её структуры, и так далее, возложены на прикладной уровень. В частности, прикладной уровень реализует также целый ряд функционала, который вынесен в уровень сессии 7-ми уровневой модели. В этой модели для передачи очень большого файла (например, в 100 Гб) нужно много времени. Предположим, что вы работаете в не очень надёжной сети, в которой очень часто рвётся соединение. Будет не очень хорошо, если после каждого разрыва придётся возобновлять передачу файла. Необходимо предусмотреть какой-то механизм борьбы с такими ситуациями. На уровне сессии был предусмотрен механизм контрольных точек. Автоматически выставлялись контрольные точки, фиксировался объём переданных данных на какой-то текущий момент, и инициировалась передача следующего фрагмента. Если происходил сбой, разрыв соединения в результате передачи следующего фрагмента, то передача возобновлялась, но не с самого начала, а именно с начала этого следующего фрагмента.
Гибкость инкапсуляции на примере VPN
Можно использовать очень гибкую инкапсуляцию. Пусть у нас есть два офиса, расположенные в разных городах. Необходимо обеспечить взаимодействие информационных систем в этих офисах: бухгалтерии, отдела кадров, документации, и так далее. При этом финансовую информацию передавать в открытой сети чрезвычайно опасно, маркетинговую информацию – тем более. Её может перехватить конкурент. Для этого были придуманы VPN-службы. VPN (Virtual Private Network) – это шифрование. На выходе из потока данных ставится некое устройство, которое получает к себе на вход некоторую протокольную единицу данных, шифрует её от начала до конца с некоторым ключом, а на выход – VPN-шлюз. На вход VPN-шлюза подаётся пакет на уровне 3 – сетевом уровне. VPN-шлюз зашифрует весь пакет уровня L3, сформирует кадр уровня L2 – канала данных и бросит это на канальный уровень в сеть Интернет.
Пример. Вы обратились в представительство компании «Ростелеком» и попросили создать канал из точки A в точку B с пропускной способностью 10 Гбит/с.
«Ростелеком» соглашается предоставить канал на уровне L2 стоимостью порядка 5 миллионов рублей в месяц. Вы ставите шлюз, шифрование и дальше по каналу «Ростелеком» идёт зашифрованный пакет. Всё, что открыто, – это уровень L2. На выходе из сети придёт кадр уровня L2, который попадёт в VPN-шлюз второго офиса в точке B. VPN-шлюз распакует кадр L2 и вытащит оттуда зашифрованный пакет L3. Но поскольку эти VPN-шлюзы принадлежат одной организации, они знают секретные ключи друг друга. Поэтому шлюз в точке B расшифрует пакет L3 и представит его в офис. В офисную сеть уже попадёт пакет сетевого уровня и дальше побежит по локальной сети офиса. За счёт инкапсуляции достигается очень большая гибкость. Пакет L3 мы туннелировали через L2 не известной нам сети, но сделали передаваемую информацию недоступной, потому что расшифровать пакет L3 ключом длиной 256 бит очень сложно. На это уйдут многие годы. Туннелирование – очень широко распространённый приём в Интернете. Виртуализация в сетях в значительной степени построена на этом приёме.
Заключение
Основные принципы, на которых строится Интернет:
• 4-ёх уровневый стек протоколов
• принцип инкапсуляции данных
• принцип коммутации пакетов
• принцип доменного именования и адресации на каждом уровне
Отдельно можно выделить принцип End-to-End, который говорит о том, что между точками A и B не должно происходить никаких промежуточных изменений в пакете. Всё, что должна сделать сеть, – получить данные в точке A и передать в точку B. Люди в силу необходимости были вынуждены отойти от этого принципа из-за NAT. На сегодняшний день, для того чтобы работать с сетью Интернет, нужно поддерживать не только протокол IP, но и протокол TCP, потому что по этому протоколу работает NAT. Нарушение принципа End-to-End привело к усложнению работы компьютерной сети.