Últimos Cambios |
||
Blog personal: El hilo del laberinto |
Última Actualización: 24 de Julio de 2.000 - Lunes
En este documento se describe el sistema de negociación dinámica y asíncrona en los enlaces entre servidores, en producción en IRC-Hispano desde Mayo de 2.000.
El sistema de negociación está basado el esquema de negociación del protocolo PPP, usando los comandos REQ, ACK, NACK y REJ.
Cuando un extremo desea solicitar que el otro extremo utilice (o deje de utilizar) alguna propiedad, lo solicita mediante un comando REQ (request). El otro extremo tiene, pues, cuatro posibilidades:
Este ciclo puede repetirse las veces que sea preciso.
Existe más información sobre este tema en diversas propuestas que envié en su momento a la lista "client-server", en la que se intentaba consensuar un sistema de negociación entre clientes y servidores, como medio para evolucionar el protocolo. Las discusiones en la lista no llegaron a nada, pero mi propuesta está disponible online, en la sección de bibliografía.
La implementación final que se documenta aquí está basada en aquellas propuestas, pero existen un buen número de cambios.
NEGOCIACION = "CONFIG" COMANDO ":" OPCION["," OPCION]... COMANDO = "REQ" | "ACK" | "NACK" | "REJ" OPCION = ["!"][GRUPO":"]PROPIEDAD["("PARAM["," PARAM]...")"] GRUPO = PALABRA PALABRA = ALFA ALFANUM... ALFA = "a".."z" | "A".."Z" NUM = "0".."9" ALFANUM = ALFA | NUM | "-" | "_" PROPIEDAD = PALABRA PARAM = ALFANUM...
La negociación es bidireccional e independiente en cada sentido. La negociación es asíncrona, por lo que no es preciso detener el intercambio de datos hasta que ésta haya finalizado.
También se responde con un REJ cuando la propiedad negociada es inválida en el modo actual (por ejemplo, se está negociando compresión alternativa dentro de una conexión ya comprimida). Este caso debe valorarse dentro del contexto de los modos actuales y el resto de propiedades que se están negociando. Puede ser una opción, por ejemplo, emitir un NACK en su lugar.
Un ejemplo típico de esta necesidad es la negociación de propiedades entre servidores ANTES de que se sepa si la conexión se corresponde a un servidor o no. Tan pronto el nodo sabe que la conexión se corresponde con un servidor, debe completar la negociación.
Básicamente, el otro extremo nos está ofreciendo una sugerencia.
Un nodo puede intentar renegociar propiedades en cualquier momento.
Un nodo puede intentar que el otro extremo inicie una renegociación en cualquier momento.
Las propiedades son las características de un conexión unidireccional que se están negociando en un momento dado. Puede consultarse su sintaxis en la sección correspondiente.
En principio, cada nodo conoce las propiedades de negociación recomendadas y las permitidas, por lo que no se requiere ningún tipo de configuración para que una nueva versión de un nodo empiece a negociar nuevas propiedades.
Existen, no obstante, casos en los que una configuración manual resulta beneficiosa. El más habitual es cuando una propiedad negociada por defecto no resulta apropiada para un enlace en particular. El ejemplo típico es la compresión del enlace cuando los nodos están en una red local o disponen de abundante ancho de banda (y la CPU es un recurso escaso). El otro extremo es cuando un nodo soporta determinadas propiedades, pero no las negocia por defecto; gracias a la configuración manual, se puede hacer que un enlace determinado emplee dichas propiedades.
La configuración de la negociación se realiza a través de líneas F en el "ircd.conf", con el formato siguiente:
F:[propiedades_TX]:[propiedades_RX]:[nodo]
Las propiedades se definen como una letra (cada letra, una propiedad). La letra en mayúscula significa "siempre", y en minúscula significa "nunca".
Por ejemplo, a la compresión ZLIB le corresponde la letra ZETA ("Z"):
Cualquier propiedad poseerá unas características de negociación, que se definen junto a la misma. Dichas características indican su nivel de prioridad, incompatibilidades y configuraciones por defecto en ausencia de líneas F.
Obsérvese, asimismo, que si solicitamos un REQ forzado por línea F, pero el otro extremo nos deniega la propiedad o, sencillamente, no completa la negociación, el enlace no se romperá. Esto es así porque nunca podríamos saber cuándo se ha completado la negociación, sobre todo en situaciones de lag. Además, ello asegura que el enlace tendrá éxito aunque ambos extremos tengan configuraciones contradictorias (en cuyo caso se utilizará el máximo común divisor).
El estado de las "líneas F" es accesible a través del comando "stats f".
Este documento define un "framework" genérico, y en esta sección describiremos el estado actual de la implementación, a Julio de 2.000:
El caso típico es la negociación de compresión en los enlaces antes de que el enlace se haya identificado como perteneciente a otro servidor: Debemos negociar la compresión antes de saber si se trata de un servidor para poder disponer de la compresión a la hora de transferir la ráfaga. Naturalmente el servidor no aceptará compresión en un enlace que no está establecido con otro servidor, pero intentará realizar una negociación especulativa de la siguiente manera:
PASS [clave] SERVER [servidor] [BURST] PASS [clave2] SERVER [servidor2] [BURST2]
PASS [clave] CONFIG REQ [configuración] SERVER [servidor] [BURST] CONFIG REQ [configuración2] CONFIG ACK [configuración2] PASS [clave2] SERVER [servidor2] CONFIG ACK [configuración] [BURST2]
Como puede verse, el servidor que se conecta envía la petición de configuración (en particular, compresión) antes de que el otro extremo se haya identificado como servidor, aunque es esperable que lo sea, ya que nos estamos conectando a él (si no lo es, el menor de nuestros problemas será el negociar propiedades, ya que estaremos filtrando nuestra clave de enlace).
Obsérvese que el extremo que recibe la conexión no sabe que lo que se le conecta es un servidor hasta recibir el comando "SERVER", y que la negociación se envía antes de enviar dicho comando (la razón de ello es que "server" es un comando que desencadena infinidad de acciones, y debemos negociar con anterioridad). En vez de responder inmediatamente con un error, el servidor receptor "espera" a ver si el otro extrema se identifica como servidor y, en ese caso, accede a la negociación.
El efecto práctico es que el segundo servidor enviará su ráfaga, normalmente, ya codificada según las propiedades negociadas. Obsérvese que ello no es simétrico: la ráfaga del segundo servidor se envía cuando esa conexión ya se ha negociado, mientras que la ráfaga del primer servidor se manda en bruto. Por tanto, es muy recomendable que los servidores "pequeños" se conecten a los grandes, y no a la inversa, sobre todo por cuestiones como la compresión de los enlaces.
Más información sobre los OpenBadges
Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS