自治区建设厅官方网站,重庆公司名字,南阳网站排名公司,wordpress百度搜索不到前言
本文档是 RFC 3550 - RTP: A Transport Protocol for Real-Time Applications完整标准文档的中文翻译。技术术语保持与IETF官方翻译一致#xff0c;代码示例和语法保持原样#xff0c;包含所有关键技术和实现细节#xff0c;格式和结构遵循原RFC文档
注意#xff1a…前言本文档是 RFC 3550 - RTP: A Transport Protocol for Real-Time Applications完整标准文档的中文翻译。技术术语保持与IETF官方翻译一致代码示例和语法保持原样包含所有关键技术和实现细节格式和结构遵循原RFC文档注意实际实现时应参考英文原版RFC 3551文档原标准文档https://www.rfc-editor.org/rfc/rfc3550RFC 3550 - RTP实时应用的传输协议网络工作组H. Schulzrinne, S. Casner, R. Frederick, V. Jacobson征求意见稿3550分类标准跟踪废弃1889发布日期2003年7月更新者5506, 5761, 6051, 6222, 7022, 7160, 7164, 8083, 8108摘要本文档描述了实时传输协议RTP该协议用于在单播或多播网络中传输实时数据如音频、视频或模拟数据。RTP不保证实时服务但通过与实时控制协议RTCP结合使用可以提供数据传输的监控并支持多播传输中的最低程度控制。RTP和RTCP被设计为独立于底层传输层和网络层。该协议支持使用RTP转换器和混合器的应用级组播。RTP承载实时数据而RTCP监控数据传输质量并传递有关参与者的信息。RTP和RTCP被设计为独立工作但通常成对使用。RTP承载媒体流RTCP承载监控数据。目录引言术语RTP使用场景定义字节序、对齐和时间格式RTP数据传输协议RTP控制协议RTCPRTP转换器和混合器分层编码轮廓和载荷格式规范安全拥塞控制与RFC 1889的区别致谢参考文献作者地址完整版权声明1. 引言1.1 概述实时传输协议RTP为实时应用提供端到端的网络传输功能适用于组播或单播网络服务。RTP不保证服务质量但通过与实时控制协议RTCP配合使用可以监控数据传输质量并提供流同步和参与者标识等机制。1.2 协议特点RTP的关键特性包括载荷类型标识标识载荷的编码格式序列号检测丢包和恢复数据顺序时间戳支持接收端的定时和同步源标识支持多个数据源监控功能通过RTCP提供服务质量反馈1.3 与其他协议的关系RTP通常运行在UDP之上也可以与其他适当的网络或传输协议一起使用。RTP不假设底层网络是否可靠也不保证按序传输。2. 术语2.1 基本术语RTP会话一组参与者通过RTP通信RTP流单个源的RTP数据包序列同步源SSRCRTP包流的源由32位标识符标识贡献源CSRC对混合流有贡献的源RTP数据包通过RTP传输的数据包RTCP数据包控制信息的数据包参与者参与RTP会话的应用或终端轮廓一组规则定义了特定应用如何使用RTP2.2 协议术语载荷RTP包中的实际数据载荷格式载荷数据的编码方式时间戳载荷采样时刻的时间表示序列号包在流中的位置标识抖动包到达时间的变化往返时间信号从发送到返回的时间3. RTP使用场景3.1 简单多播音频会议参与者1 (SSRC1) ↓ RTP音频流 混合器 (SSRC100) ↓ 混合流 所有参与者 (SSRC100) ↑ RTCP报告3.2 音频和视频会议音频流 (SSRC1) 视频流 (SSRC2) ↓ ↓ 混合器 转换器 ↓ ↓ 参与者1 参与者2 ↑ ↑ RTCP音频报告 RTCP视频报告3.3 混合器和转换器混合器接收多个流混合后产生新流转换器改变流的编码格式但不混合RTP级中继器转发包而不修改SSRC4. 定义4.1 RTP数据包格式/* * RTP固定头格式12字节 */typedefstruct{unsignedintversion:2;/* 协议版本 */unsignedintpadding:1;/* 填充标志 */unsignedintextension:1;/* 扩展标志 */unsignedintcsrc_count:4;/* CSRC计数 */unsignedintmarker:1;/* 标记位 */unsignedintpayload_type:7;/* 载荷类型 */uint16_tsequence_number;/* 序列号 */uint32_ttimestamp;/* 时间戳 */uint32_tssrc;/* 同步源标识符 */uint32_tcsrc[15];/* 贡献源列表可选 */}rtp_header_t;4.2 RTP载荷类型PT编码名称时钟频率声道数0PCMU (G.711 mu-law)800013GSM800014G723800015DVI4 (8 kHz)800016DVI4 (16 kHz)1600017LPC800018PCMA (G.711 A-law)800019G7228000110L16 (立体声)44100211L16 (单声道)44100114MPA (MPEG音频)90000126JPEG90000131H26190000132MPV (MPEG视频)90000133MP2T90000134H263900001注动态载荷类型96-127由应用定义5. 字节序、对齐和时间格式5.1 字节序所有整数字段按**网络字节序大端序**传输16位字段高位字节在前32位字段高位字节在前5.2 对齐RTP数据包头在32位边界上对齐以提高处理效率。5.3 时间格式时间戳表示采样时刻单位由载荷类型决定音频采样周期如1/8000秒视频帧周期如1/90000秒时间戳的初始值是随机的增加速率与采样时钟同步。6. RTP数据传输协议6.1 RTP固定头字段详解6.1.1 版本V2位当前版本为2二进制106.1.2 填充P1位指示包尾是否有填充字节填充字节的最后一个字节包含填充字节数6.1.3 扩展X1位指示固定头后是否有扩展头6.1.4 CSRC计数CC4位指示CSRC标识符的数量0-156.1.5 标记M1位载荷类型相关如视频帧边界6.1.6 载荷类型PT7位标识载荷格式见4.2节6.1.7 序列号16位每发送一个RTP包增加1初始值随机选择用于检测丢包6.1.8 时间戳32位反映采样时刻时钟频率取决于载荷格式用于同步和抖动计算6.1.9 SSRC32位同步源标识符全局唯一在单个RTP会话内随机选择冲突概率低6.1.10 CSRC列表0-15个32位标识符标识对混合流有贡献的源6.2 RTP扩展头/* * RTP扩展头格式 */typedefstruct{uint16_tprofile;/* 扩展标识符 */uint16_tlength;/* 扩展数据长度32位字 */uint32_tdata[0];/* 扩展数据 */}rtp_extension_t;6.3 RTP载荷格式要求载荷格式规范必须定义载荷类型到编码名称的映射时间戳时钟频率打包规则视频载荷通常包含帧边界信息使用M位时间戳增量规则音频载荷通常包含采样时钟频率打包持续时间6.4 RTP传输要求底层协议通常使用UDP端口分配RTP使用偶数端口RTCP使用下一个奇数端口MTU考虑应避免IP分片服务质量可以结合DiffServ、RSVP等6.5 混合器处理规则混合器必须生成新的SSRC标识符维护CSRC列表调整时间戳和序列号可能重新打包载荷6.6 转换器处理规则转换器必须保持SSRC不变更新载荷类型适当调整时间戳可能需要缓冲和重新定时7. RTP控制协议RTCP7.1 RTCP包格式所有RTCP包以固定头开始/* * RTCP公共头格式 */typedefstruct{unsignedintversion:2;/* 协议版本始终为2 */unsignedintpadding:1;/* 填充标志 */unsignedintcount:5;/* 变体取决于包类型 */uint8_tpacket_type;/* RTCP包类型 */uint16_tlength;/* 包长度32位字减1 */}rtcp_common_header_t;7.2 RTCP包类型类型缩写名称用途200SR发送方报告发送方传输和接收统计201RR接收方报告接收方接收统计202SDES源描述项源描述信息CNAME、NAME等203BYE再见结束参与通知204APP应用定义应用特定功能205RTPFBRTP反馈通用RTP反馈消息RFC 4585206PSFB载荷特定反馈载荷特定反馈消息RFC 45857.3 发送方报告SR格式/* * RTCP发送方报告SR格式 */typedefstruct{rtcp_common_header_theader;/* 类型200count报告块数 */uint32_tssrc;/* 发送方SSRC */uint32_tntp_sec;/* NTP时间戳 - 秒 */uint32_tntp_frac;/* NTP时间戳 - 小数部分 */uint32_trtp_timestamp;/* RTP时间戳 */uint32_tpacket_count;/* 发送的RTP包数 */uint32_toctet_count;/* 发送的字节数 *//* 零个或多个接收报告块 */struct{uint32_tssrc;/* 源的SSRC */uint8_tfraction_lost;/* 自上次SR以来的丢包比例 */int32_tpackets_lost;/* 累计丢包数 */uint32_thighest_seq;/* 接收到的最高序列号 */uint32_tjitter;/* 抖动估计 */uint32_tlsr;/* 最后SR时间戳 */uint32_tdlsr;/* 最后SR延迟 */}report_blocks[31];}rtcp_sr_t;7.4 接收方报告RR格式/* * RTCP接收方报告RR格式 */typedefstruct{rtcp_common_header_theader;/* 类型201count报告块数 */uint32_tssrc;/* 接收方SSRC *//* 零个或多个接收报告块 */struct{uint32_tssrc;/* 源的SSRC */uint8_tfraction_lost;/* 丢包比例 */int32_tpackets_lost;/* 累计丢包数 */uint32_thighest_seq;/* 接收到的最高序列号 */uint32_tjitter;/* 抖动估计 */uint32_tlsr;/* 最后SR时间戳 */uint32_tdlsr;/* 最后SR延迟 */}report_blocks[31];}rtcp_rr_t;7.5 SDES包格式/* * RTCP源描述SDES格式 */typedefstruct{rtcp_common_header_theader;/* 类型202count源数 */struct{uint32_tssrc;/* 源SSRC *//* SDES项列表以零项结束 */struct{uint8_ttype;/* SDES项类型 */uint8_tlength;/* 文本长度 */chartext[0];/* 文本内容 */}items[0];}chunks[31];}rtcp_sdes_t;SDES项类型1: CNAME规范名称- 必须2: NAME用户名称- 可选3: EMAIL电子邮件- 可选4: PHONE电话号码- 可选5: LOC地理位置- 可选6: TOOL应用/工具- 可选7: NOTE状态通知- 可选8: PRIV私有扩展- 可选7.6 BYE包格式/* * RTCP再见BYE格式 */typedefstruct{rtcp_common_header_theader;/* 类型203count源数 */uint32_tssrc[31];/* 退出的源SSRC列表 */charreason[0];/* 可选的原因字符串 */}rtcp_bye_t;7.7 APP包格式/* * RTCP应用定义APP格式 */typedefstruct{rtcp_common_header_theader;/* 类型204count子类型 */uint32_tssrc;/* 源SSRC */charname[4];/* 应用名称4个ASCII字符 */chardata[0];/* 应用相关数据 */}rtcp_app_t;7.8 RTCP传输间隔7.8.1 计算规则RTCP包应定期发送间隔根据以下公式计算T max(T_min, N * C * avg_rtcp_size / bw)其中T 计算出的传输间隔T_min 最小间隔推荐5秒N 参与者数量C 带宽参数见下表avg_rtcp_size 平均RTCP包大小bw 会话带宽7.8.2 带宽分配会话带宽发送者比例接收者比例 1000 bps100%0%≥ 1000 bps25%75%7.8.3 时间随机化为避免同步实际间隔应随机化actual_T T * (random() * 0.5 0.5)7.8.4 逆向重新考虑算法新参与者初始间隔T T_min * (random() * 1.5 1)7.9 SSRC标识符分配与冲突7.9.1 分配规则随机选择SSRC应为随机32位值唯一性在RTP会话内必须唯一冲突检测通过RTCP监视冲突7.9.2 冲突处理检测到冲突时相同SSRC数据源冲突发送BYE包选择新SSRC监控冲突如果来自不同网络地址保持两者7.9.3 环路检测当收到自己发送的包时发送BYE包选择新的SSRC继续参与会话7.10 源描述SDES信息7.10.1 CNAME要求每个参与者必须有CNAME唯一标识参与者跨多个媒体流保持一致格式建议userhost7.10.2 CNAME格式推荐格式CNAME user host其中user 登录名或其他标识host 完全限定域名或IP地址示例aliceexample.com 192.0.2.17.11 RTCP传输要求7.11.1 复合包RTCP包应作为复合包发送顺序为SR或RR必须额外RR如有SDES包括CNAME其他BYE、APP等7.11.2 大小限制复合包不应超过路径MTUIPv4≤ 1456字节1500 - 20 - 8 - 16IPv6≤ 1232字节1280 - 40 - 8 - 07.11.3 加密和认证如果使用安全RTPSRTPRTCP包应单独加密应保持复合包结构8. RTP转换器和混合器8.1 混合器操作混合器接收多个RTP流混合后产生新流输入流1 (SSRC1) ──┐ 输入流2 (SSRC2) ──┼→ 混合器 (SSRC100) → 输出流 (SSRC100) 输入流3 (SSRC3) ──┘混合器必须生成新的SSRC100在CSRC列表中包含源SSRC1,2,3调整时间戳到统一时间线重新计算序列号8.2 转换器操作转换器改变编码格式但不混合流输入流 (SSRC1, PT0) → 转换器 → 输出流 (SSRC1, PT8) (PCMU→PCMA)转换器必须保持SSRC不变1更新载荷类型0→8适当调整时间戳可能需要缓冲8.3 RTCP处理8.3.1 混合器的RTCP处理混合器应转发原始发送者的RTCP报告生成自己的接收报告作为新源发送SR报告8.3.2 转换器的RTCP处理转换器应透明转发RTCP包不修改SSRC字段可能更新时间戳相关字段9. 分层编码9.1 基本概念分层编码将媒体流分为多个层基础层最低质量必须接收增强层提高质量可选接收9.2 RTP中的分层编码使用不同的RTP流传输各层基础层 (SSRC1, PT96) 增强层1 (SSRC2, PT97) 增强层2 (SSRC3, PT98)9.3 同步机制通过RTCP关联各层相同的CNAME标识时间戳关联载荷类型指示层次10. 轮廓和载荷格式规范10.1 轮廓定义轮廓是一组规则定义载荷类型分配静态或动态时间戳时钟频率音频、视频等RTP头字段使用M位含义等打包规则帧边界处理10.2 音频视频轮廓AVPRTP/AVPAudio/Video Profile静态载荷类型0-35动态载荷类型96-127默认时钟频率见4.2节10.3 载荷格式规范要求载荷格式规范必须定义编码算法如H.264、AACRTP打包载荷在包中的组织时间戳使用时钟频率、增量标记位使用帧边界指示分片规则大帧的分片方法11. 安全11.1 安全RTPSRTPSRTP提供机密性AES加密消息认证HMAC-SHA1重放保护序列号检查11.2 安全考虑认证防止欺骗攻击加密保护隐私完整性防止篡改重放保护防止重放攻击11.3 密钥管理推荐使用MIKEY多媒体互联网密钥交换SDES会话描述协议安全描述ZRTPZRTP密钥协商协议12. 拥塞控制12.1 基本要求RTP应用必须实施拥塞控制带宽适应根据网络条件调整速率公平性与其他流公平共享带宽响应性快速响应网络变化12.2 技术机制速率控制调整编码比特率优先级调整分层编码中丢弃增强层帧率调整降低视频帧率分辨率调整降低视频分辨率12.3 RTCP反馈RTCP提供丢包率网络拥塞指示抖动网络延迟变化往返时间路径延迟13. 与RFC 1889的区别RFC 3550替代RFC 1889主要区别13.1 澄清和修正RTCP间隔计算澄清了带宽分配SSRC冲突处理改进冲突解决算法CNAME格式推荐具体格式13.2 新功能分层编码支持明确支持扩展机制更好的扩展支持安全集成与SRTP集成13.3 向后兼容完全向后兼容但推荐更新实现。14. 致谢感谢以下人员的贡献Van Jacobson原始设计Steve Casner编辑Ron Frederick实现以及IETF AVT工作组的成员15. 参考文献15.1 规范参考文献[1] Postel, J., “User Datagram Protocol”, STD 6, RFC 768.[2] Postel, J., “Internet Protocol”, STD 5, RFC 791.[3] Schulzrinne, H., “RTP Profile for Audio and Video Conferences with Minimal Control”, RFC 3551.[4] Baugher, M., “The Secure Real-time Transport Protocol (SRTP)”, RFC 3711.15.2 信息参考文献[5] Schulzrinne, H., Casner, S., Frederick, R., and V. Jacobson, “RTP: A Transport Protocol for Real-Time Applications”, RFC 3550.[6] Handley, M., “Session Announcement Protocol”, RFC 2974.[7] Rosenberg, J., “SIP: Session Initiation Protocol”, RFC 3261.16. 作者地址Henning Schulzrinne Dept. of Computer Science Columbia University 1214 Amsterdam Avenue New York, NY 10027 USA Email: schulzrinnecs.columbia.edu Stephen L. Casner Packet Design 3400 Hillview Avenue Palo Alto, CA 94304 USA Email: casneracm.org Ron Frederick Blue Coat Systems, Inc. 650 Almanor Avenue Sunnyvale, CA 94085 USA Email: ronfbluecoat.com Van Jacobson Packet Design 3400 Hillview Avenue Palo Alto, CA 94304 USA Email: vanpacketdesign.com17. 完整版权声明Copyright © The Internet Society (2003). All Rights Reserved.This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.This document and the information contained herein is provided on an “AS IS” basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.附录ARTP实现示例A.1 简单音频发送器#includestdint.h#includenetinet/in.h#defineRTP_VERSION2#defineRTP_PAYLOAD_TYPE_PCMU0#defineAUDIO_SAMPLE_RATE8000typedefstruct{uint8_tversion:2;uint8_tpadding:1;uint8_textension:1;uint8_tcsrc_count:4;uint8_tmarker:1;uint8_tpayload_type:7;uint16_tsequence_number;uint32_ttimestamp;uint32_tssrc;}rtp_header_t;voidsend_rtp_packet(intsockfd,structsockaddr_in*dest,uint16_tseq,uint32_tts,uint32_tssrc,uint8_t*payload,size_tpayload_len){rtp_header_theader;uint8_tpacket[1500];// 填充RTP头header.versionRTP_VERSION;header.padding0;header.extension0;header.csrc_count0;header.marker0;header.payload_typeRTP_PAYLOAD_TYPE_PCMU;header.sequence_numberhtons(seq);header.timestamphtonl(ts);header.ssrchtonl(ssrc);// 复制头和数据到包缓冲区memcpy(packet,header,sizeof(header));memcpy(packetsizeof(header),payload,payload_len);// 发送包sendto(sockfd,packet,sizeof(header)payload_len,0,(structsockaddr*)dest,sizeof(*dest));}A.2 简单音频接收器voidreceive_rtp_packet(intsockfd){uint8_tbuffer[1500];rtp_header_t*header;ssize_tlen;lenrecv(sockfd,buffer,sizeof(buffer),0);if(lensizeof(rtp_header_t))return;header(rtp_header_t*)buffer;// 验证版本if(header-version!RTP_VERSION)return;// 提取字段网络字节序转换uint16_tseqntohs(header-sequence_number);uint32_ttsntohl(header-timestamp);uint32_tssrcntohl(header-ssrc);uint8_tpayload_typeheader-payload_type;// 处理载荷uint8_t*payloadbuffersizeof(rtp_header_t);size_tpayload_lenlen-sizeof(rtp_header_t);// 解码和播放音频play_audio(payload,payload_len,payload_type);}A.3 RTCP发送方报告生成typedefstruct{uint8_tversion:2;uint8_tpadding:1;uint8_tcount:5;uint8_tpacket_type;uint16_tlength;}rtcp_common_header_t;typedefstruct{rtcp_common_header_theader;uint32_tssrc;uint32_tntp_sec;uint32_tntp_frac;uint32_trtp_timestamp;uint32_tpacket_count;uint32_toctet_count;}rtcp_sr_t;voidsend_rtcp_sr(intsockfd,structsockaddr_in*dest,uint32_tssrc,uint32_tntp_sec,uint32_tntp_frac,uint32_trtp_ts,uint32_tpkt_count,uint32_toctet_count){rtcp_sr_tsr;// 填充SR包sr.header.versionRTP_VERSION;sr.header.padding0;sr.header.count0;// 无报告块sr.header.packet_type200;// SRsr.header.lengthhtons((sizeof(sr)/4)-1);sr.ssrchtonl(ssrc);sr.ntp_sechtonl(ntp_sec);sr.ntp_frachtonl(ntp_frac);sr.rtp_timestamphtonl(rtp_ts);sr.packet_counthtonl(pkt_count);sr.octet_counthtonl(octet_count);sendto(sockfd,sr,sizeof(sr),0,(structsockaddr*)dest,sizeof(*dest));}A.4 抖动计算示例#defineMAX_JITTER_BUFFER1000// 毫秒typedefstruct{uint32_tlast_timestamp;uint32_tlast_arrival;floatjitter;}jitter_calculator_t;voidupdate_jitter(jitter_calculator_t*jc,uint32_ttimestamp,uint32_tarrival_time){if(jc-last_timestamp0){jc-last_timestamptimestamp;jc-last_arrivalarrival_time;jc-jitter0.0;return;}// 计算传输延迟差异int32_td(arrival_time-jc-last_arrival)-(timestamp-jc-last_timestamp);if(d0)d-d;// 使用指数加权移动平均jc-jitterjc-jitter(1.0/16.0)*((float)d-jc-jitter);// 更新状态jc-last_timestamptimestamp;jc-last_arrivalarrival_time;}附录B常见问题解答B.1 RTP与TCP的区别特性RTPTCP可靠性不可靠可靠顺序保证不保证保证实时性优化实时不优化实时拥塞控制应用层控制内置控制用途实时媒体可靠数据传输B.2 如何选择RTP载荷类型静态类型0-35标准编码动态类型96-127通过信令协商选择原则使用标准编码时选静态类型自定义编码时用动态类型通过SDP或RTSP协商B.3 RTP时间戳同步音频同步使用采样时钟视频同步使用帧率时钟多流同步相同CNAME标识相关流RTCP提供NTP时间参考接收端调整播放时间B.4 处理网络抖动接收缓冲缓存一定量数据播放调整动态调整播放点丢包隐藏使用前向纠错或插值B.5 实现建议SSRC选择使用高质量的随机数生成器时间戳初始化随机初始值防止预测RTCP带宽不超过会话带宽的5%安全考虑始终考虑使用SRTP重要说明实现合规应遵循RFC 3551RTP/AVP轮廓互操作性测试与其他实现的互操作性性能优化考虑使用硬件加速安全更新关注SRTP相关安全更新