22.1. El Protocolo NNTP

Hemos mencionado dos órdenes NNTP que son clave en cuanto a cómo los artículos de noticias se impulsan o seleccionan entre servidores. Ahora, le echaremos un vistazo a todo esto en una sesión NNTP real para mostrarle cuán sencillo es el protocolo. Para ilustrar nuestros propósitos, usaremos un sencillo cliente telnet para conectar con un servidor de noticias basado en INN de la Cervecera Virtual llamado news.vbrew.com. El servidor está corriendo una configuración mínima para que los ejemplos sean cortos. Ya veremos cómo completar la configuración de este servidor en Capítulo 23. En nuestras pruebas pondremos especial cuidado en generar artículos sólo en el grupo de noticias es.pruebas para evitar molestar a nadie.

22.1.1. Conectar con el servidor de noticias

Conectar con el servidor de noticias es tan sencillo como abrir una conexión TCP con su puerto NNTP. Cuando esté conectado, aparecerá un anuncio de bienvenida. Una de las primeras órdenes que puede probar es help. La respuesta que reciba dependerá generalmente de si el servidor cree que somos un servidor NNTP o un cliente de noticias, al requerirse grupos de órdenes diferentes. Puede cambiar el modo de operación con la orden mode; veremos eso en un momento:

    $ telnet news.vbrew.com nntp
    Trying 172.16.1.1...
    Connected to localhost.
    Escape character is '^]'.
    200 news.vbrew.com InterNetNews server INN 1.7.2 08-Dec-1997 ready
    help
    100 Legal commands
            authinfo
    		help
    		ihave
    		check
    		takethis
    		list
    		mode
    		xmode
    		quit
    		head
    		stat
    		xbatch
    		xpath
    		xreplic
    For more information, contact "usenet" at this machine.
    .

Las respuestas a las órdenes NNTP siempre acaban con un punto (.) en una línea separada. Los números que ve en el listado de salida son códigos de respuesta que usa el servidor para indicar éxito o fallo de la orden. Los códigos de respuesta se describen en el RFC-977; hablaremos de los más importantes conforme vayamos avanzando.

22.1.2. Empujar un artículo de noticias a un servidor

Mencionamos la orden IHAVE cuando hablamos de hacer "pushing" de noticias a servidores. Fijémonos ahora en cómo funciona realmente la orden IHAVE:

    ihave <123456@gw.vk2ktj.ampr.org>
    335
    From: terry@gw.vk2ktj.ampr.org
Subject: mensaje de prueba enviado con ihave
Newsgroups: es.pruebas
Distribution: mundo
Path: gw.vk2ktj.ampr.org
Date: 26 Abril 1999
Message-ID: <123456@gw.vk2ktj.ampr.org>
Body: 

Esto es un mensaje de prueba enviado usando la orden NNTP IHAVE.

.
    235

Ninguna orden NNTP es sensible al uso de mayúsculas o minúsculas, por lo que resulta indiferente cómo se introduzcan las órdenes. La orden IHAVE toma una variable obligada, siendo el ID del mensaje lo que se impulsa. Se asigna un ID de mensaje único a cada artículo cuando se crea. La orden IHAVE proporciona al servidor NNTP una manera de decir qué articulos tiene cuando quiere impulsar artículos a otro servidor. El servidor que envíe usará una orden IHAVE para cada artículo que desee impulsar. Si el código de respuesta de la orden que genere el servidor NNTP receptor se encuentra en el rango “3xx”, el servidor NNTP remitente transmitirá el artículo completo, incluyendo toda su cabecera y haciéndolo terminar con un punto en una línea aparte. Si el código de respuesta se encuentra en el rango “4xx”, el servidor receptor ha elegido no aceptar el artículo, posiblemente porque ya lo tiene o a causa de algún problema, como que se esté quedando sin suficiente espacio en disco.

Cuando se ha transmitido el artículo, el servidor receptor emite otro código de respuesta indicando si la transferencia del artículo ha concluido con éxito.

22.1.3. Cambiar el modo de lectura NNRP

Los lectores de noticias usan sus propios grupos de órdenes cuando se comunican con los servidores de noticias. Para activar estas órdenes, el servidor de noticias tiene que estar operando en modo de lectura. La mayoría de servidores de noticias funcionan en modo de lectura de manera predeterminada, a menos que la dirección IP de la máquina con la que conecten se encuentre lista como un punto de reenvío de noticias. En cualquier caso, NNTP incluye una orden para cambiar explícitamente al modo de lectura:

    mode reader
    200 news.vbrew.com InterNetNews NNRP server INN 1.7.2 08-Dec-1997 ready/
        (posting ok).
    help
    100 Legal commands
      authinfo user Name|pass Password|generic <prog> <args>
      article [MessageID|Number]
      body [MessageID|Number]
      date
      group newsgroup
      head [MessageID|Number]
      help
      ihave
      last
      list [active|active.times|newsgroups|distributions|distrib.pats|/
          overview.fmt|subscriptions]
      listgroup newsgroup
      mode reader
      newgroups yymmdd hhmmss ["GMT"] [<distributions>]
      newnews newsgroups yymmddhhmmss ["GMT"] [<distributions>]
      next
      post
      slave
      stat [MessageID|Number]
      xgtitle [group_pattern]
      xhdr header [range|MessageID]
      xover [range]
      xpat header range|MessageID pat [morepat...]
      xpath MessageID
    Report problems to <usenet@vlager.vbrew.com>
    .

