Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程

整体而言,RTSP 通常工作于可靠的传输协议 TCP 之上,就像 HTTP 那样,用于发起/结束流媒体传输,交换流媒体元信息。RTP 通常工作于 UDP 
之上,用于传输实际的流媒体数据,其中的载荷格式因具体流媒体类型的不同而不同,通常有专门的 RFC 规范对其进行定义,如 H.264 编码格式视频数据的载荷格式在 RFC 6184, RTP Payload Format for H.264 Video 中定义,其它流媒体数据类型有其它的规范进行定义。RTCP 同样通常工作于 UDP 之上,用于对 RTP 进行控制,流媒体数据的收发端在传输过程中相互发送 RTCP 数据包,将自己这一端检测到的 QoS 等信息传递给对方,使用 RTP/RTCP 协议的应用程序,利用这些信息对收发过程进行控制。RTP 和 RTCP 在传输过程中,工作于不同的端口上。

我们通过 Wireshark 抓包来看一下 RTSP/RTP/RTCP 的基本工作过程。我们启动 live555MediaServer,其工作目录下存有一些流媒体文件,其中包括 H.264 原始码流格式的文件 raw_h264_stream.264。启动 Wireshark 抓包。然后通过 ffplay 请求 live555MediaServer 并播放 raw_h264_stream.264

$ ffplay rtsp://10.240.248.20:8554/raw_h264_stream.264
 
 
  • 1

其中 URI 中的 IP 地址为 live555MediaServer 运行的主机的 IP 地址,端口号为其采用的端口号。在 Wireshark 中,通过 Display Filter 过滤仅显示 RTSP/RTP/RTCP 包,将看到类似下面这样的包序列:

可以看到,首先是 RTSP 数据的交互,建立媒体传输会话,随后开始通过 RTP/RTCP 传输数据。RTSP 协议在制定时较多地参考了 HTTP/1.1 协议,甚至许多内容与 HTTP/1.1 完全相同。与 HTTP/1.1 类似,RTSP 客户端首先向服务器发送请求,随后服务器发回响应,以此实现数据的交互。RTSP 同样定义了一系列方法,表示对 URI 标识的资源所执行的操作。RTSP 具体定义的方法有如下这些:

      method            direction        object     requirement
      DESCRIBE          C->S             P,S        recommended
      ANNOUNCE          C->S, S->C       P,S        optional
      GET_PARAMETER     C->S, S->C       P,S        optional
      OPTIONS           C->S, S->C       P,S        required
                                                    (S->C: optional)
      PAUSE             C->S             P,S        recommended
      PLAY              C->S             P,S        required
      RECORD            C->S             P,S        optional
      REDIRECT          S->C             P,S        optional
      SETUP             C->S             S          required
      SET_PARAMETER     C->S, S->C       P,S        optional
      TEARDOWN          C->S             P,S        required
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

回到 Wireshark 抓的包来看 RTSP/RTP/RTCP 的基本工作过程。

客户端首先向服务器发送了一个方法为 OPTIONS 的请求,如第 112 号包,该请求内容如上图所示,携带有 URL,RTSP 版本号,User-Agent 等信息。RTSP 的 OPTIONS 与 HTTP/1.1 的对应方法具有相同的语义,具体在 HTTP/1.1 规范 RFC 2616 的 9.2 节 中定义。客户端通过这个方法了解服务器为 URL 提供了哪些方法的支持。

第 112 号包是 RTSP 服务器对客户端的 OPTIONS 请求的响应,其具体内容如下:

服务器将该 URL 支持的方法的列表返回给客户端。对于这里的情况,也就是 OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER

然后客户端向服务器发送了一个 DESCRIBE 请求,即第 116 号包,该请求内容如下:

DESCRIBE 方法用于客户端提取由所请求的 URL 标识的表示或媒体对象的描述信息。它可以使用 Accept 头部指定客户端理解的描述格式。服务器则用所请求的资源的描述作为响应。DESCRIBE 应答响应对构成RTSP的媒体初始化阶段。

对于这里的情况,DESCRIBE 请求的 Accept 头部值为 application/sdp,表示客户端希望收到 SDP 格式的媒体表示。

服务器以一个 RTSP/SDP 包作为响应,如图中的第 118 号包:

这个 SDP 包实际内容的文本格式如下:

