[Lemei Huang-Notes] NDN-RTC

2017-10-10

Posted by 黄乐玫

Problem

实现一个能在NDN网络里进行实时视频通讯的协议,实时视频app可以利用该协议进行通讯。属于NDN video streaming领域。

Issue

想实现的是低延迟多人视频会议这样的功能

与直播相比:直播是一Producer多consumer,而视频会议是多consumer多producer

Related Work

IP里Video Streaming

点播

  • RTSP RTP 和 RTCP
    RTSP发起/终结流媒体、RTP传输流媒体数据 、RTCP对RTP进行控制,同步。
  • 高低水位

直播

两种方式:

  1. UDP+组播:缺点有UDP不可靠、组播协议部署得不好、TCP更容易穿过防火墙等
  2. TCP+多个单播:不利于scalability

实时会议

特点:双向通话、低延迟要求、传输单元更小(大了延迟高)、缓冲区更小(缓冲区越长能容忍的延迟越长)
为了减小延迟在IP包里还会打tag,提高优先级之类的

  • VOIP:电话内容封装在IP包里通过网络传递
    有许多协议,拿SID举例,每个实体都有个SID proxy,要语音时,两个proxy之间先携带RTP地址以及其他信息等进行沟通,同意之后,再通过RTP传输媒体。

主要都是sender-driven的端到端,当参与人数多的时候就会出问题。
例如,有4个人参与,两两需要建立连接。

NDN里的Video Streaming

NDN Video

NDN里的流媒体传输,支持随机访问

NDNlive and NDNtube

前者是一Producer多Consumer直播,后者算是点播吧
是对NDN Video的改进:

  1. NDN Video里的媒体内容是封装成固定长度的段,这样不好是视频音频难以同步,而且会出现线头阻塞【靠前但是后来的视频被靠后但是先到的音频阻塞?】。本文里是先按视频的帧分,再把帧分成段。

    Voice-over-CCN

  2. 建立联系:通过命名机制完成,先是/目标/sid/具体信息,这样会被FIB引到目标,然后目标检查内容名字里的信息,作出回应,回应塞在Data包里。
  3. 传输数据:Interest请求名字为/目标/call-id/rtp/seg,callid是之前建立联系的时候所得到的。

Idea

每个流媒体分为一帧一帧,每一帧分为若干个段在NDN里传输。

Producer

主要负责发布媒体,给媒体命名

命名

key和delta分开命名
metadata命特殊的名

Data

数据包内除了媒体载荷,还会附加一些header,里面是些元数据
【frame+frame header】被切割成若干段,每段有个seg header。seg 0 包括frame头。
frame header里记录的是媒体信息,比如当前速率等。
seg记录一些其他信息,比如Interest的nonce,加上Interest到达Producer的时刻,这样Consumer可以估计单程时间。

Consumer

目的希望减小延迟,所以先一次撒出去N个,多退少补。
需要让Interest在Data出现之前到Producer,不然会增加延迟。但是Interest的产生不能太频繁,否则会被PIT抑制住。

Buffer用来重排段,组合段成帧,再解码播放。
retransmission

如何判断是不是最新的,看Data到来间隔

读取最新:Interest希望能命中最新的内容,所以决定发一大堆Interest来更新沿路的cache
采用了拥塞控制的某个方法,希望放出去更新的Interest不要过多(通信太多,更新太快,Interest等的时间久),也不要过少。