WebRTC中RTP和RTCP共用一个UDP端口
WebRTC中的RTP和RTCP都使用udp传输,并且RTP和RTCP混合使用同一个udp端口,因为打通NAT本来就不是一件容易的事,如果还分开两个端口的话更增加程序复杂度和NAT打洞成功的难度。
WebRTC怎么区分RTP/RTCP包
webrtc/call/call.cc:
PacketReceiver::DeliveryStatus Call::DeliverPacket(
MediaType media_type,
rtc::CopyOnWriteBuffer packet,
const PacketTime& packet_time) {
RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
if (RtpHeaderParser::IsRtcp(packet.cdata(), packet.size()))
return DeliverRtcp(media_type, packet.cdata(), packet.size());
return DeliverRtp(media_type, std::move(packet), packet_time);
}
既然RTP和RTCP都使用同一个UDP端口,那么就要区分出收到的UDP包是RTP还是RTCP包,在上面代码中IsRtcp
判断了是否是RTCP包。
RTP/RTCP的相关代码在modules/rtp_rtcp
目录下。
RtpHeaderParser::IsRtcp
调用了RtpHeaderParser::RTCP()
判断是否RTCP包:
webrtc/modules/rtp_rtcp/source/rtp_utility.cc:
bool RtpHeaderPa