Get Firefox

Firefox 4.0

stopsoftwarepatents.eu petition banner Manifiesto por la liberación de la cultura 
No a la traza privada
Últimos cambios
Últimos Cambios
Vote for Public Maps - Reject INSPIRE! Geocaching
Mi estado actual en Jabber/XMPP: - jabberES - jabber.org

Negociación en los enlaces servidor <-> servidor

Ú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.


Características:


Descripción Informal:

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:

  1. Ignorar la petición.
  2. Responder con un REJ (reject). El servidor está indicando que no soporta o no entiende la propiedad negociada.
  3. Responder con un ACK (acknowledge). El siguiente comando se recibirá bajo las nuevas condiciones acordadas.
  4. Responder con un NACK (non acknowledge). El servidor nos está indicando que o bien le solicitemos una negociación de la propiedad demandada, o bien ajustemos nuestra petición a los parámetros que nos proporciona. Es decir, nos está realizando una sugerencia.

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.


Sintaxis:

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


Descripción Formal:

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.

  1. El nodo recibe un REQ:

  2. El nodo recibe un ACK:

  3. El nodo recibe un NACK:

  4. El nodo recibe un REJ:


Propiedades:

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.


Configuración:

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".


Estado de la Implementación:

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:


Nuevas Negociaciones


Bibliografía:


Historia:



Firefox 4.0 Python Zope ©2000 jcea@jcea.es