zoukankan      html  css  js  c++  java
  • RTP/RTCP/RTSP协议分析(3)

    RTSP的消息有两大类,一是请求消息(request),一是回应消息(response),两种消息的格式不同;

    请求消息:

        方法 URI RTSP版本 CR LF
        消息头 CR LF
        CR LF
        消息体 CR LF

    其中方法包括OPTION回应中所有的命令;

    URI是接受方的地址,例如:rtsp://192.168.1.100;

    RTSP版本一般都是 RTSP/1.0;

    每行后面的CR LF表示回车换行,需要接受端有相应的解析,最后一个消息头需要有两个CR LF;

    回应消息:  

        RTSP版本 状态码 解释 CR LF
        消息头 CR LF
        CR LF
        消息体 CR LF


    其中RTSP版本一般都是RTSP/1.0;

    状态码是一个数值,200表示成功;

    解释是与状态码对应的文本解释;

    方法的定义

    方法记号表示资源上执行的方法, 它区分大小写. 新方法可在将来定义, 但不能以$开头. 已定义方法如下表所示:

    (注: P----演示, S----流, C----用户端, S----服务器端)

    | 方法            | 方向        | 对象 | 要求  | 含义                                                                                                                                                                                                                                                                                                                                                                  |
    |---------------|-----------|------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
    | DESCRIBE      | C->S      | P,S  | 推荐 | 检查演示或媒体对象的描述, 也允许使用接收头指定用户理解的描述格式. DESCRIBE的答复-响应组成媒体RTSP初始阶段                                                                                                                                                                                                                                                             |
    | ANNOUNCE      | C->S S->C | P,S  | 可选 | 当从用户发往服务器时, ANNOUNCE将请求URL识别的演示或媒体对象描述发送给服务器; 反之, ANNOUNCE实时更新连接描述. 如新媒体流加入演示, 整个演示描述再次发送, 而不仅仅是附加组件, 使组件能被删除                                                                                                                                                                             |
    | `GET_PARAMETER` | C->S S->C | P,S  | 可选 | `GET_PARAMETER`请求检查RUL指定的演示与媒体的参数值. 没有实体体时, `GET_PARAMETER`也许能用来测试用户与服务器的连通情况                                                                                                                                                                                                                                                     |
    | OPTIONS       | C->S S->C | P,S  | 要求 | 可在任意时刻发出OPTIONS请求, 如用户打算尝试非标准请求, 并不影响服务器状态                                                                                                                                                                                                                                                                                             |
    | PAUSE         | C->S      | P,S  | 推荐 | PAUSE请求引起流发送临时中断. 如请求URL命名一个流, 仅回放和记录被停止; 如请求URL命名一个演示或流组, 演示或组中所有当前活动的流发送都停止. 恢复回放或记录后, 必须维持同步. 在SETUP消息中连接头超时参数所指定时段期间被暂停后, 尽管服务器可能关闭连接并释放资源, 但服务器资源会被预订                                                                                    |
    | PLAY          | C->S      | P,S  | 要求 | PLAY告诉服务器以SETUP指定的机制开始发送数据; 直到一些SETUP请求被成功响应, 客户端才可发布PLAY请求. PLAY请求将正常播放时间设置在所指定范围的起始处, 发送流数据直到范围的结束处. PLAY请求可排成队列, 服务器将PLAY请求排成队列, 顺序执行                                                                                                                                  |
    | RECORD        | C->S      | P,S  | 可选 | 该方法根据演示描述初始化媒体数据记录范围, 时标反映开始和结束时间; 如没有给出时间范围, 使用演示描述提供的开始和结束时间. 如连接已经启动, 立即开始记录, 服务器数据请求URL或其他URL决定是否存储记录的数据; 如服务器没有使用URL请求, 响应应为201(创建), 并包含描述请求状态和参考新资源的实体与位置头. 支持现场演示记录的媒体服务器必须支持时钟范围格式, smpte格式没有意义 |
    | REDIRECT      | S->C      | P,S  | 可选 | 重定向请求通知客户端连接到另一服务器地址. 它包含强制头地址, 指示客户端发布URL请求; 也可能包括参数范围, 以指明重定向何时生效. 若客户端要继续发送或接收URL媒体, 客户端必须对当前连接发送TEARDOWN请求, 而对指定主执新连接发送SETUP请求                                                                                                                                   |
    | SETUP         | C->S      | S    | 要求 | 对URL的SETUP请求指定用于流媒体的传输机制. 客户端对正播放的流发布一个SETUP请求, 以改变服务器允许的传输参数. 如不允许这样做, 响应错误为"455 Method Not Valid In This State”. 为了透过防火墙, 客户端必须指明传输参数, 即使对这些参数没有影响                                                                                                                             |
    | `SET_PARAMETER` | C->S S->C | P,S  | 可选 | 这个方法请求设置演示或URL指定流的参数值. 请求仅应包含单个参数, 允许客户端决定某个特殊请求为何失败. 如请求包含多个参数, 所有参数可成功设置, 服务器必须只对该请求起作用. 服务器必须允许参数可重复设置成同一值, 但不让改变参数值. 注意: 媒体流传输参数必须用SETUP命令设置. 将设置传输参数限制为SETUP有利于防火墙. 将参数划分成规则排列形式, 结果有更多有意义的错误指示   |
    | TEARDOWN      | C->S      | P,S  | 要求 | TEARDOWN请求停止给定URL流发送, 释放相关资源. 如URL是此演示URL, 任何RTSP连接标识不再有效. 除非全部传输参数是连接描述定义的, SETUP请求必须在连接可再次播放前发布                                                                                                                                                                                                        |
    
    消息头的定义
    • Type:
      • 类型 "g" 表示请求和响应中的通用请求头;
      • 类型 "R" 表示请求头;
      • 类型 "r" 表示响应头;
      • 类型 "e" 表示实体头字段.
    • Support:
      • "req." 表示必须由接收者以特殊的方法实现; 注意, 不是所有 "req." 字段在该类型的每个请求中都会被发送. "req." 只表示客户机(支持响应头)和服务器(支持请求头)必须执行该字段.
      • "opt." 表示是可选的.
    • 最后一栏列出了关于头字段产生作用的方法; (其中 "entity" 针对于返回一个信息主体的所有方法. )
        | Header             | Type | Support | Methods                   |
        |--------------------|------|---------|---------------------------|
        | Accept             | R    | opt.    | entity                    |
        | Accept-Encoding    | R    | opt.    | entity                    |
        | Accept-Language    | R    | opt.    | all                       |
        | Allow              | R    | opt.    | all                       |
        | Authorization      | R    | opt.    | all                       |
        | Bandwidth          | R    | opt.    | all                       |
        | Blocksize          | R    | opt.    | All but OPTIONS, TEARDOWN |
        | Cache-Control      | G    | opt.    | SETUP                     |
        | Conference         | R    | opt.    | SETUP                     |
        | Connection         | G    | req.    | all                       |
        | Content-Base       | E    | opt.    | entity                    |
        | Content-Encoding   | E    | req.    | SET_PARAMETER             |
        | Content-Encoding   | E    | req.    | DESCRIBE, ANNOUNCE        |
        | Content-Language   | E    | req.    | DESCRIBE, ANNOUNCE        |
        | Content-Length     | E    | req.    | SET_PARAMETER, ANNOUNCE   |
        | Content-Length     | E    | req.    | entity                    |
        | Content-Location   | E    | opt.    | entity                    |
        | Content-Type       | E    | req.    | SET_PARAMETER, ANNOUNCE   |
        | Content-Type       | R    | req.    | entity                    |
        | CSeq               | G    | req.    | all                       |
        | Date               | G    | opt.    | all                       |
        | Expires            | E    | opt.    | DESCRIBE, ANNOUNCE        |
        | From               | R    | opt.    | all                       |
        | If-Modified-Since  | R    | opt.    | DESCRIBE, SETUP           |
        | Last-Modified      | E    | opt.    | entity                    |
        | Proxy-Authenticate |      |         |                           |
        | Proxy-Require      | R    | req.    | all                       |
        | Public             | R    | opt.    | all                       |
        | Range              | R    | opt.    | PLAY, PAUSE, RECORD       |
        | Range              | R    | opt.    | PLAY, PAUSE, RECORD       |
        | Referer            | R    | opt.    | all                       |
        | Require            | R    | req.    | all                       |
        | Retry-After        | R    | opt.    | all                       |
        | RTP-Info           | R    | req.    | PLAY                      |
        | Scale              | Rr   | opt.    | PLAY, RECORD              |
        | Session            | Rr   | req.    | All but SETUP, OPTIONS    |
        | Server             | R    | opt.    | all                       |
        | Speed              | Rr   | opt.    | PLAY                      |
        | Transport          | Rr   | req.    | SETUP                     |
        | Unsupported        | R    | req.    | all                       |
        | User-Agent         | R    | opt.    | all                       |
        | Via                | G    | opt.    | all                       |
        | WWW-Authenticate   | R    | opt.    | all                       |
    常用头解析
    | Header                  | Description                                                                           |
    |-------------------------|---------------------------------------------------------------------------------------|
    | CSeq                    | 命令的序列号, 逐1增加                                                                          |
    | Content-Length          | 这个标记的存在说明后面有实体数据, 而且给出了这个数据块的大小, 单位是byte                                              |
    | X-Playlist-Gen-Id       | 用来检查播放列表是否有效. 这个标记最初在客户端发送DESCRIBE命令后使用. 客户端在发送“SETUP”命令给服务器时必须回应一样的值                 |
    | X-Playlist-Seek-Id      | 值必须和X-Playlist-Gen-Id 域的值相同, 在PLAY请求命令中使用.                                            |
    | Blocksize               | 媒体包的总长度,单位是byte                                                                       |
    | Session                 | Session ID是用作客户端和服务器之间是否是正确的连接。在客户端发送SETUP命令后,服务器会在应答消息头里面发送一个session值给客户端。这算建立的一个会话. |
    | X-Accept-Authentication | 允许的authentication 方法.  NTLM, Digest 和 Basic 是标准的                                      |
    | X-Broadcast-Id          | 是否是实况或者是先期录制的流。0 表示先期录制,其他的值表示是实况。                                                    |
    | Range                   | 暂无中文释义                                                                                |
    | Speed                   | 用来调整传输到客户端的流得速度。假如你的带宽可以接受更高速的数据传送,这个域的值可以设置大于1来加速下载数据. i.e. x1 rate                  |
    | Server                  | 服务器类型和软件版本                                                                            |
    | EOF                     | 文件结束标记,也是流的结束标记                                                                       |
    | Date                    | 日期时间,下面举个例子:Tue, 18 Nov 2003 15:57:07 GMT                                             |
    | Bandwidth               | 流需要的最大带宽,bits/秒                                                                       |
    | Transport               | 使用什么协议来传输数据,比如TCP或者UDP等                                                               |
    | Etag                    | 实体标记Entity tag,是一个分配给会话的值,就像”23180160″                                                |
    | Supported               | 支持的COM modules , 有的是可选的.                                                              |
    | Content-Type            | 此域用来表示命令或者应答的用意. 下面是常用的几种类型                                                           |
    | /                      | application/x-wms-Logconnectstats 这个在SET_PARAMETER命令中用到,表示将客户端的信息登记到服务器上。             |
    | /                      | application/sdp 这个表示接下来数据包里面的是sdp数据,它是在服务器对DESCRIBE命令的应答包中。                           |
    | /                      | application/x-wms-contentdesc 表示紧跟的数据是一个内容描述对象,它设置the layout of the dialog.           |
    | /                      | application/vnd.ms.wms-hdr.asfv1 表示跟着一个流媒体头信息(ASF header),可以用BASIC 或者DIGEST来解码。       |
    | /                      | application/x-rtsp-packetpair 它被用来确定连接的可用带宽。                                          |
    状态码
    | value | meaning                             |
    |-------|-------------------------------------|
    | ”100” | Continue (all 100 range)            |
    | “200” | OK                                  |
    | ”201” | Created                             |
    | ”250” | Low on Storage Space                |
    | ”300” | Multiple Choices                    |
    | ”301” | Moved Permanently                   |
    | ”302” | Moved Temporarily                   |
    | ”303” | See Other                           |
    | ”304” | Not Modified                        |
    | ”305” | Use Proxy                           |
    | ”350” | Going Away                          |
    | ”351” | Load Balancing                      |
    | ”400” | Bad Request                         |
    | ”401” | Unauthorized                        |
    | ”402” | Payment Required                    |
    | ”403” | Forbidden                           |
    | ”404” | Not Found                           |
    | ”405” | Method Not Allowed                  |
    | ”406” | Not Acceptable                      |
    | ”407” | Proxy Authentication Required       |
    | ”408” | Request Time-out                    |
    | ”410” | Gone                                |
    | ”411” | Length Required                     |
    | ”412” | Precondition Failed                 |
    | ”413” | Request Entity Too Large            |
    | ”414” | Request-URI Too Large               |
    | ”415” | Unsupported Media Type              |
    | ”451” | Parameter Not Understood            |
    | ”452” | reserved                            |
    | ”453” | Not Enough Bandwidth                |
    | ”454” | Session Not Found                   |
    | ”455” | Method Not Valid in This State      |
    | ”456” | Header Field Not Valid for Resource |
    | ”457” | Invalid Range                       |
    | ”458” | Parameter Is Read-Only              |
    | ”459” | Aggregate operation not allowed     |
    | ”460” | Only aggregate operation allowed    |
    | ”461” | Unsupported transport               |
    | ”462” | Destination unreachable             |
    | ”500” | Internal Server Error               |
    | ”501” | Not Implemented                     |
    | ”502” | Bad Gateway                         |
    | ”503” | Service Unavailable                 |
    | ”504” | Gateway Time-out                    |
    | ”505” | RTSP Version not supported          |
    | ”551” | Option not supported                |

    rtsp常用方法举例(其中C->S:和S->C:只是表示放心,实际返回的数据中是不包含这个的)

    OPTIONS

    C->S: OPTIONS * RTSP/1.0

    CSeq: 1

    Require: implicit-play

    Proxy-Require: gzipped-messages

     

    S->C: RTSP/1.0 200 OK

    CSeq: 1

    Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

     

    DESCRIBE

    C->S: DESCRIBE rtsp://server.example.com/fizzle/foo RTSP/1.0

    CSeq: 312

    Accept: application/sdp, application/rtsl, application/mheg

     

    S->C: RTSP/1.0 200 OK

    CSeq: 312

    Date: 23 Jan 1997 15:35:06 GMT

    Content-Type: application/sdp

    Content-Length: 376

    v=0

    o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4

    s=SDP Seminar

    i=A Seminar on the session description protocol

    u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps

    e=mjh@isi.edu (Mark Handley)

    c=IN IP4 224.2.17.12/127

    t=2873397496 2873404696

    a=recvonly

    m=audio 3456 RTP/AVP 0

    m=video 2232 RTP/AVP 31

    m=whiteboard 32416 UDP WB

    a=orient:portrait

    ANNOUNCE

    C->S: ANNOUNCE rtsp://server.example.com/fizzle/foo RTSP/1.0

    CSeq: 312

    Date: 23 Jan 1997 15:35:06 GMT

    Session: 47112344

    Content-Type: application/sdp

    Content-Length: 332

    v=0

    o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4

    s=SDP Seminar

    i=A Seminar on the session description protocol

    u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps

    e=mjh@isi.edu (Mark Handley)

    c=IN IP4 224.2.17.12/127

    t=2873397496 2873404696

    a=recvonly

    m=audio 3456 RTP/AVP 0

    m=video 2232 RTP/AVP 31

     

    S->C: RTSP/1.0 200 OK

    CSeq: 312

    SETUP

    C->S: SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0

    CSeq: 302

    Transport: RTP/AVP;unicast;client_port=4588-4589

     

    S->C: RTSP/1.0 200 OK

    CSeq: 302

    Date: 23 Jan 1997 15:35:06 GMT

    Session: 47112344

    Transport: RTP/AVP;unicast;

    client_port=4588-4589;server_port=6256-6257

    PLAY

    C->S: PLAY rtsp://audio.example.com/twister.en RTSP/1.0

    CSeq: 833

    Session: 12345678

    Range: smpte=0:10:20-;time=19970123T153600Z

     

    S->C: RTSP/1.0 200 OK

    CSeq: 833

    Date: 23 Jan 1997 15:35:06 GMT

    Range: smpte=0:10:22-;time=19970123T153600Z

    For playing back a recording of a live presentation, it may be desirable to use clock

    units:

     

    C->S: PLAY rtsp://audio.example.com/meeting.en RTSP/1.0

    CSeq: 835

    Session: 12345678

    Range: clock=19961108T142300Z-19961108T143520Z

     

    S->C: RTSP/1.0 200 OK

    CSeq: 835

    Date: 23 Jan 1997 15:35:06 GMT

    PAUSE

    C->S: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0

    CSeq: 834

    Session: 12345678

     

    S->C: RTSP/1.0 200 OK

    CSeq: 834

    Date: 23 Jan 1997 15:35:06 GMT

    TEARDOWN

    C->S: TEARDOWN rtsp://example.com/fizzle/foo RTSP/1.0

    CSeq: 892

    Session: 12345678

     

    S->C: RTSP/1.0 200 OK

    CSeq: 892

    GET PARAMETER

    S->C: GET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0

    CSeq: 431

    Content-Type: text/parameters

    Session: 12345678

    Content-Length: 15

    packets_received

    jitter

     

    C->S: RTSP/1.0 200 OK

    CSeq: 431

    Content-Length: 46

    Content-Type: text/parameters

    packets_received: 10

    jitter: 0.3838

    SET PARAMETER

    C->S: SET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0

    CSeq: 421

    Content-length: 20

    Content-type: text/parameters

    barparam: barstuff

     

    S->C: RTSP/1.0 451 Invalid Parameter

    CSeq: 421

    Content-length: 10

    Content-type: text/parameters

    barparam

    REDIRECT

    S->C: REDIRECT rtsp://example.com/fizzle/foo RTSP/1.0

    CSeq: 732

    Location: rtsp://bigserver.com:8001

    Range: clock=19960213T143205Z-

    RECORD

    C->S: RECORD rtsp://example.com/meeting/audio.en RTSP/1.0

    CSeq: 954

    Session: 12345678

    Conference: 128.16.64.19/32492374

    Embedded (Interleaved) Binary Data

  • 相关阅读:
    编写更好的CSS
    EntityFramework中支持BulkInsert扩展
    NoSql数据库使用
    jsoneditor显示Json data
    资源
    了解你的被测系统(why?)
    SQL SERVER开窗函数
    oracle中的exists 和not exists 用法详解(转)
    visualvm监控jvm及远程jvm监控方法(转)
    爆:中国互联网的那些黑色产业链(转)
  • 原文地址:https://www.cnblogs.com/frkang/p/3355222.html
Copyright © 2011-2022 走看看