首页 > 编程知识 正文

RTCP协议,rtp协议详解

时间:2023-05-04 06:36:02 阅读:153479 作者:1424

接收方将未接收到的数据包编号全部通过反馈消息通知发送方并重新发送。

通过相对ARQ改善:可以减少反馈分组的频率和带宽的占用,同时可以比较及时地向发送侧通知分组丢失的重发。

NACK消息的定义在[rfc4585]文档中定义。

RTCP的反馈分组报头被定义为: FMT和PT确定消息的类型,FCI是该消息的具体负载:

version(v ) : 2位此字段标识RTP版本。 现在的版本是2

如果设置了padding(p ) : 1位,则填充位表示包末尾的其他填充八位包含在长度字段中,而不是控制信息中。

feedbackmessagetype(fmt ) : 5 bits此字段标识FB消息的类型,并且是传输层、有效载荷特定层或APP应用层的反馈。 每个值的三种反馈类型在各自的部分中定义如下:

payloadtype(pt ) 3: 8 bits这是一种RTCP数据包类型,将数据包标识为RTCP FB消息。 IANA定义了两个值3360

Length: 16 bits包括该分组的长度(以32比特字为单位,长度减去1 )和填充量。 这与定义RTCP发送方和接收方报告时使用的长度字段相匹配。

SSRC of packet sender: 32 bits此消息的始发者的同步源标识符包。

SSRC of media source: 32 bits媒体源的同步源标识符。

协议中规定的NACK反馈消息的PT=205、FMT=1、FCI的格式如下(

这里的设计很巧妙,可以一次携带多个连续数据包的丢包情况。

packetid(PID ) : 16 bits PID字段用于指定丢失的包。 PID字段显示丢失包的RTP序列号。

bitmaskoffollowinglostpackets (BLP ) : 16 bits BLP可以报告紧接在PID指示的RTP分组之后的16个RTP分组中的任何一个的丢失。 如果接收方将位掩码的位I设置为1,则表示编号(PID i )的RTP包已丢失。 否则,将位I设定为0。

NACK数据捕获包

以下是RTCP数据包,红色框内是NACK数据。

使用wireshark进行以下分析:

根据丢失的RTP包序列号计算PID和BLP

staticvoidcheck _ for _ seq _ number _ gap _ immediate (RTP session * session,rtp_header_t *rtp ) uint16_tPPP/* don ' tcheckanythingbeforefirstpacketdelivered */session-flag srtp _ session _ first _ packet _ delivered RTP _ seq _ is _ strictly _ greater _ than (RTP-seq ) _ seq _ is _ strictly _ greater _ than (RTP-seq _ number,session-RTP.) )。 uint16_t diff; if (first _ missed _ seq=session-RTP.snd _ last _ nack ) first _ missed _ seq=session-RTP.snd _ last _ sed pid=first_missed_seq; for(I=0; I=(diff/16; I ) {uint16_t seq; uint16_t blp=0; for(seq=PID1; (seq rtp-seq_number ) ) )-PID ) 16; seq ) ) BLP|=(1) seq-PID-1 ); }if(session-RTP.congdetect!=null session-RTP.cong detect-state==congestionstatedetected ) {/** donotsendnackinimmediate _ nackmodeincongestiongbecausetheretransmissionbytheotherpartyofthemissingpackets * willnecessarilyincreaseoratleastsustainthecongestion.* further manager due to the congestion,theretransmittedpacketshaveveveryfewew } RTP _ session _ send _ RTCP _ FB _ generic _ nack (session,pid,blp ); pid=seq; } if (RTP _ seq _ is _ strictly _ greater _ than ) RTP-seq_number,session-RTP.snd _ last _ nack (/* weue )

从PID和BLP获取丢失的RTP分组序列号

staticvoidgeneric _ nack _ received (constortpeventdata * evd,OrtpNackContext *ctx ) if(rtcp_is_RTPFB ) evd-Corte uint16_t pid、blp、seq; mblk_t *lost_msg;/* getrtptransportfromsession */RTP _ session _ get _ transports (CTX-session,rtpt,NULL ); fci=RTCP _ RTP FB _ generic _ nack _ get _ fci (evd-packet ); PID=RTCP _ FB _ generic _ nack _ fci _ get _ PID (fci; BLP=RTCP _ FB _ generic _ nack _ fci _ get _ BLP (fci ); BC tbx _ mutex _ lock (CTX-sent _ packets _ mutex ); lost _ msg=find _ packet _ with _ sequence _ number (CTX-sent _ packets,pid ); if(lost_msg!=null (meta _ RTP _ transport _ modifier _ inject _ packet _ to _ send (rtpt,ctx-rtp_modifier,lost _ msg ord ) ) } else { ortp _ warning (ortpnackcontext [ % p ] : cannotfindmissingpacketwithseq=% Hu ',ctx,pid ); (PID; for(seq=BLP; seq!=0; seq=1,pid(if ) seq=1) lost _ msg=find _ packet _ with _ sequence _ number ) CTX-sent_packets,PID; if(lost_msg!=null (meta _ RTP _ transport _ modifier _ inject _ packet _ to _ send (rtpt,ctx-rtp_modifier,lost _ msg ord ) ) } else { ortp _ warning (ortpnackcontext [ % p ] : cannotfindmissingpacketwithseq=% Hu ',ctx,pid ); } } BC tbx _ mutex _ unlock (CTX-sent _ packets _ mutex ); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。