WebRtcTransport
- Mediasoup 内部有多种 Transport 实现,其中 WebRtcTransport 的实现是基于 ICE Lite(精简版ICE)。
- WebRtcTransport 主要用来进行 client 端 与 mediasoup server 端 Router 进行通讯。
- ICE Lite: meaning that it does not initiate ICE connections but expects ICE Binding Requests from endpoints.
- FULL ICE:是双方都要进行连通性检查,完成的走一遍流程。
- Lite ICE: 在FULL ICE和Lite ICE互通时,只需要FULL ICE一方进行连通性检查, Lite一方只需回应response消息。这种模式对于部署在公网的设备比较常用。
WebRtcTransportOptions
WebRtcTransport 类型的选项参数
Field | Type | Description | Required | Default |
---|---|---|---|---|
listenIps | Array<TransportListenIp|String> | Listening IP address or addresses in order of preference (first one is the preferred one). | Yes | |
enableUdp | Boolean | Listen in UDP. | No | true |
enableTcp | Boolean | Listen in TCP. | No | false |
preferUdp | Boolean | Listen in UDP. | No | false |
preferTcp | Boolean | Listen in TCP. | No | false |
initialAvailableOutgoingBitrate | Number | Initial available outgoing bitrate (in bps). | No | 600000 |
enableSctp | Boolean Create a SCTP association. | No | false | |
numSctpStreams | NumSctpStreams | SCTP streams number. | No | |
maxSctpMessageSize | Number | Maximum allowed size for SCTP messages sent by DataProducers. | No | 262144 |
appData | Object | Custom application data. | No | {} |
- 从上表即可得知,WebRtcTransport 传输层协议优先使用的是 UDP,并且支持 TCP 以及 SCTP.
- ip 可配置多个,但是从描述来看,第一个 prefered。那么多网卡,多ip时,内部实现,可能是更多偏向于主备,而非负载。
Note:
- 不要使用 “0.0.0.0”。
socket 层 “0.0.0.0” 是什么?
说白了,就是 0. 但是这个点分十进制的0,其实是 IPv4的 0.
“00::00::00::00"或者"0::0”:类似这种,才是IPv6的 0.
在socket server 编程的时候,如果 bind 中的ip地址为 0。那么底层怎么做呢?
底层相当于不绑定,不分配IP,dst为任意的一个本机 ip 的数据包,到本机,都会被留下来,而回复时,哪儿来的往哪儿回,主动发送,就随机挑个ip。这种情况下,相对而言比较灵活,但是针对于多网卡多ip机器而言,这种自动分配的方式就不是很靠谱,尤其是需要ICE去解决NAT穿透的问题场景下,更麻烦。
所以在创建WebRtcTransport时,建议不要这么干。 - 如果你配置了"0.0.0.0","::",那么在对应的位置,必须配置announcedIp。
- initialAvailableOutgoingBitrate:这个配置,仅仅在 endpoint的 Consumer 端,使用了REMB or Transport-CC 其中之一的码率控制算法(可能不仅仅是拥塞)时,才会被采用。
IceParameters
usernameFragment: string 类型,指定 ICE 的 ufrag
password: string 类型,指定 ICE 的 password
iceLite: 指定是否采用 ICE Lite
IceCandidate
DtlsParameters
DtlsFingerprint
enum
- IceState
- DtlsRole
- DtlsState
属性
webRtcTransport.iceRole
webRtcTransport.iceParameters
webRtcTransport.iceCandidates
webRtcTransport.iceState
webRtcTransport.iceSelectedTuple
webRtcTransport.dtlsParameters
webRtcTransport.dtlsState
webRtcTransport.dtlsRemoteCert
webRtcTransport.sctpParameters
webRtcTransport.sctpState
行为
webRtcTransport.getStats()
// 获取 webRtcTransport 的 RTC 的 statistics
webRtcTransport.connect({ dtlsParameters })
// 根据 dtlsParameters 建立与 endpoint 端的 webRtcTransport
webRtcTransport.restartIce()
// 重启 ICE 层的连接,获取新的参数,并且,新参数应当及时通知给 remote endpoint
事件
WebRtcTransport events
webRtcTransport.on(“icestatechange”, fn(iceState))
监控 ICE 连接的状态变化
webRtcTransport.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
ICE state 变成完成(completed)之后,如果 ICE 选择的连接 tuple 发生变化,那么会触发该事件。
该 TransportTuple 就是前文已述的 local ip/port, remote ip/port + protocol 的数据结构。
webRtcTransport.on(“dtlsstatechange”, fn(dtlsState))
DTLS 的连接发生状态变化,会被触发,具体状态跳转参考 DtlsState 定义
webRtcTransport.on(“sctpstatechange”, fn(sctpState))
SCTP 的连接发生状态变化,会被触发,具体状态跳转参考 TransportSctpState 定义
WebRtcTransport observer events
其实是上面 4 个事件的重复而已。
webRtcTransport.observer.on(“icestatechange”, fn(iceState))
webRtcTransport.observer.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
webRtcTransport.observer.on(“dtlsstatechange”, fn(dtlsState))
webRtcTransport.observer.on(“sctpstatechange”, fn(sctpState))
PlainRtpTransport (DEPRECATED)
( mediasoup.version < 3.5.0 )
PlainTransport
( mediasoup.version >= 3.5.0 )
PlainTransport 主要用于 RTP/RTCP (或者采用安全的srtp)以及 SCTP(DataChannel)的通讯连接。
PlainTransportOptions
Field | Type | Description | Required | Default |
---|---|---|---|---|
listenIp | TransportListenIp|String | Listening IP address. | Yes | |
rtcpMux | Boolean | RTP & RTCP 采用统一端口 | No | true |
comedia | Boolean | 自动检测功能(使用第一个收到的rtp packet的对端ip:port),作为remote endpoint的ip:port。另只能在开启了SRTP 情况下,在从远端收到了对应的参数srtpParameters时,connect() 才能被调用。(见下文Note) | No | false |
enableSctp | Boolean | Create a SCTP association. | No | false |
numSctpStreams | NumSctpStreams | SCTP streams number. | No | |
maxSctpMessageSize | Number | Maximum allowed size for SCTP messages sent by DataProducers. | No | 262144 |
enableSrtp | Boolean | Enable SRTP to encrypt RTP and SRTP. If enabled, the remote must also enable SRTP. | No | false |
srtpCryptoSuite | SrtpCryptoSuite | Just valid if enableSrtp is set. | No | “AES_CM_128_HMAC_SHA1_80” |
appData | Object | Custom application data. | No | {} |
Note:
- comedia: 字段,仅仅当 remote endpoint 会通过该 plaintransport produce RTP(SCTP) 数据包发送过来,才有意义。否则,当endpoint端不发送RTP/SCTP数据到 mediasoup server,那么,mediasoup也无法检测其ip:port,也就无法发送任何数据包到endpoint了。
- 换句话说,如果 remote endpoint端,并不打算produce数据,而仅仅是consume,那么comedia模式,便不要开启,而应该调用 connect() 接口,ip:port 采用之前信令协商的ip:port.
- PlainTransport 支持 RTP/RTCP 的mux技术。
属性
plainTransport.tuple
如果 RTCP-mux is set,那么该tuple 包含 RTP & RTCP的信息。
当 plain transport被创建,该tuple 中的 localIp,localPort,protocol会被设置。
但是 remote 部分:
- 通过上面提到过的 comedia 的模式自动填充。
- connect() 调用主动处理填充。
plainTransport.rtcpTuple
参考 plainTransport.tuple,该属性,标识的是 rtp 部分。
plainTransport.sctpParameters
plainTransport.sctpState
plainTransport.srtpParameters
行为/方法
plainTransport.getStats()
plainTransport.connect({ ip, port, rtcpPort, srtpParameters })
事件
plainTransport 事件
plainTransport.on(“tuple”, fn(tuple))
当开启了 comedia 模式,mediasoup 收到 endpoint 过来的RTP/SCTP数据包,获取到endpoint的ip:port,就会触发该事件。
plainTransport.on(“rtcptuple”, fn(rtcpTuple))
如上类似,但是还要外加一个条件。即: comedia set + RTCP-mux not set
plainTransport.on(“sctpstatechange”, fn(sctpState))
plainTransport observer 事件
plainTransport.observer.on(“tuple”, fn(tuple))
plainTransport.observer.on(“rtcptuple”, fn(rtcpTuple))
plainTransport.observer.on(“sctpstatechange”, fn(sctpState))
PipeTransport
与 plaintransport 类似,但是,通讯双方不再是 remote endpoint 与 mediasoup,而是同一个主机上的两个 Router。但是文档中没说是否跨 Worker,那么有可能是跨 Worker 也就是跨进程,也有可能是同一个进程。
DirectTransport
通讯双方: medisoup node.js process 与 mediasoup-worker subprocess 中的某个 Router。
目前,nodejs 可以通过在 direct transport 上直接创建的DataProducers & DataConsumers 进行数据消息的发送和接收。
基于 directtransport 上的 DataProducer 发送的消息,可以被支持 SCTP 连接的(如: WebRtcTransport, PlainTransport, PipeTransport) endpoint 消费;也可以被 Node.js 应用中的基于 direct transport 创建的 DataConsumer 消费。
反之亦然:通过 SCTP/DataChannel 发出来的消息,也可以被 Node.js 应用中的 基于 DirectTransport 创建的 DataConsumer 消费。
DirectTransportOptions
maxMessageSize: 262144
appData: {}
属性
参考 Transport
行为/方法
directTransport.getStats()
directTransport.connect()
不支持的方法
以下三个方法,不支持,如果调用,就会报错: UnsupportedError.
- directTransport.setMaxIncomingBitrate(options)
- directTransport.produce(options)
- directTransport.consume(options)
事件
参考 Transport 事件,未定义更多的事件。