PortAllocatorSession

106 阅读2分钟

收集candidate的过程

  1. 根据媒体协商的数据收集candidate
  • 如果协商传输音频和视频, 那么就会有两个媒体流channel

  • 对于每个媒体流又分为RTP(媒体数据传输协议)传输和RTCP(为保证媒体传输质量的控制协议)传输, 每个媒体流又会分成两个channel, 即音频数据通道、音频数据控制通道、视频数据通道、视频数据控制通道

  • 为了减少端口占用, 便于逻辑控制, webrtc会对通道进行合并, 是否进行合并是在SDP中进行控制的

  • 例如 : RTP和RTCP是否公用一个通道, 在SDP中指明端口复用, 就会只产生一个通道传输RTP和RTCP数据, 同时在SDP中出现了bundle的信息, 音频流和视频流也可以共用同一个端口, 这样4个channel就会合并成一个channel, 4个端口就会合并成一个端口. 

  • 一般webrtc都会复用端口, 减少对系统端口资源的占用.

PortAllocatorSession的创建

  1. 通过allocator创建session
  2. 通过AddAllocatorSession() 将session添加到P2PTransportChannel中
  3. 使用session的startGettingPorts()进行candidate的收集

startGettingPorts()函数中, 向网络线程发送消息, 进而触发session的消息处理机

消息处理机

  1. 收到“START”消息后, 会调用GetPortConfigurations() 构造PortConfiguration对象
  2. 收到第二阶段消息“READY”后, 调用OnConfigReady函数, 内部又会调用AllocatorPorts方法执行具体逻辑, 之后又会收到下一阶段的消息“ALLOCATE”
  3. 收到消息“ALLOCATE”, 开始真正的candidate收集工作:
  • 调用OnAllocate, 内部调用DoAllocate
  • 在DoAllocate中, 通过networkmanager获取每个network, 针对每一个network生成AllocationSequence对象, 在针对该对象生成对应的socket

  4.   在上面一步收集到host类型的candidate之后, 进入“CREATED”消息中的            OnAllocationSequenceObjectsCreated方法进行逻辑处理

  5.  当所有candidate被收集之后 转交给对端, 对端对每个candidate进行连接检测后, 对所选    择的某一个candidate作为通讯线路进行提名, 当收到提名之后, 发送“STOP”消息来结束消息处理机

  • 通过消息处理机制, 推动逻辑运转 进而收集到本地的candidate