背景知识:可以查看https://www.cnblogs.com/lidabo/p/4483497.html

RTSP/RTP over TCP
TCP承载RTSP/RTP
 
When you use RTSP/RTP over TCP, all command and media data will be sent through the RTSP port, normally, port 554. Also, when using
当使用TCP协议承载RTSP/RTP时,所有的命令和媒体数据都将通过RTSP端口,通常是554,进行发送。同时,数据将经过二元交织格式化之后才能发
RTSP/RTP over TCP, the data will be sent via binary interleave format.
送。
 
Below will describe the essential for using RTSP/RTP over TCP
接下来我们将描述使用TCP承载RTSP/RTP的主要要素:
 
SETUP
 
To use TCP communication, you need to request TCP connection during RTSP SETUP. You have to sent SETUP command with
要使用TCP连接,RTSP客户端需要在SETUP阶段请求TCP连接。SETUP命令中应该包括如下格式的Transport:

Transport: RTP/AVP/TCP;interleaved=0-1

This will tell the server to send media data with TCP and interleave the data in channel 0 and 1. Given in the specification, data channel is even
上述Transport将告诉服务端使用TCP协议发送媒体数据,并且使用信道 0 和 1 对流数据以及控制信息进行交织。详细说来,使用偶数信道作为数据
number and control channel is odd (data_ch_num + 1). So, if you data channel is 0, your control channel will be 0 + 1 = 1.
传输信道,使用奇数信道作为控制信道(数据信道 + 1)。所以,如果你设定数据信道为 0 ,那控制信道应该是 0 + 1 = 1。
 
Below is an example of TCP SETUP
 
RTP Data
 
After the setup, RTP data will be sent through the TCP socket that is used for RTSP commands. The RTP data will be encapsulate in the following format
SETUP之后,RTP数据将通过用来发送RTSP命令的TCP Socket进行发送。RTP数据将以如下格式进行封装:

| magic number | channel number | embedded data length | data |

magic number - 1 byte value of hex 0x24
RTP数据标识符,"$"
channel number - 1 byte value to denote the channel
信道数字 - 1个字节,用来指示信道
embedded data length - 2 bytes to denote the embedded data length
数据长度 - 2个字节,用来指示插入数据长度
data - data packet, ie RTP packet, with the total length of the embedded data length
数据 - 数据包,比如说RTP包,总长度与上面的数据长度相同
Below is a full example of the communication exchanged
下面是交互过程的一个完整示例:
问题描述:
 当我们的rtp定位符丢失之后,机顶盒应该如何在不重新建联的情况下,保证后面的播放?
1.定位符$(0x24)这部分丢失,也就是不知道信道,也不知道长度,由于是tcp,无法知道下一个定位符在哪。
2.如果遍历后面的报文,可能是媒体,也可能是信令,则0x24可能会找错,比如媒体数据里面有0x24.
3.定位符丢失的原因可能是因为前面的rtp媒体数据丢失,后面连着一个定位符,但是被机顶盒解码为媒体数据,这样相当于后面那个定位符就丢失了。
4.tcp按道理是不会丢包,但是由于用户态在多次tryagain的时候,到时间就可能需要发送下一个报文了(处于实时性考虑),这样就出现了丢包现象。
 
解决方法:
媒体服务器发包的时候,保证原子性,因为tcp会重传,那么唯一丢失rtp定位符是的可能条件是,应用程序在发包的时候,发送到定位符部分,而socket由于buf是满的,
会导致我们应用程序重试,假设那段时间一直重试失败,则有可能导致发送下一个报文。这就要求在tcp发送的时候,必须一直重试,而在udp的时候,可以重试几次后
发送下一个报文,因为udp的是有界的。

一个RTSP/RTP over TCP 的丢包引起的问题的更多相关文章

  1. RTSP - RTP over TCP

    RTP over RTSP(TCP)(一)   RTP over RTSP包混合发送的解决办法   RTSP - RTP over TCP     To use TCP communication, ...

  2. TCP通信丢包原因总结

    今天在公司问老大,公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉包的问题,TCP是基于不可靠的网络实现可靠 ...

  3. MTU-TCP/IP协议栈-linux kernel-TCP丢包重传-UDP高性能-AI- ip数据报 tcp数据报

    1.IP协议首部 TCP报文段的首部  UDP分组结构   ip数据报 tcp数据报 UDP校验 w 报文长度该字段指定UDP报头和数据总共占用的长度.可能的最小长度是8字节,因为UDP报头已经占用了 ...

  4. MTU-TCP/IP协议栈-linux kernel-TCP丢包重传-UDP高性能-AI-

    http://view.inews.qq.com/a/20161025A0766200窄带时代的QQQQ是窄带时代极具代表性的产品,在那个网络传输效率比较低的年代,大家还记得Google的首页吗?Go ...

  5. TCP通信粘包问题分析和解决

    转载至https://www.cnblogs.com/kex1n/p/6502002.html 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发 ...

  6. 丢包 ICMP

    小结: 1.ICMP 常见网络丢包故障分析及处理 云极安 云极安 2019-12-25 我们在管理维护网络的过程中经常会遇到数据包丢失的现象.使用Ping命令进行连通性测试,则会发现Ping包延时远远 ...

  7. 数据包判断是否丢包 ping+tracert+mtr

    1.用咱们最常用的Ping命令来查看是不是真的丢包了 这里可以看到数据包发送了4个,返回了4个,丢失=0  证明没有丢失 也有可能中间路由做了策略不给ICMP的回应 这样就ping没法判断了  正常情 ...

  8. 网络损伤仪WANsim中关于丢包的介绍

    网络损伤仪WANsim中的4种丢包模型 丢包是指在网络上传输的数据包无法到达指定目的地.丢包在广域网中是一个很常见的问题.想要模拟出真实的广域网环境,对丢包的精确模拟是必不可少的. 在网络损伤仪WAN ...

  9. 记录一个UDP收包丢包的问题

    这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏. 分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分 ...

随机推荐

  1. 剑指Offer 11. 二进制中1的个数 (其他)

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目地址 https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040e ...

  2. Object.create(null)、Object.create({})、{} 三者创建对象的区别

    参考 1.先看看我们经常使用的{}创建的对象是什么样子的: var o = {a:1}; console.log(o) 从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnProp ...

  3. Spring3(一) 控制反转(IoC)和依赖注入(DI)

    几个常用框架之间的关系 1       spring框架概述 1.1   什么是spring Spring是一个开源.轻量级的Java 开发框架.框架的主要优势之一就是其分层架构,分层架构允许使用者选 ...

  4. 【leetcode】448. Find All Numbers Disappeared in an Array

    problem 448. Find All Numbers Disappeared in an Array solution: class Solution { public: vector<i ...

  5. WEBBASE篇: 第八篇, JavaScript知识2

    JavaScript 2 一,数据类型: 作用: 约束了数据在内存中所占空间大小问题的: JS数据类型分类: 基本数据类型(值类型) (1) number 类型: 数字类型,可以表示32位的整数或64 ...

  6. scanf连续输入字符,中间不要忘记\n

    #include <stdio.h> int main(void) { int precipitating; int temperature; printf("\nInput p ...

  7. Linux LVM使用小记

    对于Linux LVM一直不太理解,直到最近使用了简单功能后才稍微明白点. 对于硬盘空间物理上的使用,我们都是先对硬盘进行分区,然后格式化成文件系统支持的类型,最后给操作系统使用.但是这种使用方式很不 ...

  8. R语言中的字符串处理函数

    内容概览   尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串有时候也会在数据分析中占到相当大的份量.   R语言是一个擅长处理数据的语言,但是也不可避免的需要处理一些字符串(文本数据).如何高 ...

  9. java应用:向用户注册的邮箱发送邮件

    实现功能 忘记密码,注册成功等向用户发送验证码信息或注册信息. 业务流程 忘记密码: 1.验证邮箱是否注册过: 2.向邮箱发送验证码: 3.验证验证码是否正确: 4.重新设置密码: 我这里着重介绍发送 ...

  10. windows 2008R2系统程序运行提示无法定位程序输入点ucrtbase.terminate

    1.用python写了个脚本,打成exe程序,在一些机器上正常运行,再另外一些机器上运行提示 无法定位程序输入点ucrtbase.terminate 应该是缺少库文件支持 2.网上搜了下.https: ...