~ubuntu-branches/ubuntu/quantal/gnash/quantal-proposed

« back to all changes in this revision

Viewing changes to doc/C/refmanual/rtmp.xml

  • Committer: Bazaar Package Importer
  • Author(s): Alexander Sack
  • Date: 2008-10-14 16:06:54 UTC
  • mfrom: (1.1.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20081014160654-0anbl2mi098aee2h
Tags: 0.8.4-0ubuntu1
* LP: #84526 - Gnash menu launcher (/usr/share/applications/gnash.desktop
  file) doesn't start any application, also gnash isn't asociated with SWF
  mimetype; we dont show gnash in the .desktop launcher; we add
  NoDisplay=true, add a GenericName and Comment for the sake of
  completeness. Also we add the proper MimeType value, remove Encoding,
  don't use absolute paths for icon and exec and dont use specific icon
  file format suffix.
  - update debian/gnash.desktop

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?xml version="1.0" encoding="utf-8"?>
2
 
<chapter id="rtmp">
3
 
  <title>RTMP Protocol</title>
4
 
  
5
 
  <para>
6
 
    This document is based mostly on my own reverse engineering of the
7
 
    RTMP protocol and AMF format. <emphasis>tcpdump</emphasis> and
8
 
    <emphasis>ethereal</emphasis> are your friend. Some additional info that got
9
 
    me started was from the <ulink  type="http"
10
 
        url="http://www.osflash.org/red5">Red5</ulink>
11
 
    project. <emphasis>Red5</emphasis> is the only other open source SWF
12
 
    server. So some details are still vague, but as the implementation
13
 
    appears to work, we'll figure out what they are later.
14
 
  </para>
15
 
 
16
 
  <para>
17
 
    The Real Time Messaging Protocol was created by MacroMedia (now
18
 
    Adobe) for delivering SWF objects and video over a network
19
 
    connection. Currently the only servers which support this format
20
 
    are the MacroMedia Media sever, and the Open Source Red5 project.
21
 
  </para>
22
 
 
23
 
  <para>
24
 
    This is a simple protocol, optimized for poor bandwidth
25
 
    connections. It can support up to 64 concurrent streams over the
26
 
    same network connection. Part of each AMF packet header contains
27
 
    the index number of the stream. A single RTMP message can contain
28
 
    multiple AMF packets.
29
 
  </para>
30
 
 
31
 
  <para>
32
 
    An RTMP connection uses Tcp/ip port 1935. It is also possible to
33
 
    tunnel RTMP over an HTTP connection using port 80. Each AMF packet
34
 
    is 128 bytes long except for streaming audio, which has 64 byte
35
 
    packets.
36
 
  </para>
37
 
 
38
 
  <para>
39
 
    The basics of the RTMP protocol are as follows. All communications
40
 
    are initiated by the client.
41
 
    <mediaobject>
42
 
      <imageobject>
43
 
        <imagedata align="center" fileref="images/rtmp.png"/>
44
 
      </imageobject>
45
 
    </mediaobject>
46
 
  </para>
47
 
 
48
 
  <para>
49
 
    The client starts the RTMP connection by sending a single byte
50
 
    with a value of 0x3. This byte is followed by a data block of 1536
51
 
    bytes. The format if this data block is unknown, but it appears to
52
 
    not be actually used by the protocol except as a handshake.
53
 
  </para>
54
 
 
55
 
  <para>
56
 
    The server receives this packet, stores the 1536 byte data block,
57
 
    and then send a single byte with the value of 0x3, followed by two
58
 
    1536 data blocks. The second data block is the full contents of
59
 
    the original data block as sent by the client.
60
 
  </para>
61
 
 
62
 
  <para>
63
 
    The client receives the 1536 byte data block, and if they match,
64
 
    the connection is established. After the handshake process is
65
 
    done, there are three other messages that the client sends to the
66
 
    sever to start the data flowing.
67
 
  </para>
68
 
 
69
 
  <para>
70
 
    The first AMF packet sent to the server contains the
71
 
    <emphasis>connect</emphasis> packet. This doesn't appear to do
72
 
    much but notify the server the client is happy with the
73
 
    handshake, and ready to start reading packets.
74
 
  </para>
