Network Working Group J. Postel Request for Comments: 854 J. Reynolds ISI Obsoletes: NIC 18639 Mayo 1983 Traducción al castellano: Agosto 2001 Gonzalo Paniagua Javier ESPECIFICACIÓN DEL PROTOCOLO TELNET Este RFC especifica un estándar para la comunidad ARPA Internet. Los ordenadores conectados a la red ARPA Internet deberían adoptar e implementar este estándar. INTRODUCCIÓN El propósito del protocolo TELNET es proporcionar un servicio de comunicaciones orientado a bytes de 8 bit general y bidireccional. El principal objetivo es permitir un método estándar de comunicar entre sí terminales y procesos orientados a terminal. Está previsto que el protocolo se pueda usar también para comunicaciones terminal- terminal ("enlace") y comunicaciones proceso-proceso (computación distribuída). CONSIDERACIONES GENERALES Una conexión TELNET es una conexión TCP usada para transmitir datos con información de control TELNET intercalada. El protocolo TELNET se basa en tres ideas principales: primera, el concepto de un "Terminal Virtual de Red" (NVT, Network Virtual Terminal); segunda, el principio de opciones negociadas; y tercera, una visión simétrica de terminales y procesos. 1. Cuando se inicia una conexión TELNET, se supone que se inicia y finaliza en un "Terminal Virtual de Red" o NVT. Un NVT es un dispositivo imaginario que proporciona una representación intermedia de un terminal. Esto elimina la necesidad para los ordenadores "servidor" y "usuario" de guardar información de las características del terminal del otro y de las convenciones para manejarlo. Ambos mapean las características del dispositivo local para que a través de la red parezca un NVT y ambos pueden asumir un mapeado similar en el otro extremo. Se pretende que el NVT sea algo intermedio entre ser muy restringido (que no proporciona a los ordenadores lo suficiente como para mapear sus códigos de caracteres locales), y ser demasiado exigente (penalizando a los usuarios con terminales modestos). NOTA: El ordenador "usuario" es aquel al que el terminal físico está normalmente conectado y el ordenador "servidor" es el que Postel & Reynolds [Página 1] RFC 854 Mayo 1983 normalmente proporciona algún servicio. Desde otro punto de vista, aplicable incluso en comunicaciones terminal-terminal o proceso- proceso, el ordenador "usuario" es aquel que inicia la comunicación. 2. El principio de opciones negociadas tiene en cuenta el hecho de que muchos ordenadores querrán proporcionar servicios adicionales a los disponibles en un NVT y muchos usuarios tendrán terminales sofisticados y querrán disponer de servicios sofisticados en lugar de los mínimos. Hay "opciones" independientes del Protocolo TELNET pero estructuradas dentro de él que se votarán y que se podrán usar con la estructura "DO, DON'T, WILL, WON'T" (tratada posteriormente) que permiten a un usuario y a un servidor ponerse de acuerdo para usar convenciones más elaboradas (o tal vez sólo diferentes) para sus conexiones TELNET. Entre esas opciones se podrían incluir el cambio del juego de caracteres, el modo de eco, etc. La estrategia básica para el uso de opciones es hacer que una parte (o ambas) inicien la petición de activar alguna opción. El otro lado puede entonces aceptar o rechazar la petición. Si la petición se acepta, tiene efecto inmediato; si se rechaza, el aspecto asociado de la conexión queda tal y como se especifica para un NVT. Claramente, una parte siempre puede rehusar activar una opción y nunca debe rehusar desactivar alguna opción ya que ambos lados deben estar preparados para soportar un NVT. Se ha diseñado la sintaxis de la negociación de opciones para que si ambas partes solicitan una opción simultáneamente, cada una de ellas vea la petición de la otra como el reconocimiento positivo de la suya. 3. La simetría de la sintaxis de negociación puede potencialmente llevar a bucles infinitos de reconocimiento -- cada parte viendo las órdenes que llegan no como reconocimientos sino como nuevas peticiones para reconocer. Para evitar esto, prevalecen las siguientes normas: a. Las partes sólo pueden solicitar un cambio del estado de una opción; i.e., una parte no puede enviar una "petición" simplemente para anunciar en qué modo está. b. Si una parte recibe lo que parece una petición para entrar en algún modo en el que ya está, la petición no debería reconocerse. No responder esto es esencial para evitar bucles infinitos en la negociación. Es necesario enviar una respuesta para las peticiones de cambio de modo incluso si no se ha cambiado el modo. c. Siempre que una parte envíe una orden de opción a la otra, ya Postel & Reynolds [Página 2] RFC 854 Mayo 1983 sea una petición o un reconocimiento, y el uso de la opción va a tener algún efecto en el procesado de los datos enviados de la primera parte a la segunda, dicha orden se debe enviar en el punto donde se desee que comience a tener efecto. (Hay que tener en cuenta que pasará algún tiempo entre la transmisión de una petición y la recepción de un reconocimiento, que puede ser negativo. Por tanto, un ordenador puede ir almacenando los datos a enviar después de solicitar una opción, hasta que la petición se acepte o deniegue, para ocultar al usuario el "periodo de incertidumbre"). Es probable que las solicitudes de opción vayan de un lado a otro cuando se inicia la conexión TELNET, ya que cada parte intenta obtener el mejor servicio posible de la otra. Además de esto, se pueden usar las opciones para modificar dinámicamente las características de la conexión para ajustarse a cambios en las condiciones locales. Por ejemplo, el NVT, como se explica después, usa una disciplina de transmisión que se ajusta bien a muchas aplicaciones, como el BASIC, que envían una "línea cada vez", pero se ajusta mal a aplicaciones que, como el NLS, envían un "carácter cada vez". Un servidor puede optar por la carga extra de procesador que requiere una disciplina de "carácter cada vez" cuando se ajusta mejor al proceso local y negociaría la opción apropiada. Sin embargo, en lugar de estar permanentemente cargado con el trabajo extra que esto requiere, podría volver (es decir, negociar la vuelta) al NVT cuando no sea necesario el control detallado. Es posible que las peticiones iniciadas por procesos provoquen un bucle de petición infinito si el proceso responde a un rechazo volviendo a solicitar la opción. Para evitar que esto suceda, las peticiones rechazadas no se deben repetir hasta que algo cambie. Operacionalmente, esto puede significar que el proceso está ejecutando un programa diferente o el usuario a enviado otra orden o cualquier otra cosa que tenga sentido en el contexto para un proceso dado y una opción dados. Una buena regla a seguir es sólo se debe repetir una petición como resultado de información adicional procedente del otro extremo de la conexión o cuando se solicite por intervención del usuario a nivel local. Los diseñadores de opciones no se deberían sentir restringidos por la, en cierto modo, limitada sintaxis para negociar opciones. El objetivo de la sintaxis simple es hacer fácil tener opciones -- ya que es fácil ignorarlas. Si alguna opción en particular requiere una estructura de negociación más compleja que la posible mediante "DO, DON'T, WILL, WON'T", lo apropiado es usar "DO, DON'T, WILL, WON'T" para aclarar que ambas partes entienden la opción y, una vez conseguido esto, se puede usar una sintaxis más exótica. Por ejemplo, una parte puede enviar una solicitud para alterar Postel & Reynolds [Página 3] RFC 854 Mayo 1983 (establecer) la longitud de línea. Si se acepta, se puede usar una sintaxis diferente para negociar la longitud de la línea -- esa "subnegociación" puede incluir campos para los valores mínimo, máximo y deseado de longitud de línea. El concepto importante es que esas negociaciones expandidas nunca deberían iniciarse hasta que una negociación previa (estándar) haya establecido que ambas partes son capaces de interpretar la sintaxis expandida. En resumen, se envía WILL XXX por cualquier parte para indicar que esa parte desea (ofrece) iniciar la opción XXX, siendo DO XXX y DON'T XXX los reconocimientos positivo y negativo respectivamente; de la misma forma, se envía DO XXX para indicar un deseo (petición) de que la otra parte (es decir, quien recibe el DO) inicie la opción XXX, siendo WILL XXX y WON'T XXX los reconocimientos positivo y negativo respectivamente. Como el NVT es lo que queda cuando no se activa ninguna opción, las respuestas DON'T y WON'T garantizan que la conexión se quede en un estado que ambas partes entienden. De esta manera, todos los procesos TELNET se pueden implementar de tal forma que ignoren completamente todas las opciones no soportadas, simplemente devolviendo un rechazo a cualquier solicitud de opción que no entienda. En la medida de lo posible, el protocolo TELNET se ha hecho simétrico entre el servidor y el usuario para que de forma natural se adapte a conexiones usuario-usuario y servidor-servidor. Se espera, pero no se requiere en absoluto, que las opciones fomenten la simetría. En cualquier caso, se acepta explícitamente que la simetría es un principio operativo más que una regla inamovible. Se debe consultar otro documento, "Especificaciones de Opción TELNET", para obtener información del procedimiento que establece nuevas opciones. EL TERMINAL VIRTUAL DE RED El Terminal Virtual de Red (NVT, Network Virtual Terminal) es un dispositivo bidireccional de caracteres. El NVT tiene una impresora y un teclado. La impresora responde a los datos que llegan y el teclado produce los datos de salida que se envían a través de la conexión TELNET y, si se desea, también a la impresora del NVT. Los "ecos" no deberían recorrer la red (aunque existen opciones para activar el modo de operación de eco "remoto", no es obligatorio implementar esta opción). El código usado es USASCII de siete bits en un campo de ocho bits. Cualquier conversión de códigos u otras consideraciones que surjan son problemas locales y no afectan al NVT. TRANSMISIÓN DE DATOS Postel & Reynolds [Página 4] RFC 854 Mayo 1983 Aunque una conexión TELNET a través de la red es intrínsecamente bidireccional (full-dúplex), se debe ver al NVT como un dispositivo unidireccional (half-dúplex) operando en modo línea. A no ser que se negocien opciones indicando lo contrario, se aplican las siguientes condiciones por defecto a la transmisión de datos por la conexión TELNET: 1) Los datos se deben acumular en el ordenador donde se generan hasta tener una línea completa de datos o hasta que alguna señal definida localmente indique que debemos transmitir los datos. Esta señal se puede generar por un proceso o por un usuario. Todo ello mientras que el espacio de almacenamiento local lo permita. La motivación de esta regla es el elevado coste, para algunos ordenadores, de procesar una interrupción de entrada de datos por red unido a la especificación por defecto del NVT que dice que los "ecos" no circulan por la red. Por eso es razonable almacenar una cantidad de datos a medida que se obtienen. Muchos sistemas realizan alguna acción al final de cada línea de entrada (incluso las impresoras de línea o las tarjetas perforadas tienden a funcionar de esta manera), por eso la transmisión se debería ocurrir al final de cada línea. Por otra parte, un usuario o proceso puede necesitar o desear enviar datos que no necesariamente terminan en una nueva línea; por tanto, se advierte a los programadores de que proporcionen métodos para indicar localmente que todos los datos almacenados deben transmitirse inmediatamente. 2) Cuando un proceso ha terminado de enviar datos a una impresora NVT y no tiene más datos que procesar (es decir, cuando un proceso en un extremo de una conexión TELNET no puede continuar sin datos del otro extremo), el proceso debe transmitir la orden TELNET Go Ahead (Continuar). Esta regla no pretende requerir que se envíe la orden TELNET GA desde cada terminal en el extremo de una línea, ya que los servidores no requieren normalmente ninguna señal en especial (además de fin-de-línea u otros caracteres definidos localmente) para iniciar el proceso. En cambio, la orden TELNET GA está diseñada para ayudar a que el ordenador local de un usuario interaccione a nivel físico con terminales unidireccionales que disponen de un teclado que se puede bloquear, como el IBM 2741. Una descripción de este tipo de terminal puede ayudar a explicar el uso correcto de la orden GA. La conexión terminal-ordenador está siempre bajo control del Postel & Reynolds [Página 5] RFC 854 Mayo 1983 usuario o el ordenador. Ninguno puede unilateralmente apoderarse del control cuando lo tiene el otro; en lugar de eso, quien tenga el control debe liberarlo explícitamente. En la parte del terminal, el hardware está diseñado para que libere el control cada vez que se termina una línea (es decir, cuando el usuario pulsa la tecla de nueva línea). Cuando esto ocurre, el ordenador (local) al que está conectado procesa los datos de entrada, decide si se genera salida y si no devuelve el control al terminal. Si se genera salida, el ordenador mantiene el control hasta que ha transmitido todos los datos. Las dificultades de usar este tipo de terminal a través de la red deberían ser obvias. El ordenador local no es capaz de decidir si mantener el control después de ver la señal fin-de- línea o no; esta decisión sólo puede tomarla el ordenador remoto que procesa los datos. Por tanto, la orden TELNET GA proporciona un mecanismo por el cual el ordenador remoto (servidor) puede indicar al ordenador local (usuario) que es el momento de transferir el control al usuario del terminal. Debería transmitirse en esos momentos y sólo en esos momentos es en los que se debe dar al usuario el control del terminal. Téngase en cuenta que un envío prematuro de la orden GA puede provocar que se bloquee la salida, ya que el usuario probablemente pensará que la transmisión de datos está parada y, por tanto, no marcará el final de línea manualmente. Lo precedente, por supuesto, no se aplica a la dirección usuario- a-servidor de la comunicación. En esta dirección, se pueden enviar GAs en cualquier momento, pero no son necesarios. También, si la conexión TELNET se usa para comunicación proceso-a-proceso, no se necesita el envío de GAs en ninguna dirección. Finalmente, para comunicaciones terminal-a-terminal, se pueden necesitar GAs en ninguna, una o ambas direcciones. Si un ordenador espera soportar comunicación terminal-a-terminal se sugiere que el ordenador provea al usuario con algún medio para indicar manualmente que es el momento de enviar un GA; no obstante, esto no es un requisito para un proceso que implemente el protocolo TELNET. Nótese que la simetría del modelo TELNET requiere que haya un NVT en cada extremo de la conexión TELNET, al menos conceptualmente. REPRESENTACIÓN ESTÁNDAR DE FUNCIONES DE CONTROL Como se indica en la introducción de este documento, el objetivo principal del protocolo TELNET es proporcionar un interfaz estándar entre dispositivos terminales y procesos orientados a terminal a través de la red. Las primeras experiencias con este tipo de interconexión muestran que ciertas funciones son Postel & Reynolds [Página 6] RFC 854 Mayo 1983 implementadas por la mayoría de los servidores, pero que los métodos de invocar esas funciones varían mucho. Para un usuario que interactúa con varios servidores, estas diferencias son muy frustrantes. TELNET, consecuentemente, define una representación estándar para cinco de estas funciones, descritas más abajo. Estas representaciones estándar tienen significados estándar, pero no requeridos (con la excepción de la función Interrumpir Proceso (IP) que puede ser usada por otros protocolos que usan TELNET); esto es, un sistema que no proporciona la función a los usuarios locales no necesita proporcionarla a los usuarios remotos y puede tratar la representación estándar ignorándola. Por otra parte, un sistema que proporciona la función a usuarios locales está obligado a dar la misma función a un usuario remoto que transmite la representación estándar de la función. Interrumpir proceso (IP, Interrupt Process) Muchos sistemas proporcionan una función que suspende, interrumpe, aborta o finaliza la operación de un proceso de usuario. Esta función se usa frecuentemente cuando un usuario cree que su proceso está en un bucle infinito o cuando se ha activado sin querer un proceso no deseado. IP es la representación estándar para invocar esta función. Los desarrolladores deberían tener en cuenta que otros protocolos que usan TELNET pueden requerir esta opción y, por tanto, debería implementarse si se quiere soportar esos otros protocolos. Abortar Salida (AO, Abort Output) Muchos sistemas proporcionan una función que permite a un proceso que está generando salida que se ejecute hasta terminar (o que alcance el mismo punto que alcanzaría si se ejecutara hasta el final) pero sin enviar la salida al terminal del usuario, Además, esta función elimina cualquier salida que ya se haya generado pero que no se haya imprimido (o mostrado) aún en el terminal del usuario. AO es la representación estándar para invocar esta función. Por ejemplo, algún subsistema podría aceptar normalmente una orden introducida por el usuario, enviar una larga cadena de texto al terminal del usuario como respuesta y, finalmente, indicar que está preparado para la siguiente orden enviando el carácter de "prompt" (precedido por ) al terminal de usuario. Si se recibe el AO durante la transmisión de la cadena de texto, una implementación razonable debería suprimir el resto de la cadena de texto pero transmitir el carácter de "prompt" precedido de . (Esto es posiblemente para distinguir de la acción a tomar si se recibe IP; IP podría provocar la supresión de la cadena de texto y la Postel & Reynolds [Página 7] RFC 854 Mayo 1983 salida del subsistema). Se debe tener en cuenta por los servidores que ofrezcan esta función que puede haber espacios de almacenamiento intermedios externos al sistema (en la red y en el ordenador local del usuario) que deberían borrarse; la forma apropiada de hacer esto es mediante la transmisión de la señal "Synch" (descrita más adelante) al sistema del usuario. Estás ahí (AYT, Are You There) Muchos sistemas proporcionan una función que ofrece al usuario alguna evidencia visible (p.e., imprimible) de que el sistema está encendido y en funcionamiento. EL usuario puede invocar esta función cuando el sistema está inesperadamente "silencioso" durante un periodo largo de tiempo a causa de la imprevista (por el usuario) duración de una operación, una inusual elevada carga del sistema, etc. AYT es la representación estándar para invocar esta función. Carácter de Borrado (EC, Erase Character) Muchos sistemas ofrecen una función que borra el último carácter o "posición de impresión"* del flujo de datos introducido por el usuario. Esta función se usa típicamente para editar la entrada desde el teclado cuando se cometen errores. EC es la representación estándar para invocar esta función. *NOTA: Una "Posición de impresión" puede contener varios caracteres que son el resultados de sobreposiciones o de secuencias como BS ... Borrar Línea (EL, Erase Line) Muchos sistemas proporcionan una función que borra todos los datos de la línea actual de entrada. Esta función se suele usar para editar la entrada por teclado. EL es la representación estándar para invocar esta función. LA SEÑAL TELNET "SYNCH" Muchos sistemas de tiempo compartido ofrecen mecanismos para permitir a un terminal recuperar el control de un proceso en ejecución; las funciones IP y AO descritas previamente son ejemplos de estos mecanismos. En sistemas como esos, usados localmente, se tiene acceso a todas las señales generadas por el usuario, ya sean estas caracteres normales o señales "fuera de Postel & Reynolds [Página 8] RFC 854 Mayo 1983 banda" especiales como las generadas por la tecla "BREAK" o la tecla "ATTN" en el IBM 2741. Esto no siempre se cumple cuando el terminal se conecta al sistema a través de la red; los mecanismos de control de flujo de la red pueden provocar que una señal de este tipo se almacene en cualquier otra parte, por ejemplo en el ordenador del usuario. Para evitar este problema, se ha creado el mecanismo "Synch" de TELNET. Una señal Synch esta formada por una notificación urgente de TCP junto con la orden TELNET de MARCA DE DATOS. La notificación urgente, que no está sujeta al control de flujo relativo a la conexión TELNET, se usa para que se trate de manera especial el flujo de datos por los procesos que lo reciban. De esta forma, el flujo de datos se explora inmediatamente en busca de señales "interesantes" tal y como se definen más abajo, descartando otros datos. La orden TELNET de MARCA DE DATOS (DM, DATA MARK) es la indicación de sincronismo en el flujo de datos que indica que cualquier señal especial ha sido generada y que el receptor puede volver a procesar el flujo de datos. El Synch se envía mediante la operación de envío TCP con el indicador de Urgente activado y DM como el último (o único) octeto de datos. Cuando se envían varios Synch rápidamente, se pueden mezclar varias notificaciones de urgente. No es posible contar dichas notificaciones ya que el número recibido será menor o igual que el de enviados. Normalmente, un DM no tiene ningún efecto; si se está en modo urgente, indica el final del procesamiento urgente. Si TCP señala el final de los datos urgentes antes de que se encuentre el DM, TELNET debería continuar el tratamiento especial del flujo de datos hasta que se encuentre un DM. Si TCP indica que hay más datos urgentes después de encontrar el DM, sólo puede ser por un Synch posterior. TELNET debería continuar el tratamiento especial del flujo de datos hasta encontrar otro DM. Señales "interesantes" son: las representaciones TELNET estándar de IP, AO y AYT (pero no EC no EL); los análogos locales de estas operaciones (si los hay); otras señales definidas por el servidor cuya acción se puede llevar a cabo sin retrasar la búsqueda en el flujo de datos. Como uno de los efectos del mecanismo SYNCH es el descarte de prácticamente todos los caracteres (excepto órdenes TELNET) entre el que lo envía y el que lo recibe, se especifica este mecanismo Postel & Reynolds [Página 9] RFC 854 Mayo 1983 como la forma estándar de borrar los datos cuando se desee. Por ejemplo, si un usuario provoca que se transmita un AO, el servidor que lo recibe (si proporciona esa función) debería devolver un Synch al usuario. Por último, al igual que TELNET necesita la notificación urgente de TCP como una señal indicando datos fuera-de-banda, otros protocolos que usan TELNET pueden requerir órdenes TELNET que pueden ser vistas en otro nivel como señales de datos fuera-de- banda. Por convenio la secuencia [IP, Synch] se usa como señal para indicar esto. Por ejemplo, supongamos que ese otro protocolo, que usa TELNET, define el carácter FINAL de cadena igual que la orden TELNET AO. Imaginemos que un usuario de este protocolo desea que un servidor procese el FINAL de cadena, pero la conexión está bloqueada porque el servidor está procesando otros datos. El usuario debería hacer que su sistema: 1. Envíe el carácter TELNET IP; 2. Envíe la secuencia TELNET SYNCH, esto es: Envíe la MARCA DE DATOS (DM) como el único carácter en una operación de envío TCP urgente. 3. Envíe el carácter FINAL de cadena; y 4. Envíe el análogo en el otro protocolo del TELNET DM, si lo hay. El usuario (o proceso actuando en su lugar) debe transmitir la secuencia TELNET SYNCH del paso 2 anterior para asegurarse de que el TELNET IP llega al intérprete TELNET del servidor. El envío urgente debería despertar al proceso TELNET; el IP debería despertar el siguiente proceso de más alto nivel. LA IMPRESORA Y EL TECLADO NVT La impresora NVT tiene un ancho de carro y una longitud de página sin especificar y puede producir representaciones de los 95 caracteres USASCII imprimibles (códigos 32 a 126). De los 33 códigos de control de USASCII (de 0 a 31 y el 127), y los otros 128 códigos que no están cubiertos (128 a 255), los siguientes tienen un significado específico para la impresora NVT: Postel & Reynolds [Página 10] RFC 854 Mayo 1983 NOMBRE CÓDIGO SIGNIFICADO NULO (NUL) 0 Ninguna operación. Avance de 10 Mueve la impresora a la siguiente línea (LF) línea conservando la misma posición horizontal. Retorno de 13 Mueve la impresora al margen carro (CR) izquierdo de la línea actual. Además, los siguientes códigos deberán tener efectos definidos, pero no requeridos, sobre la impresora NVT. Ningún extremo de una conexión TELNET puede asumir que el otro lado hará o ha hecho, ninguna acción particular al recibir o transmitir estos: Campana (BEL) 7 Produce una indicación audible o visible que NO desplaza el cabezal de la impresora. Retroceso (BS) 8 Mueve el cabezal una posición hacia el margen izquierdo. Tabulador hor­ 9 Mueve la impresora al siguiente izontal (HT) punto de parada horizontal. No se especifica cómo cada parte deter­ mina o establece dónde están esos puntos de parada. Tabulador ver­ 11 Mueve la impresora al siguiente tical (VT) punto de parada vertical. No se especifica cómo cada parte deter­ mina o establece dónde están esos puntos de parada. Avance de 12 Mueve la impresora al principio de página (FF) la siguiente página manteniendo la misma posición horizontal. El resto de los códigos no hacen que la impresora NVT realice acción alguna. La secuencia "CR LF", según la definición, hará que el NVT se posicione en el margen izquierdo de la siguiente línea (tal y como lo haría, por ejemplo, la secuencia "LF CR"). Sin embargo, muchos sistemas y terminales no tratan el CR y el LF de forma independi­ ente y esto hará realizar un esfuerzo extra para simular su efecto. (Por ejemplo, algunos terminales no tienen un CR separado del LF, pero en ellos se puede simular el CR con retrocesos.) Por tanto, la secuencia "CR LF" se debe tratar como si fuera un carácter de nueva línea y usado cuando se pretende obtener el Postel & Reynolds [Página 11] RFC 854 Mayo 1983 resultado de su acción combinada; la secuencia "CR NUL" se usará cuando lo único que se quiere es un retorno de carro; y se debe evitar el carácter CR en otros contextos. Esta regla asegura a los sistemas que deben decidir si realizar un función de "nueva línea" o múltiples retrocesos que el flujo TELNET contiene un carácter después del CR que permitirá tomar una decisión acertada. Nótese que se requiere "CR LF" o "CR NUL" en ambas direcciones (en el modo ASCII por defecto), para preservar la simetría del modelo NVT. Aunque se puede saber en determinadas situaciones (p.e., con las opciones de eco remoto y continuar en efecto) que no estamos enviando los caracteres a una impresora real, sin embargo, en aras de la consistencia, el protocolo requiere que se inserte un NUL después de cada CR que no vaya seguido de un LF en el flujo de datos. La conversión de esto es que un NUL recibido en el flujo de datos después de un CR (en ausencia de opciones que explícitamente indiquen lo contrario) debería ser eliminado antes de aplicar el conjunto de caracteres usado localmente por el NVT. El teclado NVT tiene teclas o combinaciones de teclas o secuencias de teclas para generar los 128 códigos USASCII. Nótese que aunque muchos de ellos no tienen efecto sobre la impresora NVT, el teclado NVT es capaz de generarlos todos. Además de estos códigos, el teclado NVT deberá poder generar los siguientes códigos adicionales que, excepto en los que se diga lo contrario, tiene significados definidos pero no requeridos. La asignación de códigos para estos "caracteres" está en la sección de Órdenes TELNET, porque son, en cierto sentido, genéricos y debería estar disponibles incluso cuando el flujo de datos se interpreta como si fuera otro código de caracteres. Synch Esta tecla permite al usuario borrar los datos que están en camino hacia el otro extremo. La activación de esta tecla causa el envío de un DM (ver sección sobre órdenes) por el flujo de datos y una notificación TCP de urgente se asocia con él. El par DM-urgente tendrá el significado requerido según se ha definido anteriormente. Break (BRK, interrumpir) Se proporciona este código porque es una señal fuera del con­ junto USASCII al que se le da un significado local en muchos sistemas. Su propósito es indicar la pulsación de la tecla de interrupción o de atención. Nótese, sin embargo, que la Postel & Reynolds [Página 12] RFC 854 Mayo 1983 intención es proporcionar un código 129 para sistemas que lo requieren, no como un sinónimo de la representación estándar IP. Interrumpir proceso (IP, Interrupt Process) Suspende, interrumpe, aborta o termina el proceso al que está conectado el NVT. También es parte de la señal fuera-de-banda para otros protocolos que usan TELNET. Abortar salida (AO, Abort Output) Permite al proceso ejecutarse (o aparentarlo) hasta finalizar, pero no envía su salida al usuario. También envía un Synch al usuario. Estás ahí (AYT, Are You There) Devuelve al NVT alguna evidencia visible (p.e., imprimible) de que se ha recibido el AYT. Borrar carácter (EC, Erase Character) El receptor debería borrar el carácter o "posición de impresión" inmediatamente anterior en el flujo de datos. Borrar línea (EL, Erase Line) El receptor debería borrar caracteres del flujo de datos hacia atrás hasta, pero sin incluir, el último "CR LF" enviado por la conexión TELNET. El espíritu de estas teclas "extra", y también de las que afectan al formato de impresión, es que deberían representar una extensión natural del mapeado que ya se debe hacer entre "NVT" y "local". Igual que el octeto 68 (104 en octal) se debería mapear al código local para la D mayúscula, el carácter EC se debería mapear a cualquiera que sea la función de borrar carácter en local. Además, igual que el mapeado para 124 (174 en octal) es de alguna forma arbitrario en un entorno que no tiene ningún carácter de barra vertical, el carácter EL también puede tener un mapeado arbitrario (o ninguno en absoluto) si no se dispone en local de ninguna función para borrar una línea. Igualmente para los caracteres que afectan al formato: si el terminal tiene tabulador vertical, entonces el mapeado para el VT es obvio y sólo cuando el terminal no lo tiene el efecto es impredecible. ESTRUCTURA DE ORDENES TELNET Postel & Reynolds [Página 13] RFC 854 Mayo 1983 Todas las órdenes TELNET consisten, al menos, en una secuencia de dos bytes: el carácter de escape "Interpretar como Orden" (IAC) seguido por el código de orden. Las órdenes que negocian opciones consisten en secuencias de tres bytes, siendo el tercero el código para la opción referenciada. Se ha elegido este formato para hacer que si se usa racionalmente el espacio de datos -- mediante negociaciones a partir del NVT básico, por supuesto -- las colisiones de bytes de datos con órdenes se minimicen, requiriendo esas colisiones la incon­ veniencia e ineficiencia de "escapar" los bytes de datos. De la forma indicada, sólo se necesita duplicar el IAC para enviarlo como un dato y los otros 255 códigos se pueden pasar transparentemente. Estas son las órdenes TELNET definidas. Tenga en cuenta que estos códigos o secuencias de códigos sólo tienen el significado que se indica si van inmediatamente precedidos por un IAC. NOMBRE CÓDIGO SIGNIFICADO SE 240 Fin de los parámetros de subnegociación. NOP 241 No operación. Marca de datos (DM) 242 La parte del flujo de datos de un Synch. Siempre se debe acompañar de una notifi­ cación urgente de TCP. Break 243 Carácter BRK del NVT. Interrumpir proceso 244 La función IP. Interrumpir salida 245 La función AO. Estás Ahí 246 La función AYT. Borrar Carácter 247 La función EC. Borrar Línea 248 La función EL. Continuar 249 La señal GA. SB 250 Indica que lo que sigue es una subnego­ ciación de la opción indicada. WILL (código de 251 Indica el deseo de iniciar el uso de una opción) opción o la confirmación de que ya se está usando. WON'T (código de 252 Denota la negativa a usar o continuar opción) usando la opción indicada. DO (código de 253 Es una solicitud para que el otro lado opción) use una opción o la confirmación de que se espera que el otro lado la use. DON'T (código de 254 Pide a la otra parte que deje de usar opción) una opción o indica que ya no esperamos que la use más. IAC 255 Byte de datos 255. ESTABLECIMIENTO DE LA CONEXIÓN Postel & Reynolds [Página 14] RFC 854 Mayo 1983 La conexión TCP del TELNET se establece entre el puerto U del usuario y el puerto L del servidor. El servidor espera esas conexiones en un puerto L conocido. Como una conexión TCP es bidireccional y se iden­ tifica por el par de puertos, el servidor puede atender muchas conex­ iones simultáneas entre su puerto L y diferentes puertos U de usuario. Asignación de puertos Cuando se usa para acceso remoto de usuarios a un ordenador (i.e., acceso desde un terminal remoto) a este protocolo se le asigna el puerto servidor 23 (27 en octal). Esto es: L=23. Postel & Reynolds [Página 15]