Транспортный уровень OSI
Транспортный уровень модели OSI (равно как и стека протоколов TCP/IP) обеспечивает следующие возможности:
- Отслеживание индивидуальных сеансов общения между приложениями на передающем и принимающем устройствах.
- Сегментация данных (разбиение больших порций данных на сегменты для индивидуальной отсылки по сети, сборка этих сегментов после получения).
- Идентификация приложений, передающих и принимающих данные.
Прежде чем приступить к обсуждению транспортного уровня, следует вспомнить, какую роль в иерархической модели он занимает:
Данные порождаются на уровне приложений конкретной пользовательской программой и передаются на транспортный уровень. Программа, как правило, знает ip адрес (или доменное имя) целевого устройства и предполагает, что на том конце должно быть запущено приложение, поддерживающее тот же самый протокол уровня приложений, что и на передающем устройстве. Все нюансы передачи в идеале должны быть сокрыты от разработчика, чтобы программист не занимался такими делами, как поиск маршрута к целевому устройству, надёжность доставки, установка соединений и т.п. Транспортный уровень — это первый уровень, который встречает данные приложения и начинает процедуру по их подготовке к передаче.
На транспортном уровне функционируют как правило два протокола: TCP и UDP. Об этих протоколах детально можно почитать в отдельных статьях, в данной же статье обсуждаются общие принципы транспортного уровня и краткие характеристики этих протоколов.
Сегментация
Первая задача, которую решают оба этих протокола — сегментация данных. Когда программист пишет очередную программу, или разрабатывает новый протокол уровня приложений, он передаёт данные теми порциями, которыми ему удобно. Например, пользователь запрашивает по протоколу FTP файл размером 10 МБ, FTP сервер начинает отправку файла. При этом у сети есть ряд ограничений на объём передаваемой информации. Наиболее важное из них — это MTU (Maximum transmission unit) — характеристика уровня Data Link, означающая максимальный размер фрейма, который можно передать по сети. Естественно, что 10 мегабайтный файл не получится передать одним куском, нужно разбиение его на отдельные сегменты. Так же естественно, что программист не захочет заниматься такой типовой задачей, так как она не связана напрямую с логикой работы самого приложения. Вот тут к нам на помощи и приходит транспортный уровень.
- Он берёт кусок данных с уровня приложений (в нашем примере те самые 10 мегабайт), разбивает его на сегменты подходящего для передачи размера,
- К каждому может добавить информацию о порядковом номере сегмента для сборки в дальнейшем (если это протокол TCP)
- Добавляет к каждому сегменту отдельный заголовок транспортного уровня
- Передаёт сегмент ниже на сетевой уровень, где каждый сегмент обрабатывается индивидуально и запаковывается, например, в отдельный IP пакет.
Идентификация приложений
Вторая важнейшая задача, лежащая на протоколах транспортного уровня — адресация индивидуальных приложений в масштабах передающего или принимающего устройств. Например, на одном сервере может работать несколько сетевых приложений: веб сервер, почтовый сервер, ssh сервер и т.п. Аналогично, пользователь может запустить на своём компьютере одновременно браузер, почтовую программу, skype и т.п. — задача транспортного уровня, передать полученную узлом информацию нужному приложению на этом узле. То есть, сетевой уровень нужен для того чтобы информация достигла узла, а транспортный — для того чтобы информация попала нужному приложению в пределах этого узла. Для такой идентификации приложений транспортерные протоколы (как TCP, так и UDP) используют номера портов: каждое приложение, желающее работать с сетью сообщает операционной системе о своих планах и регистрирует за собой какой-то номер порта. В последствии, когда на компьютер придут данные, транспортный уровень заглянет в поле «номер порта получателя» и передаст эти данные соответствующему приложению.
Порт — это числовая величина в пределах от 0 до 65535, условно диапазоны портов делятся на три категории:
- Хорошо известные порты (well-known ports) — c 0 по 1023 — эти порты резервируются для самых популярных протоколов и приложений, которые исторически заняли свою нишу. Например, любой веб сервер обычно работает на 80-м порту, почтовый протокол SMTP использует 25 порт, SSH — 22-ой.
- Зарегистрированные порты (registered ports) — с 1024 по 49151 — эти порты могут использоваться менее популярными приложениями, например, сетевыми играми, или более «молодыми» средствами связи, например, Skype. Тем не менее, и в этом блоке есть множество портов, которые можно назвать известными. Например, порт 8080 часто используется как альтернатива порту 80 для HTTP сервера.
- Динамические или частные порты (dynamic or private ports) — с 49152 по 65535 — так же могут использоваться малоизвестными приложениями, но основное их использование — в качестве порта для клиентских программ. Например, когда вы обращаетесь к веб-серверу, ваш браузер выступает в качестве клиента. При этом на сервере вы будете обращаться к 80-му порту, а данные, приходящие в ответ вашему браузеру идут с 80-го порта на какой-то порт из этого диапазона, который динамически назначился вашему браузеру операционной системой.
На самом деле, разделение портов на диапазоны весьма условно, но уважающий себя администратор должен знать наиболее известные номера портов из диапазона с 0 по 1023. Обратите внимание, порты существуют и в TCP и в UDP, в каждом из этих диапазонов каждый порт может использоваться обоими протоколами независимо друг от друга.
Отслеживание индивидуальных сеансов общения между приложениями (сессии)
Эта функция относится только к протоколу TCP. Перед началом передачи полезных данных узел, инициирующий соединение открывает сессию с узлом получателем, чтобы убедиться, что получатель существует и готов принимать данные. Далее все полезные данные передаются в рамках установленной сессии (соединения) и после завершения такой передачи сессия закрывается.
TCP и UDP
Итак, мы подошли к обсуждению двух основных протоколов, работающих на транспортном уровне.
TCP (Transmission control protocol) — протокол, транспортного уровня, обеспечивающий надёжную доставку данных. Основные характеристики TCP:
- Установка соединения (сессии)
- Надёжная доставка (автоматическая пересылка потерявшихся сегментов)
- Доставка сегментов и сборка их в том же порядке, в каком происходило сегментирование (так как разные сегменты запаковываются в индивидуальные пакеты, которые теоретически могли идти по сети разными маршрутами, в итоге сегменты могут прийти не в том порядке, в котором отправлялись. В этом случае TCP, тем не менее, соберёт их в правильном порядке).
- Контроль потока (TCP может уменьшать скорость передачи информации в случае, если получатель не справляется с приёмом по причине ограниченности ресурсов).
Все эти характеристики позволяют снять множество задач с программиста, разрабатывающего протокол уровня приложений: ему не надо заботиться о надёжной доставке, о порядке обработки сегментов, об установке соединений. Тем не менее, благодаря этим функциям, TCP замедляет передачу сообщения. Это происходит по нескольким причинам: во-первых, узел получателя будет ждать, когда придут все отправленные сегменты, до того, как передать их приложению, во-вторых, сами сегменты содержат множество служебной информации, для того, чтобы обеспечить весь этот богатый функционал. Часто приложению нужна просто быстрая доставка и нет никаких требований по надёжности. Тут на помощь приходит протокол UDP. Его особенности — противоположность особенностям TCP. UDP отличается:
- Отсутствием сессий.
- Ненадёжной доставкой.
- Отсутствием упорядочивания сегментов
- Отсутствием контроля за скоростью передачи
- Максимально возможной скоростью передачи данных за счёт всего вышеперечисленного.
UDP используется там, где важна скорость. Давайте рассмотрим два примера:
- Человек загружает страничку, или, что более интересно, архив файла с сайта. Если потеряется хоть один сегмент, то скачивание архива не имеет смысла, так как он не распакуется. Точно так же, HTML вёрстка страницы не будет иметь никакого смысла, если из середины убрать некоторый кусок текста. В этом случае конечно используется TCP
- Человек разговаривает по IP-телефону. Каждый кусок речевой информации должен приходить ровно в то время, когда его ожидают услышать (то есть между предыдущим и последующим), тут важно взаимодействие именно в реальном времени. Если какой-то кусок не дошёл, то проще просто игнорировать этот факт, чем ждать, когда его перешлют, так как в любом случае, когда он пришёл бы повторно, он был бы уже не нужен. В этой ситуации используется UDP.
Каждый протокол уровня приложений подразумевает использование определённого протокола транспортного уровня. Например, HTTP, SMTP, Telnet, SSH всегда работают по TCP. Radius, TFTP, RIP — всегда работают по UDP. Есть некоторые протоколы, которые в зависимости от ситуации могут работать как по TCP, так и по UDP. Например отправлять некоторую срочную информацию по UDP, а периодические важные обновления — по TCP.
Итоги
На транспортном уровне используются в основном два протокола: TCP и UDP. Оба этих протокола умеют:
- Разбивать данные на сегменты
- Идентифицировать передающее и принимающее приложения при помощи портов
Помимо этого, TCP умеет:
- Работать с сессией.
- Обеспечивать надёжную доставку.
- Делать упорядочивание и сборку сегментов при получении.
- Управлять скоростью передачи данных
Комментарии
Алексей Марченко (не проверено)
ср, 05/11/2016 - 11:40
Постоянная ссылка (Permalink)
"Арестовывать передающее и принимающее приложения при помощи портов"?
Наверное, идентифицировать?
bacek
пн, 05/16/2016 - 08:41
Постоянная ссылка (Permalink)
student (не проверено)
пн, 12/23/2019 - 13:57
Постоянная ссылка (Permalink)
Огромное спасибо! Ваша статья на вес золота, доходчиво и понятно!
Добавить комментарий