WebRtc与P2P

NAT(网络地址转换)是解决IPv4地址不足问题的关键技术,它允许内网主机通过一个公共IP地址访问公网。NAT分为静态、动态和NAPT等类型,其中对称NAT对通信限制最大。NAT穿透技术如STUN和TURN则用于在NAT环境下实现节点间的直接连接,ICE协议结合这些技术以优化连接建立。
摘要由CSDN通过智能技术生成

NAT

NAT(Network Address Translation,网络地址转换)允许一个整体机构以一个公用IP地址出现在Internet上,从而缓解IPV4网络地址不足的问题

NAT作用

  • NAT部署在网络出口的位置,位于内网跟公网之间,是连接内网主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的路由器叫NAT路由器,NAT路由器拥有公网IP.
  • NAT主要用来解决IPv4地址不够用的问题
    a) IPV4用32位表示网络地址,因此最多能表示2^32个
    b) 内网地址:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255这三个地址段分别处于A,B,C类地址段,仅能在内部使用,不能作为全球路由地址.
    c) NAT后面的内网主机使用内网地址,也叫本地地址,是主机上内网上的标识。内网主机要跟公网通信,必须经过NAT中转,NAT会自动为经过的网络包做内外网地址转换(这也是NAT的含义),公网地址是主机在互联网上的标识

NAT原理

  • 内网主机向外网主机发送的网络包,在经过NAT时,IP和PORT会被替换为NAT为该主机分配的外网IP/PORT,也就是该内网主机在NAT上的出口IP/PORT,外网主机收到该网络包后,会视该网络包是从NAT发送的;外网主机只能通过NAT为该内网主机分配的外网IP/PORT,向它发送网络包,内网主机的本地地址对外界不可见,网络包在经过NAT的时候,会被NAT做外网IP/PORT到内网IP/PORT的转换.
  • NAT维护内网主机内网地址和在NAT上为它分配的外网地址之间的映射关系,需要维护一张关联表。NAT在两个传输方向上做两次地址转化,出方向做源(Src)信息替换,入方向做目的(Dst)信息替换,内外网地址转换是在NAT上自动完成的.

NAT约束和限制

NAT把网络分为公网和内网,内网主机可以给外网主机直接发送网络包,而外网主机却不能主动给内网主机发送网络包,也就是说网络通信必须由内网侧主动发起(在路由端建立一个映射),公网主机不能主动访问内网主机.

NAT分类

基础型NAT
  • 静态NAT:在NAT转换时,为某一个或者某一组内局地址总是转换为固定的外局地址.
  • 动态NAT:将内部私有IP转换为公网IP地址时,IP的对应关系是不确定的.
NAPT(网络地址端口转换)
  • NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口.
  • 锥型NAT
    a) 完全锥型(Full Cone NAT):即一对一NAT,同一个内部地址只会映射相同的外部地址,映射完成后,目标IP端口都无限制,其他任何主机都可以通过该映射IP端口访问对应的内网主机.完全锥型NAT是最容易联通的NAT,因为只需要内部ip在NAT表中有申明过,则外部任意IP,端口均可以透过指定的IP、端口访问.
    b) 地址受限锥型(Restricted cone):同一个内部地址只会映射相同的外部地址,映射完成后,必须先发一个包给目标,然后才能收到目标回发的包,目标端口无限制.
    举例:
  1. client(192.168.1.10:2000)要通过NAT与server_1(210.15.27.100)通信
  2. client通过NAT向server_1发送一个包,NAT中生成映射(NAT:210.21.12.100:8000,server_1:210.15.27.100)
  3. server_1发送数据到client时,先将数据发送到NAT(210.21.12.100:8000),NAT会转到client,并且server_1主机的任意端口号都可以向client噶送数据.
  4. server_2不能与client通信,因为client并没有主动先发一包数据到server_2

c) 端口受限锥型(Port-restricted):和地址受限锥型类似,不同的是对端口有限制,即目标必须使用固定的端口与源通信.
举例:

  1. client(192.168.1.10:2000)要通过NAT与server_1(210.15.27.100:80)通信
  2. client通过NAT向server_1发送一个包,NAT中生成映射(NAT:210.21.12.100:8000,server_1:210.15.27.100:80)
  3. 此后server_1只能用210.15.27.100:80与client的192.168.1.10:2000通信,不能是server_1的其他端口,因为client没有主动发数据到其他端口
  4. server_2不能与client通信,因为client并没有主动先发一包数据到server_2
  • 对称NAT
    内部主机同一端口与不同的目标通信时会在NAT上映射不同的端口,只有曾经收到过内部主机数据包的外部主机端口才能将数据包发回.
    举例:
  1. client(192.168.1.10:2000)要通过NAT与server_1(210.15.27.100:80)和server_2(210.15.27.101:80)通信
  2. client向server_1发送一包数据,在NAT上生成映射(NAT:210.21.12.100:8000),client向server_2发送一包数据,在NAT上生成映射(NAT:210.21.12.100:8001)
  3. 此后srver_1只能使用210.15.27.100:80通过NAT的210.21.12.100:8000与client的192.168.1.10:2000通信,
    server_2只能使用210.15.27.101:80通过NAT的210.21.12.100:8001与client的192.168.1.10:2000通信
  4. server_2和server_2的其他端口均不能和client的192.168.1.10:2000通信
  • 锥型NAT和对称NAT区别
    对称NAT是一个请求对应一个端口,非对称NAT是多个请求对应一个端口

