zhngs

zhngs

pion中状态分析

1.pion状态
2.状态改变时机
3.ice状态改变时机
4.dtls状态改变时机

1.pion状态

  • pion的连接状态如下

    // peerconnection的状态 const ( peerConnectionStateNewStr = "new" peerConnectionStateConnectingStr = "connecting" peerConnectionStateConnectedStr = "connected" peerConnectionStateDisconnectedStr = "disconnected" peerConnectionStateFailedStr = "failed" peerConnectionStateClosedStr = "closed" ) // ice的状态 const ( iceConnectionStateNewStr = "new" iceConnectionStateCheckingStr = "checking" iceConnectionStateConnectedStr = "connected" iceConnectionStateCompletedStr = "completed" iceConnectionStateDisconnectedStr = "disconnected" iceConnectionStateFailedStr = "failed" iceConnectionStateClosedStr = "closed" ) // dtls的状态 const ( dtlsTransportStateNewStr = "new" dtlsTransportStateConnectingStr = "connecting" dtlsTransportStateConnectedStr = "connected" dtlsTransportStateClosedStr = "closed" dtlsTransportStateFailedStr = "failed" )
  • 如果pc的close标志被设置,pc为closed,该优先级最高,下面依次递减

  • 如果ice和dtls有任何一个failed,pc为failed

  • 如果ice为disconnected,pc为disconnected

  • 如果ice为new或closed,并且dtls为new或closed,pc为new

  • 如果ice为new或checking,或者dtls为new或connecting,pc为connecting

  • 如果ice为connected或completed或closed,并且d·tls为connected或closed,pc为connected

一共 7*5=35 种组合,一旦出现failed状态就为failed,去除failed后共 6 * 4 = 24 种组合。因为一旦出现disconnected,状态为disconnected,去除disconnected后,共 5 * 4 = 20 种组合。因为ice和dlts都为new或closed后状态为new,去除new后,共 20 - 4 = 16 种组合。去除connected状态,该状态共3 * 2 - 1= 5种,去除后共 16 - 5 = 11 种状态,剩下11种状态都是connecting

2.状态改变时机

只要ice或dtls状态改变,pc的状态就有可能改变,所以需要找到ice和dtls状态改变的时机

  • pc在close的时候,会调用改变pc状态的回调,此时状态为closed
  • 在startTransports中会调用改变pc状态的回调,此时状态未知
  • 在iceTransport的internalOnConnectionStateChangeHandler回调中会调用改变pc状态的回调,这个回调会注册到ice Agent的OnConnectionStateChange回调中,ice Agent的回调都在agent_handler.go文件中
  • ice Agent在流程中会调用updateConnectionState函数来向chan中传递状态,从而传给回调
  • dtls的状态改变通过调用DtlsTransport的onStateChange函数实现

3.ice状态改变时机

  • Agent的Restart会将状态变为checking
  • startConnectivityChecks会将状态变为checking
  • setSelectedPair会将状态变为connected
  • connectivityChecks检测到超时会将状态改为failed
  • validateSelectedPair会视情况将状态置为failed、disconnected、connected
  • taskLoop退出会将状态变为closed

4.dtls状态改变时机

  • DtlsTransport在创建时状态为new
  • DtlsTransport.Start开始会将状态变为connecting
  • DtlsTransport.Start结束后会将状态变为connected
  • DtlsTransport.Start函数在执行过程中遇到任何错误都会将状态变为failed
  • DtlsTransport.Stop会将状态变为stop