RTP over RTSP包混合发送的解决办法

    RTP和RTSP混合发生的意思是两路信息使用同一端口,这是因为方便端口映射。也就是说这个端口既要传送RTSP控制命令又要传输码流数据,但这也带来一个问题,由于TCP是无边界识别的,接收到数据后,我们如何分出RTSP数据和RTP数据?

 

1 禁用negle算法,防止TCP数据的粘合

 

    现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle算法。

 

    另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,其方式正好同TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。

 

  int nodelay = 1;

  setsockopt(connfd,IPPROTO_TCP,TCP_NODELAY,&nodelay,sizeof(nodelay));

  int KeepAlive1=0;

  setsockopt(connfd, SOL_TCP, TCP_CORK, (char*)&KeepAlive1, sizeof(int))

    这样发出去的每个包要么是RTSP包,要么是RTP包,防止了两种包粘合在一起,造成接收端无法拆分。

2 码流中嵌入二进制数据

    关于RTP包如何切片的问题,在每个包的第一个字节填充$(0x24),第二个字节可以定位为设备的通道号,第三、四个字节为RTP包的长度。

 

总结:关于设置socket的属性:由于socket的属性可能只满足某些特定的应用情况,如它默认的方法就是使用negle算法,需要将包组合到一定大小后发送,这可能对性能会有所影响,同时接收后也要进行一些分包操作。不满足RTSP和RTP混合发生的情况。还有需要设置缓冲区保证网络传输的的流畅性等等。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值