NAT穿透

  • NAT穿透即是通过一系列手段使得位于不同NAT网络下的两个节点建立直接连接.为此有以下两个关键步骤:
    a) 节点获取自身的公网ip和port
    b) 将自身的公网ip和port分享给对端
不同NAT下的穿透方案
  • 完全锥型NAT
    该类型NAT下的节点只需建立起内部主机到NAT的映射即可接受任意ip和port的数据.因此,简单流程如下
    a) client1和client2向位于公网的服务发送一个数据包
    b) 公网服务通过解析IP协议获取client1和client2的公网ip和port,并将其回发给对应client
    c) client1和client2通过另一公网服务交换自身的公网ip和port
    d) client1和client2直接通信

  • 地址受限锥型NAT
    与完全锥型NAT基本相同,不同的是内部主机需要先发送一个包到对端.因此,简单流程如下
    a) 获取自身公网ip和port以及对端交换信息同完全锥型NAT相同
    b) client1和client2互相向对方发送一个数据包
    c) client1和client2直接通信

  • 端口受限锥型NAT
    与地址受限锥型NAT一致,只是要通信的对端必须使用发出数据包的端口,不同使用其他端口.

  • 对称NAT
    由于对称NAT映射的特殊性,内部主机通过公网服务获取到的自身公网信息只能供该公网服务使用而不能共享给其他客户.因此对称NAT无法实现真正意义上的穿透,
    在这种NAT下对端要通信只能选择折中方案,即使用一个第三方公网服务进行对端消息的转发.因此,简单流程如下
    a) 获取自身公网ip和port以及对端交换信息同其他类型NAT相同
    b) 公网服务保存client1和client2的公务那个地址,并为二者生成代理地址,代理地址收到的数据都会被转往对应的公网地址
    c) 公网服务分别将client1和client2的代理地址告知二者
    d) client1和client2通过第三方公网服务交互代理地址
    e) client1和client2分别向收到的对端的代理地址发送一个数据包,打通client到代理服务的数据通道
    f) client1和client2通过代理地址进行通信

ICE

ICE功能

  • ICE(Interactive Connectivity Establishment,交互式建立连接):规范了位于NAT后的主机之间建立直接连接的方法及流程.
  • ICE整合了STUN和TURN协议,使用STUN打洞,失败后会使用TURN进行中转.
  • STUN(Simple Traversal of UDP Through NATs)是使用UDP进行NAT穿透的方案.
  • TURN(Traversal Using Relays around NAT)是对STUN的扩展,在STUN穿透失败时使用中继的形式进行”穿透”.

ICE流程

  • 收集候选地址:收集三种类型candidate(host/server reflexive/relay reflexive),与对端cndidate组成candidate pair以进行连通性检查.
  • 连通性检查:双方交换candidate后对candidate pair按照优先级(host> server reflexive> relay reflexive)进行连通性检查.
  • 数据传输:从能连通的candidate pair中选择优先级最高的进行数据传输.
TURN流程
  • Binding:client向server发送reflex地址请求命令.
  • Allocation:client在中继服务器上申请一个中继服务以获得中继地址分配.
  • Create Permission:创建许可,server接收UDP报文后必须检查源地址是否包含在许可列表中.
  • Channel Bind:绑定通道,绑定成功后对端可以使用ChannelData格式发送消息.
    在这里插入图片描述

信令服务

信令功能

  • 用于对端交换消息以协调通讯,消息类型有:
  1. 会话控制消息:业务逻辑消息及错误报告.
  2. 网络消息:自身对外部可以识别的IP地址和端口.
  3. 媒体消息:自身支持的媒体类型.

信令种类