v=0
o=- 1504179985128927 1 IN IP4 10.240.248.20
s=H.264 Video, streamed by the LIVE555 Media Server
i=raw_h264_stream.264
t=0 0
a=tool:LIVE555 Streaming Media v2017.07.18
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:H.264 Video, streamed by the LIVE555 Media Server
a=x-qt-text-inf:raw_h264_stream.264
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42802A;sprop-parameter-sets=Z0KAKtoBEA8eXlIKDAoNoUJq,aM4G4g==
a=control:track1
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

服务器通过 SDP 包,告知流媒体数据传输所用的协议,以及流媒体本身的一些信息,这里所用的协议为 RTP/RTCP。通常的 SDP 文件中,“Media Description” 选项,即以 “m” 开头的那一行中会指定,会指定客户端接收 RTP 包所需要监听的端口,但在这里这个端口为 0。传输中客户端和服务器所选择的用于 RTP/RTCP 包收发的端口将在后面的 RTSP 请求中交换。

客户端在收到服务器发来的 SDP 包之后,会选择两个端口,分别用于 RTP 和 RTCP 包的收发,并发送了一个 SETUP 请求用于建立媒体会话,如第 119 号包:

客户通过 SETUP 请求的 Transport 头部,将为 RTP 和 RTCP 选择的端口、协议及通信方式(UDP 单播还是多播)发送给客户端。这里可以看到,客户端选择了 19008 和 19009 两个端口来进行 RTP 和 RTCP 包的收发。

随后服务器对 SETUP 请求做出了响应,如第121 号包:

服务器通过这个响应,把它为媒体会话开启的用于收发 RTP、RTCP 包的端口,会话的标识符,超时时间等信息通知给客户端。随后,客户端分别在 RTP 和 RTCP 的端口上,向服务器的 RTP 和 RTCP 端口上发送了两个包,如第 122 号包和第 123 号包:

122 号包

123 号包

这两个包中携带的都是无意义的数据。发送它们的目的,大概主要是为了 NAT 穿墙。

随后客户端向服务器发送了一个 PLAY 请求,来启动播放,如第 124 号包:

PLAY 请求中会携带从前面的 SETUP 请求的响应获得的会话标识符。

随后服务器向客户端发送了一个 RTCP 包,如第 125 号包:

在这个包中,服务器把 RTP 时间戳,服务器的 SSRC,服务器的 CNAME 等信息发送给客户端。之后,服务器发送了 PLAY 请求的响应:

在这个包中,发送的 RTP 包的初始序列号,RTP 时间等重要信息被发送给客户端。

至此媒体会话最终建立完成,后面就可以开始通过 RTP 传输视频数据了。请求的 H.264 视频文件的前两个 NALU,即 SPS 和 PPS 如下所示:

00000000   00 00 00 01  67 42 80 2A  DA 01 10 0F  1E 5E 52 0A  ....gB.*.....^R.
00000010   0C 0A 0D A1  42 6A 00 00  00 01 68 CE  06 E2
 
 
  • 1
  • 2

开始的两个 RTP 包,即第 127 号包和第 128 号包内容如下:

127 号包

128 号包

它们的内容与 H.264 视频文件的前两个 NALU 的内容完全吻合,即 live555 通过两个 RTP 包发送了前两个 NALU SPS 和 PPS。

从 RTSP 的 OPTIONS 请求开始,到首个视频数据 NALU 开始发送,经过了总共大概 102 ms 的时间,媒体会话完全建立完成。

视频数据经过一端时间的稳定传输,最终以服务器向客户端发送的一个 RTCP BYE 包而结束,如第 6451 号包:

