DOCUMENTACION

 
Network Working Group                                          J. Postel
Request for Comments: 959                                    J. Reynolds
                                                                     ISI
Obsoletes RFC: 765 (IEN 149)                                Octubre 1985
Traducción al castellano:                                   Febrero 2000
Gonzalo Paniagua Javier                           <gpanjav@jazzfree.com>

              PROTOCOLO DE TRANSFERENCIA DE FICHEROS (FTP)

Estado de este Documento

   Este documento es la especificación oficial del Protocolo de
   Transferencia de Ficheros (File Transfer Protocol, FTP). Se permite
   la distribucion ilimitada de este documento.

   Las siguientes nuevas órdenes opcionales se incluyen en esta edición
   de la especificación:

      CDUP (cambiar al directorio padre), SMNT (montar estructura), STOU
      (guardar con nombre único), RMD (Borrar directorio), MKD (Make
      Directory), PWD (mostrar directorio actual), y SYST (sistema).

   Esta especificación es compatible con ediciones anteriores.

1.  INTRODUCCION

   Los objetivos del FTP son 1) promocionar el uso compartido de
   ficheros (programas y/o datos), 2) animar al uso indirecto o
   implícito (a través de programas) de servidores remotos, 3) hacer
   transparente al usuario las variaciones entre la forma de almacenar
   ficheros en diferentes ordenadores, y 4) transferir datos fiable y
   eficientemente. El FTP, aunque puede ser utilizado directamente por
   un usuario en un terminal, está diseñado principalmete para ser usado
   por programas.

   Con esta especificación se intentan satisfacer las diversas
   necesidades de los usuarios de maxi-hosts, mini-hosts, estaciones de
   trabajo personales y TAC's con un diseño de protocolo simple y fácil
   de programar.

   En este documento se asumen conocimientos del Protocolo de Contol de
   Transmisión (TCP, Transmision Control Protocol) [2] y del Protocolo
   Telnet [3]. Estos documentos se encuentras en el manual de protocolos
   de ARPA-Internet.

2.  HISTORIA, TERMINOLOGIA Y MODELO FTP

   En esta sección se tratan la historia, la terminología y el modelo
   FTP.  Los términos que se definen en esta sección son sólo aquellos
   que tienen un significado especial en el FTP. Parte de la
   terminología es muy específica al modelo FTP; algunos lectores pueden
   encontrar conveniente consultar la sección sobre el modelo FTP
   mientras revisan la terminología.

   2.1.  HISTORIA

      El FTP ha pasado por un larga evolución a través de los años.  El
      apéndice III es una recopilación cronológica de los RFC que tratan
      el FTP. Estos incluyen la primera propuesta de mecanismos para
      transferencia de ficheros de 1971, que se desarrolló para su uso
      en servidores del M.I.T. (RFC 114), más los comentarios y
      discusiones del RFC 141.

      El RFC 172 proporcionó un protocolo orientado al nivel de usuario
      para transferir ficheros entre ordenadores (incluyendo IMP's
      terminales). Una revisión de este plasmada en el RFC 265, inició
      una revisión adicional, mientras que el RFC 281 sugirió más
      cambios.  El uso de una transacción para elegir el tipo de datos
      se propuso en el RFC 294 en enero de 1982.

      El RFC 354 dejó obsoletos los RFCs 264 y 265. El Protocolo de
      Transferencia de Ficheros se definió en este momento como un
      protocolo para transferencia de ficheros entre ordenadores
      conectados a la red ARPANET, señalando como función principal del
      FTP la transferencia de ficheros fiable y eficiente entre
      ordenadores y permitiendo el uso adecuado de las características
      de almacenamiento remotas. El RFC 385 siguió comentando errores,
      enfatizó algunos puntos y añadió características al protocolo,
      mientras que el RFC 414 fue un informe sobre los servidores FTP
      que estaban funcionando. El RFC 430, que salió a la luz en 1973,
      (entre otros muchos RFCs) presentó más comentarios sobre el FTP.
      Finalmente, se publicó un documento "oficial" sobre el FTP como
      RFC 454.

      Hacia julio de 1973, se hicieron considerables cambios a las
      últimas versiones del FTP, pero la estructura general permaneció
      igual.  El RFC 542 se publicó como una nueva espcificación
      "oficial" para reflejar esos cambios. Sin embargo, muchas
      implementaciones basadas en anterios especificaciones no se
      actualizaron.

      En 1974, los RFCs 607 y 614 continuaron los comentarios sobre el
      FTP.  El RFC 624 propuso más cambios en el diseño y pequeñas
      modificaciones.  En 1975, el RFC 686, titulado "Leaving Well
      Enough Alone", trató las diferencias entre todas las primeras y
      las últimas versiones del FTP. El RFC 691 presentó una pequeña
      revisión del RFC 686, referente al tema de ficheros para imprimir.

      Motivado por la transición del NCP al TCP como protocolo
      subyacente, nació un fénix de todos los anteriores esfuerzos en el
      RFC 765 como la especificación de FTP para uso sobre TCP.

      Esta edición de la especificación FTP está dirigida a la
      corrección de pequeños errores en la documentación, a mejorar la
      explicación de algunas características del protocolo, y a añadir
      algunas nuevas órdenes opcionales.

      En particular, se incluyen las siguientes nuevas órdenes
      opcionales en esta edición de la especificación:

         CDUP - Cambiar al directorio padre (Change to Parent Directory)

         SMNT - Montar estructura (Structure Mount)

         STOU - Guardar con nombre único (Store Unique)

         RMD - Borrar directorio (Remove Directory)

         MKD - Crear directorio (Make Directory)

         PWD - Mostrar directorio actual (Print Working Directory)

         SYST - Sistema (System)

      Esta especificación es compatible con la anterior edición. Un
      programa implementado conforme a la especificación anterior
      debería estar automáticamente en conformidad con esta
      especificación.

   2.2.  TERMINOLOGIA

      ASCII

         El conjunto de caracteres ASCII se considera tal y como está
         definido en el manual de protocolos de ARPA-Internet. En el FTP
         los caracteres ASCII se definen como la mitad inferior de un
         código de 8 bits (i.e., el bit más significativo es cero).

      controles de acceso

         Los controles de acceso definen los privilegios de acceso del
         usuario para el uso de un sistema y de los ficheros que hay en
         él. Son necesarios para evitar el uso no autorizado o
         accidental de ficheros. Es una prerrogativa para un proceso
         servidor FTP utilizar los controles de acceso.

      tamaño de byte

         Hay dos tamaños de byte interesantes en el FTP: el tamaño
         lógico de byte del fichero y el tamaño de byte usado para la
         transmisión de los datos. El tamaño de byte utilizado para la
         transmisión es siempre de 8 bits. Este tamaño no es
         necesariamente el tamaño de byte con el que se guardan los
         datos en un sistema ni el tamaño lógico de byte para la
         interpretación de la estructura de los datos.

      conexión de control

         La ruta de comunicación entre el USER-PI y el SERVER-PI para el
         intercambio de órdenes y respuestas. Esta conexión sigue el
         Protocolo Telnet.

      conexión de datos

         Una conexión bidireccional sobre la que se transfieren los
         datos en un modo y tipo especificados. Los datos transferidos
         pueden ser una parte de un fichero, un fichero entero o un
         cierto numero de ficheros. La conexión se puede establecer
         entre un server-DTP y un user-DTP o entre dos server-DTP's.

      puerto de datos

         El proceso de transferencia pasiva de datos "escucha" en el
         puerto de datos hasta que recibe una conexión del proceso de
         transferencia activa para abrir la conexión de datos.

      DTP

         El proceso de transferencia de datos (DTP, Data Transfer
         Process) establece y maneja la conexión de datos. Puede ser
         activo o pasivo.

      Fin-de-linea (EOL, end-of-line)

         La secuencia fin-de-linea define la separación entre líneas. La
         secuencia consiste en un retorno de carro seguido de un
         carácter de nueva línea.

      EOF (fin-de-fichero, end-of-file)

         La condición fin-de-fichero que define el final de un fichero
         en proceso de transmisión.

      EOR (end-of-record, fin-de-registro)

         La condición fin-de-registro que define el final de un registro
         en proceso de transferencia.

      recuperación de errores

         Un procedimiento que permite al usuario recuperar el control a
         partir de ciertas condiciones de error, como un fallo en el
         servidor o en el proceso de transferencia. En el FTP, la
         recuperación de errores puede implicar el reinicio de la
         transferencia de un fichero a partir de un cierto punto.

      órdenes FTP

         Un conjunto de órdenes que abarcan la información de control
         que va desde el proceso user-FTP al proceso server-FTP.

      fichero

         Un conjunto ordenado de datos del ordenador (incluyendo
         programas), de longitud arbitraria, definido de forma única por
         una ruta.

      modo

         El modo en que se tranfieren datos por la conexión de datos.
         El modo define el formato de los datos durante la
         transferencia, incluyendo EOR y EOF. Los modos de transferencia
         definidos para FTP se describen en la sección Modos de
         Transmisión.

      NVT

         El terminal virtual de red (Network Virtual Terminal) tal y
         como se define en el Protocolo Telnet.

      NVFS

         El sistema de ficheros virtual de red (Network Virtual File
         System). Un concepto que define un sistema de ficheros de red
         estándar con órdenes estándar y convenciones sobre los nombres
         de ruta [pathname].

      página

         Un fichero se puede estructurar como un conjunto de partes
         independientes llamadas páginas. El FTP soporta la transmisión
         de ficheros discontinuos como páginas indizadas independientes.

      nombre de ruta [pathname]

         El nombre de ruta se define como una cadena de caracteres que
         el usuario pasa al sistema de ficheros para identificar un
         fichero. La ruta normalmente contiene nombres de dispositivos
         y/o directorios y un nombre de fichero. El FTP no especifica
         aún un estándar para indicar una ruta. Cada usuario debe seguir
         las normas que dictan los sistemas de ficheros implicados en la
         transferencia para nombrar los ficheros.

      PI

         El Intérprete del Protocolo (Protocol Interpreter). La parte
         del usuario y del servidor del protocolo tienen distintos
         papeles que se implementan como un user-PI y un server-PI.

      registro

         Un fichero secuencial se puede estructurar en un número de
         partes contiguas llamadas registros. El FTP soporta las
         estructuras de registro, pero un fichero no tiene por qué tener
         una estructura de registro.

      respuesta

         Una respuesta es un asentimiento (positivo o negativo) enviada
         por el servidor al usuario a través de la conexión de control
         en respuesta a una orden FTP. La forma general de una respuesta
         es un código de terminación seguido de una cadena de texto. Los
         códigos son usados por los programas y el texto por las
         personas.

      server-DTP (server Data Transfer Process)

         El proceso de transferencia de datos (Data Transfer Process),
         en su estado normal de "activo", establece una conexión de
         datos con el puerto de datos que está a la espera. Prepara los
         parámetros para transferir y almacenar y transfiere los datos
         cuando así se requiere a través de su PI. El DTP se puede poner
         en estado "pasivo" para esperar una conexión, en lugar de
         iniciarla.

      proceso server-FTP

         Un proceso o un conjunto de ellos que realizan la función de
         transferencia de ficheros en conjunción con el proceso user-FTP
         y, posiblemente, otro servidor. Las funciones consisten en un
         intérprete de protocolo (PI) y un proceso de transferencia de
         datos (DTP).

      server-PI (server Protocol Interpreter)

         El intérprete de protocolo del servidor "escucha" en el puerto
         L hasta que recibe una conexión de un user-PI y establece una
         conexión de comunicaciones para control. Recibe órdenes FTP
         estándar desde el user-PI, envía respuestas y controla el
         server-DTP.

      tipo

         El tipo de representación de datos usado para transferir y
         almacenar los datos. El tipo implica ciertas transformaciones a
         la hora de almacenar y enviar los datos. Los tipos de
         representación definidos en el FTP se describen en la sección
         titulada "Estableciendo conexiones de datos".

      usuario

         Una persona o un proceso en su lugar que desea utilizar el
         servicio de transferencia de ficheros. La persona puede
         interactuar directamente con el proceso server-FTP, pero se
         prefiere el uso de un proceso user-FTP ya que el diseño del
         protocolo está orientado a su utilización por autómatas.

      user-DTP (user Data Transfer Process)

         El Proceso de Transferencia de Datos espera a recibir una
         conexión en el puerto de datos desde el proceso server-FTP.  Si
         dos servidores están transfiriendo datos entre ellos, el user-
         DTP permanece inactivo.

      proceso user-FTP

         Un conjunto de funciones incluyendo un intérprete de protocolo,
         un proceso de transferencia de datos y una interfaz de usuario
         que juntos realizan la función de transferir ficheros en en
         cooperación con un proceso server-FTP. La interfaz de usuario
         permite usar un lenguaje local en el diálogo orden-respuesta
         con el usuario.

      user-PI (user Protocol Interpreter)

         El intérprete de protocolo de usuario inicia la conexión de
         control desde su puerto U hasta el proceso server-FTP, envía
         órdenes FTP y controla el user-DTP si es necesario para la
         transferencia de ficheros.

      2.3.  EL MODELO FTP

         Teniendo en cuenta las definiciones anteriores, el siguiente
         modelo (mostrado en la Figura 1) representa un diagrama de un
         servicio FTP.

                                        ------------
                                        |/--------\|
                                        ||        ||   ---------
                                        ||Interfaz|<-->|Usuario|
                                        |\----^---/|   ---------
              ----------                |     |    |
              |/------\|  Ordenes FTP   |/----V---\|
              ||Server|<---------------->|   User ||
              ||  PI  || Respuestas FTP ||    PI  ||
              |\--^---/|                |\----^---/|
              |   |    |                |     |    |
 ----------   |/--V---\|   Conexión     |/----V---\|  ----------
 |Sistema |<-->|Server|<---------------->|  User  |<-->|Sistema|
 |  de    |   ||      ||   de datos     ||        ||  |   de   |
 |ficheros|   || DTP  ||                ||   DTP  ||  |ficheros|
 ----------   |\------/|                |\--------/|  ----------
              ----------                -------------
                Server-FTP                   User-FTP

          Figura 1: Modelo para el uso del FTP.

   NOTAS: 1. La conexión de datos es bidireccional.
         2. La conexión de datos no tiene por qué existir todo el
         tiempo.

         En el modelo descrito en la Figura 1, el intérprete de
         protocolo de usuario (user-PI), inicia la conexión de control.
         La conexión de control sigue el Protocolo Telnet. Las órdenes
         FTP estándar las genera el user-PI y se transmiten al proceso
         servidor a través de la conexión de control. (El usuario puede
         establecer una conexión de control directa con el server-FTP,
         desde un terminal TAC por ejemplo, y enviar órdenes FTP
         estándar, obviando así el proceso user-FTP.)  Las respuestas
         estándar se envían desde el server-PI al user-PI por la
         conexión de control como contestación a las órdenes.

         Las órdenes FTP especifican parámetros para la conexión de
         datos (puerto de datos, modo de transferencia, tipo de
         representación y estructura) y la naturaleza de la operación
         sobre el sistema de ficheros (almacenar, recuperar, añadir,
         borrar, etc.). El user-DTP u otro proceso en su lugar, debe
         esperar a que el servidor inicie la conexión al puerto de datos
         especificado y transferir los datos en función de los
         parámetros que se hayan especificado. Se debe reseñar que el
         puerto de datos no tiene por qué estar en el mismo ordenador
         que envía las órdenes FTP a través de la conexión de control,
         pero el usuario o el proceso user-FTP debe asegurarse de que se
         espera la conexión en el puerto de datos indicado. También hay
         que destacar que la conexión de datos se puede usar
         simultáneamente para enviar y para recibir.

         En otra situación, un usuario puede querer transferir ficheros
         entre dos ordenadores que no son locales. El usuario prepara
         las conexiones de control con los dos servidores y da las
         órdenes necesarias para crear una conexión de datos entre
         ellos. De esta forma, la información de control se envía al
         user-PI pero los datos se transfieren entre los procesos de
         transferencia de datos de los servidores. A continuación se
         muestra un modelo de esta interacción servidor-servidor.

               Control     ------------   Control
                ---------->| User-FTP |<-----------
                |          | User-PI  |           |
                |          |   "C"    |           |
                V          ------------           V
         --------------                        --------------
         | Server-FTP |   Data Connection      | Server-FTP |
         |    "A"     |<---------------------->|    "B"     |
         -------------- Port (A)      Port (B) --------------


                              Figura 2

      El protocolo requiere que las conexiones de control permanezcan
      abiertas mientras se transfieren datos. Es responsabilidad del
      usuario solicitar el cierre de las conexiones de control una vez
      termine de usar el servicio, mientras que el servidor es el
      encargado de cerrarlas. El servidor puede interrumpit la
      transferencia de datos si las conexiones de control se cierran sin
      previa solicitud.

      La relación entre FTP y Telnet:

         El FTP usa el protocolo Telnet en la conexión de control. Esto
         se puede conseguir de dos formas: primera, el user-PI o el
         server-PI pueden implementar las reglas del Protocolo Telnet
         directamente; o, segunda, el user-PI o el server-PI pueden usar
         el módulo Telnet que exista en el sistema.

         La facilidad de implementación, compartir código y la
         programación modular, están a favor de la segunda aproximación.
         La eficiencia y la independencia abogan por la primera
         aproximación. En la práctica, el FTP no depende mucho del
         protocolo Telnet, por ello la primera aproximación no
         necesariamente implica gran cantidad de código.

3.  FUNCIONES DE TRANSFERENCIA DE DATOS

   Los ficheros sólo se transmiten por la conexión de datos. La conexión
   de control se usa para enviar órdenes, que describen la función a
   realizar, y las repuestas a estas órdenes (ver la sección "Respuestas
   FTP"). Varias órdenes se refieren a la transferencia de datos entre
   ordenadores. Estas órdenes incluyen MODE (modo) que especifica cómo
   se transmiten los bits de datos y las órdenes STRU (STRUcture,
   estructura) y TYPE, que se usan para definir la forma de
   representación de los datos. La transmisión y la representación son
   básicamente independientes, pero el modo de transmisión flujo depende
   de la estructura del fichero y si se especifica el modo de
   transmisión "comprimido", la naturaleza del byte de relleno depende
   del tipo de representación.

   3.1.  REPRESENTACION DE DATOS Y ALMACENAMIENTO

      Los datos se tranfieren desde un dispositivo de almacenamiento en
      el ordenador que envía los datos a otro en el ordenador que los
      recibe. A menudo es necesario realizar ciertas transformaciones en
      los datos porque la representación de los datos almacenados varía
      de un ordenador a otro. Por ejemplo NVT-ASCII tiene diferentes
      representaciones de los datos almacenados en diferenctes sistemas.

      Los TOPS-20 de DEC generalmente almacenana NVT-ASCII como cinco
      caracteres ASCII de 7 bits, justificados a la izquierda en una
      palabra de 36 bits. Es conveniente convertir caracteres a la
      representación estándar NVT-ASCII cuando se transmite texto entre
      sistemas diferentes. Los ordenadores que intervienen en la
      transferencia deberían realizar las transformaciones necesarias
      entre la representación estándar y su representación interna.

      Nos encontramos con un problema diferente cuando se transmiten
      datos en forma binaria (no caracteres) entre ordenadores con
      distinto tamaño de palabra. No siempre está claro cómo se deben
      enviar los datos y como se deben almacenar al recibirlos. Por
      ejemplo, cuando se transmiten bytes de 32 bits desde un sistema
      con tamaño de palabra de 32 bits a un sistema con tamaño de
      palabra de 36 bits, sería conveniente (por razones de eficiencia y
      utilidad) almacenar los bytes de 32 bits justificados a la derecha
      en una palabra de 36 bits en el sistema receptor. En cualquier
      caso, el usuario debería tener la opción de especificar la
      representación de los datos y las transformaciones realizadas en
      ellos. Hay que señalar que el FTP proporciona muy limitados tipos
      de representación. Las transformaciones necesarias más allá de
      esta limitada capacidad las deberá realizar el usuario
      directamente.

      3.1.1.  TIPOS DE DATOS

         El usuario especifica las representaciones de datos que se
         manejarán en el FTP. Este tipo puede definir implícita (como es
         el caso de ASCII y EBCDIC) o explícitamente (como en un tamaño
         de byte local) un tamaño de byte para la interpretación
         denominado "tamaño de byte lógico". Hay que tener en cuenta que
         esto no tiene nada que ver con el tamaño de byte usado para la
         transmisión a través de la conexión de datos, llamado "tamaño
         de byte de transferencia", y no debería haber confusión entre
         ambos. Por ejemplo, NVT-ASCII tiene un tamaño de byte lógico de
         8 bits. Si el tipo es tamaño de byte local entonces la orden
         TYPE tiene un segundo parámetro obligatorio especificando el
         tamaño de byte lógico. El tamaño del byte de transferencia es
         siempre de 8 bits.

         3.1.1.1.  TIPO ASCII

            Este es el tipo por defecto y debe ser admitido por todas
            las implementaciones del FTP. Su principal propósito es
            transferir ficheros de texto, excepto cuando ambos
            ordenadores encuentran el tipo EBCDIC más conveniente.

            El ordenador que envía los datos, los convierte de una
            representación de caracteres interna a la representación
            estándar NVT-ASCII de 8 bits (ver la especificación de
            Telnet).  El receptor convertirá los datos del tipo estándar
            a su propia forma interna.

            De acuerdo con el estándar NVT, la secuencia <CRLF> se debe
            usar donde sea necesario para indicar el final de una línea
            de texto.  (Ver el tratamiento de la estructura del fichero
            al final de la sección sobre Almacenamiento y Representación
            de los Datos.)

            Usar la representación estándar NVT-ASCII implica que los
            datos se deben interpretar como bytes de 8 bits.

            El parámetro de formato para los tipos ASCII y EBCDIC se
            expone más adelante.

         3.1.1.2.  TIPO EBCDIC

            El propósito de este tipo es la transferencia eficaz entre
            ordenadores que usan EBCDIC como su representación de
            carácter interna.

            Para la transmisión, los datos están en forma de caracteres
            EBCDIC de 8 bits. El código de carácter es la única
            diferencia entre la especificación funcional de los tipos
            EBCDIC y ASCII.

            Fin-de-linea (en contraposición a fin-de-registro - ver el
            tratamiento de la estructura) probablemente apenas se usará
            con el tipo EBCDIC para denotar la estructura, pero donde
            sea necesario se usará el carácter <NL>.

         3.1.1.3.  TIPO IMAGEN

            Los datos se envían como bits contiguos que, para la
            transferencia, están empaquetados en bytes de transferencia
            de 8 bits. El receptor debe almacenar los datos como bits
            contiguos.  La estructura del sistema de almacenamiento
            puede necesitar el rellenado del fichero (o de cada
            registro, para un fichero estructurado en registros) hasta
            el límite pertinente (byte, palabra o bloque). Este
            rellenado, que debe ser todo ceros, sólo puede tener lugar
            al final del fichero (o de cada registro) y debe haber una
            forma de identificar los bits de relleno para poder
            eliminarlos si se obtiene el fichero. La transformación de
            relleno debe ser conocida por el usuario para procesar el
            fichero en el lugar de recepción.

            El tipo imagen está indicado para el almacenamiento y
            obtención de ficheros y la transferencia de datos binarios.
            Se recomienda que todas las implementaciones del FTP acepten
            este tipo.

         3.1.1.4.  TIPO LOCAL

            Los datos se transfieren en bytes lógicos del tamaño
            especificado por el segundo parámetro obligatorio, tamaño de
            byte. El valor del tamaño de byte debe ser un entero
            decimal; no hay valor por defecto. El tamaño de byte lógico
            no es necesariamente el mismo que el tamaño de byte de
            transferencia.  Si hay diferencia entre los tamaños de byte,
            entonces los bytes lógicos se deben empaquetar
            contiguamente, a pesar de los límites del byte de
            transferencia y con el relleno necesario al final.

            Cuando los datos llegan al receptor, se transformarán de una
            manera independiente del tamaño de byte lógico y del
            ordenador en cuestión. Esta transformación debe ser
            inversible (i.e., se obtendrá el mismo fichero si se usan
            los mismos parámetros) y los desarrolladores de la
            implementación deben hacerla pública.

            Por ejemplo, un usuario enviando números en coma flotante de
            36 bits a un ordenador con tamaño de palabra de 32 bits
            puede enviar esos datos como byte local con un tamaño lógico
            de 36.  El receptor debería almacenar los bytes lógicos de
            forma que sea fácil su manipulación; en este ejemplo, poner
            los bytes lógicos de 36 bits en palabras dobles de 64 bits
            sería suficiente.

            En otro ejemplo, un par de ordenadores con tamaño de palabra
            de 36 bits, pueden enviarse datos en palabras usando "TYPE L
            36".  Los datos se enviarían en los bytes de transmisión de
            8 bits y empaquetados para que 9 bytes de transmisión lleven
            dos palabras de 36 bits.

         3.1.1.5.  CONTROL DE FORMATO

            Los tipos ASCII y EBCDIC llevan un segundo parámetro
            (opcional); este es para indicar qué tipo de control de
            formato vertical, si es que lo hay, se asocia con el
            fichero. Los siguientes tipos de representación de datos se
            definen en el FTP:

            Un fichero de texto se envía a un ordenador por uno de estos
            tres propósitos: para su impresión, para almacenarlo y
            posteriormente recuperarlo, o para procesarlo. Si se envía
            un fichero para imprimirlo, el receptor debe saber cómo está
            representado el control de formato vertical. En el segundo
            caso, debe ser posible almacenar el fichero y después
            recuperarlo exactamente igual. Por último, debería ser
            posible enviar un fichero de un ordenador a otro y
            procesarlo en el receptor sin problemas indebidos. Un
            formato ASCII o EBCDIC por sí solo no satisface estas tres
            condiciones. Por lo tanto, estos tipos tiene un segundo
            parámetro especificando uno de los siguientes tres formatos:

            3.1.1.5.1.  NO PARA IMPRIMIR [NON PRINT]

               Este es el formato por defecto si se omite el segundo
               parámetro (formato). Se debe admitir en todas las
               implementaciones del FTP.

               El fichero no necesita ninguna información de formato
               vertical. Si se pasa a un proceso para imprimir, este
               proceso puede asumir valores estándar para espaciado y
               márgenes.

               Normalmente, este formato se usará con ficheros que van a
               ser procesados o simplemente almacenados.

             3.1.1.5.2.  CONTROLES DE FORMATO TELNET

               El fichero contiene controles de formato vertical
               ASCII/EBCDIC (i.e., <CR>, <LF>, <NL>, <VT>, <FF>) que el
               proceso para imprimir interpretará apropiadamente.
               <CRLF>, siguiendo exactamente este orden, también indica
               fin-de-línea.

            3.1.1.5.3.  CONTROL DE CARRO (ASA)

               El fichero contiene caracteres de control de formato
               vertical ASA (FORTRAN). (Vea el apéndice C RFC 740; y
               Comunicaciones de la ACM, Vol. 7, No. 10, p. 606, octubre
               1964). En una línea o registro formateado de acuerdo con
               en estándar ASA, el primer carácter no se imprime. En su
               lugar, se usa para determinar el movimiento vertical del
               papel que debería tener lugar antes de que se imprima el
               resto del registro.

               El estándar ASA especifica los siguientes caracteres de
               control:

               Carácter      Espaciado vertical

               espacio       Mueve el papel una línea arriba

               0             Mueve el papel dos líneas arriba

               1             Mueve hasta el comienzo de la sig. página

               +             No se mueve, i.e., sobreescribe

               Claramente, debe haber alguna manera para el proceso que
               imprime de distinguir el final de la entidad estructural.
               Si un fichero tiene estructura de registro (ver más
               abajo) no hay problema; los registros se marcan
               explícitamente durante la transferencia y el
               almacenamiento. Si el fichero no tiene estructura de
               registro, la secuencia fin-de-linea <CRLF> se usa para
               separar líneas al imprimir, pero los controles ASA tienen
               prioridad sobre estos especificadores de formato.

      3.1.2.  ESTRUCTURAS DE DATOS

         Además de los diferentes tipos de representación, el FTP
         permite especificar la estructura de un fichero. Se definen
         tres estructuras de fichero en el FTP:

         estructura de fichero, donde no hay una estructura interna y el
         fichero se considera como una secuencia continua de bytes de
         datos,

         estructura de registro, donde el fichero está compuesto de
         registros secuenciales,

         y estructura de página, donde el fichero está compuesto de
         páginas indizadas independientes.

         Si no se usa la orden STRU (estructura), se asume por defecto
         estructura de fichero, pero todas las implementaciones del FTP
         deben aceptar para ficheros de "texto"  las estructuras de
         fichero y de registro (i.e., para los TYPE ASCII y TYPE
         EBCDIC). La estructura de un fichero afectará al modo de
         transferencia y a la interpretación y almacenamiento del
         fichero (vea la sección Modos de Transmisión).

         La estructura "natural" de un fichero depende del ordenador que
         almacena el fichero. Un fichero con código fuente se guardará
         en un Mainframe de IBM, normalmente, en registros de tamaño
         fijo pero en un TOPS-20 de DEC se guardará como un flujo de
         caracteres particionados en líneas, separados, por ejemplo, por
         <CRLF>. Si se quiere realizar una transferencia entre
         odenadores tan dispares que sea útil, debe haber una forma para
         que uno reconozca lo que el otro asume por defecto.

         Con unos ordenadores orientados por naturaleza a ficheros y
         otros orientados a registros, puede haber problemas si se envía
         un fichero con una estructura a un ordenador orientado a la
         otra. Si un fichero de texto se envía con estructura de
         registros a un ordenador que está orientado a ficheros,
         entonces éste último debería aplicar internamente una
         transformación basada en la estructura de registros.
         Obviamente, esta transformación debería ser adecuada, pero,
         además, debe ser inversible para que se pueda obtener un
         fichero identico usando estructura de registro.

         En el caso de enviar un fichero con estructura de fichero a un
         ordenador orientado a registro, surge la cuestión de qué
         criterio debe usar el ordenador para dividir el fichero en
         registros que se puedan procesar localmente. Si es necesaria
         esta división, la implementación del FTP debería usar la
         secuencia <CRLF> para ficheros de texto ASCII o <NL> para
         ficheros de texto EBCDIC como separador de registro. Si una
         implementación del FTP adopta esta técnica, debe estar
         preparada para hacer la transformación inversa si se recupera
         el fichero con estructura de fichero.

         3.1.2.1.  ESTRUCTURA DE FICHERO

            La estructura de fichero se asume por defecto si no se
            utiliza la orden STRU (eSTRUctura).

            Si el fichero tiene esta estructura, se considera como una
            secuencia continua de bytes de datos, sin ninguna estructura
            interna.

         3.1.2.2.  ESTRUCTURA DE REGISTRO

            Todas las implementaciones del FTP deben aceptar la
            estructura de registro para ficheros de texto (i.e., con
            tipos ASCII o EBCDIC).

            El fichero está formado por registros dispuestos
            secuencialmente.

         3.1.2.3.  ESTRUCTURA DE PAGINA

            Para transmitir ficheros discontínuos, el FTP define una
            estructura de página. Los fichero de este tipo también se
            conocen como ficheros de acceso aleatorio o como ficheros
            con huecos.  En estos ficheros hay a veces otra información
            asociada con el fichero como un todo (por ejemplo, un
            descriptor de fichero), o con una sección del fichero (por
            ejemplo, controles de acceso a página) o ambos. En el FTP
            las secciones del fichero se llaman páginas.

            Para tratar con varios tamaños de página y con la
            información asociada, cada página se envía con una cabecera
            de página. Esta cabecera tiene definidos los siguientes
            campos:

               Longitud de la cabecera

                  El número de bytes lógicos en la cabecera incluyendo
                  este.  El tamaño mínimo de la cabecera es de 4.

               Indice de página

                  El número lógico de página de esta sección del
                  fichero.  Esto no es el número de secuencia de
                  transmisión de esta página, sino el índice usado para
                  identifiar esta página del fichero.

               Tamaño de datos

                  El número de bytes lógicos que hay en los datos de la
                  página. El mínimo es 0.

               Tipo de página

                  Existen los siguientes tipos de página:

                     0 = Ultima página

                        Se usa para indicar el final de una transmisión
                        con estructura de página. El tamaño de cabecera
                        debe ser 4 y el tamaño de datos debe ser 0.

                     1 = Página normal

                        Este es el tipo usado para ficheros paginados
                        simples sin información de control de acceso
                        asociada a nivel de página. El tamaño de la
                        cabecera debe ser 4.

                     2 = Página de descriptor

                        Este tipo se utiliza para transmitir la
                        información descriptiva del fichero considerado
                        como un todo.

                     3 = Página con control de acceso

                        Este tipo incluye un campo adicional en la
                        cabecera para ficheros paginados con información
                        de control de acceso a nivel de página. El
                        tamaño de la cabecera debe ser 5.

               Campos opcionales

                  Se pueden usar más campos en la cabecera para
                  proporcionar, por ejemplo, información de control por
                  página.

                  Todos los campos miden un byte lógico. El tamaño de
                  byte lógico se especifica por la orden TYPE. Vea el
                  apéndice I para más detalles y un caso específico de
                  estructura de página.

      Una nota de atención sobre los parámetros: un fichero debe ser
      almacenado y recuperado con los mismos parámetros si la versión
      recuperada debe ser idéntica a la versión originalmente
      transmitida. Por tanto, las implementaciones del FTP deben
      devolver un fichero idéntico al original si los parámetros usados
      para almacenar y recuperar el fichero son los mismos.

   3.2.  ESTABLECIENDO CONEXIONES DE DATOS

      La mecánica de transferir datos consiste en preparar la conexión
      de datos en los puertos apropiados y elegir los parámetros para la
      transferencia. El usuario y los server-DTPs tienen ambos un puerto
      por defecto. El puerto por defecto del proceso de usuario es el
      mismo que el puerto de la conexión de control (i.e., U). El puerto
      por defecto del proceso servidor es el puerto adyacente al puerto
      de la conexión de control (i.e., L-1).

      El tamaño de byte para la transferencia es de 8 bits. Este tamaño
      sólo es relevante para la transferencia de datos; no tiene nada
      que ver con la representación de los datos dentro del sistema de
      ficheros de un ordenador.

      El proceso de transferencia de datos pasivo (que puede ser un
      user-DTP o un segundo server-DTP) deberá "escuchar" en el puerto
      de datos antes de enviar una orden de petición de transferencia.
      Esta orden determina el sentido de la transferencia de los datos.
      El servidor, una vez recibida la petición de transferencia,
      iniciará la conexión de datos al puerto indicado. Una vez
      establecida la conexión, la transferencia de datos comienza entre
      los DTPs y el server-PI envía una respuesta de confirmación al
      user-PI.

      Todas las implementaciones del FTP deben soportar el uso de los
      puertos de datos por defecto y sólo el user-PI puede solicitar un
      cambio a un puerto diferente.

      Usando la orden PORT, el usuario puede especificar un puerto
      alternativo. Puede que el usuario quiera volcar un fichero en una
      impresora de líneas TAC o que se obtenga el fichero de un tercer
      ordenador. En este último caso, el user-PI establece las
      conexiones de control con ambos ordenadores. Luego dice a un
      servidor (mediante una orden FTP) que "escuche" hasta recibir una
      conexión que el otro iniciará. El user-PI envía aun server-PI una
      orden PORT indicando el puerto de datos del otro.  Finalmente, se
      envían a ambos las órdenes apropiadas de transferencia. La
      secuencia exacta de órdenes y respuestas entre el usuario y los
      servidores está en la sección sobre Respuestas FTP.

      En genera, es responsabilidad del servidor mantener la conexión de
      datos (abrirla y cerrarla). La excepción a esto se produce cuando
      el user-DTP envía los datos en un modo de transferencia que
      requiere cerrar la conexión para indicar EOF. El servidor DEBE
      cerrar la conexión de datos bajo las siguientes circunstancias:

         1. El servidor ha terminado de enviar datos en un modo de
         transferencia que requiere un cierre para indicar EOF.

         2. El servidor recibe una orden ABORT del usuario.

         3. Una orden del usuario especifica un nuevo puerto.

         4. La conexión de control se cierra correctamente o de
         cualquier otro modo.

         5. Se produce una condición de error irrecuperable.

      En cualquier caso, el cierre es una opción del servidor que se
      debe indicar al proceso de usuario sólo mediante una respuesta 250
      ó 226.

   3.3.  MANEJO DE LA CONEXION DE DATOS

      Puertos de la conexión de datos por defecto: Todas las
      implementaciones del FTP deben soportar el uso de los puertos de
      datos por defecto y sólo el user-PI puede iniciar el uso de otros
      puertos.

      Negociando puertos de datos distintos a los que hay por defecto:
      el user-PI puede especificar un puerto de datos diferente por su
      parte con la orden PORT. El user-PI puede solicitar al servidor la
      localización de un puerto en el propio servidor con la orden PASV.
      Como una conexión está definida por el par de direcciones,
      cualquiera de estas acciones es suficiente para tener una conexión
      de datos diferente, pero se permite usar ambas órdenes para
      utilizar nuevos puertos en los dos lados de la conexión.

      Reutilización de la conexión de datos: Cuando se usa el modo flujo
      para transferencia de datos el final de fichero se indica cerrando
      la conexión. Esta causa un problema si se van a transferir varios
      ficheros en la sesión, debido a la necesidad que tiene el TCP de
      mantener el registro de la conexión por un tiempo de espera para
      garantizar una comunicación fiable.  Por eso la conexión no puede
      reabrirse inmediatamente.

         Hay dos soluciones a este problema. La primera es negociar un
         puerto diferente al que hay por defecto. La segunda es usar
         otro modo de transmisión.

         Un comentario sobre los modos de transmisión. El modo flujo de
         transferencia es implícitamente poco fiable porque no se puede
         determinar si la conexión se ha cerrado prematuramente o no.
         Los otros modos de transferencia (de bloque, comprimido) no
         cierran la conexión para indicar el final de fichero. Los datos
         que envía el FTP a través de ellos hacen que se pueda
         determinar el final de fichero. Por eso, usando estos modos, se
         puede dejar la conexión de datos abierta para transferir más de
         un fichero.

   3.4.  MODOS DE TRANSMISION

      Otro aspecto a considerar en la transferencia de datos es la
      elección apropiada del modo de transmisión. Hay tres modos: uno
      que formatea los datos y permite reiniciar la transmisión; otro
      que además comprime los datos para una transferencia eficaz; y
      otro que pasa los datos sin apenas procesarlos. En este último
      caso, el modo interactúa con el atributo de estructura para
      determinar el tipo de proceso. En el modo comprimido, el tipo de
      representación determina el byte de relleno.

      Todas las transferencia de datos se deben complementar con un fin-
      de-fichero (EOF, end-of-file) que se puede indicar explícita o
      implícitamente cerrando la conexión de datos. Para ficheros con
      estructura de registro, todos los indicadores de fin-de-registro
      (EOR) son explícitos, incluyendo el último. Para ficheros
      transmitidos con estructura de página, se usa una página con el
      indicador de última página activado.

      NOTA: en el resto de esta sección, byte significa "byte de
      transferencia" excepto donde se indique explícitamente.

      Para estandarizar la transferencia, el ordenador que envía los
      datos trasladará sus caracteres de fin de línea o de fin de
      registro a la representación indicada por el modo de transferencia
      y la estructura del fichero y el receptor realizará la traducción
      inversa a su representación interna. Un campo de contador de
      registro de un Mainframe de IBM puede no ser reconocido por otro
      ordenador, por eso, la información de fin-de-registro se puede
      transferir como un código de control de dos bytes en modo flujo o
      como un bit activado en un descriptor de modo bloque o comprimido.
      El fin-de-línea en un fichero ASCII o EBCDIC no estructurado en
      registros se debería indicar con <CRLF> o <NL> respectivamente.
      Debido a que estas transformaciones implican un trabajo extra para
      algunos sistemas, sistemas idénticos que transfieren entre ellos
      un fichero de texto no estructurado en registros pueden preferir
      usar una representación binaria y modo flujo para la
      transferencia.

      Se definen los siguientes modos de transmisión en el FTP:

      3.4.1.  MODO FLUJO

         Los datos se transmiten como un flujo de bytes. No hay ninguna
         restricción en el tipo de representación usado; se permiten
         estructuras de registro.

         En un fichero estructurado en registros, EOR y EOF se indicarán
         por un código de control de dos bytes. El primer byte del
         código de control consistirá en todo unos, el carácter de
         escape. El segundo tendrá el bit de orden más bajo activado y
         ceros en el resto para EOR y el segundo bit de orden más bajo
         activado para EOF; esto es, el byte valdrá 1 para EOR y 2 para
         EOF. EOF y EOR se pueden indicar conjuntamente en el último
         byte transmitido activando los dos bits más bajos (i.e., el
         valor 3). Si se pretende transmitir un byte con todo unos como
         dato, se debería repetir em el segundo byte del código de
         control.

         Si la estructura es de fichero, se indica el EOF cuando el
         ordenador que envía los datos cierra la conexión de datos y
         todos los bytes son bytes de datos.

      3.4.2.  MODO BLOQUE

         El fichero se transmite como una serie de bloques de datos
         precedidos por uno o más bytes cabecera. Los bytes de la
         cabecera contienen un campo contador y un código descriptor. El
         campo contador indica la longitud total del bloque de datos en
         bytes, indicando así el inicio del siguiente bloque de datos
         (no hay bits de relleno). El código descriptor define: último
         bloque del fichero (EOF), último bloque del registro (EOR),
         indicador de reinicio (vea la sección sobre Recuperación de
         Errores y Reinicio) o datos sospechosos (i.e., los datos
         tranferidos pueden contener errores y no son fiables). Este
         último código NO es para controlar errores desde el propio FTP.
         Su uso está motivado por el deseo de ciertos sitios que
         intercambian cierto tipo de información (por ejemplo, datos
         sísmicos o meteorológicos) enviando y recibiendo todos los
         datos a pesar de que pueda haber errores locales (como errores
         leyendo una cinta magnética). Se permiten estructuras de
         registro y se puede usar cualquier tipo de representación.

         La cabecera consiste en tres bytes. De los 24 bits de
         información, los 16 más bajos representan un contador de bytes
         y los 8 más altos representan códigos de descripción como se
         muestra a continuación.

         Cabecera de Bloque

            +----------------+----------------+----------------+
            | Descriptor     |    Contador de Bytes            |
            |         8 bits |                      16 bits    |
            +----------------+----------------+----------------+

         Los códigos de descripción se indican mediante bits en el byte
         de descripción. Hay asignados 4 códigos, donde cada número de
         código es el valor decimal del correspondiente bit en el byte.

         Código     Significado

            128     El final del bloque de datos es EOR
             64     El final del bloque de datos es EOF
             32     Puede haber errores en el bloque
             16     El bloque de datos es un marcador de reinicio

         Con esta codificación, más de una condición codificada puede
         ocurrir para un bloque en particular. Se pueden activar tantos
         bits como sea necesario.

         El indicador de reinicio está incluído en el flujo de datos
         como un número de 8 bits representando caracteres imprimibles
         en el lenguaje usado en la conexión de control (por ejemplo,
         NVT-ASCII). <SP> (espacio en el lenguaje apropiado) no se debe
         usar DENTRO de un indicador de reinicio.

         Por ejemplo, para transmitir un indicardor de seis caracteres,
         se debería enviar lo siguiente:

            +----------+--------+--------+
            |Descriptor|  Byte count     |
            |code= 16  |             = 6 |
            +----------+--------+--------+

            +-------+-------+-------+
            | Marca | Marca | Marca |
            | 8 bits| 8 bits| 8 bits|
            +-------+-------+-------+

            +-------+-------+-------+
            | Marca | Marca | Marca |
            | 8 bits| 8 bits| 8 bits|
            +-------+-------+-------+

      3.4.3.  MODO COMPRIMIDO

         Hay tres clases de información a enviar: datos normales,
         enviados en una cadena de bytes; datos comprimidos, formados
         por repeticiones o relleno; e información de control, enviada
         en una secuencia de escape de dos bytes. Si se envía n>0 bytes
         (hasta 127) de datos normales, estos n bytes van precedidos de
         un byte con el bit más a la izquierda a cero y los 7 bits más a
         la derecha contienen el número n.

                  Cadena de bytes:

             1       7                8                     8
            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
            |0|       n     | |    d(1)       | ... |      d(n)     |
            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
                                          ^             ^
                                          |---n bytes---|
                                              de datos

            Cadena de n bytes de datos d(1),..., d(n)
            El contador n debe ser positivo.

         Para comprimir una cadena de n repeticiones del byte de datos
         d, se envían los 2 siguientes bytes:

         Byte Repetido:

              2       6               8
            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
            |1 0|     n     | |       d       |
            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

         Una cadena de n bytes de relleno se puede comprimir en un sólo
         byte, donde el byte de relleno varía según el tipo de
         representación.  Si el tipo es ASCII o EBCDIC, el byte de
         relleno es <SP> (espacio, código ASCII 32, código EBCDIC 64).
         Si el tipo es imagen o byte local, el relleno es un byte cero.

         Cadena de Relleno:


              2       6
            +-+-+-+-+-+-+-+-+
            |1 1|     n     |
            +-+-+-+-+-+-+-+-+

         La secuencia de escape está formada por dos bytes, el primero
         de los cuales es el byte de escape (todo ceros) y el segundo
         contiene códigos de descripción según lo definido para el modo
         bloque. Los códigos tienen el mismo significado que
         anteriormente y se aplican a la cadenas de bytes transmitidas
         con éxito.

         EL modo comprimido es útil para obtener un ancho de banda
         adicicional en transmisiones muy largas con un coste extra de
         CPU muy pequeño. Se puede usar de forma muy efectiva para
         reducir el tamaño de ficheros para imprimir como los generados
         por ordenadores RJE.

   3.5.  RECUPERACION DE ERRORES Y REINICIO

      No hay nada que detecte bits perdidos o alterados en las
      transmisiones de datos; este nivel de control de errores lo maneja
      el TCP. Sin embargo, se proporciona un medio para recomenzar
      transferencia para proteger a los usuarios de fallos graves en el
      sistema (incluyendo fallos de un ordenador, un proceso FTP o de la
      red usada).

      Sólo está definido el procedimiento de reinicio para los modos de
      transferencia de bloque y comprimido. Requiere que el que envía
      datos inserte un código marcador especial en el flujo de datos con
      información que indique por dónde vamos. Esta información sólo
      tiene significado para el ordenador que envía los datos, pero debe
      consistir en caracteres imprimibles en el lenguaje negociado o por
      defecto de la conexión de control (ASCII o EBCDIC). El indicador
      puede representar una cuenta de los bits, los registros o
      cualquier otra información por la que un sistema pueda identificar
      un punto de control. El receptor de los datos, si implementa el
      procedimiento de reinicio, debería guardar la correspondiente
      posición de este marcador en el sistema receptor y devolver esta
      información al usuario.

      En el caso de un fallo del sistema, el usuario puede reiniciar la
      transferencia de datos identificando el último marcador recibido
      con el procedimiento de recomenzar del FTP. El siguiente ejemplo
      ilustra el uso de este procedimiento:

      El que envía datos inserta un bloque marcador apropiado en el
      flujo de datos en un punto conveniente. El que recibe marca el
      correspondiente punto en sus sistema de ficheros y proporciona al
      usuario información del último marcador recibido, ya sea
      directamente o por la conexión de control en una respuesta 110
      (dependiendo de quién envíe el fichero). Si ocurre un error del
      sistema, el usuario o proceso reinicia el servidor en el último
      punto que este indicó enviando la orden recomenzar con el marcador
      del servidor como argumento. La orden se transmite por la conexión
      de control y es seguida inmediatamente por la orden (ya sea RETR,
      STOR o LIST) que se estaba ejecuntado cuando ocurrió el error.

4.  FUNCIONES DE TRANSFERENCIA DE FICHEROS

   El canal de comunicación entre el user-PI y el server-PI se establece
   como una conexión TCP desde el usuario al puerto estándar. El
   intérprete de protocolo de usuario es responsable de enviar órdenes
   FTP e interpretar las respuestas recibidas; el server-PI interpreta
   las órdenes, envía respuestas y controla su DTP para establecer la
   conexión de datos y transferirlos. Si el proceso de transferencia
   pasiva es el user-DTP, entonces está controlado a través del
   protocolo interno del ordenador donde se ejecuta el user-DTP; si es
   otro server-DTP, está controlado a través de órdenes recibidas en su
   PI desde el user-PI. Las respuestas FTP se tratan en la siguiente
   sección.

   Al describir algunas de las órdenes en esta sección, viene bien ser
   explícito con las posibles respuestas.

   4.1.  ORDENES FTP

      4.1.1.  ORDENES DE CONTROL DE ACCESO

         Las siguientes órdenes especifican identificadores de control
         de acceso (los códigos de las órdenes están entre paréntesis).

         NOMBRE DE USUARIO (USER)
            El argumento es una cadena Telnet que identifica al usuario.
            Esta identificación es la que requiere el servidor para
            acceder a su sistema de ficheros. Normalmente esta será la
            primera orden a transmitir una vez establecida la conexión
            de control (algunos ordenadores lo pueden requerir). El
            servidor puede requerir información adicional como una
            contraseña y/o cuenta. Los servidores pueden permitir una
            nueva orden USER en cualquier momento para cambiar el
            control de acceso y/o la información de la cuenta. Esto
            tiene el efecto de descartar cualquier información anterior
            sobre usuario, contraseña y cuenta y comienza la secuencia
            de acceso otra vez. Todos lo parámetros de la transferencia
            permanecen sin cambios y cualquier transferencia de fichero
            en curso se completa bajo los anteriores parámetros de
            control de acceso.

         CONTRASEÑA (PASS)
            El argumento es una cadena Telnet especificando la
            contraseña del usuario. Esta orden debe ir inmediatamente
            precedida por la orden USER y, para algunos ordenadores,
            completa la identificación del usuario para el control de
            acceso. Como la información de la contraseña es un dato
            confidencial, es preferible, en general, "enmascararla" o
            evitar mostrarla en pantalla. Parece que el servidor no
            tiene un medio a prueba de tontos para conseguir esto. Por
            tanto es responsabiliad del proceso user-FTP el ocultar la
            información sobre la contraseña.

         CUENTA (ACCT)
            El argumento es una cadena Telnet identificando la cuenta
            del usuario. Esta orden no está necesariamente relacionada
            con la orden USER, ya que algunos ordenadores pueden
            requerir una cuenta para acceder y otros sólo para cierto
            tipo de acceso, como almacenar ficheros. En este último
            caso, la orden se puede enviar en cualquier momento.

            Hay códigos de respuesta para diferenciar automáticamente
            estos casos: cuando se requiere información de la cuenta, la
            respuesta a una orden PASS correcta es el código 332. Por
            otra parte, si NO se requiere esta información, la respuesta
            a una orden PASS correcta es 230; y si la cuenta se requiere
            para una orden enviada más tarde, el servidor debería
            devolver una respuesta 332 o una 532 dependiendo de que
            almacene (esté pendiente de recibir el comando ACCT) o
            descarte la orden, respectivamente.

         CAMBIO DE DIRECTORIO DE TRABAJO (CWD)
            Esta orden permite al usuario trabajar en un directorio o
            conjunto de datos [data set] diferente para almacenar o
            recuperar información sin alterar su información de entrada
            o de cuenta. Los parámetros de transferencia permanecen sin
            cambios. El argumento es un nombre de ruta especificando el
            directorio o alguna otra agrupación de ficheros dependiente
            del sistema.

         CAMBIAR AL DIRECTORIO PADRE (CDUP)
            Esta orden es un caso especial de CWD y se incluye para
            simplificar la implementación de programas para transferir
            árboles de directorios entre sistemas operativos que tienen
            diferentes formas de nombrar al directorio padre. Los
            códigos de respuestas deberán ser idénticos a los de CWD.
            Vea el Apéndice II para más detalles.

         MONTAR ESTRUCTURA (SMNT)
            Esta orden permite al usuario montar un sistema de ficheros
            diferente sin alterar su información de entrada o de cuenta.
            Los parámetros de transferencia permanecen sin cambios. El
            argumento es un nombre de ruta especificando un directorio o
            alguna otra agrupación de ficheros dependiente del sistema.

         REINICIALIZAR (REIN)
            Esta orden termina una orden USER, descargando todos los
            datos del entrada/salida y la información de cuenta, excepto
            que si hay alguna transferencia en proceso permite que
            termine. Todos los parámetros se inician con sus valores por
            defecto y la conexión de control se deja abierta. El estado
            alcanzado es idéntico al que se tiene inmediatamente después
            de abrir la conexión de control. Posiblemente se espere una
            orden USER a continuación de esta.

         DESCONECTAR (QUIT)
            Esta orden termina una orden USER y si no hay en proceso
            ninguna transferencia, cierra la conexión de control. Si hay
            una transferencia de fichero en proceso, la conexión
            permanecerá abierta hasta que el servidor envíe una
            respuesta con el resultado de la transferencia y luego se
            cierra. Si el proceso de usuario está transfiriendo ficheros
            para varios usuarios (USERs) pero no quiere cerrar la
            conexión y reabrirla para cada usuario, se debería usar el
            comndo REIN en lugar de QUIT. Un cierre inesperado de la
            conexión de control provoca que el servidor actúe como si
            hubiera recibido las órdenes interrumpir (ABOR) y
            desconectar (QUIT).

      4.1.2.  ORDENES DE PARAMETROS DE TRANSFERENCIA

         Todos los parámetros de transferencia de datos tienen valores
         por defecto y las órdenes que especifican valores para ellos
         sólo se deben utilizar si se van a cambiar los parámetros por
         defecto. El valor por defecto es el último valor especificado
         o, si no se ha especificado ninguno, el valor por defecto
         estándar es el que se indica aquí. Esto implica que el servidor
         debe "recordar" los valores por defecto aplicables. Las órdenes
         pueden ir en cualquier orden, pero deben preceder a la
         transferencia. Las siguientes órdenes especifican parámetros de
         transferencia de datos:

         PUERTO DE DATOS (PORT)
            El argumento es una especificación ordenador-puerto para el
            puerto que será usado en la conexión de datos. Hay valores
            por defecto tanto para el puerto de usuario como para el del
            servidor y, bajo circunstancias normales, esta orden y su
            respuesta no son necesarias. Si se usa esta orden, el
            argumento es la concatenación de una dirección IP (32 bits)
            y un puerto TCP (16 bits). Esta información está repartida
            en campos de 8 bits y el valor de cada campo se transmite
            como un número decimal (representado como una cadena de
            caracteres). Los campos están separados por comas. Una orden
            PORT podría ser algo así:

                  PORT h1,h2,h3,h4,p1,p2

            donde h1 es el número decimal correspondiente a los 8 bits
            más altos de la dirección IP del ordenador.

         PASIVO (PASV)
            Esta orden solicita al server-DTP que "escuche" en un puerto
            de datos (que no es el puerto por defecto) y espere a
            recibir una conexión en lugar de iniciar una al recibir una
            orden de transferencia. La respuesta a este comando incluye
            la dirección IP y el puerto donde este servidor está
            esperando a recibir la conexión.

         TIPO DE REPRESENTACION (TYPE)
            El argumento especifica un tipo de representación tal y como
            se describió en la sección Representación de Datos y
            Almacenamiento. Algunos tipos requieren un segundo
            parámetro. El primer parámetro es un único carácter Telnet y
            el segundo, para ASCII y EBCDIC, también; el segundo
            parámetro para tamaño de byte local es un entero decimal.
            Los parámetros están separados por un <SP> (espacio, código
            ASCII 32).

            Se asignan los siguientes códigos para tipos:

                    \    /
          A - ASCII |    | N - No para imprimir
                    |-><-| T - Formateo con caracteres Telnet
          E - EBCDIC|    | C - Control de carro (ASA)
                    /    \
          I - Imagen

          L <tamaño de byte> - Tamaño de byte local

            La representación por defecto es ASCII no para imprimir. Si
            se cambia el parámetro de formato y más tarde sólo el primer
            argumento, el formato vuelve a ser el inicial por defecto
            (no para imprimir).

         ESTRUCTURA DEL FICHERO (STRU)
            El argumento es un único carácter Telnet especificando una
            estructura de fichero de las descritas en la sección
            Representación de Datos y Almacenamiento.

            Existen los siguientes códigos para la estructura:

               F - Fichero (sin estructurar en registros) R -
               Estructurado en registros P - Estruturado en páginas

            La estructura por defecto es Fichero.

         MODO DE TRANSFERENCIA (MODE)
            El argumento es un único carácter Telnet especificando un
            modo de transferencia de los descritos en la sección Modos
            de Transmisión.

            Los posibles códigos son los siguientes:

               S - Flujo

               B - Bloque

               C - Comprimido

            El modo por defecto es Flujo.

      4.1.3.  ORDENES DE SERVICIO FTP

         Las órdenes de servicio FTP definen la transferencia del
         fichero o la función del sistema de ficheros que requiere el
         usuario. El argumento normalmente será un nombre de ruta. La
         sintaxis del nombre de ruta debe seguir las convenciones del
         servidor (con valores estándar por defecto aplicables) y las
         convenciones del lenguaje usado en la conexión de control.  Se
         sugiere que por defecto se utilice el último dispositivo,
         directorio o nombre de fichero o el valor por defecto para los
         usuarios locales. Las órdenes pueden enviarse en cualquier
         secuencia, excepto que la orden "renombrar" debe ir seguida por
         una "renombrar a" y la orden "recomenzar" debe ir seguida por
         la orden de servicio interrumpida (por ejemplo, STOR o RETR).
         Cuando se transfieren datos se debe hacer siempre a través de
         la conexión de datos, excepto para algunas respuestas
         informativas. Las siguientes órdenes especifican peticiones de
         servicio FTP:

         RECUPERAR (RETR)
            Esta orden hace que el server-DTP transfiera una copia del
            fichero especificado en el nombre de ruta al proceso que
            está al otro lado de la conexión de datos. El estado y el
            contenido del fichero en el servidor debe permanecer tal y
            como estaba.

         ALMACENAR (STOR)
            Esta orden hace que el server-DTP lea los datos transferidos
            por la conexión de datos y los guarde en un fichero en el
            servidor. Si el fichero especificado en el nombre de ruta
            existe en el servidor, su contenido se debe reemplazar con
            los datos recibidos. Se crea un fichero nuevo en el servidor
            si el indicado no existía ya.

         ALMACENAR UNICO (STOU)
            Esta orden se comporta igual que STOR sólo que el fichero
            resultante se crea en el directorio actual con un nombre
            único para ese directorio. La respuesta 250 Transferencia
            iniciada debe incluir el nombre generado.

         AÑADIR (con creación) (APPE)
            Esta orden hace que el server-DTP reciba datos a través de
            la conexión de control y los guarde en un fichero en el
            servidor. Si el fichero especificado en el nombre de ruta
            existe, los datos se añaden a ese fichero; si no, se crea un
            fichero nuevo en el servidor.

         SOLICITAR ESPACIO (ALLO)
            Esta orden puede ser necesaria para que algunos servidores
            reserven suficiente espacio de almacenamiento para recibir
            el nuevo fichero.  El argumento debe ser un entero decimal
            indicando el número de bytes (usando el tamaño de byte
            lógico) de almacenamiento que se deben reservar. Para
            ficheros enviados con estructura en registros o páginas,
            puede ser necesario enviar el tamaño máximo de registro o
            página; esto se indica con un entero decimal como segundo
            argumento de la orden. Este segundo argumento es opcional,
            pero cuando se utilice, debe estar separado del primero por
            los caracteres Telnet <SP> R <SP>. A continueción de esta
            orden se deberá indicar una orden STOR o APPE. La orden ALLO
            debería tratarse como la orden NOOP (no operación) por los
            servidores que no necesitan conocer de antemano el tamaño
            del fichero y aquellos servidores que sólo interpreten el
            tamaño máximo de registro o página deberían admitir un valor
            inutil como primer argumento e ignorarlo.

         RECOMENZAR (REST)
            El argumento representa un marcador del servidor a partir
            del cual debe recomenzar la transferencia. La orden no
            realiza la transferencia del fichero, pero hace que el
            puntero de lectura o escritura del fichero se sitúe a
            continuación del punto indicado. A continuación de esta
            orden se debe enviar la orden de servicio FTP apropiada que
            hará que continúe la transferencia del fichero.

         RENOMBRAR DE (RNFR)
            Esta orden indica el fichero que queremos cambiar de nombre
            en el servidor. Debe ir inmediatamente seguida de la orden
            "renombrar a" con el nuevo nombre para el fichero.

         RENOMBRAR A (RNTO)
            Esta orden especifica el nuevo nombre para el fichero
            indicado mediante el comando RNFR. Las dos órdenes seguidas
            hacen que el fichero cambie de nombre.

         INTERRUMPIR (ABOR)
            Este comando pide al servidor que interrumpa la orden de
            servicio FTP previa y cualquier transferencia de datos
            asociada. La orden de interrupción puede requerir alguna
            "acción especial", tratada más adelante, para forzar el
            reconocimiento de la orden por el servidor. No se hará nada
            si la orden anterior ha finalizado (incluyendo la
            transferencia de datos). El servidor no cierra la conexión
            de control, pero puede que sí cierre la conexión de datos.
            Hay dos posibles casos para el servidor al recibir esta
            orden: (1) la orden de servicio FTP está ya terminada, o (2)
            aún está en ejecución.

            En el primer caso, el servidor cierra la conexión de datos
            (si está abierta) y devuelve una respuesta 226 indicando que
            la orden de interrumpir se ha procesado correctamente. En el
            segundo caso, el servidor interrumpe el servicio FTP en
            proceso y cierra la conexión de datos, devolviendo una
            respuesta 426 para indicar que la solicitud de servicio
            terminó anormalmente. Luego, el servidor envía una respuesta
            226 para indicar que la orden de interrumpir se ha procesado
            correctamente.

         BORRAR (DELE)
            Esta orden borra en el servidor el fichero indicado en el
            nombre de ruta. Si se quiere tener un nivel extra de
            protección (del tipo "¿Seguro qu quiere borrar el
            fichero?"), la debería proporcionar el proceso user-FTP.

         BORRAR DIRECTORIO (RMD)
            Esta orden borra en el servidor el directorio indicado. Vea
            el Apéndice II.

         CREAR DIRECTORIO (MKD)
            Esta orden crea el directorio indicado en el servidor. Vea
            el Apéndice II.

         MOSTRAR EL DIRECTORIO DE TRABAJO (PWD)
            Esta orden hace que el servidor nos devuelva en la respuesta
            el nombre del directorio actual. Vea Apéndice II.

         LISTAR (LIST)
            Esta orden hace que el servidor envíe una listado de los
            ficheros a través del proceso de transferencia de datos
            pasivo. Si el nombre de ruta u otra agrupación de ficheros,
            el servidor debe transferir una lista de los ficheros en el
            directorio indicado. Si el nombre de ruta especifica un
            fichero, el servidor debería enviar información sobre el
            fichero. Si no se indica argumento alguno, implica que se
            quiere listar el directorio de trabajo actual o directorio
            por defecto. Los datos se envían a traves de la conexión de
            datos con tipo ASCII o EBCDIC. (El usuario se debe asegurar
            del tipo con TYPE).  Como la información sobre un fichero
            puede variar mucho de un sistema a otro, es muy difícil que
            ésta pueda ser procesada automáticamente, pero puede ser
            útil para una persona.

         LISTAR NOMBRES (NLST)
            Esta orden hace que se envíe un listado de directorio desde
            el servidor. El nombre de ruta indica un directorio u otra
            agrupación de ficheros específica del sistema; si no hay
            argumento, se asume el directorio actual. Los datos se
            transfieren en formato ASCII o EBCDIC a través de la
            conexión de datos separados unos de otros por <CRLF> o <NL>.
            (Una vez más el usuario se debe asegurar con TYPE). La
            función de esta orden es devolver información que pueda ser
            usada por un programa para procesar posteriormente los
            ficheros automáticamente. Por ejemplo, implementando una
            función que recupere varios ficheros.

         PARAMETROS DEL SISTEMA (SITE)
            Esta orden la usa el servidor para proporcionar servicios
            específicos propios de su sistema que son fundamentales para
            transferir ficheros pero no lo suficientemente universales
            como para ser incluídos como órdenes en el protocolo. La
            naturaleza de este servicio y la especificación de su
            sintaxis se puede obtener como respuesta a una orden HELP
            SITE.

         SISTEMA (SYST)
            Esta orden devuelve el tipo de sistema operativo del
            servidor.  La respuesta debe tener como primera palabra uno
            de los nombres de sistema listados en la versión actual del
            documento Números Asignados [4].

         ESTADO (STAT)
            Esta orden hace que el servidor nos envía una respuesta con
            su estado a través de la conexión de control. La orden se
            puede enviar durante la transferencia de un fichero (junto
            con las señales Telnet IP y Synch--vea la sección Ordenes
            FTP) en cuyo caso el servidor responderá con el estado de la
            operación en progreso, o se puede enviar entre
            transferencias de ficheros. En este último caso, la orden
            puede llevar un argumento. Si el argumento es un nombre de
            ruta, la orden es similar a LIST, excepto que los datos se
            devolverán por la conexión de control. Si no hay ningún
            argumento, el servidor devolverá información general del
            estado del proceso servidor FTP. Esto debería incluir los
            valores actuales de los parámetros de transferencia y el
            estado de las conexiones.

         AYUDA (HELP)
            Esta orden hace que el servidor envíe información sobre la
            implementación del FTP a través de la conexión de control.
            La orden puede tener un argumento que debe ser un nombre de
            orden y así devuelve información más específica como
            respuesta. La respuesta es de tipo 211 ó 214. Se sugiere que
            se permita el uso de HELP antes de el comando USER. El
            servidor puede usar esta respuesta para especificar
            parámetros dependientes del sistema, por ejemplo, en
            respuesta a HELP SITE.

         NO OPERACION (NOOP)
            Esta orden no afecta a ningún parámetro ni orden introducida
            previamente. No hace nada más que provocar que el servidor
            envíe una respuesta OK.

      El Protocolo de Transferencia de Ficheros sigue la especificación
      del Protocolo Telnet en todas las comunicaciones a través de la
      conexión de control. Como el lenguaje usado para comunicación
      Telnet puede ser una opción negociada, todas las referencias en
      las siguientes dos secciones se referirán al "lenguaje Telnet" y
      el correspondiente "código Telnet de fin-de-línea". De momento,
      podemos entender que esto significa NVT-ASCII y <CRLF>. No se hará
      mención a ninguna otra especificación del Protocolo Telnet.

      Las órdenes FTP son "cadenas Telnet" terminadas con el "código
      Telnet de fin de línea". Los códigos de orden son caracteres
      alfabéticos terminados con el carácter <SP> (espacio) si tienen
      parámetros o el carácter Telnet EOL (fin de línea) si no los
      tienen. En esta seción se han descrito los códigos de orden y su
      significado; la sintaxis detallada se encuentra en la sección
      sobre Ordenes, las secuencias de respuesta se explican en la
      sección Secuencia de Ordenes y Respuestas, y se muestran ejemplos
      del uso de estos comandos en la sección Escenario Típico del FTP.

      Las órdenes FTP se pueden dividir en aquellas que indican
      identificadores de control de acceso, parámetros de transferencia
      de datos y peticiones de servicio FTP. Algunas órdenes (como ABOR,
      STAT y QUIT) se pueden enviar por la conexión de control cuando
      hay una transferencia en proceso. Puede que algunos servidores no
      sean capaces de gestionar las conexiones de control y de datos
      simultáneamente, en cuyo caso puede ser necesaria alguna acción
      especial para captar la atención del servidor. Se recomienda
      insistentemente esta forma:

         1. Se inserta la señal Telnet "Interrumpir Proceso" (IP) en la
         conexión de control.

         2. Se envía la señal Telnet "Synch".

         3. Se envía el comando (p.e., ABOR) por la conexión de control.

         4. El intérprete de protocolo del servidor, después de recibir
         la señal "IP", lee de la conexión de control UNICAMENTE UN
         COMANDO.  (Para otros servidores, puede que esto no sea
         necesario, pero el hacerlo no tendrá ninguna repercusión.)

   4.2.  RESPUESTAS FTP

      Las respuestas a órdenes del FTP están pensadas para asegurar la
      sincronización entre peticiones y acciones en el proceso de
      transferencia de ficheros y para garantizar que el proceso de
      usuario siempre conoce el estado del servidor. Cada orden debe
      generar por lo menos una respuesta, aunque puede haber más de una;
      en este último caso, las diferentes respuestas se deben distinguir
      fácilmente. Además, algunos comandos deben ocurrir en secuencia,
      como USER, PASS y ACCT o RNFR y RNTO. Las respuestas muestran la
      existencia de un estado intermedio si todos los comandos
      anteriores han ido correctamente. Un error en cualquier punto de
      la seuencia implica que se debe iniciar de nuevo desde el
      principio.

      Los detalles de la secuencia orden-respuesta se muestran en un
      conjunto de diagramas de estado más abajo.

      Una respuesta FTP consiste en un número de tres cifras
      (transmitido como tres caracteres alfanuméricos) seguidos de
      texto. El número se proporciona para su uso por autómatas que
      deben determinar el próximo estado; el texto va dirigido a las
      personas. Se pretende que el número contenga suficiente
      información codificada como para que el intérprete de protocolo de
      usuario no necesite examinar el texto y pueda o bien descartarlo o
      bien mostrarlo al usuario. En particular, el texto puede depender
      del servidor y, por tanto, puede variar en cada código de
      respuesta.

      Una respuesta debe contener el código de 3 dígitos, seguidos de
      espacio <SP>, seguido de una línea de texto (en la que hay
      definido una longitud máxima), y termina con el código Telnet de
      fin de línea. Habrá casos en los que el texto es mayor que una
      línea. En estos casos el texto debe ir marcado para que el proceso
      de usuario sepa cuando ha terminado la respuesta (i.e., deje de
      leer de la conexión de control) y haga otras cosas.  Esto requiere
      de un formato especial en la primera línea para indicar que hay
      más y otro en la última línea para indicar lo propio. Al menos una
      de estas debe contener el código de respuesta apropiado para
      indicar el estado de la transacción. Para satisfacer a todos, se
      ha decidido que ambas, la primera y la última línea, deben
      contener el mismo código.

      Por tanto, el formato para respuestas multi-línea consiste en que
      la primera línea empieza con el código de respuesta requerido
      seguido inmediatamente de un guión, "-" (también es el signo
      menos), seguido de el texto. La última línea empezará con el mismo
      código, seguido inmediatamente por un espacio <SP>, opcionalmente
      texto, y el código Telnet de fin de línea.

      Por ejemplo:

                 123-Primera linea
                     Segunda linea
                 234 Una linea que comienza con numeros
                 123 La ultima linea

      El proceso de usuario sólo necesita buscar la segunda ocurrencia
      del mismo código de respuesta, seguido de <SP> (espacio), al
      principio de una línea. Si una línea intermedia comienza con un
      número de tres dígitos, el servidor debe desplazar ese número para
      evitar confusiones.

      Este esquema permite permite que se usen los procedimientos
      estándar del sistema para la información de respuesta (como, por
      ejemplo, para STAT), con las líneas primera y última añadidas
      "artificialmente". En casos raros en los que estos procedimientos
      generen tres dígitos y un espacio al principio de cualquier línea,
      el principio de cada línea de texto se debería desplazar con algún
      texto neutral, como espacios.

      Este esquema asume que las respuestas multilínea no pueden estar
      anidadas.

      Cada tres dígitos de la respuesta tienen un significado especial.
      Se pretende permitir un rango de respuestas desde muy simple a muy
      sofisticado para el proceso de usuario. El primer dígito denota si
      la respuesta es buena, mala o incompleta. (Refiriendonos al
      diagrama de estado), un proceso de usuario poco sofisticado podrá
      determinar su próxima acción simplemente examinando el primer
      dígito. Un proceso de usuario que quiera conocer aproximadamente
      el tipo de error ocurrido (por ejemplo, error del sistema de
      ficheros o error de sintaxis) puede examinar el segundo dígito,
      reservando el tercero para una mayor precisión en la información
      (por ejemplo, orden RNTO sin ser precedida por una RNFR).

      Hay cinco valores para el primer dígito del código de respuesta:

         1yz Respuesta preliminar positiva
            Se ha iniciado la acción requerida; se espera otra respuesta
            antes de seguir con una nueva orden. (El proceso de usuario
            que envía otra orden antes de que la respuesta de
            finalización llegue, estará violando el protocolo, pero el
            proceso servidor debería encolar cualquier orden que reciba
            mientras está ejecutando una orden anterior.) Este tipo de
            respuesta se puede usar para indicar que se ha aceptado la
            orden y que el proceso de usuario debería ocuparse ahora de
            la conexión de datos, en implementaciones donde controlar
            ambas conexiones a la vez es difícil. El proceso servidor
            puede enviar, a lo sumo, una respuesta 1yz por orden
            recibida.

         2yz Respuesta de finalización positiva
            La acción requerida se ha completado satisfactoriamente. Se
            puede iniciar una nueva orden.

         3yz Respuesta intermedia positiva
            La orden se ha aceptado, pero se está pendiente de recibir
            más información para completarla. El usuario debería enviar
            otra orden indicando esta información. Esta respuesta se
            utiliza en órdenes que deben ir en secuencia.

         4yz Repuesta de finalización negativa transitoria
            La orden no se ha aceptado y la acción requerida no se ha
            llevado a cabo, pero la condición de error es temporal y se
            puede solicitar la acción de nuevo. El usuario debería
            volver al principio de la secuencia de comandos, si es que
            la hay. Es difícil dar un significado a "transitoria",
            particularmente cuando dos sistemas diferentes (el servidor
            y el usuario) deben estar de acuerdo en la interpretación.
            Cada respuesta la categoría 4yz puede tener un valor
            diferente, pero se pretende con ella que el proceso de
            usuario reintente la operación. Una regla para determinar si
            una respuesta pertenece a la categoría 4yz o a la 5yz
            (permanente negativa) es que las respuestas son 4yz si la
            orden se puede repetir sin cambios en la forma o en las
            propiedades del usuario o del servidor (por ejemplo, la
            orden y sus argumentos son los mismos; el usuario no cambia
            su cuenta ni su nombre; el servidor no lo interpreta de
            diferente forma.

         5yz Respuesta de finalización negativa permanente
            La orden no se ha aceptado y la acción requerida no ha
            tenido lugar. El proceso de usuario no debería repetir la
            misma petición (en la misma secuencia). Incluso algunas
            condiciones de error "permanente" se pueden corregir, por
            eso el usuario (la persona) puede hacer posteriormente que
            su proceso de usuario repita posteriormente la orden (por
            ejemplo, se corrige el argumento, o el usuario cambia el
            estado de su directorio.)

      Las siguientes agrupaciones de funciones se codifican en el
      segundo dígito:

         x0z Sintaxis
            Estas respuestas se refieren a errores de sintaxis, órdenes
            correctas sintácticamente pero que no encajan en ninguna
            otra categoría, órdenes no implementadas o superfluas.

         x1z Información
            Estas son respuestas a solicitudes de información como
            STATUS o HELP.

         x2z Conexiones
            Respuestas referidas a las conexiones de control y de datos.

         x3z Autenticación y cuenta
            Respuestas para el proceso de entrada al sistema y
            procedimientos de cuenta.

         x4z Sin especificar aún.

         x5z Sistema de ficheros
            Estas respuestas indican el estado del sistema de ficheros
            en el servidor según se realizan transferencias u otras
            acciones sobre el sistema de ficheros.

      El tercer dígito afina más en el significado de cada una de las
      categorías indicadas por el segundo. La lista de respuestas de la
      siguiente sección mostrará esto. El texto asociado con cada
      respuesta es sólo una recomendación, no una obligación, y puede
      incluso cambiar según la orden asociada. Los códigos de respuesta,
      por otra parte, deben seguir estrictamente las especificaciones;
      es decir, las implementaciones de servidores no deben inventarse
      nuevos códigos para situaciones que son ligeramente diferentes a
      las descritas aquí, sino que deberían adaptarse a los códigos ya
      definidos.

      Una orden como TYPE o ALLO cuya correcta ejecución no proporciona
      al usuario ninguna nueva información debería devolver un código
      200. Si la orden no se ha implementado porque no tiene sentido
      para un determinado sistema, por ejemplo ALLO en un TOPS-20, una
      respuesta de finalización positiva es conveniente para no
      confundir al proceso de usuario. En este caso se usa una respuesta
      202 con, por ejemplo, el siguiente texto: "No es necesario
      solicitar espacio para el fichero." Si, por otra parte, la orden
      no es específica a ningún sistema y no está implementada, la
      respuesta debe ser 502. Un caso particular de esto es la respuesta
      504 para una orden que está implementada pero que se solicita con
      un argumento no implementado.

      4.2.1  Códigos de respuesta por grupos funcionales

         200 Orden correcta.

         500 Error de sintaxis, comando no reconocido.
            Esto puede incluir errores como línea de orden demasiado
            larga.

         501 Error de sintaxis en parámetros o argumentos.

         202 Orden no implementada, no necesaria en este sistema.

         502 Orden no implementada.

         503 Secuencia de órdenes incorrecta.

         504 Orden no implementada para ese parámetro.


         110 Respuesta de marcador de reinicio.
            En este caso, el texto debe ser:
               MARK yyyy = mmmm
            Donde yyyy es el marcador del flujo de datos en el proceso
            de usuario y mmmm es el equivalente en el servidor (atención
            a los espacios entre los marcadores y el "=").

         211 Estado del sistema o respuesta de ayuda del sistema.

         212 Estado del directorio.

         213 Estado del fichero.

         214 Mensaje de ayuda.
            Sobre como usar el servidor o el significado de una orden
            particular no estándar. Esta respuesta sólo es útil para una
            persona.

         215 NOMBRE system type.
            Donde NOMBRE es un nombre de sistema oficial de la lista que
            hay en el documento Números Asignados.

         120 El servicio estará en funcionamiento en nnn minutos.

         220 Servicio preparado para nuevo usuario.

         221 Cerrando la conexión de control.
            Desconectado si procede.

         421 Servicio no disponible, cerrando la conexión de control.
            Esta puede ser la respuesta a cualquier comando si el
            servidor sabe que debe finalizar.

         125 La conexión de datos ya está abierta; comenzando
         transferencia.

         225 Conexión de datos abierta; no hay transferencia en proceso.

         425 No se puede abrir la conexión de datos.

         226 Cerrando la conexión de datos.
            La acción sobre fichero requerida ha sido correcta (por
            ejemplo, una transferencia o interrupción).

         426 Conexión cerrada; transferencia interrumpida.

         227 Iniciando modo pasivo (h1,h2,h3,h4,p1,p2).

         230 Usuario conectado, continúe.

         530 No está conectado.

         331 Usuario OK, necesita contraseña.

         332 Necesita una cuenta para entrar en el sistema.

         532 Necesita una cuenta para almacenar ficheros.

         150 Estado del fichero correcto; va a abrirse la conexión de
         datos.

         250 La acción sobre fichero solicitado finalizó correctamente.

         257 "NOMBRERUTA" creada.

         350 La acción requiere más información

         450 Acción no realizada.
            Fichero no disponible (por ejemplo, fichero bloqueado).

         550 Acción no realizada,
            Fichero no disponible (por ejemplo, fichero no existe, no se
            tiene acceso al mismo).

         451 Acción interrumpida. Error local.

         551 Acción interrumpida. Tipo de página desconocido.

         452 Acción no realizada.
            Falta de espacio en el sistema de ficheros.

         552 Acción interrumpida.

            Se ha sobrepasado el espacio disponible de almacenamiento
            (para el directorio actual).

         553 Acción no realizada.
            Nombre de fichero no permitido.

      4.2.2 Códigos de respuesta por número.

         110 Respuesta de marcador de reinicio.
            En este caso, el texto debe ser:
               MARK yyyy = mmmm
            Donde yyyy es el marcador del flujo de datos en el proceso
            de usuario y mmmm es el equivalente en el servidor (atención
            a los espacios entre los marcadores y el "=").

         120 El servicio estará en funcionamiento en nnn minutos.

         125 La conexión de datos ya está abierta; comenzando
         transferencia.

         150 Estado del fichero correcto; va a abrirse la conexión de
         datos.

         200 Orden correcta.

         211 Estado del sistema o respuesta de ayuda del sistema.

         212 Estado del directorio.

         213 Estado del fichero.

         214 Mensaje de ayuda.
            Sobre como usar el servidor o el significado de una orden
            particular no estándar. Esta respuesta sólo es útil para una
            persona.

         215 NOMBRE system type.
            Donde NOMBRE es un nombre de sistema oficial de la lista que
            hay en el documento Números Asignados.

         220 Servicio preparado para nuevo usuario.

         221 Cerrando la conexión de control.
            Desconectado si procede.

         225 Conexión de datos abierta; no hay transferencia en proceso.

         226 Cerrando la conexión de datos.
            La acción sobre fichero requerida ha sido correcta (por
            ejemplo, una transferencia o interrupción).

         227 Iniciando modo pasivo (h1,h2,h3,h4,p1,p2).

         230 Usuario conectado, continúe.

         250 La acción sobre fichero solicitado finalizó correctamente.

         257 "NOMBRERUTA" creada.

         331 Usuario OK, necesita contraseña.

         332 Necesita una cuenta para entrar en el sistema.

         532 Necesita una cuenta para almacenar ficheros.

         350 La acción requiere más información.

         421 Servicio no disponible, cerrando la conexión de control.
            Esta puede ser la respuesta a cualquier comando si el
            servidor sabe que debe finalizar.

         425 No se puede abrir la conexión de datos.

         426 Conexión cerrada; transferencia interrumpida.

         450 Acción no realizada.
            Fichero no disponible (por ejemplo, fichero bloqueado).

         451 Acción interrumpida. Error local.

         452 Acción no realizada.
            Falta de espacio en el sistema de ficheros.

         500 Error de sintaxis, comando no reconocido.
            Esto puede incluir errores como línea de orden demasiado
            larga.

         501 Error de sintaxis en parámetros o argumentos.

         202 Orden no implementada, no necesaria en este sistema.

         502 Orden no implementada.

         503 Secuencia de órdenes incorrecta.

         504 Orden no implementada para ese parámetro.

         530 No está conectado.

         550 Acción no realizada,
            Fichero no disponible (por ejemplo, fichero no existe, no se
            tiene acceso al mismo).

         551 Acción interrumpida. Tipo de página desconocido.

         552 Acción interrumpida.
            Se ha sobrepasado el espacio disponible de almacenamiento
            (para el directorio actual).

         553 Acción no realizada.
            Nombre de fichero no permitido.

5.  ESPECIFICACIONES

   5.1.  IMPLEMENTACION MINIMA

      Para hacer un FTP funcional sin mensajes de error innecesarios, se
      requiere que todos los servidores implementen como mínimo las
      siguientes funciones:

         TIPO - ASCII No para imprimir

         MODO - Flujo

         ESTRUCTURA - Fichero, registros

         ORDENES - USER, QUIT, PORT,

                  TYPE, MODE, STRU,

                  para los valores por defecto

                  RETR, STOR,

                  NOOP.

      Los valores por defecto de los parámetros de transferencia:

         TYPE - ASCII No para imprimir MODE - Flujo STRU - Fichero

      Todos los servidores deben aceptar los valores indicados como
      estándar por defecto.

   5.2.  CONEXIONES

      El intérprete de protocolo del servidor debe "escuchar" en el
      puerto L. El usuario o el intérprete de protocolo de usuario
      iniciará la conexión de control full-duplex (bidireccional). Los
      procesos de servidor y de usuario deberían seguir las convenciones
      del Protocolo Telnet tal y como se especifican en el Manual de
      Protocolos de ARPA-Internet [1]. Los servidores no tienen ninguna
      obligación de proporcionar facilidades para la edición de la línea
      de comandos y pueden requerir que esto se haga en el ordenador del
      usuario. El servidor deberá cerrar la conexión a petición del
      usuario después de que todas las transferencias y respuestas se
      han enviado.

      El user-DTP debe "escuchar" en el puerto de datos especificado;
      este puede ser el puerto por defecto (U) u otro especificado por
      la orden PORT.  El servidor, por defecto, iniciará las conexiones
      de datos desde su propio puerto de datos por defecto (L-1) usando
      el puerto de datos indicado por el usuario. El sentido de la
      transferencia y el puerto se determinarán por la orden de servicio
      FTP.

      Todas las implementaciones del FTP deben poder transferir datos
      usando el puerto por defecto y sólo el user-PI puede solicitar el
      uso de puertos diferentes.

      Cuando se van a transferir datos entre dos servidores, A y B (ver
      Figura 2), el user-PI, C, establece la conexión de control entre
      ambos server-PIs. A uno de los servidores, por ejemplo, A, se le
      envía un comando PASV indicandole que "escuche" en su puerto de
      datos en lugar de iniciar la conexión cuando reciba la petición de
      transferencia. Cuando el user-PI recibe la respuesta a la orden
      PASV, que incluye la dirección del ordenador y el puerto donde
      está escuchando, el user-PI envía el puerto de A a B mediante un
      comando PORT; se devuelve una respuesta. Luego el user-PI puede
      enviar las correspondientes órdenes a A y B. El servidor B inicia
      la conexión y comienza la transferencia de datos. La secuencia
      orden-respuesta se muestra aquí. Los mensajes se muestran en orden
      verticalmente, pero no horizontalmente:

         User-PI - Servidor A              User-PI - Servidor B
         --------------------              --------------------

         C->A : Conexión                   C->B : Conexión
         C->A : PASV
         A->C : 227 Iniciando modo pasivo. A1,A2,A3,A4,a1,a2
                                           C->B : PORT A1,A2,A3,A4,a1,a2
                                           B->C : 200 Orden correcta.
         C->A : STOR                       C->B : RETR
                    B->A : Conexión a HOST-A, PORT-a
                                Figura 3

      El servidor cerrará la conexión de datos en las condiciones
      descritas en la sección Estableciendo Conexiones de Datos. Si se
      va a cerrar la conexión de datos y no se necesita esto para
      indicar el final de fichero, el servidor lo debe hacer
      inmediatamente. No se permite que espere hasta recibir una nueva
      orden de transferencia porque el proceso de usuario ya habrá
      comprobado la conexión de datos para ver si necesita "escuchar"
      (recuerde que el usuario debe "escuchar" en un puerto cerrado
      ANTES de enviar la petición de transferencia. Para evitar fallos
      de sincronización, el servidor envía una respuesta (226) después
      de cerrar la conexión de datos (o, si la conexión se deja abierta,
      una respuesta "Transferencia completada." (250) y el user-PI
      debería esperar una de estas respuestas antes de enviar una nueva
      orden de transferencia) .

      En cualquier momento en que el servidor o el usuario vean que el
      otro va a cerrar la conexión, debería leer inmediatamente
      cualquier dato que permanezca encolado en la conexión y proceder
      al cierre de la misma.

   5.3.  ORDENES

      Las órdenes son cadenas de caracteres Telnet transmitidas por la
      conexión de control tal y como se describe en la sección Ordenes
      FTP.

      Las funciones y la semántica de las órdenes se describe en las
      secciones Ordenes de Control de Acceso, Ordenes de Parámetros de
      Transferencia, Ordenes de Sevicio FTP y Ordenes Varias. La
      sintaxis de los comandos se detalla aquí.

      Las órdenes comienzan con un código de orden seguido de unos
      argumentos. Los códigos de orden tienen cuatro o menos carcteres
      alfabéticos. Las letras mayúsculas y las minúsculas se tratan de
      la misma manera. Por tanto, cualquiera de las siguientes puede
      representar a la orden "recuperar":

               RETR    Retr    retr    ReTr    rETr

      También se aplica esto a cualquier símbolo que represente valores
      de los parámetros como la 'A' para el tipo ASCII. Los códigos de
      comando y el campo de argumentos están separados por uno o más
      espacios.

      El campo de argumentos consiste en una cadena de caracteres de
      longitud variable terminada con la secuencia de caracteres <CRLF>
      (Retorno de carro, avance de línea) para la representación NVT-
      ASCII; para otros lenguajes negociados puede que se use otro
      representación para el fin de línea. El servidor no realizará
      ninguna acción hasta recibir el código de fin de línea.

      La sintaxis se especifica más abajo en NVT-ASCII. Todos los
      caracteres del campo de argumentos son caracteres ASCII,
      incluyendo los enteros decimales representados en ASCII. Los
      paréntesis cuadrados indican que un argumento es opcional. Si no
      se proporciona el argumento implica que se toma un valor por
      defecto apropiado.

      5.3.1.  ORDENES FTP
         Las órdenes FTP son las siguientes:

            USER <SP> <nombre-usuario> <CRLF>

            PASS <SP> <contraseña> <CRLF>

            ACCT <SP> <información-cuenta> <CRLF>

            CWD  <SP> <nombre-ruta> <CRLF>

            CDUP <CRLF>

            SMNT <SP> <nombre-ruta> <CRLF>

            QUIT <CRLF>

            REIN <CRLF>

            PORT <SP> <dirIP-puerto> <CRLF>

            PASV <CRLF>

            TYPE <SP> <código-tipo> <CRLF>

            STRU <SP> <código-estructura> <CRLF>

            MODE <SP> <código-modo> <CRLF>

            RETR <SP> <nombre-ruta> <CRLF>

            STOR <SP> <nombre-ruta> <CRLF>

            STOU <CRLF>

            APPE <SP> <nombre-ruta> <CRLF>

            ALLO <SP> <entero-decimal>

                [<SP> R <SP> <entero-decimal>] <CRLF>

            REST <SP> <marcador> <CRLF>

            RNFR <SP> <nombre-ruta> <CRLF>

            RNTO <SP> <nombre-ruta> <CRLF>

            ABOR <CRLF>

            DELE <SP> <nombre-ruta> <CRLF>

            RMD  <SP> <nombre-ruta> <CRLF>

            MKD  <SP> <nombre-ruta> <CRLF>

            PWD  <CRLF>

            LIST [<SP> <nombre-ruta>] <CRLF>

            NLST [<SP> <nombre-ruta>] <CRLF>

            SITE <SP> <cadena> <CRLF>

            SYST <CRLF>

            STAT [<SP> <nombre-ruta>] <CRLF>

            HELP [<SP> <cadena>] <CRLF>

            NOOP <CRLF>


      5.3.2.  ARGUMENTOS DE LAS ORDENES FTP

         La sintaxis de los argumentos (usando la notación BNF) es:

            <nombre-usuario> ::= <cadena>

            <contraseña> ::= <cadena>

            <información-cuenta> ::= <cadena>

            <cadena> ::= <carácter> | <carácter><cadena>

            <carácter> ::= cualquier carácter ASCII excepto <CR> y <LF>

            <marcador> ::= <pr-cadena>

            <pr-cadena> ::= <pr-carácter> | <pr-carácter><pr-cadena>

            <pr-carácter> ::= caracteres imprimibles, cualquier código
                              ASCII desde 33 a 126.

            <tamaño-byte> ::= <número>

            <dirIP-puerto> ::= <host-número>,<port-número>

            <host-número> ::= <número>,<número>,<número>,<número>

            <port-número> ::= <número>,<número>

            <número> ::= cualquier entero decimal desde 1 a 255

            <código-formateo> ::= N | T | C

            <código-tipo> ::= A [<sp> <código-formateo>]
                          | E [<sp> <código-formateo>]
                          | I
                          | L <sp> <tamaño-byte>

            <código-estructura> ::= F | R | P

            <código-modo> ::= S | B | C

            <nombre-ruta> ::= <cadena>

            <entero-decimal> ::= cualquier entero decimal

   5.4.  SECUENCIA DE ORDENES Y RESPUESTAS

      La comunicación entre el usuario y el servidor se lleva a cabo
      mediante un diálogo. Como tal, el usuario envía una orden y el
      servidor devuelve una respuesta. El usuario debería esperar a
      recibir la respuesta antes de enviar más ordenes.

      Algunas órdenes requieren una segunda respuesta a la que el
      usuario debería también esperar. Estas respuestas informan, por
      ejemplo, del estado o la finalización de una transferencia o del
      cierre de la conexión de datos.  Son respuestas secundarias a
      órdenes de transferencia de ficheros. Un grupo importante de
      respuestas informativas son los mensajes al iniciar la conexión.
      En circunstancias normales, un servidor enviará una respuesta 220,
      "Esperando órdenes", cuando se completa la conexión. El usuario
      debería esperar esta respuesta antes de enviar cualquier orden. Si
      el servidor no puede aceptar órdenes en ese momento, se debería
      enviar una respuesta 120 indicando el tiempo previsto de retraso y
      una respuesta 220 cuando esté disponible. El usuario sabrá así que
      no debe desconectar.

      Respuestas espontáneas

         A veces "el sistema" tiene que enviar un mensaje al usuario
         espontáneamente (normalmente a todos los usuarios). Por
         ejemplo, "El sistema se apagará en 15 minutos". El FTP no
         proporciona los medios para enviar este mensaje inmediatamente
         al usuario. Se recomienda que esa información se encole en el
         server-PI y se envíe en la siguiente respuesta (posiblemente en
         una respuesta multilínea).

         La tabla siguiente lista las respuestas indicando la
         finalización de cada orden correcta o incorrectamente. Se deben
         usar estas respuestas estrictamente; el servidor puede cambiar
         el texto en las respuestas, pero el significado y la acción que
         implica el número de código y la secuencia de comandos no debe
         alterarse.

      Secuencias orden-respuesta

         En esta sección se presenta la secuencia orden-respuesta. Cada
         orden se muestra con sus posibles respuestas; los grupos de
         órdenes se muestran juntos. En primer lugar aparecen las
         respuestas preliminares (con las respuestas de ejecución
         correcta indentadas a continuación), luego las respuestas de
         finalización positiva y negativa y , por último, las respuestas
         intermedias con el resto de las órdenes de la secuencia. Este
         listado es la base de los diagramas, que se verán más tarde.

            Establecimiento de conexión
               120
                  220
               220
                421

            Login
               USER
                  230
                  530
                  500, 501, 421
                  331, 332
               PASS
                  230
                  202
                  530
                  500, 501, 503, 421
                  332
               ACCT
                  230
                  202
                  530
                  500, 501, 503, 421
               CWD
                  250
                  500, 501, 502, 421, 530, 550
               CDUP
                  200
                  500, 501, 502, 421, 530, 550
               SMNT
                  202, 250
                  500, 501, 502, 421, 530, 550
            Logout
               REIN
                  120
                  220
                  421
                  500, 502
               QUIT
                  221
                  500

            Parámetros de transferencia
               PORT
                  200
                  500, 501, 421, 530
               PASV
                  227
                  500, 501, 502, 421, 530
               MODE
                  200
                  500, 501, 504, 421, 530
               TYPE
                  200

                  500, 501, 504, 421, 530
               STRU
                  200
                  500, 501, 504, 421, 530

            Acciones sobre ficheros
                ALLO
                  200
                  202
                  500, 501, 504, 421, 530
               REST
                  500, 501, 502, 421, 530
                  350
               STOR
                  125, 150
                     (110)
                     226, 250
                     425, 426, 451, 551, 552
                  532, 450, 452, 553
                  500, 501, 421, 530
               STOU
                  125, 150
                     (110)
                     226, 250
                     425, 426, 451, 551, 552
                  532, 450, 452, 553
                  500, 501, 421, 530
               RETR
                  125, 150
                     (110)
                     226, 250
                     425, 426, 451
                  450, 550
                  500, 501, 421, 530
               LIST
                  125, 150
                     226, 250
                     425, 426, 451
                  450
                  500, 501, 502, 421, 530
               NLST
                  125, 150
                     226, 250
                     425, 426, 451
                  450
                  500, 501, 502, 421, 530
               APPE
                  125, 150

                     (110)
                     226, 250
                     425, 426, 451, 551, 552
                  532, 450, 550, 452, 553
                  500, 501, 502, 421, 530
               RNFR
                  450, 550
                  500, 501, 502, 421, 530
                  350
               RNTO
                  250
                  532, 553
                  500, 501, 502, 503, 421, 530
               DELE
                  250
                  450, 550
                  500, 501, 502, 421, 530
               RMD
                  250
                  500, 501, 502, 421, 530, 550
               MKD
                  257
                  500, 501, 502, 421, 530, 550
               PWD
                  257
                  500, 501, 502, 421, 550
               ABOR
                  225, 226
                  500, 501, 502, 421

            Ordenes informativas
               SYST
                  215
                  500, 501, 502, 421
               STAT
                  211, 212, 213
                  450
                  500, 501, 502, 421, 530
               HELP
                  211, 214
                  500, 501, 502, 421

            Otras órdenes
               SITE
                  200
                  202
                  500, 501, 530
               NOOP

                  200
                  500 421

6.  DIAGRAMAS DE ESTADO

   Aquí presentamos los diagramas de estado para una implementación FTP
   muy simple. Sólo se tiene en cuenta el primer dígito de la respuesta.
   Hay un diagrama de estado por cada grupo de órdenes FTP o secuencia
   de las mismas.

   La agrupación de las órdenes se ha hecho construyendo un modelo para
   cada una de ellas y juntando las que tienen modelos idénticos
   estructuralmente.

   Para cada órden o secuencia hay tres posibles resultados: sin
   problemas (S), fallo (F) y error (E). En los diagramas se ha usado el
   símbolo B para "inicio" y el símbolo W para indicar "espera una
   respuesta".

   En primer lugar tenemos el diagrama que representa el grupo más
   grande de órdenes FTP:

                               1,3    +---+
                          ----------->| E |
                         |            +---+
                         |
      +---+    ord    +---+    2      +---+
      | B |---------->| W |---------->| S |
      +---+           +---+           +---+
                         |
                         |     4,5    +---+
                          ----------->| F |
                                      +---+
      Este diagrama modela las órdenes:
         ABOR, ALLO, DELE, CWD, CDUP, SMNT, HELP, MODE, NOOP, PASV,
         QUIT, SITE, PORT, SYST, STAT, RMD, MKD, PWD, STRU y TYPE.

   El otro grupo grande de órdenes se representa con un diagrama muy
   parecido:



                               3      +---+
                          ----------->| E |
                         |            +---+
                         |
      +---+    ord    +---+    2      +---+
      | B |---------->| W |---------->| S |
      +---+       --->+---+           +---+
                 |     | |
                 |     | |     4,5    +---+
                 |  1  |  ----------->| F |
                  -----               +---+

      Este diagrama es para las órdenes:
         APPE, LIST, NLST, REIN, RETR, STOR y STOU.

   Como se puede ver, este segundo modelo puede usarse para representar
   el primer grupo de órdenes; la única diferencia es que en el primer
   grupo las respuestas que empiezan por 1 no se esperan y, por tanto,
   se tratan como un error, mientras que el segundo grupo espera (a
   veces necesita) las respuestas que empiezan por 1.

   Recuerde que, como mucho, se permite una respuesta que empiece por 1
   por cada orden.

   El resto de los diagramas modela secuencias de órdenes; quizá el más
   simple de ellos es la secuencia de renombrar un archivo:

      +---+   RNFR    +---+    1,2    +---+
      | B |---------->| W |---------->| E |
      +---+           +---+        -->+---+
                       | |        |
                3      | | 4,5    |
         --------------  ------   |
        |                      |  |   +---+
        |               ------------->| S |
        |              |   1,3 |  |   +---+
        |             2|  --------
        |              | |     |
        V              | |     |
      +---+   RNTO    +---+ 4,5 ----->+---+
      |   |---------->| W |---------->| F |
      +---+           +---+           +---+

   El siguiente diagrama es un modelo simple de la orden recomenzar:


      +---+   REST    +---+    1,2    +---+
      | B |---------->| W |---------->| E |
      +---+           +---+        -->+---+
                       | |        |
                3      | | 4,5    |
         --------------  ------   |
        |                      |  |   +---+
        |               ------------->| S |
        |              |   3   |  |   +---+
        |             2|  --------
        |              | |     |
        V              | |     |
      +---+   ord     +---+ 4,5 ----->+---+
      |   |---------->| W |---------->| F |
      +---+        -->+---+           +---+
                  |      |
                  |  1   |
                   ------

         Donde "ord" es APPE, STOR o RETR.

   Podemos ver que los tres modelos anteriores son similares. Recomenzar
   difiere de renombrar sólo en el tratamiento de las respuestas tipo
   100 en la segunda parte, mientras que el segundo grupo espera (a
   veces necesita) respuestas tipo 100. Sólo se permite una respuesta
   tipo 100 por cada orden.



                            1
      +---+   USER    +---+------------->+---+
      | B |---------->| W | 2       ---->| E |
      +---+           +---+------  |  -->+---+
                       | |       | | |
                     3 | | 4,5   | | |
         --------------   -----  | | |
        |                      | | | |
        |                      | | | |
        |                 ---------  |
        |               1|     | |   |
        V                |     | |   |
      +---+   PASS    +---+ 2  |  ------>+---+
      |   |---------->| W |------------->| S |
      +---+           +---+   ---------->+---+
                       | |   | |     |
                     3 | |4,5| |     |
         --------------   --------   |
        |                    | |  |  |
        |                    | |  |  |
        |                 -----------
        |             1,3|   | |  |
        V                |  2| |  |
      +---+   ACCT    +---+--  |   ----->+---+
      |   |---------->| W | 4,5 -------->| F |
      +---+           +---+------------->+---+

   Por último, mostramos un diagrama generalizado que se puede usar para
   modelar el intercambio orden y respuesta.


               ------------------------------------
              |                                    |
     Inicio   |                                    |
        |     V                                    |
        |   +---+  ord   +---+ 2         +---+     |
         -->|   |------->|   |---------->|   |     |
            |   |        | W |           | S |-----|
         -->|   |     -->|   |-----      |   |     |
        |   +---+    |   +---+ 4,5 |     +---+     |
        |     |      |    | |      |               |
        |     |      |   1| |3     |     +---+     |
        |     |      |    | |      |     |   |     |
        |     |       ----  |       ---->| F |-----
        |     |             |            |   |
        |     |             |            +---+
         -------------------
              |
              |
              V
             Fin

7.  ESCENARIO TIPICO DEL FTP

   El usuario del ordenador U quiere transferir ficheros a/desde el
   ordenador S:

   Generalmente, el usuario se comunicará con el servidor a través del
   proceso user-FTP. El siguiente puede ser un escenario típico. Lo que
   muestra el user-FTP está entre paréntesis, '---->' representa órdenes
   de U a S y
    '<----' representa respuestas de S a U.


   ORDENES DEL USUARIO              ACCIONES QUE IMPLICAN
   ftp (host) multics<CR>         Conectarse a S en el puerto L
                                  estableciendo conexiones de control.
                                  <---- 220 Servicio preparado <CRLF>.
   username Doe <CR>              USER Doe<CRLF>---->
                                  <---- 331 Nombre de usuario OK,
                                            necesita contraseña<CRLF>.
   password mumble <CR>           PASS mumble<CRLF>---->
                                  <---- 230 Usuario aceptado<CRLF>.
   retrieve (local type) ASCII<CR>
   (local pathname) test 1 <CR>   El user-FTP abre el fichero local en
                                  modo ASCII.
   (for. pathname) test.pl1<CR>   RETR test.pl1<CRLF> ---->
                                  <---- 150 Fichero correcto;
                                        se va a abrir la conexión
                                        de datos<CRLF>.
                                  El servidor crea la conexión de datos
                                  al puerto U.
                                  <---- 226 Cerrando conexión de datos,
                                      transferencia completada<CRLF>.
   type Image<CR>                 TYPE I<CRLF> ---->
                                  <---- 200 Orden OK<CRLF>
   store (local type) image<CR>
   (local pathname) file dump<CR> El user-FTP abre el fichero local en
                                  modo binario.
   (for.pathname) >udd>cn>fd<CR>  STOR >udd>cn>fd<CRLF> ---->
                                  <---- 550 Acceso denegado<CRLF>
   terminate                      QUIT <CRLF> ---->
                                  El servidor cierra todas las
                                  conexiones.

8.  ESTABLECIMIENTO DE LA CONEXION

   La conexión de control del FTP se establece mediante FTP entre el
   puerto del proceso de usuario U y el puerto del proceso servidor L. A
   este protocolo se le ha asignado el puerto 21 (25 en octal), por
   tanto L=21.

APENDICE I -  ESTRUCTURA PAGINADA

   La necesidad del FTP para admitir estructura paginada deriva
   principalmente de la necesidad de admitir la transmisión eficiente de
   ficheros entre sistemas TOPS-20, particularmente los fichero usados
   por el NLS.

   El sistema de ficheros del TOPS-20 está basado en el concepto de
   páginas.  El sistema operativo es más eficiente manipulando páginas
   que ficheros. El sistema operativo proporciona una interfaz con el
   sistema de ficheros de tal forma que muchas aplicaciones ven los
   ficheros como un flujo de caracteres secuencial. Sin embargo, algunas
   aplicaciones usan las estructuras paginadas directamente y algunas de
   ellas crean ficheros con huecos.

   Un fichero del TOPS-20 consiste en 4 cosas: un nombre de ruta, una
   tabla de páginas, un conjunto de páginas (posiblemente vacío) y un
   conjunto de atributos. El nombre de ruta se especifica con la orden
   RETR o STOR. Incluye el nombre de directorio, el nombre del fichero,
   la extensión y el número de generación.

   La tabla de páginas contiene hasta 2**18 entradas. Cada una de ellas
   puede estar vacía o apuntar a una página. Si no está vacía, hay unos
   bits de acceso a la página; no todas las páginas de un fichero tienen
   por qué tener los mismos permisos de acceso.

   Una página es un conjunto contiguo de 512 palabras de 36 bits cada
   una. Los atributos del fichero, que está en el Bloque de Descripción
   del Fichero (FDB), contienen datos como la hora de creación, de
   escritura, de lectura,...

   Las entradas de la tabla de páginas NO tienen por qué ser contiguas.
   Puede haber páginas vacías entre otras ocupadas. Además, el puntero
   de fin de fichero es simplemente un número. No hace falta que apunte
   al "último" dato del fichero.

   Las llamadas al sistema de entrada/salida del TOPS-20 hacen que el
   puntero de fin de fichero quede después del último dato escrito, pero
   otras operaciones pueden hacer que esto no sea así si un programa lo
   requiere.

   De hecho, en estos dos casos, ficheros con huecos y punteros de fin
   de fichero que NO están al final del fichero, ocurren con los
   ficheros de datos NLS.

   Los ficheros paginados del TOPS-20 se pueden enviar con los
   siguientes parámetros FTP:

   TYPE L 36, STRU P y MODE S (de hecho, se puede usar cualquier modo).

   Cada página de información tiene una cabecera. Cada campo de la
   cabecera, que es una byte lógico, es una palabra del TOPS-20, por
   ello el tipo es L 36.

   Los campos de la cabecera son:
      Palabra 0: Longitud de la cabecera.
         La longitud de la cabecera es 5.

      Palabra 1: Indice de página.
         Si los datos son de la página de un fichero, este es el número
         de ellas que hay en el mapa de páginas del fichero. Las páginas
         vacías (huecos) del fichero no se envían. Tener en cuenta que
         un hueco NO es lo mismo que una página de ceros.

      Palabra 2: Longitud de datos.
         El número de palabras de datos de esta página que van a
         continuación de la cabecera. El número total de palabras
         transmitidas es la longitud de la cabecera más la longitud de
         datos.

      Palabra 3: Tipo de página.
         Un código para indicar el tipo de página. Un 3 indica una
         página de datos; un 2 indica que es un FDB.

      Palabra 4: Control de acceso a la página.
         Los bits de control asociados a la página en el mapa de páginas
         del fichero.

   A continuación de la cabecera van los datos. La longitud de los datos
   es o 512 para una página de datos o 31 para un FDB. Los ceros finales
   se pueden descartar, haciendo que la longitud de datos sea inferior a
   512.

APPENDIX II -  ORDENES DE DIRECTORIO

   Como UNIX tiene una estructura de directorio en forma de árbol en el
   que los directorios se pueden manipular fácilemente como ficheros
   normales, es conveniente ampliar los servidores FTP de estos sistemas
   para tratar con la creación de directorios. Como hay más tipos de
   servidores con un sistema similar, estas órdenes son tan generales
   como es posible.

      Se han añadido 4 órdenes de directorio al FTP:
         MKD nombreruta
            Crea un directorio con el nombre "nombreruta".

         RMD nombreruta
            Borra el directorio llamado "nombreruta".

         PWD
            Muestra el nombre del directorio de trabajo actual.

         CDUP
            Cambia el directorio actual a directorio padre.

   El nombre de ruta indicado se crea (borra) como un subdirectorio del
   directorio de trabajo actual a menos que "nombreruta" contenga
   suficiente información que indique al servidor que es un nombre de
   ruta absoluto.

   CODIGOS DE RESPUESTA

      La orden CDUP es un caso especial de CWD y se incluye para
      simplificar la implementación de programas para transferir árboles
      de directorios completos entre sistemas que llaman de forma
      diferente al directorio padre.  Lo códigos de respuesta a CDUP son
      los mismos que para CWD.

      Los códigos de respuesta para RMD son los mismos que para su
      análogo con ficheros, DELE.

      Los códigos de respuesta para MKD, sin embargo, son un poco más
      complicados. Un directorio creado recientemente será, lo más
      seguro, el objeto de una próxima orden CWD. Desafortunadamente, el
      argumento de MKD no siempre es apropiado para CWD. Este es el
      caso, por ejemplo, de crear un directorio en un TOPS-20 dando sólo
      el nombre de subdirectorio. Esto es, en un servidor FTP de un
      TOPS-20, la secuencia

         MKD DIRECTORIO
         CWD DIRECTORIO

      fallará. Sólo podemos referirnos al nuevo directorio por su nombre
      absoluto; por ejemplo, si se realiza el comando MKD cuando estamos
      conectados al directorio <DFRANKLIN>, sólo podemos referirnos al
      nuevo subdirectorio como <DFRANKLIN.DIRECTORIO>.

      Incluso en UNIX y Multics puede ocurrir algo similar. Si se trata
      de un nombre de ruta relativo (al directorio actual), el usuario
      necesita estar en el mismo directorio actual para alcanzar el
      subdirectorio. Según qué aplicación, esto puede ser un
      inconveniente. No es muy robusto en ningún caso.

      Para solucionar estos problemas, una vez que finalice
      correctamente una orden MKD, el servidor debería devolver una
      respuesta de la forma:
         257<espacio>"<nombre-directorio>"<espacio><comentario>

      Así el servidor comunica al usuario la cadena que debe usar para
      referirse al nuevo directorio. El nombre de directorio puede
      contener cualquier carácter; si en el nombre hay comillas dobles,
      se debería indicar usando dos veces ls comillas dobles.

      Por ejemplo, un usuario se conecta al directorio /usr/dm y crea un
      subdirectorio llamado nombreruta:

         CWD /usr/dm
         200 directorio cambiado a /usr/dm
         MKD nombreruta
         257 "/usr/dm/nombreruta" directorio creado.

      Un ejemplo que contiene comillas dobles:

         MKD foo"bar 257 "/usr/dm/foo""bar" directorio creado.  CWD
         /usr/dm/foo"bar 200 directorio cambiado a /usr/dm/foo"bar

      Si existe un subdirectorio con el mismo nombre, se produce un
      error y el servidor debe enviar una respuesta de error "acceso
      denegado":

         CWD /usr/dm 200 directorio cambioado a /usr/dm MKD nombreruta
         521-"/usr/dm/nombreruta" ya existe el directorio; 521 no se
         realizó ninguna acción.

      Las respuestas indicando error para MKD son análogas a las de su
      primo para crear ficheros, STOR. También se da una respuesta
      "acceso denegado" si el nombre de un fichero coincide con el del
      nuevo directorio (esto es un problema en UNIX, pero no debería
      serlo en un TOPS-20).

      Como el comando PWD devuelve el mismo tipo de información que un
      MKD correcto, la respuesta a un comando PWD correcto usa también
      el código 257.

   SUTILEZAS

      Como estos comandos serán más útiles a la hora de transferir
      subárboles de un ordenador a otro, observe con cuidado que el
      argumento de MKD se interpreta como un subdirectorio del
      directorio actual a menos que contenga información suficiente que
      indique lo contrario. Un ejemplo hipotético de su uso en un
      TOPS-20:

         CWD <algun.lugar>
         200 Directorio de trabajo cambiado
         MKD sobreelarcoiris
         257 "<algun.lugar.sobreelarcoiris>" directorio creado
         CWD sobreelarcoiris
         431 No existe el directorio
         CWD <algun.lugar.sobreelarcoiris>
         200 Directorio de trabajo cambiado
         CWD <algun.lugar>
         200 Directorio de trabajo cambiado a <algun.lugar>
         MKD <absoluto>
         257 "<absoluto>" directorio creado
         CWD <absoluto>

      El primer ejemplo da como resultado un subdirectorio del
      directorio actual. En cambio, el segundo ejemplo le indica al
      TOPS-20 que el directorio <absoluto> es un directorio de primer
      nivel. Vea también que en el primer ejemplo el usuario "viola" el
      protocolo intentando acceder al nuevo directorio con un nombre
      diferente al devuelto por el TOPS-20. Podía haber habido problemas
      de ambigüedad si existiera un directorio llamado
      <sobreelarcoiris>, pero esto es una ambigüedad inherente al
      sistema TOPS-20.  Estas consideraciones se aplican también a la
      orden RMD. Lo que hay que tener en cuenta es: excepto cuando
      hacerlo así viole las convenciones de un sistema para diferenciar
      nombres de ruta absolutos y relativos, el sistema debería tratar
      los operandos de MKD y RMD como subdirectorios. La respuesta 257
      del MKD siempre debe contener el nombre de ruta absoluto del
      directorio creado.

APENDICE III - RFCs sobre FTP

   Bhushan, Abhay, "Un protocolo de transferencia de ficheros", RFC 114
   (NIC 5823), MIT-Project MAC, 16 de abril de 1971.

   Harslem, Eric, y John Heafner, "Comentarios sobre el RFC 114 (Un
   protocolo de transferencia de ficheros)", RFC 141 (NIC 6726), RAND,
   29 de abril de 1971.

   Bhushan, Abhay, et al, "El Protocolo de Transferencia de Ficheros",
   RFC 172 (NIC 6794), MIT-Project MAC, 23 de junio de 1971.

   Braden, Bob, "Comentarios sobre las propuestas DTP y FTP", RFC 238
   (NIC 7663), UCLA/CCN, 29 de septiembre de 1971.

   Bhushan, Abhay, et al, "El Protocolo de Transferencia de Ficheros",
   RFC 265 (NIC 7813), MIT-Project MAC, 17 de noviembre de 1971.

   McKenzie, Alex, "Una sugerencia para añadir al protocolo FTP", RFC
   281 (NIC 8163), BBN, 8 de diciembre de 1971.

   Bhushan, Abhay, "El uso de la transacción "Tipo de datos" en FTP",
   RFC 294 (NIC 8304), MIT-Project MAC, 25 de enero de 1972.

   Bhushan, Abhay, "El Protocolo de Transferencia de Ficheros", RFC 354
   (NIC 10596), MIT-Project MAC, 8 de julio de 1972.

   Bhushan, Abhay, "Comentarios sobre el protocolo de transferencia de
   ficheros (RFC 354)", RFC 385 (NIC 11357), MIT-Project MAC, 18 de
   agosto de 1972.

   Hicks, Greg, "Documentación para el usuario del FTP", RFC 412 (NIC
   12404), Utah, 27 de noviembre de 1972.

   Bhushan, Abhay, "Estado del FTP y comentarios adicionales", RFC 414
   (NIC 12406), MIT-Project MAC, 20 de noviembre de 1972.

   Braden, Bob, "Comentarios sobre el FTP", RFC 430 (NIC 13299),
   UCLA/CCN, 7 de febrero de 1973.

   Thomas, Bob, and Bob Clements, "Interacción servidor-servidor en el
   FTP", RFC 438 (NIC 13770), BBN, 15 sw enero de 1973.

   Braden, Bob, "Ficheros para imprimir y FTP", RFC 448 (NIC 13299),
   UCLA/CCN, 27 de febrero de 1973.

   McKenzie, Alex, "Protocolo de Transferencia de Ficheros", RFC 454
   (NIC 14333), BBN, 16 de febrero de 1973.

   Bressler, Bob, and Bob Thomas, "Recogido de correo mediante FTP", RFC
   458 (NIC 14378), BBN-NET and BBN-TENEX, 20 de febrero de 1973.

   Neigus, Nancy, "Protocolo de Transferencia de Ficheros", RFC 542 (NIC
   17759), BBN, 12 de julio de 1973.

   Krilanovich, Mark, and George Gregg, "Comentarios sobre el FTP", RFC
   607 (NIC 21255), UCSB, 7 de enero de 1974.

   Pogran, Ken, and Nancy Neigus, "Respuesta al RFC 607 - Comentarios
   sobre el FTP", RFC 614 (NIC 21530), BBN, 28 de enero de 1974.

   Krilanovich, Mark, George Gregg, Wayne Hathaway, and Jim White,
   "Comentarios sobre el FTP", RFC 624 (NIC 22054), UCSB, Ames Research
   Center, SRI-ARC, 28 de febrero de 1974.

   Bhushan, Abhay, "Comentarios sobre el FTP y respuesta al RFC 430",
   RFC 463 (NIC 14573), MIT-DMCG, 21 de febrero de 1973.

   Braden, Bob, "Compresión de datos en FTP", RFC 468 (NIC 14742),
   UCLA/CCN, 8 de marzo de 1973.

   Bhushan, Abhay, "FTP y el sistema de correo de red", RFC 475 (NIC
   14919), MIT-DMCG, 6 de marzo de 1973.

   Bressler, Bob, and Bob Thomas "Interacción servidor-servidor en FTP -

   II", RFC 478 (NIC 14947), BBN-NET and BBN-TENEX, 26 de marzo de 1973.

   White, Jim, "Use of FTP by the NIC Journal", RFC 479 (NIC 14948),
   SRI-ARC, 8 marzo de 1973.

   White, Jim, "Host-Dependent FTP Parameters", RFC 480 (NIC 14949),
   SRI-ARC, 8 de marzo de 1973.

   Padlipsky, Mike, "An FTP Command-Naming Problem", RFC 506 (NIC
   16157), MIT-Multics, 26 de junio de 1973.

   Day, John, "Memo to FTP Group (Proposal for File Access Protocol)",
   RFC 520 (NIC 16819), Illinois, 25 de junio de 1973.

   Merryman, Robert, "The UCSD-CC Server-FTP Facility", RFC 532 (NIC
   17451), UCSD-CC, 22 de junio de 1973.

   Braden, Bob, "TENEX FTP Problem", RFC 571 (NIC 18974), UCLA/CCN, 15
   de noviembre de 1973.

   McKenzie, Alex, and Jon Postel, "Telnet and FTP Implementation -
   Schedule Change", RFC 593 (NIC 20615), BBN and MITRE, 29 de noviembre
   de 1973.

   Sussman, Julie, "FTP Error Code Usage for More Reliable Mail
   Service", RFC 630 (NIC 30237), BBN, 10 de abril de 1974.

   Postel, Jon, "Códigos de respuesta FTP revisados", RFC 640 (NIC
   30843), UCLA/NMC, 5 junio de 1974.

   Harvey, Brian, "Leaving Well Enough Alone", RFC 686 (NIC 32481), SU-
   AI, 10 mayo de 1975.

   Harvey, Brian, "Un intento más con el FTP", RFC 691 (NIC 32700), SU-
   AI, 28 de mayo 1975.

   Lieb, J., "La orden CWD en el FTP", RFC 697 (NIC 32963), 14 de julio
   de 1975.

   Harrenstien, Ken, "FTP Extension: XSEN", RFC 737 (NIC 42217), SRI-KL,
   31 de octubre de 1977.

   Harrenstien, Ken, "FTP Extension: XRSQ/XRCP", RFC 743 (NIC 42758),
   SRI-KL, 30 de diciembre de 1977.

   Lebling, P. David, "Survey of FTP Mail and MLFL", RFC 751, MIT, 10 de
   diciembre de 1978.

   Postel, Jon, "Especificación del protocolo de transferencia de
   ficheros", RFC 765, ISI, junio de 1980.

   Mankins, David, Dan Franklin, and Buzz Owen, "Ordenes FTP orientadas
   a directorio", RFC 776, BBN, diciembre de 1980.

   Padlipsky, Michael, "Orden de guardar con nombre único en FTP", RFC
   949, MITRE, julio de 1985.

   [1]  Feinler, Elizabeth, "Libro de trabajo sobre la transición de
   protocolo en Internet",Network Information Center, SRI International,
   marzo de 1982.

   [2]  Postel, Jon, "Protocolo de control de la transmisión -
   Especificación del protocolo del programa DARPA Internet", RFC 793,
   DARPA, septiembre de 1981.

   [3]  Postel, Jon, and Joyce Reynolds, "Especificación del Protocolo
   Telnet", RFC 854, ISI, mayo de 1983.

   [4]  Reynolds, Joyce, and Jon Postel, "Números asignados", RFC 943,
   ISI, abril de 1985.