SDP
  • SDP是一种会话描述,在webRTC中主要用来描述对端的offer和answer消息.SDP格式由多个行组成,每个行都是type和value(=)的组合,具体含义如下:
	<type>:代表特定属性.
	<value>:对属性的描述,具体格式与属性字段有关.
	=*:表示value可选.
  • client使用SDP描述自身媒体能力,并通过offer和answer的形式与对端交换,以通知对端自身支持的媒体类型等信息.
  • SDP属性
	o=:会话发起者标志,描述发起者的诸如用户名、会话id等信息.
	s=:会话名.
	c=:连接数据,描述网络、地址类型.
	m=:媒体描述,包括媒体类型(video/audio)、格式(h264/aac)、传输协议等信息.
	a=:附加属性,用于扩展SDP信息,增加对会话或媒体信息的描述.
	t=:时间信息,声明会话的开始和结束时间.
Candidate
  • candidate描述了自身的网络信息,包括地址、端口、传输协议、优先级等.
  • candidate信息具体字段如下:
	 type:候选类型,具体有host(主机),srvflx(服务器反射),relay(中继),prflx(对端反射).
	foundation:用于标志和区分来自同一个stun的2个candidate.
	base:指candidate的基础地址,srvflx address的base是本地host address,host address和relay address的base是自身.
	component id:传输媒体的类型,1代表RTP,2代表RTCP.
	transport:传输协议.
	priority:该candidate的优先级,根据的type优先级高低一般如下顺序:host>srvflx>prflx>relay.

音视频服务

传输

webRTC默认使用UDP传输音视频数据,在网络较差的情况下会发生丢包、乱序等问题,webRTC使用NACK机制处理丢包问题.

NACK机制

  • 在接收端检测到数据丢包后,发送NACK报文到发送端,发送端根据NACK报文中的序列号* 在发送缓冲区找到对应的数据包,重新发送到接收端.NACK需要发送端发送缓冲区的支持.
  • SDP协商NACK:NACK是RTP层反馈参数,在本端收集codec属性时一起收集,被添加到offer/answer的属性字段中(a=rtcp-fb:125 nack),在SDP协商过程中发送到对端.
  • 为了便于接收端统计丢包率,webRTC将重传包的ssrc和正常包的ssrc做了区分,两个ssrc在SDP中体现(a=ssrc-group:FID 3463951252 1461041037),该模式也称RTX重传.
    NACK报文格式:NACK报文类型为205,是RTCP的扩展反馈报文.报文中PID即为丢失包的序列号.

主动丢包

  • 接收端在帧不完整/参考帧丢失/报文不连续的情况下会主动丢弃该帧数据.

相关协议

  • UDP:音视频传输协议.
  • RTP:实时传输协议,用来传输对实时性要求较高的数据,音视频数据的封装使用RTP协议.
  • RTCP:RTP传输控制协议,用于监控RTP数据传输质量,并反馈到发送端.
  1. RTCP报文中的SR字段用来通知接收端信息,其负载类型是200.
    2.RTCP报文中RR字段用来反馈接收情况,包括丢包率、累积丢包总数等信息,其负载类型是201.
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WebRTC (Web Real-Time Communication) 是一种用于实时通信的技术,特别适用于浏览器和移动设备之间的点对点(P2P)连接,比如视频聊天、文件共享等。在安卓应用中实现WebRTC P2P,你需要使用Google的开源库,如libjitsi-mobix(基于Jitsi Meet)或Janus Gateway。 以下是一个简单的步骤概述: 1. 添加依赖:在你的项目中引入WebRTC相关的库,例如`org.webrtc:webrtc:2.0.x`(具体版本根据Android Studio的要求选择)。 2. 初始化:在你的Activity或Fragment中初始化WebRTC引擎,创建PeerConnection实例,这通常在`onCreate`或`onResume`方法中完成。 ```java WebRtcEngineFactory engineFactory = new WebRtcEngineFactory(context); WebRtcEngine engine = engineFactory.createWebRtcEngine(); PeerConnectionFactory peerConnectionFactory = PeerConnectionFactory.createDefaultPeerConnectionFactory(); ``` 3. 创建VideoCapturer:如果你的应用需要获取本地视频流,你需要创建一个`VideoCapturer`。 4. 建立连接:创建`RTCPeerConnection`,加入媒体流,然后调用`createOffer()`生成SDP offer。 ```java SessionDescriptionDescription offer = peerConnectionFactory.createOffer(); peerConnection.setLocalDescription(offer); ``` 5. 处理ICE候选:接收并处理对端发送的ICE候选,使用`addIceCandidate()`方法。 6. 加入/接听呼叫:对于接收呼叫,需要调用`setRemoteDescription()`,然后可能需要进行SDP协商。 7. 实现数据通道:如果需要双向数据传输,使用DataChannel。 8. 关闭连接:在不需要的时候,记得调用`close()`方法释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不太能吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值