总结一下这个过程: 
1. 客户端首先向服务器发送一个方法为 OPTIONS 的请求,了解服务器为 URL 提供了哪些方法的支持。 
2. 服务器将该 URL 支持的方法的列表返回给客户端。 
3. 客户端向服务器发送了一个 DESCRIBE 请求,提取由所请求的 URL 标识的表示或媒体对象的描述信息。 
4. 服务器通过 SDP 包,告知流媒体数据传输所用的协议,以及流媒体本身的一些信息。 
5. 客户端在收到服务器发来的 SDP 包之后,会选择两个端口,分别用于 RTP 和 RTCP 包的收发,并发送了一个 SETUP 请求用于建立媒体会话。 
6. 服务器发回 SETUP 响应,把它为媒体会话开启的用于收发 RTP、RTCP 包的端口,会话的标识符,超时时间等信息通知给客户端。 
7. 客户端分别在 RTP 和 RTCP 的端口上,向服务器的 RTP 和 RTCP 端口上发送了两个包。 
8. 客户端向服务器发送一个 PLAY 请求,来启动播放。 
9. 服务器向客户端发送一个 RTCP 包,把 RTP 时间戳,服务器的 SSRC,服务器的 CNAME 等信息发送给客户端。 
10. 服务器发送 PLAY 请求的响应,其中包含 RTP 包的初始序列号,RTP 时间等重要信息。至此媒体会话最终建立完成。 
11. 通过 RTP/RTCP 发送流媒体数据。 
12. 服务器向客户端发送一个 RTCP BYE 包结束会话。


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP三次握手和四次挥手是TCP协议建立和关闭连接时所采用的步骤。 三次握手是在客户端和服务器之间建立TCP连接时的过程。首先,客户端向服务器发送一个请求连接的数据包,该数据包包含一个随机生成的序列号(SYN),表示客户端希望建立连接。服务器接收到该请求后,向客户端回复一个确认连接的数据包,该数据包包含其自己生成的一个随机序列号(SYN-ACK),表示服务器同意建立连接。最后,客户端再次向服务器发送一个确认连接的数据包,该数据包中包含服务器的序列号加一(ACK),表示客户端接受服务器的连接请求。这样,TCP连接就建立起来了。 四次挥手是在客户端和服务器关闭TCP连接时的过程。首先,客户端发送一个关闭连接的请求数据包(FIN),表示客户端想要关闭连接。服务器收到该请求后,向客户端回复一个确认关闭连接的数据包(ACK),但自己的数据可能没有发送完毕。服务器等到自己的数据发送完毕后,发送一个自己的关闭连接请求数据包(FIN),表示服务器也希望关闭连接。客户端收到服务器的请求后,回复一个确认关闭连接的数据包(ACK),然后等待一段时间,确保服务器收到了该数据包。最后,客户端和服务器都关闭连接,四次挥手过程完成。 通过Wireshark抓包分析TCP三次握手和四次挥手可以观察到每个数据包的源地址、目标地址、序列号、确认号等信息。可以通过Wireshark的过滤功能筛选出TCP协议相关的数据包进行分析。通过分析数据包的交互过程,可以确认连接建立和关闭的状态是否符合预期,并可以进一步分析网络延迟、丢包等问题。 综上所述,Wireshark抓包分析TCP三次握手和四次挥手可以帮助我们深入理解TCP连接的建立和关闭过程,以及发现网络故障的根源。 ### 回答2: TCP是一种常用的传输层协议,它通过进行三次握手来建立连接,并进行四次挥手来终止连接。 三次握手的过程如下: 1. 客户端发送一个SYN标志位的TCP报文段给服务器,表示请求建立连接; 2. 服务器收到请求后,回复一个带有SYN和ACK标志位的TCP报文段给客户端,表示同意建立连接; 3. 客户端收到服务器的回复后,再次发送一个带有ACK标志位的TCP报文段给服务器,表示连接建立成功。 四次挥手的过程如下: 1. 客户端发送一个FIN标志位的TCP报文段给服务器,表示希望断开连接; 2. 服务器收到请求后,回复一个带有ACK标志位的TCP报文段给客户端,表示确认收到断开请求; 3. 服务器完成数据的发送后,发送一个带有FIN标志位的TCP报文段给客户端,表示自己也要断开连接; 4. 客户端收到服务器的断开请求后,发送一个带有ACK标志位的TCP报文段给服务器,表示确认断开,并进入TIME_WAIT状态。 在三次握手的过程中,第一次握手是客户端发起的,第二次握手是服务器回复同意建立连接,第三次握手是客户端回复确认连接。这个过程是为了确保双方都同意建立连接,以保证数据传输的可靠性。 在四次挥手的过程中,首先客户端发送断开请求,服务器回复确认,然后服务器发送断开请求,客户端回复确认。这个过程是为了保证双方都断开连接,并确保数据完整性。 Wireshark是一款网络抓包分析工具。使用Wireshark可以捕获网络数据包,并对数据包进行解析和分析。通过Wireshark,我们可以看到每个TCP报文段的具体内容,并对三次握手和四次挥手的过程进行详细分析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值