75
 
 
76
 
  <para>
77
 
    The second packet is the <emphasis>NetConnection</emphasis> object from
78
 
    the client. This ActionScript class is used by the SWF movie to
79
 
    create the network connection to the server.
80
 
  </para>
81
 
 
82
 
  <para>
83
 
    The third packet is the <emphasis>NetStream</emphasis> object from the
84
 
    client. This is the ActionScript class used to specify the file to
85
 
    be streamed by the server.
86
 
  </para>
87
 
 
88
 
  <para>
89
 
    The RTMP packet for our example looks like this:
90
 
   
91
 
    <programlisting>
92
 
      030000190000c91400000000020007connect00?f0000000000000030003app0200#
93
 
      software/gnash/tests/1153948634.flv0008flashVer02000cLNX 6,0,82,0 0006
94
 
      swfUrl02001dfile:///file|%2Ftmp%2Fout.swfc30005tcUrl\002\0004
95
 
      rtmp://localhost/software/gnash/tests/1153948634.flv\000\000\t
96
 
      \002\000\005userx
97
 
    </programlisting>
98
 
    
99
 
    We'll take this apart in a bit, but you can see how all three AMF
100
 
    packets are in the same message. The message is received in
101
 
    several 128 byte blocks, with the last one being less than
102
 
    that. The total size of the RTMP message is in the header, so the
103
 
    reader can tell if the entire message was read or not.
104
 
  </para>
105
 
  
106
 
  <para>
107
 
    The RTMP header is first, followed by the connect message as an
108
 
    ASCII string as the message body. The following AMF packet is the
109
 
    <emphasis>NetConnection</emphasis> one, which specifies that this is coming
110
 
    from a SWF application. This also contains the file path the server
111
 
    can use to find the file to stream. This is then followed by the
112
 
    version number, which I assume is the version of the SWF player,
113
 
    so the server knows what it is talking to.
114
 
  </para>
115
 
 
116
 
  <para>
117
 
    The third packet is the one from <emphasis>NetStream</emphasis>, which
118
 
    specifies the URL used for the movie, followed by the user name
119
 
    for a semblance of security.
120
 
  </para>
121
 
 
122
 
  <para>
123
 
    For the next level of detail, we'll explain the format of AMF. AMF
124
 
    is used by the RTMP protocol to transfer data. Each SWF object
125
 
    is encapsulated in an AMF packet, including streaming audio or
126
 
    video.
127
 
  </para>
128
 
 
129
 
  <para>
130
 
    The first byte of the RTMP header determines two things about the
131
 
    rest of the message. The first 2 bits of this byte signify the
132
 
    total size of the RTMP header. The RTMP header is of a variable
133
 
    size, so this is important.
134
 
 
135
 
    <variablelist>
136
 
      <varlistentry>
137
 
        <term>00</term>
138
 
        <listitem>
139
 
          <para>
140
 
            This specifies the header contains 12 bytes, including
141
 
            this one.
142
 
          </para>
143
 
        </listitem>
144
 
      </varlistentry>
145
 
      <varlistentry>
146
 
        <term>01</term>
147
 
        <listitem>
148
 
          <para>
149
 
            This specifies the header contains 8 bytes, including this
150
 
            one.
151
 
          </para>
152
 
        </listitem>
153
 
      </varlistentry>
154
 
      <varlistentry>
155
 
        <term>02</term>
156
 
        <listitem>
157
 
          <para>
158
 
            This specifies the header contains 4 bytes, including this
159
 
            one.
160
 
          </para>
161
 
        </listitem>
162
 
      </varlistentry>
163
 
      <varlistentry>
164
 
        <term>03</term>
165
 
        <listitem>
166
 
          <para>
167
 
            This specifies the header contains 1 byte, so this is the
168
 
            complete header.
169
 
          </para>
170
 
        </listitem>
171
 
      </varlistentry>
172
 
    </variablelist>
173
 
  </para>
174
 
 
175
 
  <para>
176
 
    The other 6 bits in this byte represent the AMF index. As a single
177
 
    RTMP connection can support multiple data streams, this signifies
178
 
    which stream this packet is for. Once an AMF object is fully
179
 
    received by the client, the AMF index may be reused.
