
602 Глава 6. Транспортный уровень
заглушка создаст указатель на полученную переменную k и передаст его сервер-
ной процедуре. Именно этого та и ожидала. Когда серверная процедура возвра-
щает управление серверной заглушке, последняя отправляет k обратно клиенту,
где обновленное значение этой переменной записывается вместо старого (если
оно было изменено сервером). В принципе, стандартная последовательность дей-
ствий, выполняемая при вызове по ссылке, заменилась последовательностью ко-
пирования и восстановления. Увы, этот трюк не всегда удается применить — в
частности, нельзя это сделать, если указатель ссылается на граф или иную слож-
ную структуру данных. По этой причине на параметры удаленно вызываемых
процедур должны быть наложены определенные ограничения.
Вторая проблема заключается в том, что в языках со слабой типизацией дан-
ных (например, в С) можно совершенно законно написать процедуру, которая
подсчитывает скалярное произведение двух векторов (массивов), не указывая их
размеры. Каждая из этих структур в качестве ограничителя имеет какое-то зна-
чение, известное только вызывающей и вызываемой процедурам. При этих об-
стоятельствах клиентская заглушка не способна маршализовать параметры: нет
никакой возможности определить их размеры.
Третья проблема заключается в том, что не всегда можно распознать типы па-
раметров по спецификации или по самому коду. В качестве примера можно при-
вести процедуру printf, у которой может быть любое число параметров (не меньше
одного), и они могут представлять собой смесь целочисленных, коротких веще-
ственных, длинных вещественных, символьных, строковых, вещественных с пла-
вающей запятой различной длины и других типов. Задача удаленного вызова
процедуры printf может оказаться практически невыполнимой из-за такой свое-
образной толерантности языка С. Тем не менее, нет правила, говорящего, что
удаленный вызов процедур возможен только в том случае, если используется не
С (C++), — это подорвало бы репутацию метода RPC.
Четвертая проблема связана с применением глобальных переменных. В нор-
мальной ситуации вызывающая и вызываемая процедуры могут общаться друг
с другом посредством глобальных переменных (кроме общения с помощью па-
раметров). Если вызываемая процедура переедет на удаленную машину, про-
грамма, использующая глобальные переменные, не сможет работать, потому что
глобальные переменные больше не смогут служить в качестве разделяемого ре-
сурса.
Эти проблемы не означают, что метод удаленного вызова процедур безнаде-
жен. На самом деле, он широко используется, просто нужны некоторые ограни-
чения для его нормальной практической работы.
Конечно, RPC не нуждается в UDP-пакетах, однако они хорошо подходят
друг для друга, и UDP обычно используется совместно с RPC. Тем не менее, ко-
гда параметры или результаты оказываются больше максимальных размеров
UDP-пакетов или запрашиваемая операция не идемпотентна (то есть не может
повторяться без риска сбоя — например, операция инкрементирования счетчи-
ка), может понадобиться установка TCP-соединения и отправки запроса по TCP,
а не по UDP.
Транспортные протоколы Интернета: UDP 603
Транспортный протокол реального
масштаба времени
Клиент-серверный удаленный вызов процедур — это та область, в которой UDP
применяется очень широко. Еще одной такой областью являются мультимедий-
ные приложения реального времени. В частности, с ростом популярности интер-
нет-радио, интернет-телефонии, музыки и видео по заказу, видеоконференций и
других мультимедийных приложений стало понятно, что все они пытаются зано-
во изобрести велосипед, используя более или менее одинаковые транспортные
протоколы реального времени. Вскоре пришли к мысли о том, что было бы здоро-
во иметь один общий транспортный протокол для мультимедийных приложений.
Так появился на свет протокол RTP (Real-Time Transport Protocol — транспорт-
ный протокол реального масштаба времени). Он описан в RFC 1889 и ныне ши-
роко используется.
RTP занимает довольно странное положение в стеке протоколов. Было реше-
но, что RTP будет принадлежать пользовательскому пространству и работать
(в обычной ситуации) поверх UDP. Делается это так. Мультимедийное прило-
жение может состоять из нескольких аудио-, видео-, текстовых и некоторых дру-
гих потоков. Они прописываются в библиотеке RTP, которая, как и само прило-
жение, находится в пользовательском пространстве. Библиотека уплотняет потоки
и помещает их в пакеты RTP, которые, в свою очередь, отправляются в сокет. На
другом конце сокета (в ядре операционной системы) генерируются UDP-паке-
ты, которые внедряются в IP-пакеты. Теперь остается передать IP-пакеты по се-
ти. Если компьютер подключен к локальной сети Ethernet, IP-пакеты для пере-
дачи разбиваются на кадры Ethernet. Стек протоколов для описанной ситуации
показан на рис. 6.20, а. Система вложенных пакетов показана на рис. 6.20, б.
В результате оказывается непросто определить, к какому уровню относится
RTP. Так как протокол работает в пользовательском пространстве и связан с при-
кладной программой, он, несомненно, выглядит, как прикладной протокол. С дру-
гой стороны, он является общим, независимым от приложения протоколом, ко-
торый просто предоставляет транспортные услуги, не более. С этой точки зрения
он может показаться транспортным протоколом. Наверное, лучше всего будет
определить его таким образом: RTP — это транспортный протокол, реализован-
ный на прикладном уровне.
Основной функцией RTP является уплотнение нескольких потоков реально-
го масштаба времени в единый поток пакетов UDP. Поток UDP можно направ-
лять либо по одному, либо сразу по нескольким адресам. Поскольку RTP ис-
пользует обычный UDP, его пакеты не обрабатываются маршрутизаторами
каким-либо особым образом, если только не включены свойства доставки с каче-
ством обслуживания уровня IP. В частности, нет никаких гарантий касательно
доставки, дрожания (неустойчивой синхронизации) и т. д.
Каждый пакет, посылаемый с потоком RTP, имеет номер, на единицу превы-
шающий номер своего предшественника. Такой способ нумерации позволяет
получателю определить пропажу пакетов. Если обнаруживается исчезновение
какого-либо пакета, то лучшее, что может сделать получатель, — это путем ин-