參考: 手撕RTSP協(xié)議系列
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作與策劃設(shè)計,江安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:江安等地區(qū)。江安做網(wǎng)站價格咨詢:18980820575Rtsp基本流程 rtsp協(xié)議簡介rtsp,英文全稱 Real Time Streaming Protocol,RFC2326,實時流傳輸協(xié)議,是TCP/IP協(xié)議體系中的一個應(yīng)用層協(xié)議!協(xié)議主要規(guī)定定了一對多應(yīng)用程序如何有效地通過IP網(wǎng)絡(luò)傳送多媒體數(shù)據(jù)。RTSP體系結(jié)位于RTP和RTCP之上(RTCP用于控制傳輸,RTP用于數(shù)據(jù)傳輸),使用TCP或UDP完成數(shù)據(jù)傳輸!
rtsp基本交互過程假設(shè)我們現(xiàn)在要向一個RTSP的sever發(fā)送請求獲取數(shù)據(jù),基本流程如下:
OPTIONS
C—>S
客戶端向服務(wù)器端發(fā)送OPTIONS,請求可用的方法。
S—>C
服務(wù)器端回復(fù)客戶端,消息中包含當前可用的方法。
DESCRIBE
C—>S
客戶端向服務(wù)器請求媒體描述文件,一般通過rtsp開頭的url來發(fā)起請求,格式為sdp。
S—>C
服務(wù)器回復(fù)客戶端sdp文件,該文件告訴客戶端服務(wù)器有哪些音視頻流,有什么屬性,如編解碼器信息,幀率等。
SETUP
C—>S
客戶端向服務(wù)器端發(fā)起建立連接請求,請求建立會話連接,準備開始接收音視頻數(shù)據(jù),請求信息描述了期望音視頻數(shù)據(jù)包基于UDP還是TCP傳輸,指定了RTP,RTCP端口,以及是單播還是組播等信息!
S—>C
服務(wù)器端收到客戶端請求后,根據(jù)客戶端請求的端口號確定發(fā)送控制數(shù)據(jù)的端口以及音視頻數(shù)據(jù)的端口!
PLAY
C—>S
客戶端向服務(wù)端請求播放媒體。
S—>C
服務(wù)器回復(fù)客戶端200 OK! 之后開始通過SETUP中指定的端口開始發(fā)送數(shù)據(jù)!
TEARDOWN
C---->S
結(jié)束播放的時候,客戶端向服務(wù)器端發(fā)起結(jié)束請求
S—>C
服務(wù)端收到消息后,向客戶端發(fā)送200 OK,之后斷開連接
上述的流程基本涵蓋了RTSP的流程,當然,RTSP除此之外,還有PAUSE,SCALE,GET_PARAMETER,SET_PARAMETER等參數(shù)。
Rtsp抓包示例Rtsp消息格式RTSP消息分為兩大類,一類是請求消息(request),一類是回應(yīng)消息(ressponse)
請求報文請求消息的格式如下:
也就是說:
方法 URI RTSP版本 CR LF
消息頭 CR LF CR LF
消息體 CR LF
1).請求消息的第一行的語法結(jié)構(gòu)如下:
Request-Line = Method 空格 Request-URI 空格 RTSP-Version CRLF
其中方法包括OPIONS、DESCRIBE、SETUP、PLAY、TEARDOWN等,URI是接受方的地址,例如:rtsp://192.168.0.1/video1.3gp。
RTSP版本一般都是 RTSP/1.0。每行后面的CR LF表示回車換行,需要接受端有相應(yīng)的解析,
2).在消息頭中除了第一行的內(nèi)容外,還有一些需求提供附加信息。其中有些是一定要的,后續(xù)我們會詳細介紹經(jīng)常用到的幾個域的含義。
消息頭 = Accept
? | Accept-Encoding
? | Accept-Language
? | Authorization
? | From
? | If-Modified-Since
? | Range
? | Referer
? | User-Agent
3).最后一個消息頭需要有兩個CR LF。消息體是可選的,有的Request消息并不帶消息體。
如圖中所示,該RTSP請求消息的方法為OPTIONS,請求的目標地址為rtsp://192.17.1.63:554,RTSP的版本為1.0;
接下來包含兩種類型的消息,第一種為CSeq表示序列號,本次請求的序列號為1(服務(wù)器端回復(fù)此請求的數(shù)據(jù)包的序列號也是1);
第二種為User-Agent,表示用戶代理,值為 “Lavf58.42.100”;
由于User-Agent為最后一條消息,其后要跟兩組回車和換行!
用戶代理為LibVLC/2.2.4,使用VLC播放器rtsp流的一個代理
響應(yīng)報文響應(yīng)報文的開始行是狀態(tài)行,RTSP響應(yīng)報文的結(jié)構(gòu)如下圖所示
也就是說:回應(yīng)消息由RTSP版本+狀態(tài)碼+解釋開頭,之后跟一條或多條消息
RTSP版本 狀態(tài)碼 解釋 CR LF
消息頭 CR LF CR LF
消息體 CR LF
說明:
狀態(tài)碼:表示狀態(tài),同http的返回狀態(tài),如200,表示OK
解釋:針對狀態(tài)碼的文本解釋
同樣:最后一條消息也是需要 跟兩個回車和換行!
回復(fù)消息以Response標識,該消息中RTSP的版本號為1.0;
服務(wù)器回復(fù)的狀態(tài)碼為401;
針對狀態(tài)碼401的解釋為Unauthorized(未授權(quán));
包含兩種類型的消息:
一是WWW-Authenticate:告訴請求端授權(quán)認證需要的信息;
二是Date:表示當前日期和時間!
sdp格式詳解sdp,英文全稱Session Description Protocol,會話描述協(xié)議,對應(yīng)RFC2327。我們在此介紹,是因為RTSP協(xié)議中使用sdp進行媒體信息的描述,不過,sdp的應(yīng)用不止于此,語音通話SIP協(xié)議,監(jiān)控安防GB28181國標, 當下比較火熱的webRtc都用到了sdp,可謂應(yīng)用廣泛!
sdp的目的就是在媒體會話中,傳遞媒體流信息,允許會話描述的接收者去參與會話,定義了會話描述的統(tǒng)一格式!
OPTIONOPTION是一個request消息,各個字段:
OPTIONS:標識請求命令的類型;
RTSP URI:請求的服務(wù)端的URI,以rtsp://開頭的地址,一般為rtsp://ip:554(rtsp默認端口號);
RTSP VER:標識RTSP 版本號,一般常見RTSP/1.0;
CSeq:數(shù)據(jù)包序列號,由于OPTIONS一般而言為RTSP請求的第一條指令,一般而言,針對OPTIONS,該值為1;
User-Agent:用戶代理;
回復(fù)消息的結(jié)構(gòu):
OPTIONS的回復(fù)遵循RTSP response消息的格式,第一行回復(fù)RTSP的版本,狀態(tài)碼,狀態(tài)描述;然后是序列號,與OPTION請求中的序列號相同;之后是Public字段,用于描述服務(wù)器當前提供了哪些方法;最后是Date字段,表示日期。
最后放一個完整的OPTIONS請求的示例:
請求
OPTIONS rtsp://192.17.1.63:554 RTSP/1.0\r\n
CSeq: 1\r\n
User-Agent: Lavf58.42.100\r\
回復(fù)
RTSP/1.0 200 OK\r\n
CSeq: 1\r\n
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER\r\n
Date: Fri, Apr 10 2020 19:07:19 GMT\r\n
DESCRIBE上一篇我們介紹了RTSP的OPTION指令,客戶端發(fā)起OPTION請求后,得到了RTSP服務(wù)器支持的指令。在此之后,客戶端會繼續(xù)向服務(wù)器發(fā)送DESCRIBE消息,來獲取會話描述信息(sdp)。本篇我們來詳細介紹一下DESCRIBE指令。
DESCRIBE的作用
向服務(wù)器請求會話描述信息(SDP)。
DESCRIBE的格式
1.請求
格式:
描述:
首先用DESCRIBE描述請求類型;然后在URI中請求的服務(wù)器端地址;RTSP_VER表示RTSP的版本號,在加入\r\n消息頭結(jié)束;
消息體包含以下字段:
Accept:指明接收數(shù)據(jù)的格式,如application/sdp表示接收sdp信息,之后加入\r\n表示此條目結(jié)束;
CSeq:RTSP序列號,一般DESCRIBE包在RTSP請求過程中的序列號為2,之后加入\r\n表示此條目結(jié)束;
UserAgent : 指明用戶代理,由于是最后一個條目,加入兩組\r\n表示結(jié)束。
案例
第一次DESCRIBE請求:
DESCRIBE rtsp://192.17.1.63:554 RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf58.42.100
服務(wù)端回復(fù)的401消息:
RTSP/1.0 401 Unauthorized
CSeq: 2
WWW-Authenticate: Digest realm="IP Camera(23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e", stale="FALSE"
Date: Fri, Apr 10 2020 19:07:19 GMT
第二次DESCRIBE請求
DESCRIBE rtsp://192.17.1.63:554 RTSP/1.0
Accept: application/sdp
CSeq: 3
User-Agent: Lavf58.42.100
Authorization: Digest username="admin", realm="IP Camera(23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e", uri="rtsp://192.17.1.63:554", response="8f1987b6da1aeb3f3744e1307d850281"
驗證OK消息
RTSP/1.0 200 OK
CSeq: 3
Content-Type: application/sdp
Content-Base: rtsp://192.17.1.63:554/
Content-Length: 712
v=0
o=- 1586545639954157 1586545639954157 IN IP4 192.17.1.63
s=Media Presentation
e=NONE
b=AS:5100
t=0 0
a=control:rtsp://192.17.1.63:554/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://192.17.1.63:554/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z01AKI2NQDwBE/LgLcBAQFAAAD6AAAw1DoYACYFAABfXgu8uNDAATAoAAL68F3lwoA==,aO44gA==
m=audio 0 RTP/AVP 8
c=IN IP4 0.0.0.0
b=AS:50
a=recvonly
a=control:rtsp://192.17.1.63:554/trackID=2
a=rtpmap:8 PCMA/8000
a=Media_header:MEDIAINFO=494D4B48010300000400000111710110401F000000FA000000000000000000000000000000000000;
a=appversion:1.0
SETUP實際的案例:
request
SETUP rtsp://192.17.1.63:554/trackID=1 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=26968-26969
CSeq: 4
User-Agent: Lavf58.42.100
Authorization: Digest username="admin", realm="IP Camera(23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e", uri="rtsp://192.17.1.63:554/trackID=1", response="e29ca030062df6022faa77fefde40b28"
Response
RTSP/1.0 200 OK
CSeq: 4
Session: 337474243;timeout=60
Transport: RTP/AVP/UDP;unicast;client_port=26968-26969;server_port=8284-8285;ssrc=4a7fb757;mode="play"
Date: Fri, Apr 10 2020 19:07:19 GMT
PLAY實例:
RTSP PLAY (requst)
PLAY rtsp://192.17.1.63:554/ RTSP/1.0\r\n
Range: npt=0.000-\r\n
CSeq: 6\r\n
User-Agent: Lavf58.42.100\r\n
Session: 337474243\r\n
Authorization: Digest username="admin", realm="IP Camera(23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e", uri="rtsp://192.17.1.63:554/", response="9ea6c2659d3bce8d129ca3549ecc7fbf"\r\n\r\n
RTSP PLAY (response)
RTSP/1.0 200 OK\r\n
CSeq: 6\r\n
Session: 337474243\r\n
RTP-Info: url=rtsp://192.17.1.63:554/trackID=1;seq=3658;rtptime=1710363406,url=rtsp://192.17.1.63:554/trackID=2;seq=6598;rtptime=4065225152\r\n
Date: Fri, Apr 10 2020 19:07:20 GMT\r\n\r\n
PAUSE一個官方的例子:
PAUSE rtsp://example.com/fizzle/foo RTSP/1.0\r\n
CSeq:834\r\n
Session:12345678\r\n\r\n
PAUSE回復(fù)示例
RTSP/1.0 200 OK\r\n
CSeq:834\r\n
Session:12345678\r\n\r\n
TEARDOWN該TREADOWN消息中,消息序列號為11,用戶代理為LibVLC/2.2.4,這是我們使用VLC播放器rtsp流的一個代理,消息序列號為11, Session為之前SETUP請求后服務(wù)端Reply返回的session字段的值,用于表示此次會話連接!
發(fā)出去請求后,服務(wù)端同樣也會回饋response的消息。
完整TEARDWON請求和回復(fù)的例子:
TEARDOWN請求
TEARDOWN rtsp://192.17.1.73:554/Streaming/Channels/101/?transportmode=unicast&profile=Profile_1 RTSP/1.0\r\n
CSeq: 10\r\n
Authorization: Digest username="admin", realm="bcad28138995", nonce="a1a5b9d3865180dccbaffb1cb2eb2a27", uri="rtsp://192.17.1.73:554/Streaming/Channels/101/", response="c5c005ef16638dfa326dcfc0c3f54aab"\r\n
User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)\r\n
Session: 1659421772\r\n\r\n
TEARDOWN的回復(fù)
RTSP/1.0 200 OK\r\n
CSeq: 10\r\n
Session: 1659421772\r\n
Date: Thu, Aug 27 2020 18:31:13 GMT\r\n\r\n
GET_PARAMETERGetParameret用作向服務(wù)器獲取參數(shù),一般用于獲取時間范圍。當發(fā)送的請求中沒有相關(guān)請求參數(shù)時,則用作保持RTSP連接!
從抓包文件中看并沒有任何參數(shù)的信息,所以我們認為這是一個空的 RTSP請求,其作用是保持RTSP連接,類似于ping的作用,類似于RTMP協(xié)議中的ping request消息。如果有實際的參數(shù)請求,則在增加請求的參數(shù)對應(yīng)的字段就可以了!
完整的GETPARAMETER的請求和回復(fù)的例子:
GET_PARAMETER請求
GET_PARAMETER rtsp://192.17.1.73:554/Streaming/Channels/101/?transportmode=unicast&profile=Profile_1 RTSP/1.0\r\n
CSeq: 7\r\n
Authorization: Digest username="admin", realm="bcad28138995", nonce="a1a5b9d3865180dccbaffb1cb2eb2a27", uri="rtsp://192.17.1.73:554/Streaming/Channels/101/", response="4764a1f2772821f5528ebbb2ad18c3f9"\r\n
User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)\r\n
Session: 1659421772\r\n\r\n
GET_PARAMETER回復(fù)
RTSP/1.0 200 OK\r\n
CSeq: 7\r\n
Date: Thu, Aug 27 2020 18:29:00 GMT\r\n
RTSP_SET_PARAMETERSET PARAMETER作用
SET_PARAMETER方法用于給URI指定的流地址設(shè)置參數(shù)。
當客戶端想要確定為什么某一個特定的請求失敗時,請求應(yīng)該只包含一個參數(shù)。
如果請求中包含多個參數(shù)值,則服務(wù)器只有在所有的參數(shù)被成功設(shè)置的情況下,才會生效。
服務(wù)器允許某個參數(shù)被重復(fù)設(shè)置成相同的值,但不允許改變參數(shù)的值!
RTP包格式RTP概覽
RTP是一種應(yīng)用層協(xié)議,傳輸層協(xié)議可以是TCP或者UDP(UDP多一些)!
RTP數(shù)據(jù)包由兩部分組成,一部分是RTP Heaeder,一部分是RTP body,RTP Header占用最少12個字節(jié),最多72個字節(jié);另一部分是RTP Payload,用來封裝實際的數(shù)據(jù)負載,如封裝h264編碼的視頻數(shù)據(jù)!下面我們來仔細看下RTP Header和RTP Body的組織形式!
RTCP協(xié)議通過Marker=1為最后一幀的 判斷總處理的幀數(shù)是否等于Sequence number,據(jù)此判斷是否丟幀
WireShark默認綠色是TCP報文,深藍色是DNS,淺藍是UDP,黑色標識出有問題的TCP報文——比如亂序報文。
Wireshark基本用法
Wireshark抓包的三次握手解析:
①客戶端發(fā)起連接,先發(fā)送SYN報文,并發(fā)送序號為Seq=X=0;
②服務(wù)端收到客戶端的連接請求后,發(fā)送SYN + ACK報文,并發(fā)送服務(wù)端發(fā)送的序號為Seq=Y=0,和確認序號ACK=X+1=1;
③客戶端收到服務(wù)端的確認報文后,再次發(fā)送ACK報文給服務(wù)端,表示客戶端能與服務(wù)端正常連接通信,并發(fā)送序號Seq=Z=1, 確認序號為ACK=Y+1=1;
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