Primeros pasos con webrtc: 14. SCTP, el protocolo de transmisión de datos en pion webrtc

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. webrtcAl 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 DTLSel 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.

inserte la descripción de la imagen aquí

Cómo implementarlo en pion

DTLSTransportEl protocolo está implementado en DTLS, lo cual es conveniente para nuestras llamadas.Después t.connde 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.ClientEl 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
}

Supongo que te gusta

Origin blog.csdn.net/weixin_40425640/article/details/127086822
Recomendado
Clasificación