En el modo de lectura de NNTP se dispone de muchas órdenes. La mayoría de ellas están diseñadas para facilitar la vida de un lector de noticias. Mencionamos antes que hay órdenes para pedir al servidor que envíe la cabecera y el cuerpo de los artículos de manera separada. También hay órdenes que listan los grupos y artículos disponibles, y otras que permiten publicar, un medio alternativo de enviar noticias a un servidor.

22.1.4. Listar los grupos disponibles

La orden list lista diferentes tipos de información; de manera notable los grupos que soporta el servidor:

    list newgroups
    215 Descriptions in form "group description".
    control                 News server internal group
    junk                    News server internal group
    local.general           General local stuff
    local.test              Local test group
    .

22.1.5. Listar grupos activos

list active muestra cada grupos soportado y ofrece información sobre ellos. Los dos números de cada línea de la salida son las marcas de agua alta y baja—es decir, el artículo numerado más alto y el artículo numerado más bajo en cada grupo. El lector de noticias es capaz de hacerse una idea del número de artículos del grupo a partir de éstos. Hablaremos un poco más sobre estos números en un momento. El último campo de la salida muestra variables que controlan si se permite publicar en el grupo, si el grupo está moderado y si los artículos publicados tienen o no que guardarse. Estas variables se describen con detalle en Capítulo 23. Éste es el aspecto de un ejemplo:

    list active
    215 Newsgroups in form "group high low flags".
    control 0000000000 0000000001 y
    junk 0000000003 0000000001 y
    alt.test 0000000000 0000000001 y
    .

22.1.6. Publicar un artículo

Hemos mencionado que había una diferencia entre impulsar un artículo y publicar uno. Cuando se impulsa un artículo, se asume implícitamente que el artículo ya existe, que tiene un identificador del mensaje que el servidor ha asignado al que se publicó originalmente, y que tiene un juego completo de cabeceras. Cuando se publica un artículo, se crea el artículo por primera vez y las únicas cabeceras que se aportan son las que puedan tener algún sentido para nosotros, como el título o el grupo de noticias al que se desea enviar el artículo. El servidor de noticias en el que publiquemos el artículo se encargará de añadir el resto de cabeceras y de crear un ID para el mensaje que usará cuando impulse el artículo a otros servidores.

Todo esto significa que publicar un artículo es incluso más sencillo que impulsar uno. Un ejemplo de publicar sería algo como esto:

    post
    340 Ok
    From: terry@richard.geek.org.au
Subject: mensaje de prueba número 1
Newsgroups: es.pruebas
Body: 

Esto es un mensaje de prueba, ignórelo libremente.

.
    240 Article posted

Hemos generado dos mensajes más como éste para dotar de algo de realismo a nuestro siguientes ejemplos.

22.1.7. Listar nuevos artículos

Cuando un lector de noticias se conecta por primera vez con un servidor de noticias y el usuario elige leer un grupo de noticias, el lector querrá descargar una lista con los nuevos artículos publicados o recibidos desde la última vez que el usuario entró al sistema. La orden newnews se usa con este propósito. Hay variables obligatorias que tienen que proporcionarse: el nombre del grupo o grupos a consultar, la fecha de comienzo y la hora a partir de la cual listar los mensajes. La fecha y la hora se especifican con números de seis dígitos cada una, con la información más significativa primero; aammdd y hhmmss, respectivamente:

    newnews junk 990101 000000
    230 New news follows
    <7g2o5r$aa$6@news.vbrew.com>
    <7g5bhm$8f$2@news.vbrew.com>
    <7g5bk5$8f$3@news.vbrew.com>
    .

22.1.8. Elegir un grupo con el que trabajar

Cuando el usuario elige un grupo de noticias a leer, el lector de noticias puede decirle al servidor que se ha elegido ese grupo. Esto simplifica la interacción entre el lector y el servidor de noticias eliminando la necesidad de enviar constantemente el nombre del grupo con cada orden. La orden group simplemente toma el nombre del grupo elegido como una variable. Muchas de las órdenes siguientes usan el grupo elegido como el predeterminado, a menos que se especifique otro grupo de noticias explícitamente:

    group es.pruebas
    211 3 1 3 es.pruebas

La orden group devuelve un mensaje en el que se indica el número de mensajes activos, la marca de agua baja, la marca de agua alta y el nombre del grupo respectivamente. Tenga en cuenta que mientras que el número de mensajes activos y la marca de agua alta coinciden en nuestro ejemplo, a menudo no es éste el caso; en un servidor de noticias activo, algunos artículos pueden haber expirado o haberse borrado, haciendo descender el número de mensajes activos pero dejando intacta la marca de agua alta.

22.1.9. Listar artículos en un grupo

Para dirigirse a los artículos de noticias, el lector tiene que saber qué números de artículos representan a los artículos activos. La orden listgroup ofrece una lista con los números de los artículos activos en el grupo actual o en un grupo explícito si se proporciona el nombre del grupo:

    listgroup es.pruebas
    211 Article list follows
    1
    2
    3
    .

22.1.10. Descargar sólo la cabecera de un artículo

El usuario tiene que disponer de información acerca de un artículo antes de saber si desea leerlo. Hemos mencionado antes que algunas órdenes nos permiten descargar la cabecera y el cuerpo de los artículos de manera separada. La orden head se usa para solicitar al servidor que sólo transfiera la cabecera del artículo especificado al lector de noticias. Si el usuario no quiere leer el artículo, no hemos desperdiciado tiempo y ancho de banda transfiriendo innecesariamente el cuerpo de un artículo potencialmente grande.

Puede hacerse referencia a los artículos tanto por su número (el de la orden listgroup) como por el identificador del mensaje:

    head 2
    221 2 <7g5bhm$8f$2@news.vbrew.com> head
    Path: news.vbrew.com!not-for-mail
    From: terry@richard.geek.org.au
    Newsgroups: es.pruebas
    Subject: mensaje de prueba número 2
    Date: 27 Apr 1999 21:51:50 GMT
    Organization: La Cervecera Virtual
    Lines: 2
    Message-ID: <7g5bhm$8f$2@news.vbrew.com>
    NNTP-Posting-Host: localhost
    X-Server-Date: 27 Apr 1999 21:51:50 GMT
    Body: 
    Xref: news.vbrew.com es.pruebas:2
    .

22.1.11. Descargar sólo el cuerpo de un artículo

Si, por otra parte, el usuario decide que quiere leer el artículo, su lector de noticias necesita una manera de solicitar que se le transfiera el cuerpo del mensaje. La orden body se usa con este propósito. Funciona de una manera muy similar a la orden head, exceptuando que sólo se devuelve el cuerpo del mensaje.

    body 2
    222 2 <7g5bhm$8f$2@news.vbrew.com> body
    Esto es otro mensaje de prueba, ignórelo también libremente.
    
    .

22.1.12. Leer un artículo de un grupo

Aunque normalmente es más eficiente transferir las cabeceras y los cuerpos de manera separada, hay ocasiones en las que puede resultarnos mejor descargar el artículo completo. Un buen ejemplo de esto es en aplicaciones a través de las que queramos transferir todos los artículos de un grupo sin ningún tipo de preselección, como cuando usamos un programa con caché NNTP tipo leafnode.[1]

Naturalmente, NNTP nos ofrece una forma de hacer esto, y de manera ya poco sorprendente, funciona de manera casi idéntica a como lo hace la orden head. La orden article también acepta un número de artículo o un ID de mensaje como variable, pero devuelve el artículo completo incluyendo su cabecera:

    article 1
    220 1 <7g2o5r$aa$6@news.vbrew.com> article
    Path: news.vbrew.com!not-for-mail
    From: terry@richard.geek.org.au
    Newsgroups: es.pruebas
    Subject: mensaje de prueba número 1
    Date: 26 Apr 1999 22:08:59 GMT
    Organization: La Cerveceraa Virtual
    Lines: 2
    Message-ID: <7g2o5r$aa$6@news.vbrew.com>
    NNTP-Posting-Host: localhost
    X-Server-Date: 26 Apr 1999 22:08:59 GMT
    Body: 
    Xref: news.vbrew.com es.pruebas:1
    
    Esto es un mensaje de prueba, ignórelo libremente.
    
    .

Si intenta descargar un artículo desconocido el servidor le devolverá un mensaje con un código de respuestas apropiado y quizá un mensaje de texto legible:

    article 4
    423 Bad article number

En esta sección hemos descrito cómo se usan las órdenes NNTP más importantes. Si está interesado en desarrollar software que implemente el protocolo NNTP, debería acudir a los documentos RFC relevantes; ellos le proporcionarán información al detalle que aquí no podemos incluir.

Veamos ahora a NNTP en acción mediante el servidor nntpd.

Notas

[1]

leafnode se encuentra disponible por FTP anónimo en wpxx02.toxi.uni-wuerzburg.de en el directorio /pub/.