Problem
实现一个能在NDN网络里进行实时视频通讯的协议,实时视频app可以利用该协议进行通讯。属于NDN video streaming领域。
Issue
想实现的是低延迟多人视频会议这样的功能
与直播相比:直播是一Producer多consumer,而视频会议是多consumer多producer
IP里Video Streaming
点播
- RTSP RTP 和 RTCP
RTSP发起/终结流媒体、RTP传输流媒体数据 、RTCP对RTP进行控制,同步。
- 高低水位
直播
两种方式:
- UDP+组播:缺点有UDP不可靠、组播协议部署得不好、TCP更容易穿过防火墙等
- 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的改进:
- NDN Video里的媒体内容是封装成固定长度的段,这样不好是视频音频难以同步,而且会出现线头阻塞【靠前但是后来的视频被靠后但是先到的音频阻塞?】。本文里是先按视频的帧分,再把帧分成段。
Voice-over-CCN
- 建立联系:通过命名机制完成,先是
/目标/sid/具体信息
,这样会被FIB引到目标,然后目标检查内容名字里的信息,作出回应,回应塞在Data包里。
- 传输数据: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等的时间久),也不要过少。