Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Desarrollo de una Herramienta Software para el Acceso a Redes TCP/IP a través de la Red Telefónica Conmutada

Última Actualización: 30 de Junio de 1.996 - Domingo

Capítulo 3:
El Módulo Físico

La responsabilidad del módulo físico consiste en transmitir los datagramas provenientes de las capas superiores (IP y ARP) y recibir los datagramas que les envían otras máuinas. Existen multitud de variantes posibles a la hora de implementar una capa física para la torre de protocolos TCP/IP, dependiendo de la interfaz o interfaces físicas disponibles.

En este Proyecto nos hemos centrado en las interfaces serie RS232C, MIDI y LAN, aunque actualmente sólo se ha implementado la versión RS232C. Asimismo existen básicamente cuatro protocolos diferentes para encapsular los datagramas IP/ARP en canales serie: SLIP (Serial Line IP) [RFC1055], PPP (Point to Point Protocol) [RFC1661] [RFC1662], KISS (Keep It Simply Stupid) [KISS] y SMACK (Stuttgart's Modified Amateur CRC KISS) [SMACK].

El protocolo SLIP es un sistema de encapsulado muy simple, sin ningún tipo de control de errores o flujo. Dado que está ideado para su empleo en conexiones punto a punto no soporta datagramas ARP. KISS, en cambio, ha sido diseñado específicamente considerando su aplicación en la red de RadioPaquete de Aficionado (AX.25) -una red broadcast- por lo que, aún siendo funcionalmente idéntico al SLIP, soporta datagramas ARP, RARP, etc. SMACK, por otra parte, es una mejora del KISS para entornos electromagnéticamente ruidosos como es el caso, lógicamente, de una estación de Radioaficionado. Para ello incorpora un CRC de 16 bits a todas las tramas. Los dos últimos sistemas, hasta donde sabe el autor, son utilizados exclusivamente en entornos de Radioaficionado.

El protocolo PPP (Point to Point Protocol) contrasta con los anteriores por su gran complejidad. Permite multiplexar a través de una misma línea protocolos de red diferentes, no estando exclusivamente limitado al mundo TCP/IP. Incorpora detección de errores en las tramas, autentificación, una capacidad de negociación de extensiones extremadamente desarrollada, asignación dinámica de direcciones IP, búsqueda de servidores de nombres y un largo etcétera. Está compuesto de un protocolo de control de enlace (LCP - Link Control Protocol) y una familia de protocolos de control de red (NCP - Network Control Protocol), siendo uno de los protocolos soportados el IP (Internet Protocol).

En [RFC1661] se definen sus características básicas, siendo el documento [RFC1662] donde se especifica su formato de trama (similar al HDLC - High-level Data Link Control). Las especificaciones son ampliadas en los documentos [RFC1333], [RFC1334] y [RFC1570]. Cada uno de las posibles familias de protocolos de control de red se especifica en uno o más documentos diferentes e independientes. El que nos interesa a nosotros es el protocolo asociado al IP [RFC1332].

Por último, en [RFC1912] se describen los problemas de patentes que han surgido durante el desarrollo de una serie de extensiones al protocolo PPP para posibilitar la compresión y encriptación en línea. El propietario de las patentes es Motorola y aunque dicha compañía ha mostrado su intención de facilitar licencias "bajo términos equitativos y razonables", todavía se ignora cuales serán dichas condiciones...


Interfaz

La interfaz de este módulo está constituida por diversos procesos cooperantes y varias rutinas que se ejecutan en el contexto del llamante.


PROC_FIS_BC

Este proceso es el encargado de inicializar este módulo. Debe ser invocado con un mensaje "MSG_INIT" o "MSG_QUIT". En general éste debería ser el primero o, en cualquier caso, uno de los primeros módulos en ser inicializado.


PROC_FIS_SUP

Este proceso recibe mensajes "MSG_MBUF" conteniendo una cadena de MBUF's representando un datagrama y lo transmite a través del canal indicado. Un canal especifica una interfaz física y un protocolo a emplear. El formato es el siguiente:

  • campo1: Cadena de MBUF's conteniendo el datagrama a enviar
  • campo2: Nombre del canal físico a través del cual se debe enviar el datagrama
  • campo3: No utilizado

Asimismo los datagramas que se reciben a través de una interfaz y un protocolo dado, asimilables a un canal existente, son enviados hacia los procesos "PROC_IP_INF" o "PROC_ARP_INF", según corresponda. Los mensajes serán, también, "MSG_MBUF". El formato es como sigue:

  • campo1: Un UNICO MBUF conteniendo el datagrama recibido
  • campo2: Nombre del canal físico a través del cual se recibió el datagrama
  • campo3: No utilizado

En cuanto a las rutinas, sus prototipos son:


estado fis_alta_canal(uint32 canal,uint32 protocolo,uint32 dispositivo);

Esta rutina crea un nuevo canal. Su identificador será 'canal', 'protocolo' el protocolo a emplear y 'dispositivo' el nombre de la interfaz física utilizada.

En la actualidad los protocolos existentes son:

  • PROT_NULL
    Este protocolo simplemente descarta todos los datagramas que se transmiten. Nunca se recibirá nada a través de él.

  • PROT_LOOP
    Este protocolo reenvía hacia arriba todo datagrama transmitido, exactamente igual que si se puenteasen las patillas de transmisión y recepción de la interfaz física.

  • PROT_SLIP
    Este protocolo se corresponde a [RFC1055]. Sólo puede existir un canal con protocolo SLIP a través de una interfaz determinada. Este protocolo obliga a que la línea física sea utilizada exclusivamente por un canal, ya que el SLIP no permite la multiplexación de datos.

  • PROT_PPP
    Este protocolo se corresponde a [RFC1661] [RFC1662]. Aunque el protocolo PPP soporta multiplexación de tramas de diferentes redes a través del mismo cable físico, la implementación actual no lo permite.

En cuanto a las interfaces físicas soportadas, o dispositivos, tenemos los siguientes:

  • DISP_INDF
    Este dispositivo indica, sencillamente, ningún dispositivo. Es la interfaz que debe utilizarse con "PROT_NULL" y "PROT_LOOP".

  • DISP_COM1
    Este dispositivo se corresponde al puerto serie primario del ordenador.

  • DISP_MIDI
    Dispositivo MIDI, si está disponible (Atari).

  • DISP_LAN
    Dispositivo LAN serie, si está disponible (Atari).

void fis_baja_canal(uint32 canal);

Esta rutina da de baja un canal. Su dispositivo asociado queda libre para un nuevo uso.


estado fis_flujo_canal(uint32 canal,uint16 tamanho);

Esta rutina solicita a permiso a la capa física para transmitir un datagrama de 'tamanho' bytes a través del canal 'canal'. Si podemos hacerlo la función retornará "OK". En caso contrario indicará "FLUJO_LLENO". Si el canal especificado no existe, devuelve "ERR_NO_CANAL".

La capa física dispone de una serie de búfferes internos para cada interfaz física, de una capacidad determinada. Ello permite mantener permanentemente ocupada la unidad de transmisión, si hay datos para ello. Aún cuando la capa física gestionará adecuadamente cualquier datagrama recibido con el control de flujo cerrado, se desaconseja dicha práctica.


void fis_ppp_auth(uint32 canal,pmbuf auth);

Esta rutina permite especificar los parámetros de autentificación para un canal PPP dado. El canal especificado debe utilizar el protocolo PPP. 'auth' es una cadena de dos MBUF's conteniendo el primero la identidad del usuario y el segundo su palabra de paso asociada.


Implementación

A pesar de la intención inicial finalmente no se programaron los protocolos KISS [KISS] ni SMACK [SMACK] debido a que en mi entorno urbano no existe ninguna red TCP/IP de Radioaficionado para poder evaluar el funcionamiento correcto de las rutinas desarrolladas. Es muy posible, no obstante, que muy pronto sean añadidas a la herramienta, ya que su difusión así lo exige.

En la actualidad el módulo físico sólo permite un protocolo por interfaz, debido a la dificultad de demultiplexarlo. A pesar de que el protocolo PPP incorpora bastantes funcionalidades al respecto se ha considerado innecesario para un uso normal.

Por otra parte el protocolo SLIP implantado no utiliza la idea de Phil Karn de acotar los datagramas por ambos extremos, y se limita a indicar su final. No se ha seguido dicha recomendación porque el autor opina que la calidad actual de las líneas telefónicas es lo bastante elevada como para que sea muy improbable que se detecten caracteres espúreos debidos al ruido. Si a ello unimos la amplia difusión del protocolo V.42 y similares (corrección de errores) en el mundo de los MODEMS, deducimos que no vale la pena la mayor complejidad y pérdida de prestaciones. No obstante el proceso receptor implementado es capaz de gestionar de forma adecuada datagramas nulos como los que resultarían si el otro extremo sí aplicase dicha técnica.

En cuanto al protocolo PPP, se ha realizado una implantación funcionalmente mínima. Se han seguido de forma detallada todos los pasos a la hora de la negociación LCP [RFC1661], pero la mayoría de las opciones son denegadas. Se deniega la compresión Van Jacobson [RFC1144] y la compresión de cabeceras. Se deniega la opción de CRC32 y CRC8. Se acepta, no obstante, la gestión de autentificación y la asignación dinámica de dirección IP. A pesar de todo el subconjunto implantado ha sido capaz de interoperar convenientemente con todos los sistemas proveedores con los que se ha probado. En cualquier caso, para facilitar la subsanación de cualquier problema, este módulo imprime información exhaustiva sobre las opciones que se están negociando y lo que, en todo momento, nos solicita el otro extremo.

En cuanto a la gestión de los dispositivos físicos, la transmisión y recepción de caracteres se realiza por interrupciones. No obstante en procesado en sí de los datagramas, así como la lectura del búffer de recepción y el rellenado del búffer de transmisión, se realizan durante los períodos IDLE del programa. Es muy importante que no haya ningún proceso IDLE con un tiempo de ejecución demasiado elevado, ni demasiados procesos IDLE activos en un momento determinado, so pena de perder datagramas por errores debidos a desbordamientos del búffer de recepción. Ello también tiene repercusiones en la transmisión, ya que aparecerán tiempos muertos que harán bajar el rendimiento. Se ha fijado una longitud de las colas de 4Kbytes, lo cual implica que disponemos una capacidad de tiempo muerto de unos dos segundos y medio en un modem de 14.400bps, más de un segundo para 28.800bps y prácticamente un segundo para 33.600bps (no se ha considerado la compresión de datos, pero sí el V.42). Dadas las velocidades de proceso de los sistemas personales actuales, ello parece más que suficiente.


Bibliografía


[KISS]      "Proposed "Raw" (aka "KISS") TNC Functional Spec"
            Phil Karn, KA9Q
            Mike Cheppionis, K3MC
            6 August 1986

[LABCD]     Laboratorio de Comunicación de Datos
            Curso 94-95. Vigo, 16 de Marzo de 1.995
            Alvaro Manuel Gómez Vieites
            Carlos Gabieiro Martínez
            Jose Cadavid Jáuregui
            Jesús Cea Avión

[LABCD-FIS] Laboratorio de Comunicación de Datos
            Curso 94-95. Vigo, 16 de Marzo de 1.995
            Capa Física
            Alvaro Manuel Gómez Vieites
            Carlos Gabieiro Martínez
            Jose Cadavid Jáuregui
            Jesús Cea Avión

[MACAX25]   "MacAX25 Design Speficications"
            Tim Hayes, N2KBG
            Abril 1.995

[POWERNET]  Proyecto PowerNet
            Jesús Cea Avión
            Implementación de multitarea cooperativa en lenguaje C
            11 de Abril de 1.990

[RFC1055]   RFC1055: "A NONSTANDARD FOR TRANSMISSION OF IP
            DATAGRAMS OVER SERIAL LINES: SLIP"
            J. Romkey
            Junio 1.988

[RFC1122]   RFC1122: "Requirements for Internet Hosts --
            Communication Layers"
            Robert Braden
            Octubre 1.989

[RFC1144]   RFC1144: "Compressing TCP/IP Headers for Low-Speed
            Serial Links"
            Van Jacobson
            Febrero 1.990

[RFC1332]   RFC1332: "The PPP Internet Protocol Control Protocol
            (IPCP)"
            Glenn McGregor
            Mayo 1.992

[RFC1333]   RFC1333: "PPP Link Quality Monitoring"
            William Allen Simpson
            Mayo 1.992

[RFC1334]   RFC1334: "PPP Authentication Protocols"
            Brian Lloyd
            William Allen Simpson
            Octubre 1.992

[RFC1377]   RFC1377: "The PPP OSI Network Layer Control Protocol
            (OSINLCP)"
            Dave Katz
            Noviembre 1.992

[RFC1541]   RFC1541: "Dynamic Host Configuration Protocol"
            R. Droms
            Octubre 1993

[RFC1570]   RFC1570: "PPP LCP Extensions"
            William Allen Simpson
            Enero 1.994

[RFC1661]   RFC1661: "The Point-to-Point Protocol (PPP)"
            William Allen Simpson
            Julio 1.994

[RFC1662]   RFC1662: "PPP in HDLC-like Framing"
            William Allen Simpson
            Julio 1.994

[RFC1841]   RFC1841: "PPP Network Control Protocol for LAN Extension"
            Joelle Bafile Chapman
            Dave Coli
            Andy Harvey
            Bent Jensen
            Kevin Rowett
            Septiembre 1.995

[RFC1877]   RFC1877: "PPP Internet Protocol Control Protocol
            Extensions for Name Server Addresses"
            Steve Cobb
            Diciembre 1.995

[RFC1915]   RFC1915: "Variance for The PPP Connection Control
            Protocol and The PPP Encryption Control Protocol"
            Frank Kastenholz
            Febrero 1.996

[SMACK]     "The SMACK Protocol"
            Jan Schiefer, DL5UE
            Dieter Deyke, DK5SG/N0PRA
            27 de Febrero de 1.992
            Original en Alemán. Traducción al Inglés por Mike
            Chace, G6DHU, en Febrero de 1.993



Python Zope ©1996 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS