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 13:
El Módulo FTP

El módulo FTP (File Transfer Protocol) [RFC959] es el que posibilita que una máquina intercambie ficheros con otras computadoras remotas. Aunque existen otros protocolos para cubrir la necesidad de compartir ficheros dentro del ámbito de una red local, como el NFS (Network File System) [RFC1094] [RFC1813], el protocolo FTP está diseñado específicamente para acceder a sistemas fuera de nuestra jurisdicción, como es el caso de los grandes servidores de ficheros repartidos por todo el mundo.

Esto hace que, en el ámbito TCP/IP mundial, el tráfico de ficheros derivado del uso del protocolo FTP sólo haya sido superado, en los últimos años, por el relacionado con el "World Wide Web" [HTTP1.1].

El protocolo FTP en sí está especificado en [RFC959], con una pequeña matización en [RFC1579] para facilitar el acceso de los clientes FTP cuando estos deben atravesar una "firewall" corporativa o departamental. En [RFC783] se define el TFTP (Trivial File Transfer Protocol) que, como su mismo nombre indica, es un protocolo extremadamente sencillo (menos de 4Kbytes de código) utilizable, fundamentalmente, en ámbitos LAN. Utiliza el protocolo UDP [RFC768], mientras que el FTP propiamente dicho utiliza el TCP [RFC793]. En [RFC906] se proporciona un ejemplo de uso de TFTP para inicializar puestos de red sin disco. En [RFC913] se define el protocolo SFTP (Simple File Transfer Protocol), un paso intermedio entre TFTP y FTP.

Tal y como se ha especificado el protocolo FTP incluso posibilita el intercambio de ficheros entre dos servidores, transferencia tutelada por una tercera máquina. Dicha posibilidad no se ha considerado útil y no se ha implementado aquí. En caso de necesidad es muy fácil utilizar el protocolo TELNET para lograr dicho fin.


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_FTP_BC

Este proceso es el encargado de inicializar este módulo. Debe ser invocado con un mensaje "MSG_INIT" o "MSG_QUIT". La inicialización de este módulo debe ser posterior a la del módulo TCP.


PROC_FTP_SUP

Este proceso es el encargado de recibir los comandos provenientes de la capa superior y efectuar las tareas demandadas. Los mensajes que espera recibir son "MSG_MBUF", con el siguiente formato:

campo1: Cadena de MBUF's conteniendo el comando a ejecutar y todos sus parámetros. El comando y los parámetros deben ir, cada uno de ellos, en un nodo de la cadena.
campo2: Identificador de la conexión
campo3: No utilizado

La capa FTP intentará ejecutar el comando solicitado, con los parámetros que se indiquen. La realimentación que se genera es puramente visual. Cuando el protocolo FTP desea informar de algo al usuario envía un mensaje "MSG_MBUF" a la capa superior, con el formato habitual:

campo1: Cadena de MBUF's conteniendo el mensaje a visualizar
campo2: Identificador de la conexión
campo3: Indeterminado

Como regla general, para que el usuario pueda distinguir los mensajes textuales de la capa FTP de los enviados por el servidor, los primeros van precedidos por tres asteriscos ("***").

Si el usuario desea abortar la ejecución de un comando FTP, genera un mensaje "MSG_FTP_ABORT" con el formato:

campo1: Indeterminado
campo2: Identificador de la conexión
campo3: Indeterminado

La realimentación, nuevamente, será visual.

Los comandos actualmente implementados son:

  • USER

    El primer parámetro de este comando especifica el nombre de usuario con el que debemos identificarnos ante el servidor FTP. Si existe un segundo parámetro, éste constituirá la palabra de paso asociada.

    Este comando sólo se utiliza cuando se desea modificar la autentificación efectuada al principio del enlace al servidor. De hecho cuando se abre una sesión FTP, esta capa se encarga automáticamente de realizar la autentificación sin que el usuario deba escribir ningún comando.

  • PASS

    Este comando necesita un parámetro, que será la palabra clave asociada a un nombre de usuario. Este comando debe enviarse inmediatemente después del comando "USER" cuando en éste no se especifique ya la palabra de paso. Normalmente se utiliza dicho comando para realizar la autentificación, por lo que "PASS" se puede considerar innecesario.

  • QUIT

    Este comando no requiere parámetros. Solicita al servidor que cierre el enlace. Si hay alguna transferencia en progreso, el servidor retrasará el cierre de la conexión hasta que se haya terminado de transferir el fichero.

    Cuando la conexión se cierra se envía un mensaje "MSG_FTP_CLOSE" con el formato:

    campo1: Ignorado
    campo2: Identificador de la conexión
    campo3: Ignorado

  • ASCII

    Los ficheros transferidos se consideran ASCII. El protocolo realizará cualquier conversión que considere conveniente para adaptar los datos recibidos al formato local.

  • BINARY

    Los ficheros transferidos se consideran BINARIOS. No se realiza ninguna conversión. Este es, habitualmente, el modo en el que se debería trabajar a la hora de intercambiar ficheros. Dado que el protocolo FTP fija que el modo por defecto sea ASCII, es responsabilidad del usuario el enviar un comando "BINARY".

  • CWD

    Este comando requiere un parámetro e indica a la máquina remota cual debe ser el directorio de trabajo actual.

  • LCD

    Sin ningún parámetro este comando informa de cual es nuestro directorio local actual. Si se indica un parámetro, éste será nuestro nuevo directorio local. El directorio local es el directorio donde se reciben los ficheros que envía el servidor y desde dónde se leen los ficheros que se le envían al mismo.

  • DIR

    Este comando solicita el listado de un directorio. Si no se indican parámetros se listará el directorio actual. Si se indica un parámetro se listará el directorio especificado.

  • PWD

    Este comando no necesita ningún parámetro. Pide al servidor que informe de cual es el "path" de acceso al directorio de trabajo actual.

  • MKDIR

    Este comando solicita al servidor que cree el directorio especificado.

  • RMDIR

    Este comando solicita al servidor que borre el directorio especificado.

  • GET

    Este comando solicita el envío de un fichero. El primer parámetro indica el nombre del fichero que queremos. El segundo parámetro, si existe, indica el nombre con el que debe almacenarse en nuestro disco. Si el segundo parámetro no existe, se intentará grabar con el mismo nombre. Si el segundo parámetro es un guión ("-"), el fichero se listará en pantalla.

  • PUT

    Este comando informa al servidor de que se le va a enviar un fichero. Si sólo se indica un parámetro, éste será el nombre del fichero a transmitir. Si se indican dos parámetros, el primero será el nombre del fichero a enviar y el segundo el nombre con el cual debe ser almacenado en el servidor.

  • DEL

    Este comando solicita al servidor que borre el archivo especificado.

