====== Что такое модель OSI и зачем она нужна: препарируем слоёный пирог интернета ====== Что происходит, когда вы отправляете сообщение, скажем, в Telegram? Понятно, что Telegram отправляет это сообщение. Но что в этот момент происходит в компьютере и в сети? Куда летят файлы и как они понимают, куда им лететь? Разберёмся вместе в этой статье. ===== Что такое модель OSI ===== **Модель OSI (Open System Interconnection)**, или эталонная модель взаимодействия открытых систем описывает, как устройства в локальных и глобальных сетях обмениваются данными и что происходит с этими данными. Её предложили в 1984 году инженеры из Международной организации по стандартизации (ISO), которая работала над единым стандартом передачи данных по интернету. При этом сама по себе эталонная модель — не стандарт интернета, как, например, [[https://skillbox.ru/media/code/model-tcpip-chto-eto-takoe-i-kak-ona-rabotaet/|TCP/IP]]; её можно сравнить с фреймворками в мире языков программирования: в OSI «из коробки» доступны разные веб-стандарты — UDP, HTTP, FTP, Telnet и другие. Всего таких протоколов — более 100 штук. Модель OSI включает семь слоёв, или уровней, — причём каждый из них выполняет определённую функцию: например, передать данные или представить их в понятном для человека виде на компьютере. Кстати, у каждого слоя — свой набор протоколов. > Слои ничего не знают о том, как устроены другие слои. Это называется абстракцией. {{ :networks:12504801092022_ac4aa360577ec93ee375b17d290f20d8751c3719.png?600x600 |}} Самый нижний слой отвечает за физическое представление данных, то есть за то, как данные передаются по проводам или с помощью радиоволн, а самый верхний — за то, как приложения взаимодействуют с сетью. Нижний слой оперирует такими понятиями, как «тип кабеля» или «тип коннектора», а верхний — такими, как [[https://skillbox.ru/media/code/chto-takoe-http-i-zachem-on-nuzhen/|HTTP]] или [[https://skillbox.ru/media/code/chto_takoe_api/|API]]. Рассмотрим каждый слой подробнее. ===== 1-й уровень OSI — физический(L1, physical layer) ===== На самом нижнем уровне модели OSI данные представляют собой физические объекты — ток, свет или радиоволны. Они передаются по проводам или с помощью беспроводных сигналов. Этот слой работает с кабелями, контактами в разъёмах, модуляцией сигнала, кодированием единиц и нулей и другими низкоуровневыми штуками. По сути, первый уровень — это уровень проводов и физических способов передачи сигнала. Минимальная абстракция. {{ :networks:12504801092022_36021550e6c100b15abbb36079019e1dede4c61d.png?1600x393 |}} Данные в виде сигналов передаются между устройствами\\ Изображение: Skillbox Media Самый известный протокол на физическом уровне — Ethernet. Он описывает, как сигналы кодируются и передаются по проводам. Кроме него есть Bluetooth, Wi-Fi и ИК-порт, которые также содержат инструкции для передачи данных. Устройства физического уровня — концентраторы и репитеры. Они работают с физическим сигналом «втупую» и не вникают в его логику: получили данные — передали их дальше по проводу. {{ :networks:12524101092022_accf102caaa970ce65d217b9ae9a8e9a57caa67c.jpg?800x400 |}} //Концентратор Netgear//\\ Фото: [[https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80|Wikimedia Commons]] ===== 2-й уровень OSI — канальный(L2, data link layer) ===== Над физическим уровнем располагается канальный. Его задача — проверить целостность полученных данных и исправить ошибки. Этот уровень «поумнее» предыдущего: он уже понимает, что разные амплитуды напряжений отвечают разным битам — нулям и единицам. А ещё канальный уровень умеет кодировать сигналы в биты и передавать их дальше. Полученные с нижнего уровня данные делятся на фреймы, или кадры. Каждый фрейм состоит из служебной информации — например, адреса отправителя и адреса получателя, — а также самих данных. {{ :networks:12504801092022_57b34fec8ba88110ee3bbc347f3092624b4f2459.png?800x200 |}}\\ //Структура фрейма// Получается что-то вроде почтового конверта. На лицевой стороне у него написано, от кого пришло письмо, а внутри находится само письмо (в нашем случае данные). Лицевая сторона конверта — это MAC-адрес устройства, которое отправило нам информацию. Он нужен, чтобы идентифицировать устройства в локальной сети, состоит из 48 или 64 бит и выглядит примерно так: {{ :networks:12534401092022_ff777f213e3cf3fe8a40b34db3773616a4292812.png?800x200 |}}\\ //Запись MAC-адреса в шестнадцатеричной системе счисления// Ещё один важный факт о MAC-адресах: когда на заводе собирают ноутбук или смартфон, ему сразу же присваивают определённый MAC-адрес, который потом уже никак нельзя поменять. MAC-адрес настольных ПК зашит в сетевую карту, поэтому его можно изменить, только заменив эту самую карту. {{ :networks:09273702092022_70093120a3a547d0e09b380d233b3b19b49dae5a.png |}} С помощью команды __ifconfig__ можно узнать MAC-адрес вашего Macbook или компьютера на Linux. В Windows нужно ввести команду __ipconfig__. Канальный уровень не так прост — он делится ещё на два подуровня: * уровень управления логическим каналом — [[https://ru.wikipedia.org/wiki/Logical_link_control|LLC]] (logical link control); * уровень управления доступом к среде — тот самый [[https://ru.wikipedia.org/wiki/MAC-%D0%B0%D0%B4%D1%80%D0%B5%D1%81|MAC]] (media access control). Первый подуровень нужен для взаимодействия с верхним уровнем, сетевым, а второй — для взаимодействия с нижним, физическим. Устройства канального уровня — коммутаторы и мосты. Они нужны, чтобы передавать фреймы нужному адресату. Протоколы канального уровня — [[https://ru.wikipedia.org/wiki/PPP_(%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB)|PPP]], [[https://ru.wikipedia.org/wiki/CDP|CDP]]. ===== 3-й уровень OSI — сетевой(L3, network layer) ===== Этот уровень отвечает за маршрутизацию данных внутри сети между компьютерами. Здесь уже появляются такие термины, как «маршрутизаторы» и «IP-адреса». {{ :networks:12563401092022_08fda0244b5397e030ee401fd2bea5b24f78a72b.jpg?400x400 |}} \\ //Маршрутизатор, который используют интернет-провайдеры. Обычно маршрутизатор — это Wi-Fi-роутер// Маршрутизаторы позволяют разным сетям общаться друг с другом: они используют MAC-адреса, чтобы построить путь от одного устройства к другому. Данные на сетевом уровне представляются в виде пакетов. Такие пакеты похожи на фреймы из канального уровня, но используют другие адреса получателя и отправителя — [[https://skillbox.ru/media/code/chto-takoe-ipadres-i-maska-podseti-i-zachem-oni-nuzhny/|IP-адреса]]. Чтобы получить IP-адрес обоих устройств (отправителя и получателя), существует протокол [[https://ru.wikipedia.org/wiki/ARP|ARP]] (address resolution protocol). Он умеет конвертировать MAC- в IP-адрес и наоборот. {{ :networks:12570501092022_0fbb7b3e9b1090821274aa19834c5a453e76478b.png?800x200 |}} Примерно так выглядят пакеты ===== 4-й уровень OSI — транспортный(L4, transport layer) ===== Из названия понятно, что на этом уровне происходит передача данных по сети. Так и есть. Два главных протокола здесь — [[https://skillbox.ru/media/code/model-tcpip-chto-eto-takoe-i-kak-ona-rabotaet/|TCP]] и [[https://ru.wikipedia.org/wiki/UDP|UDP]]. Они как раз и отвечают за то, как именно будут передаваться данные. TCP (Transmission Control Protocol) — это протокол, который гарантирует доставку данных в корректном виде. Он жёстко следит за каждым битом информации, но работает гораздо медленнее UDP. Например, когда вы вводите логин и пароль при входе в социальную сеть, очень важно, чтобы все символы отправились в определённой последовательности. Если какие-то потеряются или изменятся, вы просто не сможете авторизоваться. Поэтому протокол TCP использует разные методы проверок — например, [[https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%83%D0%BC%D0%BC%D0%B0|контрольные суммы]]. {{ :networks:12504801092022_0542ca50589411a35face924f9ce819088c87b1e.png?800x400 |}} //Для этого и нужен TCP — чтобы данные доходили в правильном виде//\\ А вот в видео или аудио небольшие потери некритичны, зато важна скорость передачи данных. Для таких задач как раз и придумали протокол UDP (user datagram protocol). Он уже не проверяет цельность битов, его задача — как можно быстрее передать данные с одного устройства на другое. В протоколе TCP данные делятся на сегменты. Каждый сегмент — часть пакета. Сегменты нужны, чтобы передавать информацию по сети, учитывая её пропускную способность. Например, если вы передаёте данные с компьютера, у которого пропускная способность 100 Мб/c, на смартфон с пропускной способность 10 Мб/c, то данные разделятся так, чтобы не застревать в самом медленном устройстве. {{ :networks:12582801092022_18ab4dc57bebc87c30567aad63e852bfb251ce4c.png?800x200 |}} //Вот так данные разделяются на несколько сегментов, чтобы протиснуться в сеть с пропускной способностью 10 Мб/с//\\ Ещё сегментация важна для надёжности. Один большой пакет может потеряться или направиться не тому адресату. А маленькие пакеты снижают риск подобных ошибок и даже позволяют проверять их количество. Если какой-то сегмент не получилось доставить, протокол TCP может запросить его у отправителя снова. Так обеспечивается надёжность. В UDP данные делятся на датаграммы — это примерно то же, что и пакет, только датаграммы автономны. Каждая датаграмма имеет всё необходимое, чтобы дойти до получателя. Поэтому они не зависят от сети и могут доставляться по разным маршрутам и в произвольном порядке. ===== 5-й уровень OSI — сеансовый(L5, session layer) ===== Начиная с этого уровня и выше, данные имеют уже нормальный вид — например, привычных нам JPEG- или MP3-файлов. Задача сети на этих уровнях — представить информацию в понятном для человека виде и сделать так, чтобы пользователь мог её как-то «потрогать». Сеансовый уровень управляет соединениями, или сессиями. Типичный пример — звонок по Skype или Zoom. Когда вы звоните другому человеку, между вашими компьютерами устанавливается соединение, по которому передаются аудио и видео. Если такое соединение разорвать, то и ваш звонок прервётся. На сеансовом уровне очень важно, чтобы соединение правильно установилось и поддерживалось. То есть механизмы протоколов должны проверить, что у обоих собеседников есть нужные кодеки и сигнал между устройствами присутствует. {{:networks:13014301092022_053cfc52935ba38c6fedfd3239b230f98e7b8adf.png |}} //Сеанс звонка в Zoom// ===== 6-й уровень OSI — уровень представления данных(L6, presentation layer) ===== На этом уровне происходит преобразование форматов данных — их кодирование и сжатие. Например, полученные данные могут превратиться в GIF- или MP4-файл. То же самое происходит и в обратном порядке: когда пользователь отправляет файл другому человеку, данные сначала конвертируются в биты и сжимаются, а потом уже передаются на транспортный уровень. Помимо кодировки и сжатия на уровне представления, данные могут шифроваться — если, конечно, это необходимо. {{ :networks:13022901092022_9327ebc7950d702bc4133e7409b3b67516550091.png |}} //Обычный процесс отправки данных с одного устройства на другое// ===== 7-й уровень OSI — прикладной(L7, application layer) ===== Последний уровень модели OSI — прикладной. На нём находятся сетевые службы, которые помогают без проблем сёрфить в интернете. Прикладной уровень похож на некий графический интерфейс для всей модели OSI — с его помощью пользователь взаимодействует с другими уровнями, даже не подозревая об этом. Этот интерфейс называется сетевым. Самые популярные из сетевых интерфейсов — это [[https://skillbox.ru/media/code/chto-takoe-http-i-zachem-on-nuzhen/|HTTP]], [[https://ru.wikipedia.org/wiki/HTTPS|HTTPS]], [[https://skillbox.ru/media/code/protokol-ftp-chto-eto-takoe-i-kak-s-nim-rabotat/|FTP]] и [[https://ru.wikipedia.org/wiki/SMTP|SMTP]]. А «устройства» здесь — это уже программы: Zoom, Telegram, браузеры. {{ :networks:13031501092022_499e8c6ac92470fb486f5a66acc9be417a487156.png |}} //Например, по HTTP браузеры запрашивают веб-страницы и получают в ответ HTML-страницы// ===== Как на практике работает сетевая модель OSI ===== В начале статьи мы задались вопросом: а как передаются сообщения в Telegram? Настало время на него ответить — и показать весь процесс передачи данных по модели OSI. Мы хотим отправить сообщение нашему другу. Печатаем текст и нажимает кнопку «Отправить», а дальше перемещаемся внутрь компьютера. **Прикладной уровень.** Приложение Telegram работает на прикладном уровне модели OSI. Когда мы печатаем текст сообщения и нажимаем кнопку «Отправить», эти данные передаются на сервер мессенджера, а оттуда — нашему другу. Весь процесс проходит через API разных библиотек — например, для HTTP-запросов. Интерфейсы позволяют без лишних проблем обмениваться данными и не погружаться в то, как они представлены на низком уровне. Всё, что нужно знать, — это какую функцию вызвать и какие переменные туда передать. **Уровень представления.** Здесь данные должны преобразоваться в унифицированный формат, чтобы их можно было передавать на разные устройства и операционные системы. Например, если мы отправляем сообщение c Windows на macOS, данные должны быть в читаемом для компьютеров Apple виде. Такая же ситуация и с другими устройствами. Раз мы собираемся передать данные на другой компьютер, их нужно перевести в бинарный формат. После этого начнётся сам процесс передачи по сети. **Сеансовый уровень.** Чтобы данные успешно передались сначала на сервер Telegram, а затем к нашему другу, приложению нужно установить соединение, или сеанс. Он обеспечивает синхронизацию между устройствами и восстанавливает связь, если она прервалась. Благодаря сеансам вы можете видеть, что собеседник что-то печатает или отправляет вам картинки или видео. Но главная задача этого соединения — обеспечить стабильное соединение для передачи данных. **Транспортный уровень.** Когда соединение установлено и данные унифицированы, пора передавать их. Этим занимается транспортный уровень. Здесь данные разбиваются на сегменты и к ним добавляется дополнительная информация — например, номер порта и контрольные суммы. Всё это нужно, чтобы данные дошли до пользователя в целостности. **Сетевой уровень.** Теперь данным нужно найти маршрут к устройству нашего друга, а затем отправить их по нему. Поэтому данные упаковываются в пакеты и к ним добавляются IP-адреса. Чтобы получить IP-адрес устройств, которым нужно отправить пакеты, маршрутизаторы (устройства сетевого уровня) обращаются к ARP. Этот протокол быстро найдёт адрес получателя и отдаст его нам. **Канальный уровень.** Здесь данные передаются от одного MAC-адреса к другому. Изначальный текст делится на фреймы — с заголовками и контрольными суммами для проверки целостности данных. **Физический уровень.** И на самом нижнем уровне данные в виде электрических сигналов передаются по проводам, кабелям или по радиоволнам. Тут только одна задача — как можно быстрее откликаться на сигналы свыше. После прохождения всех уровней модели OSI сообщение успешно доставляется на устройство нашего друга. Правда, в реальности это занимает всего миллисекунды.