Говоря о протоколе RTMP, я считаю, что многие люди относительно незнакомы.По сравнению с распространенными протоколами, такими как HTTP, HTTPS и TCP, мы не имеем большого контакта с ним в нашей работе, но для индустрии прямых трансляций RTMP является важным 1. Он широко используется в аудио- и видеосценариях в реальном времени и в настоящее время занимает большую долю рынка.
Основное содержание этой статьи состоит в анализе протокола RTMP.Конечно, это не чисто теоретический анализ.Это не очень интересно.Все же необходимо анализировать фактические файлы перехвата пакетов в сочетании с фактическим анализом, так как чтобы лучше понять значение RTMP. Подробнее о том, как перехватывать пакеты, см. в модуле «Захват Android» в конце этой статьи. Я надеюсь, что, прочитав эту главу, вы также сможете просто управлять ею самостоятельно, так что вы сможете глубоко ее понять.
Содержание исходного соглашения слишком длинное, вы можете посмотреть, если вам интересноWoohoo.Adobe.com/Dev net/like tmp…
Введение в основы RTMP
Основные возможности протокола RTMP:
- Протокол RTMP — это протокол прикладного уровня, который зависит от базового надежного транспортного уровня (TCP).
- протокол (обычно TCP) для обеспечения надежности передачи информации. После того, как соединение на основе протокола транспортного уровня установлено, протокол RTMP также требует, чтобы клиент и сервер «рукопожали», чтобы установить соединение RTMP Connection на основе соединения транспортного уровня. Для воспроизведения потока протокола RTMP необходимо выполнить следующие шаги: рукопожатие, установка сетевого соединения, установка сетевого потока и воспроизведение. Между сервером и клиентом может быть установлено только одно сетевое соединение, но на основе этого соединения может быть создано множество сетевых потоков.
Здесь небольшой вопрос? Почему транспортный уровень установил TCP-соединение, а RTMP нужно снова установить соединение, нужно ли это?
- Когда передается протокол RTMP, данные будут отформатированы сами по себе.Сообщение в этом формате называется сообщением RTMP.При фактической передаче, чтобы лучше реализовать справедливость мультиплексирования, пакетирования и информации, отправитель Сообщение делится на фрагменты с идентификаторами сообщений. Каждый фрагмент может быть отдельным сообщением или частью сообщения. На принимающей стороне фрагмент будет разделен в соответствии с длиной данных, содержащихся в фрагменте, длиной идентификатора сообщения и сообщения. , Он восстанавливается до полного сообщения, чтобы реализовать отправку и получение информации.
RTMP-рукопожатие
RTMP основан на TCP.Известно, что TCP требует рукопожатий 3 для установления соединения.После того, как рукопожатия TCP 3 успешны, RTMP на прикладном уровне также требует рукопожатий, что является процессом аутентификации. Конкретный процесс сертификации выглядит следующим образом:
- Клиент отправляет C0, C1, C2, а сервер отправляет S0, S1, S2.
- Сначала клиент отправляет C0, чтобы указать номер своей версии, не дожидаясь ответа другой стороны, а затем отправляет C1, чтобы указать свою временную метку.
- Сервер может вернуть S0 только тогда, когда он получит C0, указав свой номер версии.Если версия не совпадает, он может отключиться.
- После того, как сервер отправляет S0, ему не нужно ждать, он отправляет свою собственную временную метку S1 напрямую. Когда клиент получает S1, он отправляет ACK C2, который знает отметку времени другой стороны. Точно так же, когда сервер получает C1, он отправляет ACK S2, который знает временную метку другой стороны.
- Рукопожатие установлено.
Теперь, чтобы ответить на вопрос, поставленный выше, почему RTMP также должен устанавливать отдельное соединение?
Потому что им нужно договориться о некоторых вещах, чтобы гарантировать, что будущие передачи могут проходить нормально. В основном есть две вещи, одна из них — номер версии, если номера версий клиента и сервера несовместимы, это не сработает. Другой — временная метка. При воспроизведении видео время очень важно. Когда передаются последующие потоки данных, часто включается разница между временными метками. Поэтому обе стороны должны знать временные метки друг друга с самого начала.
О чистой теории говорить скучно, давайте возьмем упаковку и посмотрим конкретный процесс.
1. Первое трехстороннее рукопожатие TCP2. Процесс рукопожатия RTMPМы обнаружили, что настоящий пакет отправляется вместе с C0+C1, S0, S1 и S2 отправляются вместе. Однако при отправке он по-прежнему будет строго контролироваться по времени, чтобы можно было действительно проверить такие поля, как номер версии.
Вытяните поток
Основной процесс потоковой передачи RTMP выглядит следующим образом:
1. Установите сетевое соединение
Клиент отправляет «подключиться» в командном сообщении на сервер, запрашивая установление соединения с экземпляром приложения-службы.
StreamID — это уникальный идентификатор каждого сообщения. При разделении на фрагменты и восстановлении фрагментов в сообщения он основан на этом идентификаторе, чтобы определить, является ли он фрагментом того же сообщения. Значение 0 здесь указывает, что сообщение является начальным 0 сообщение.
Идентификатор потока фрагментов: сообщение RTMP будет разделено на несколько фрагментов, и один и тот же идентификатор потока фрагментов должен принадлежать одному и тому же сообщению. Таким образом, фрагменты, отправленные в процессе передачи, наконец, успешно собираются с помощью идентификатора потока фрагментов моих завершенных данных сообщения.
идентификатор типа сообщения (идентификатор типа сообщения): указывает тип фактически отправленных данных, например, 8 для аудиоданных и 9 для видеоданных. Как показано на двух рисунках ниже, это кажется более простым для понимания.Формат: относится к типу фрагмента. Существует 4 различных формата, из которых первое поле формата равно 0, что может представлять все данные, представленные тремя другими, но поскольку остальные три формата основаны на дифференциально-квантованном представлении предыдущего фрагмента, они могут представлять те же самые данные. более кратко. Данные одного и того же значения должны быть представлены как можно меньшим числом байтов при фактическом использовании. Поскольку тип 0 представляет разные данные, а остальные являются различиями, вполне возможно, что если пакеты типа 0 не могут быть найдены, это означает, что с этим потоком должна быть проблема. Можно фильтровать по "rtmpt.header.format == 0".
2. Создайте сетевой поток
Сетевой поток представляет собой канал, по которому отправляются мультимедийные данные. Между сервером и клиентом может быть установлено только одно сетевое соединение, и несколько сетевых потоков могут повторно использовать это сетевое соединение. Об этом неоднократно говорилось выше.
Клиент запрашивает у сервера создание потока:После того, как сервер получает запрос, он отправляет _result() клиенту, чтобы ответить на сообщение о создании потока. На этом этапе создается NetStream.
3.Играть
Клиент отправляет команду «играть» в командном сообщении на сервер.После получения команды воспроизведения сервер отправляет протокольное сообщение о заданном размере фрагмента (ChunkSize). Сервер отправляет «streambegin» в управляющем сообщении пользователя, чтобы сообщить клиенту идентификатор потока.Если команда воспроизведения выполнена успешно, сервер отправляет «состояние ответа» NetStream.Play.Start в командном сообщении, чтобы сообщить клиенту, что команда «воспроизведения» была выполнена успешно.Мы обнаружили, что были выполнены 3 действия, а именно:Поделитесь идентификатором потока, и после того, как сообщение можно будет воспроизвести, основные свойства видео будут проанализированы.
push поток
Разобрав все операции подтягивания потока, просветление и проталкивание потока аналогичны, разница в Play ---> Publishing.
Захват Android
- Войдите на сайт:Woohoo. Android tcpdump.com/Android-TCP…инструмент tcpdump, последняя версия сейчас 4.9.3
- Найдите рутированный телефон, сначала поместите загруженный файл tcpdump в /sdcard/, adb push tcpdump /sdcard/tcpdump
- adb shell войдите в режим adb мобильного телефона, cp -rf /sdcard/tcpdump /data/local/, скопируйте tcpdump в каталог /data/local/
- chmod 777 /data/tcpdump, дать разрешение на полное выполнение tcpdump
- ./data/local/tcpdump -i any -p -s 0 -w /sdcard/capture.pcap
- Затем запустите запрос на доступ к rtmp, после завершения доступа в каталоге /sdcard/ будет сгенерирован файл capture.pcap.
- adb pull /sdcard/capture.pcap , используйте wireshare для локального анализа файла Capture.pcap
- Тестовый источник rtmp предоставляет один: rtmp://58.200.131.2:1935/livetv/hunantv.