PortAllocator

380 阅读2分钟

顾名思义, portAllocator 就是用来分配端口的, 因为每个candidate都是有IP、端口号、协议簇、类型所组成, 端口号的分配就是通过portAllocator完成的.

真正使用的是PortAllocator的子类---BasicPortAllocator.

PortAllocator:

  • stun_server : 使用该服务获取网络中的映射地址.

  • turn_servers : 对于PortAllocator来说可以访问多个turn server, vector中的每一项就是一个turn server 的配置信息, 通过配置信息即可连接到某个具体的turn服务器.

  • candidate_pool_size : 主动收集candidate之前, 会人工设置一个candidate pool, 默认设置0 ,不需要人工设置这个池子.

  • pooled_sessions : 上下文数组, PortAllocator分配端口时 真正执行这个操作的对象是PortAllocatorSession, 通过上下文才能创建出一个具体的可以使用的端口.

  • min_port : 指定端口最小值. 默认: 0.

  • max_port : 指定端口最大值, 即 设置端口号的使用范围, 默认: 0.

  • max_ipv6_networks : PortAllocator最多可以分配多少个ipv6地址, 默认:5.

  • candidate_filter : 对收集到的candidate进行过滤, 即把无效的candidate过滤掉.

  • allow_tcp_listen : 是否开启TCP监听.

  • CreateSession( ) : 创建一个PortAllocatorSession

  • TakePoolSession( ) : 因为candidate_pool_size默认设置0, 所以poolsession相关的函数极少使用.

BasicPortAllocator:

  • network_manager : 访问网络设备管理器.

  • socket_factory : 用于创建socket.

  • relay_port_factory : 用于创建中转端口.

  • CreateSessionInternal( ) : 真正用来创建PortAllocatorSession的方法.

  • AddTurnServer( ) : 将多个turn服务添加到BasicPortAllocator中.

PortAllocatorSession:

  • content_name : sdp中每一段媒体信息的名字, 通常音频是“0”, 视频是“1”

  • ice_ufrag : 用户名

  • ice_pwd : 密码, 用于验证用户是否有效

BasicPortAllocatorSession :

  • allocator: 指向BasicPortAllocator的指针

  • network_thread : 网络线程指针, 需要进行网络操作的时候,通过该指针获取网络线程

创建BasicPortAllocator对象

  • portAllocator是在peerConnection创建的时候创建的

  • 有一个peerConnection就有一个与之对应的portAllocator

  • portAllocator的参数有default_network_manager 和packet_socket_factory

  • 收集candidate的时候通过default_network_manager获取本机都有哪些net_work, 每一个net_work都对应一个socket,每一个socket都需要通过packet_socket_factory创建出来

构造BasicPortAllocator的参数

  • default_network_manager / default_socket_factory 是全局对象

BasicPortAllocator的构造函数

  • relay_port_factory : 用于构造relay类型的端口

  • setConfiguration : 配置参数- stun服务器地址、relay server的配置信息、 customizer定制信息

PortAllocator构造函数

InitRelayPortFactory

SetConfiguration

  • 如果是内网连接, stun和turn不需要配置

  • candidate_pool_size 也同样不进行人工干预, 内部会根据ICE规范自动获取所有可用的candidate

initializePortAllocator

  • portAllocator是在peerConnection初始化的时候初始化的

  1. 修改状态 : 通过port_allocator_->Initialize();将状态设置为true

  2. 通过port_allocator_->flags() 获取flag并设置

  3. 通过port_allocator_->set_flags将设置好的flag填进去

  4. port_allocator_->SetConfiguration(),将变化后的参数设置给port_allocator

小结

  • 每个PeerConnection中包括一个PortAllocator对象

  • PortAllocator对象是在CreatePeerConnection中创建的

  • PeerConnection初始化时会同时初始化PortAllocator

  • NetworkMananger和PacketSocketFactory全局唯一

  • 两者在PeerConnectionFactory的Initialize中创建