180
 
  </para>
181
 
 
182
 
  <para>
183
 
    For messages with headers of at least 4 bytes, the next 3 bytes are
184
 
    used by audio and video data packets, but at this time the meaning
185
 
    of this field is unknown.
186
 
  </para>
187
 
 
188
 
  <para>
189
 
    For messages with a 8 byte or larger header, the next 3 bytes
190
 
    determine the size of the RTMP message being transmitted. Messages
191
 
    with a 1 byte or 4 byte header use a standard size, 128 bytes for
192
 
    video, and 64 bytes for audio.
193
 
  </para>
194
 
 
195
 
  <para>
196
 
    For messages with an 8 byte or larger header, the next byte is the
197
 
    type of the AMF object.
198
 
    
199
 
    <variablelist>
200
 
      <varlistentry>
201
 
        <term>0x3</term>
202
 
        <listitem>
203
 
          <para>
204
 
            This specifies the content type of the RTMP packet is the
205
 
            number of bytes read. This is used to start the RTMP
206
 
            connection.
207
 
          </para>
208
 
        </listitem>
209
 
      </varlistentry> 
210
 
      <varlistentry>
211
 
        <term>0x4</term>
212
 
        <listitem>
213
 
          <para>
214
 
            This specifies the content type of the RTMP message is a
215
 
            <emphasis>ping</emphasis> packet.
216
 
          </para>
217
 
        </listitem>
218
 
      </varlistentry> 
219
 
      <varlistentry>
220
 
        <term>0x5</term>
221
 
        <listitem>
222
 
          <para>
223
 
            This specifies the content type of the RTMP message is
224
 
            server response of some type.
225
 
          </para>
226
 
        </listitem>
227
 
      </varlistentry> 
228
 
      <varlistentry>
229
 
        <term>0x6</term>
230
 
        <listitem>
231
 
          <para>
232
 
            This specifies the content type of the RTMP packet is
233
 
            client request of some type.
234
 
          </para>
235
 
        </listitem>
236
 
      </varlistentry> 
237
 
      <varlistentry>
238
 
        <term>0x8</term>
239
 
        <listitem>
240
 
          <para>
241
 
            This specifies the content type of the RTMP packet is an
242
 
            audio message.
243
 
          </para>
244
 
        </listitem>
245
 
      </varlistentry> 
246
 
      <varlistentry>
247
 
        <term>0x9</term>
248
 
        <listitem>
249
 
          <para>
250
 
            This specifies the content type of the RTMP message is a
251
 
            video packet.
252
 
          </para>
253
 
        </listitem>
254
 
      </varlistentry> 
255
 
      <varlistentry>
256
 
        <term>0x12</term>
257
 
        <listitem>
258
 
          <para>
259
 
            This specifies the content type of the RTMP message is
260
 
            notify. 
261
 
          </para>
262
 
        </listitem>
263
 
      </varlistentry> 
264
 
      <varlistentry>
265
 
        <term>0x13</term>
266
 
        <listitem>
267
 
          <para>
268
 
            This specifies the content type of the RTMP message is
269
 
            shared object.
270
 
          </para>
271
 
        </listitem>
272
 
      </varlistentry> 
273
 
      <varlistentry>
274
 
        <term>0x14</term>
275
 
        <listitem>
276
 
          <para>
277
 
            This specifies the content type of the RTMP message is
278
 
            remote procedure call. This invokes the method of a SWF
279
 
            class remotely.
280
 
          </para>
281
 
        </listitem>
282
 
      </varlistentry> 
283
 
    </variablelist>     
284
 
  
285
 
  </para>
286
 
 
287
 
  <para>
288
 
    There are two sets of data types to consider. One set is used by
289
 
    the to specify the content type of the AMF object, the other is an
290
 
    ActionScript data type tag used to denote which type of object is
291
 
    being transferred.
292
 
  </para>
293
 
  
294
 
  <para>
295
 
    The values of the initial type byte are:
296
 
    <variablelist>
297
 
 
298
 
      <varlistentry>
299
 
        <term>0x0</term>
300
 
        <listitem>
301
 
          <para>
302
 
            This specifies the data in the AMF packet is a numeric
