收集candidate的过程
- 根据媒体协商的数据收集candidate
-
如果协商传输音频和视频, 那么就会有两个媒体流channel
-
对于每个媒体流又分为RTP(媒体数据传输协议)传输和RTCP(为保证媒体传输质量的控制协议)传输, 每个媒体流又会分成两个channel, 即音频数据通道、音频数据控制通道、视频数据通道、视频数据控制通道
-
为了减少端口占用, 便于逻辑控制, webrtc会对通道进行合并, 是否进行合并是在SDP中进行控制的
-
例如 : RTP和RTCP是否公用一个通道, 在SDP中指明端口复用, 就会只产生一个通道传输RTP和RTCP数据, 同时在SDP中出现了bundle的信息, 音频流和视频流也可以共用同一个端口, 这样4个channel就会合并成一个channel, 4个端口就会合并成一个端口.
-
一般webrtc都会复用端口, 减少对系统端口资源的占用.
PortAllocatorSession的创建
- 通过allocator创建session
- 通过AddAllocatorSession() 将session添加到P2PTransportChannel中
- 使用session的startGettingPorts()进行candidate的收集
startGettingPorts()函数中, 向网络线程发送消息, 进而触发session的消息处理机
消息处理机
- 收到“START”消息后, 会调用GetPortConfigurations() 构造PortConfiguration对象
- 收到第二阶段消息“READY”后, 调用OnConfigReady函数, 内部又会调用AllocatorPorts方法执行具体逻辑, 之后又会收到下一阶段的消息“ALLOCATE”
- 收到消息“ALLOCATE”, 开始真正的candidate收集工作:
- 调用OnAllocate, 内部调用DoAllocate
- 在DoAllocate中, 通过networkmanager获取每个network, 针对每一个network生成AllocationSequence对象, 在针对该对象生成对应的socket
4. 在上面一步收集到host类型的candidate之后, 进入“CREATED”消息中的 OnAllocationSequenceObjectsCreated方法进行逻辑处理
5. 当所有candidate被收集之后 转交给对端, 对端对每个candidate进行连接检测后, 对所选 择的某一个candidate作为通讯线路进行提名, 当收到提名之后, 发送“STOP”消息来结束消息处理机
- 通过消息处理机制, 推动逻辑运转 进而收集到本地的candidate