Los comandos pueden escribirse en mayúsculas, minúsculas o cualquier combinación de las mismas. Los parámetros, en cambio, suelen ser interpretados por el servidor y deben escribirse teniendo en cuenta la convención utilizada localmente en el mismo. Por ejemplo, en un servidor UNIX las mayúsculas y minúsculas son significativas en un nombre de fichero o directorio, mientras que en una máquina MS-DOS son consideradas equivalentes.


PROC_FTP_INF

Este proceso es el encargado de gestionar la recepción y el envío de ficheros, y demás información asociada. En general no tiene otra interacción con el usuario que el envío de textos para ser impresos. No obstante también se encarga de informar de la apertura y cierre de enlaces FTP.

  • MSG_MBUF

    Con estos mensajes se pretende que la capa superior imprima en la pantalla el texto indicado.

    campo1: Cadena de MBUF's conteniendo el mensaje a visualizar
    campo2: Identificador de la conexión
    campo3: Indeterminado

  • MSG_FTP_OPEN

    Este mensaje se genera para indicar a la capa superior que ha sido aceptado un intento de conexión FTP a una máquina remota. A partir de ese momento la conexión está abierta y lista para aceptar comandos. Habitualmente el primer paso de esta capa es pedir al usuario que se identifique, solicitándole su nombre de usuario y su palabra de paso. No es necesario utilizar los comandos "USER" o "PASS".

    campo1: Valor indeterminado
    campo2: Identificador de la conexión
    campo3: Valor indeterminado

  • MSG_FTP_CLOSE

    Este mensaje se genera cuando uno de los extremos cierra la conexión FTP, ya sea mediante el comando correspondiente o gracias a la llamada imperativa que será descrita a continuación.

    campo1: Valor indeterminado
    campo2: Identificador de la conexión
    campo3: Valor indeterminado

En cuanto a las rutinas, sus prototipos son:


void ftp_open(uint32 ip,uint16 puerto,uint32 id,proc_id proc_retorno);

Esta rutina intenta realizar una conexión FTP al puerto 'puerto' de la máquina 'ip'. 'id' contiene el identificador de la conexión y 'proc_retorno' es el proceso que debe ser informado de todos los eventos y que recibe los datos en sí. Como resultado de esta llamada, el proceso especificado recibirá un mensaje "MSG_FTP_OPEN" o bien un "MSG_FTP_CLOSE", según corresponda. Su formato será el declarado anteriormente.

Aunque esta llamada permite abrir una conexión FTP de control en cualquier puerto donde haya un servidor FTP, éstos tienen un puerto ya asignado para tal fin: "FTP_PUERTO" (puerto 21).


void ftp_close(uint32 id);

Esta rutina cierra una conexión, especificada según su identificador 'id'. El proceso responsable recibirá un "MSG_FTP_CLOSE", con el formato habitual, cuando la conexión se cierre finalmente. Esta orden no puede ser ignorada por el servidor, que se verá forzado a aceptar la desconexión. Si hay alguna transferencia en curso, se truncará en este punto.


estado ftp_flujo(uint32 id);

Esta rutina informa de la disponibilidad de la capa FTP para aceptar nuevos comandos. La rutina devuelve "FLUJO_LLENO" si no puede hacerse cargo de comandos adicionales y "OK" si admite nuevas peticiones. Dada la semántica implantada, si se envían comandos cuando el control de flujo está cerrado se mantendrán en una cola de espera. Adicionalmente se garantiza que si en un momento dado el control de flujo está abierto, éste permanecerá en dicho estado hasta que se envíe un nuevo comando. La utilidad de una función así consiste en la ejecución de ficheros "script" por parte del módulo principal.