303
 
            value. All numeric values in SWF are 64 bit,
304
 
            <emphasis>big-endian</emphasis>.
305
 
          </para>
306
 
        </listitem>
307
 
      </varlistentry>
308
 
 
309
 
      <varlistentry>
310
 
        <term>0x1</term>
311
 
        <listitem>
312
 
          <para>
313
 
            This specifies the data in the AMF packet is a boolean
314
 
            value.
315
 
          </para>
316
 
        </listitem>
317
 
      </varlistentry>
318
 
 
319
 
      <varlistentry>
320
 
        <term>0x2</term>
321
 
        <listitem>
322
 
          <para>
323
 
            This specifies the data in the AMF packet is an
324
 
            <emphasis>ASCII</emphasis> string. 
325
 
          </para>
326
 
        </listitem>
327
 
      </varlistentry>
328
 
 
329
 
      <varlistentry>
330
 
        <term>0x3</term>
331
 
        <listitem>
332
 
          <para>
333
 
            This specifies the data in the AMF packet is a SWF
334
 
            object. The SWF object data type field further along in
335
 
            the message specifies which type of ActionScript object it
336
 
            is.
337
 
          </para>
338
 
        </listitem>
339
 
      </varlistentry>
340
 
 
341
 
      <varlistentry>
342
 
        <term>0x4</term>
343
 
        <listitem>
344
 
          <para>
345
 
            This specifies the data in the AMF packet is a SWF
346
 
            movie, ie. another SWF movie.
347
 
          </para>
348
 
        </listitem>
349
 
      </varlistentry>
350
 
 
351
 
      <varlistentry>
352
 
        <term>0x5</term>
353
 
        <listitem>
354
 
          <para>
355
 
            This specifies the data in the AMF packet is a NULL
356
 
            value. NULL is often used as the return code from calling
357
 
            SWF functions.
358
 
          </para>
359
 
        </listitem>
360
 
      </varlistentry>
361
 
 
362
 
      <varlistentry>
363
 
        <term>0x6</term>
364
 
        <listitem>
365
 
          <para>
366
 
            This specifies the data in the AMF packet is a
367
 
            undefined. This is also used as the return code from
368
 
            calling SWF functions.
369
 
          </para>
370
 
        </listitem>
371
 
      </varlistentry>
372
 
 
373
 
      <varlistentry>
374
 
        <term>0x7</term>
375
 
        <listitem>
376
 
          <para>
377
 
            This specifies the data in the AMF packet is a reference.
378
 
          </para>
379
 
        </listitem>
380
 
      </varlistentry>
381
 
 
382
 
      <varlistentry>
383
 
        <term>0x8</term>
384
 
        <listitem>
385
 
          <para>
386
 
            This specifies the data in the AMF packet is a ECMA
387
 
            array.
388
 
          </para>
389
 
        </listitem>
390
 
      </varlistentry>
391
 
 
392
 
      <varlistentry>
393
 
        <term>0x9</term>
394
 
        <listitem>
395
 
          <para>
396
 
            This specifies the data in the AMF packet is the end of an
397
 
            object definition. As an object is transmitted with
398
 
            multiple AMF packets, this lets the server know when the
399
 
            end of the object is reached.
400
 
          </para>
401
 
        </listitem>
402
 
      </varlistentry>
403
 
 
404
 
 
405
 
      <varlistentry>
406
 
        <term>0xa</term>
407
 
        <listitem>
408
 
          <para>
409
 
            This specifies the data in the AMF packet is a Strict
410
 
            array.
411
 
          </para>
412
 
        </listitem>
413
 
      </varlistentry>
414
 
 
415
 
      <varlistentry>
416
 
        <term>0xb</term>
417
 
        <listitem>
418
 
          <para>
419
 
            This specifies the data in the AMF packet is a date.
420
 
          </para>
421
 
        </listitem>
422
 
      </varlistentry>
423
 
 
424
 
      <varlistentry>
425
 
        <term>0xc</term>
426
 
        <listitem>
427
 
          <para>
428
 
            This specifies the data in the AMF packet is a multi-byte
429
 
            string. Multi-byte strings are used for international
430
 
            language support to represent non <emphasis>ASCII</emphasis>
431
 
            fonts.
432
 
          </para>
433
 
        </listitem>
434
 
      </varlistentry>
435
 
 
436
 
      <varlistentry>
437
 
        <term>0xd</term>
438
 
        <listitem>
439
 
          <para>
440
 
            This specifies the data in the AMF packet is a an
441
 
            unsupported feature.
442
 
          </para>
443
 
        </listitem>
444
 
      </varlistentry>
445
 
 
446
 
      <varlistentry>
447
 
        <term>0xe</term>
448
 
        <listitem>
449
 
          <para>
450
 
            This specifies the data in the AMF packet is a record
451
 
            set.
452
 
          </para>
453
 
        </listitem>
454
 
      </varlistentry>
455
 
 
456
 
      <varlistentry>
457
 
        <term>0xf</term>
458
 
        <listitem>
459
 
          <para>
460
 
            This specifies the data in the AMF packet is a AML
461
 
            object. XML objects are then parsed by the
462
 
            <emphasis>XML</emphasis> ActionScript class.
463
 
          </para>
464
 
        </listitem>
465
 
      </varlistentry>
466
 
 
467
 
      <varlistentry>
468
 
        <term>0x10</term>
469
 
        <listitem>
470
 
          <para>
471
 
            This specifies the data in the AMF packet is a typed object.
472
 
          </para>
473
 
        </listitem>
474
 
      </varlistentry>
475
 
 
476
 
    </variablelist>
477
 
    
478
 
  </para>
479
 
 
480
 
  <para>
481
 
    For messages with a 12 byte header, the last 4 bytes are the
482
 
    routing of the message. If the destination is the server, this
483
 
    value is the NetStream object source. If the destination is the
484
 
    client, this is the NetStream object for this RTMP message. A
485
 
    value of 0x00000000 appears to be reserved for the NetConnection
486
 
    object. 
487
 
  </para>
488
 
 
489
 
  <para>
490
 
    Multiple AMF streams can be contained in a single RTMP messages,
491
 
    so it's important to check the index of each AMF packet.
492
 
  </para>
493
 
 
494
 
  <para>
495
 
    An example RTMP header might look like this. (spaces added between
496
 
    fields for clarity) All the numbers are in hex.
497
 
 
498
 
    <screen>
499
 
      03 000019 0000c9 14 000000000
500
 
    </screen>
501
 
    
502
 
    <variablelist>
503
 
      <varlistentry>
504
 
        <term>03</term>
505
 
        <listitem>
506
 
          <para>
507
 
            The first two bits of this byte are the size of the
508
 
            header, which in this example is 00, for a 12 byte
509
 
            header. The next 6 bits is the AMF stream index number,
510
 
            which in this example is 0x3.
511
 
          </para>
512
 
        </listitem>
513
 
      </varlistentry>
514
 
 
515
 
      <varlistentry>
516
 
        <term>000019</term>
517
 
        <listitem>
518
 
          <para>
519
 
            These 3 bytes currently have an unknown purpose.
520
 
          </para>
521
 
        </listitem>
522
 
      </varlistentry>
523
 
 
524
 
      <varlistentry>
525
 
        <term>000c9</term>
526
 
        <listitem>
527
 
          <para>
528
 
            Since this example has a 12 byte header, this is the size
529
 
            of the RTMP message, in this case 201 bytes.
530
 
          </para>
531
 
        </listitem>
532
 
      </varlistentry>
533
 
 
534
 
      <varlistentry>
535
 
        <term>14</term>
536
 
        <listitem>
537
 
          <para>
538
 
            This is the content type of the RTMP message, which in
539
 
            this case is to invoke a remote function call. (which we
540
 
            later see is the connect function).
541
 
          </para>
542
 
        </listitem>
543
 
      </varlistentry>
544
 
 
545
 
      <varlistentry>
546
 
        <term>00000000</term>
547
 
        <listitem>
548
 
          <para>
549
 
            The source is the NetConnection object used to start this
550
 
            connection.
551
 
          </para>
552
 
        </listitem>
553
 
      </varlistentry>
554
 
    </variablelist>
555
 
 
556
 
  </para>
557
 
 
558
 
  &amf;
559
 
 
560
 
</chapter>
561