1、RTP over RTSP(TCP,RTP包通过使用TCP来传输)优势:
- UDP协议上的RTSP/RTP需要打开许多UDP端口,一个端口用于RTSP通信,n个端口用于RTP,n个端口用于RTCP
- 中间网络路由器很容易就过滤或者忽略掉UDP数据包
- UDP是不可靠传输协议,媒体包在因特网上传输时会面临着丢包
2、RTP over RTSP(TCP) 与 RTP over RTSP(UDP) RTP包头差异:
rtp基于tcp的包头比基于udp的包头多了4个字节:
- magic固定为0x24,
- channel用来区分音视频等多路流媒体的通道,其中偶数通道为流媒体内容,奇数通道为RTCP
- len表示数据包的长度减去开始的4个字节,即len字段之后的数据长度
3、RFC3984是H.264的baseline码流在RTP方式下传输的规范。
4、H.264的NAL层处理
- H264以NALU(NALunit)为单位来支持编码数据在基于分组交换技术网络中传输。
- NALU定义了可用于基于分组和基于比特流系统的基本格式,同时给出头信息,从而提供了视频编码和外部事件的接口。
5、H264编码过程中的三种不同的数据形式:
- SODB 数据比特串
- RBSP 原始字节序列载荷
- EBSP 扩展字节序列载荷
6、NALU打包成RTP的方式有三种:
(1)单一 NAL 单元模式:
- 即一个RTP 包仅由一个完整的 NALU 组成.
- 这种情况下 RTP NAL 头类型字段和原始的 H.264的NALU 头类型字段是一样的.
- 对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式.
- 12字节的RTP头后面的就是音视频数据,比较简单。一个封装单个NAL单元包到RTP的NAL单元流的RTP序号必须符合NAL单元的解码顺序。
(2)组合封包模式:
- 即可能是由多个NAL 单元组成一个 RTP 包.
- 分别有4种组合方式: STAP-A, STAP-B, MTAP16, MTAP24.那么这里的类型值分别是 24, 25, 26 以及 27.
- 当 NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中.
(3)分片封包模式:
- 用于把一个NALU 单元封装成多个 RTP 包.
- 存在两种类型 FU-A 和 FU-B. 类型值分别是 28 和 29.
- 而当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs).
- 数据比较大的H264视频包,被RTP分片发送。12字节的RTP头后面跟随的就是FU-A分片。
注:还记得前面nal_unit_type的定义吧,0~23是给H264用的,24~31未使用,在rtp打包时,如果一个NALU放在一个RTP包里,可以使用NALU的nal_unit_type,但是当需要把多个NALU打包成一个RTP包,或者需要把一个NALU打包成多个RTP包时,就定义新的type来标识。
7、拆包和解包
(1)拆包:当编码器在编码时需要将原有一个NAL按照FU-A进行分片,原有的NAL的单元头与分片后的FU-A的单元头有如下关系:
原始的NAL头的前三位为FU indicator的前三位,原始的NAL头的后五位为FU header的后五位,FUindicator与FU header的剩余位数根据实际情况决定。
(2)解包:当接收端收到FU-A的分片数据,需要将所有的分片包组合还原成原始的NAL包时,FU-A的单元头与还原后的NAL的关系如下:
还原后的NAL头的八位是由FU indicator的前三位加FU header的后五位组成,即:
nal_unit_type = (fu_indicator & 0xe0) | (fu_header & 0x1f) 。
8、TCP/IP、UDP:
- IP 协议负责将多个包交换网络连接起来,并管理通讯 IP 源地址和目标地址的协议
- TCP 和 UDP 协议则是位于应用层和 IP 层之间,负责它们之间信息传输的重要协议
9、TCP 和 UDP 的特点
- TCP:面向连接、可靠、基于字节流控制的传输,就像一个管道一样将应用层和 IP 层连接起来。
- UDP:提供无连接通信,但不对传送的数据包提供可靠性保证。
10、端口及其特点:
端口号属于传输协议的一部分,因此我们可以说,数据通过 IP 地址发送对应的数据到指定设备上,而通过端口号把数据发送到指定的服务或程序上。
11、程序一般不止是监听指定的端口号,而且也会明确对应的传输协议。所以我们在进行数据传输的时候,既要指定对应的端口号,也要指定对应的通讯协议,如:
程序 A 使用 TCP 协议,监听 33001 端口;程序 A 使用 UDP 协议,监听 33001 端口。
12、指定传输协议和端口,显而易见的好处在于,当我们进行端口转发或者构建网络防火墙的时候,我们可以很方便的通过协议和端口进行隔离。以防止不可预见的意外发生。对于计算机来说,通过这种方式可以防止外网各种不必要的数据,进入本地局域网。
13、IANA( Internet Assigned Numbers Authority 即互联网号码分配局 ),它负责管理端口注册。大多数主流的程序,都有一个明确的已注册端口,比如常见的 FTP 监听 20、 21 端口,而 HTTP 服务监听 80 端口等。如果有一个程序想注册某个端口,那么 IANA 会先去查一查这个端口是否已被注册,如果已经被注册了,它则会拒绝申请。
14、端口号根据范围分为三种:
- Well-Known Ports(即公认端口号):
它是一些众人皆知著名的端口号,这些端口号固定分配给一些服务,我们上面提到的 HTTP 服务、 FTP服务等都属于这一类。知名端口号的范围是:0-1023。
- Registered Ports(即注册端口):
它是不可以动态调整的端口段,这些端口没有明确定义服务哪些特定的对象。不同的程序可以根据自己的需要自己定义,注册端口号的范围是:1024-49151。
- Dynamic, private or ephemeral ports(即动态、私有或临时端口号):
顾名思义,这些端口号是不可以注册的,这一段的端口被用作一些私人的或者定制化的服务,当然也可以用来做动态端口服务,这一段的范围是:49152–65535。
参考&&致谢:
https://blog.csdn.net/daha1314/article/details/89106895
https://network.51cto.com/art/201905/596779.htm