'id' es el identificador de conexión sobre la cual estamos solicitando información. Si en un momento dado el control de flujo está cerrado habrá que reintentarlo de nuevo tras un tiempo prudencial (por ejemplo, una décima de segundo).


Implementación

La implantación que se ha efectuado del protocolo FTP sigue de forma precisa lo especificado en [RFC959]. No se han incluido algunas de las posibilidades por considerarlas obsoletas y de uso muy poco común. De hecho muchos de los servidores analizados durante las pruebas de funcionamiento tampoco las soportaban. Los formatos de transferencia definidos son:

  • Tipos de datos:

    • ASCII

      Este tipo es el utilizado por defecto. La máquina origen convertirá el texto a formato NVT (Network Virtual Terminal), tal y como se define en el protocolo TELNET [RFC854], y la máquina destina convertirá la información recibida a su propio formato interno.

    • IMAGE

      La información se considera datos binarios no sujetos a interpretación ni traducción. Ni la máquina fuente ni la máquina destino los modificarán en modo alguno. Este es el formato utilizado para la transferencia de ficheros cuando éstos no constituyen texto. Ejemplos de ello son programas ejecutables, gráficos, datos comprimidos, etc. Se puede utilizar este tipo aún cuando los ficheros estén constituidos por texto, siempre y cuando luego el usuario disponga de alguna herramienta para adaptar los CR, LF o CRLF de final de línea y demás idiosincrasias propias de cada equipo informático. En la actualidad ello no constituye ningún problema.

    • EBCDIC
    • LOCAL

      Estos tipos no se soportan, por considerarlos anticuados y poco difundidos.

  • Formatos de control: (para modos ASCII o EBCDIC)

    • NON PRINT

      Este formato indica, en modo ASCII que los datos no deben modificarse. En general la idea de ello es que no van a utilizarse para imprimir, así que no debería contener ninguna información "no texto", como tabuladores, "Form Feed", etc.

    • TELNET FORMAT CONTROLS

    • CARRIAGE CONTROL (ASA - Fortran)

      Estos formatos especifican diferentes sistemas de control utilizados a la hora de imprimir un texto. Dado que el cliente FTP implementado pone el máximo interés en no modificar los datos que se transmiten o reciben, o hacerlo lo mínimo posible, estos formatos no son soportados.

  • Estructuras de datos

    • FILE STRUCTURE

      Este formato es el normal y el único que se soporta. Asume que el fichero es una secuencia continua de bytes.

    • RECORD STRUCTURE

    • PAGE STRUCTURE

      Estas estructuras imponen un formato particular en el fichero y no son soportadas.

  • Modo de transmisión

    • STREAM MODE

      Este modo es el único que se soporta. Asume que el cierre de la conexión de datos FTP supone el EOF.

    • BLOCK MODE

    • COMPRESSED MODE

      No soportados.

Lo ideal sería, hoy en día, soportar sólo: "IMAGE"+"FILE"+"STREAM", ya que será la única combinación de sistemas que el usuario va a utilizar cuando acceda a un servidor público FTP. La razón de implantar también los modos "ASCII"+"NON PRINT" es porque, por razones históricas, éste es el formato por defecto cuando se realizar una conexión FTP.


Bibliografía


[HTTP1.1]   "HyperText Transfer Protocol"
            http://www.w3.org

[RFC768]    RFC768: "User Datagram Protocol"
            Jon Postel
            Agosto 1.981

[RFC783]    RFC783: "THE TFTP PROTOCOL (REVISION 2)"
            K. R. Sollins
            Junio 1.981

[RFC793]    RFC793: "Transport Control Protocol"
            Jon Postel
            Septiembre 1.981

[RFC854]    RFC854: "Telnet Protocol specification"
            Jon Postel
            Joyce Reynolds
            Mayo 1.983

[RFC906]    RFC906: "Bootstrap Loading using TFTP"
            Ross Finlayson
            Junio 1.984

[RFC913]    RFC913: "Simple File Transfer Protocol"
            Mark K. Lottor
            Septiembre 1.984

[RFC959]    RFC959: "FILE TRANSFER PROTOCOL (FTP)"
            Jon Postel
            Joyce Reynolds
            Octubre 1.995

[RFC1094]   RFC1094: "NFS: Network File System Protocol
            Specification"
            Sun Microsystems, Inc.
            Marzo 1.989

[RFC1123]   RFC1123:"Requirements for Internet Hosts --
            Application and Support"
            Robert Braden
            Octubre 1.989

[RFC1579]   RFC1579: "Firewall-Friendly FTP"
            Steven M. Bellovin
            Febrero 1.994

[RFC1639]   RFC1639: "FTP Operation Over Big Address Records
            (FOOBAR)"
            David M. Piscitello
            Junio 1.994

[RFC1813]   RFC1813: "NFS Version 3 Protocol Specification"
            B. Callaghan
            B. Pawlowski
            P. Staubach
            Junio 1.995



Python Zope ©1996 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS