En el proceso de transmisión de datos, el factor del mecanismo de seguridad de transmisión se ha enfatizado continuamente en los últimos años. webrtc
Al garantizar la transmisión de datos, se adopta DTLS 协议
y el método de protocolo específico se puede ver en los documentos relacionados.
DTLS (Datagram Transport Layer Security) es un protocolo TLS personalizado y mejorado para UDP basado en la realidad de que los paquetes de datos pueden perderse o reordenarse en escenarios UDP. El uso de DTLS en WebRTC incluye dos partes: negociación y administración de claves SRTP y provisión de canales encriptados para DataChannel.
Los datos de DataChannel usan DTLS
el canal, los cifran y luego los envían al extremo opuesto a través de udp. En webrtc, un canal puede enviar datos o video. Diferentes formas de datos usan diferentes protocolos. Por ejemplo, la transmisión de datos de audio y video usa el protocolo RTP, mientras que dataChannel usa el protocolo SCTP (protocolo de transmisión de control de flujo).
Todos conocemos las deficiencias de tcp y udp.Sobre esta base, SCTP ha sido rediseñado para tener control de flujo, control de congestión, etc., y puede realizar una transmisión de datos estable.
Cómo implementarlo en pion
DTLSTransport
El protocolo está implementado en DTLS
, lo cual es conveniente para nuestras llamadas.Después t.conn
de que lo obtengamos, se utilizará como un canal de datos.
// Start DTLS transport negotiation with the parameters of the remote DTLS transport
func (t *DTLSTransport) Start(remoteParameters DTLSParameters) error {
...
t.srtpEndpoint = t.iceTransport.newEndpoint(mux.MatchSRTP)
t.srtcpEndpoint = t.iceTransport.newEndpoint(mux.MatchSRTCP)
t.remoteParameters = remoteParameters
cert := t.certificates[0]
t.onStateChange(DTLSTransportStateConnecting)
...
// Connect as DTLS Client/Server, function is blocking and we
// must not hold the DTLSTransport lock
if role == DTLSRoleClient {
dtlsConn, err = dtls.Client(dtlsEndpoint, dtlsConfig)
} else {
dtlsConn, err = dtls.Server(dtlsEndpoint, dtlsConfig)
}
...
t.conn = dtlsConn
t.onStateChange(DTLSTransportStateConnected)
return t.startSRTP()
}
sctp.Client
El canal de entrada es, es decir dtlsTransport.conn
, se utilizará para enviar datos más adelante.
func (r *SCTPTransport) Start(remoteCaps SCTPCapabilities) error {
...
sctpAssociation, err := sctp.Client(sctp.Config{
NetConn: dtlsTransport.conn,
MaxReceiveBufferSize: r.api.settingEngine.sctp.maxReceiveBufferSize,
LoggerFactory: r.api.settingEngine.LoggerFactory,
})
if err != nil {
return err
}
...
go r.acceptDataChannels(sctpAssociation)
return nil
}