Actualmente en pruebas: el código de GitHub se abrirá al finalizar.

Conexión y autenticación ​

Una conexión de igual a igual (puerto Raft = puerto de cliente + 1000) se establece en exactamente el mismo orden que el puerto de cliente. No hay ningún paso en el protocolo para distinguir cliente de par — los roles se diferencian únicamente por el puerto.

  1. Conexión TCP — el lado que llama (dial) es siempre el solicitante
  2. Handshake TLS, si el servidor tiene TLS activado
  3. Un protocolo de autenticación — la especificación (challenge, digest, respuesta) es idéntica byte a byte a la del puerto de cliente
  4. Intercambio de RPC con prefijo de longitud a partir de entonces

Flujo ​

Nodo que llama (dial)
Nodo receptor
conexión TCP (puerto Raft = puerto de cliente + 1000)
handshake TLS, si el servidor tiene TLS activado
challenge (SHA-256 ␣ nonce)
digest — calculado con el primer token de cluster_tokens
se verifica contra toda la lista de cluster_tokens
a partir de aquí, RPC Raft con prefijo de longitud
solicitudrespuestaRPC de consenso (Raft)

En qué se diferencia del puerto de cliente ​

ElementoPuerto de clientePuerto Raft
Conjunto de tokens usado para verificarclient_tokenscluster_tokens
Token enviadoel token que configuró el clienteel primer token de cluster_tokens
Tras la autenticacióntramas terminadas en \nRPC con prefijo de longitud
  • En el lado receptor, la verificación comprueba contra toda la lista de cluster_tokens, así que puedes listar tokens antiguos y nuevos juntos y reiniciar los nodos uno a uno para rotar tokens sin tiempo de inactividad (Configuración (variables de entorno)).
  • Con TLS activado, el puerto Raft usa el mismo certificado. El lado que llama verifica el certificado del par contra tls_ca (o el almacén de confianza del sistema si no está definido); tls_skip_verify es solo para pruebas.
  • Si falla la autenticación, la conexión se cierra tras E auth_failed — igual que en el puerto de cliente.