The Network Virtual Terminal (Il terminale virtuale di rete)
Il terminale virtuale di rete (Network Virtual Terminal, NVT) è un dispositivo di caratteri bidirezionale (Bi-Directional Character Device). Il NVT dispone di una stampante (Printer) e di una tastiera (Keyboard). La stampante risponde ai dati in entrata e la tastiera produce dati in uscita che vengono inviati tramite la connessione TELNET e, se si desiderano "echi" (Echoes), anche alla stampante del NVT. Gli "echi" non dovrebbero attraversare la rete (sebbene esistano opzioni per abilitare una modalità di eco "remoto", nessun host è tenuto a implementare questa opzione). Il set di codici è USASCII a 7 bit in un campo a 8 bit, salvo modifiche qui specificate. Qualsiasi conversione di codice e considerazione sulla temporizzazione sono problemi locali e non influenzano il NVT.
TRANSMISSION OF DATA (Trasmissione dei dati)
Sebbene una connessione TELNET attraverso la rete sia intrinsecamente full duplex (bidirezionale completa), il NVT deve essere considerato come un dispositivo half duplex (semiduplex) che opera in modalità con buffer di riga (Line-Buffered Mode). Cioè, a meno che e fino a quando le opzioni non siano negoziate diversamente, le seguenti condizioni predefinite riguardano la trasmissione di dati sulla connessione TELNET:
-
Nella misura in cui la disponibilità dello spazio buffer locale lo consente, i dati dovrebbero (should) essere accumulati nell'host in cui sono generati fino a quando una riga completa di dati è pronta per la trasmissione, o fino a quando si verifica un segnale esplicito di trasmissione definito localmente. Questo segnale potrebbe essere generato da un processo o da un utente umano.
La motivazione di questa regola è l'alto costo, per alcuni host, dell'elaborazione degli interrupt di input di rete, unito alla specifica NVT predefinita secondo cui gli "echi" non attraversano la rete. Pertanto, è ragionevole bufferizzare una certa quantità di dati alla loro origine. Molti sistemi eseguono un'azione di elaborazione alla fine di ogni riga di input (anche le stampanti a riga o le perforatrici di schede tendono spesso a funzionare in questo modo), quindi la trasmissione dovrebbe essere attivata alla fine di una riga. D'altra parte, un utente o un processo potrebbe talvolta ritenere necessario o desiderabile fornire dati che non terminano alla fine di una riga; pertanto, gli implementatori sono invitati a fornire metodi per segnalare localmente che tutti i dati bufferizzati devono essere trasmessi immediatamente.
-
Quando un processo ha completato l'invio di dati a una stampante NVT e non ha input in coda dalla tastiera NVT per ulteriore elaborazione (cioè, quando un processo a un'estremità di una connessione TELNET non può procedere senza input dall'altra estremità), il processo deve (must) trasmettere il comando TELNET Go Ahead (GA).
Questa regola non intende richiedere che il comando TELNET GA sia inviato da un terminale alla fine di ogni riga, poiché gli host server normalmente non richiedono un segnale speciale (oltre alla fine riga o ad altri caratteri definiti localmente) per iniziare l'elaborazione. Piuttosto, il TELNET GA è progettato per aiutare l'host locale di un utente a operare un terminale fisicamente half duplex che ha una tastiera "bloccabile" come l'IBM 2741. Una descrizione di questo tipo di terminale può aiutare a spiegare l'uso appropriato del comando GA.
La connessione terminale-computer è sempre sotto il controllo dell'utente o del computer. Nessuno dei due può prendere unilateralmente il controllo dall'altro; piuttosto, l'estremità controllante deve rinunciare esplicitamente al suo controllo. All'estremità del terminale, l'hardware è costruito in modo da rinunciare al controllo ogni volta che una "riga" viene terminata (cioè, quando il tasto "New Line" viene premuto dall'utente). Quando ciò si verifica, il computer collegato (locale) elabora i dati di input, decide se deve essere generato l'output e, in caso negativo, restituisce il controllo al terminale. Se deve essere generato l'output, il controllo viene mantenuto dal computer fino a quando tutto l'output è stato trasmesso.
Le difficoltà nell'utilizzare questo tipo di terminale attraverso la rete dovrebbero essere ovvie. Il computer "locale" non è più in grado di decidere se mantenere il controllo dopo aver visto un segnale di fine riga o meno; questa decisione può essere presa solo dal computer "remoto" che sta elaborando i dati. Pertanto, il comando TELNET GA fornisce un meccanismo mediante il quale il computer "remoto" (server) può segnalare al computer "locale" (utente) che è tempo di passare il controllo all'utente del terminale. Dovrebbe (should) essere trasmesso in quei momenti, e solo in quei momenti, quando l'utente dovrebbe ricevere il controllo del terminale. Si noti che la trasmissione prematura del comando GA può causare il blocco dell'output, poiché è probabile che l'utente presuma che il sistema di trasmissione abbia fatto una pausa, e pertanto non riuscirà a invertire manualmente la linea.
Quanto sopra, ovviamente, non si applica alla direzione di comunicazione utente-server. In questa direzione, i GA possono essere inviati in qualsiasi momento, ma non è necessario che vengano mai inviati. Inoltre, se la connessione TELNET viene utilizzata per la comunicazione processo-processo, i GA non devono essere inviati in nessuna direzione. Infine, per la comunicazione terminale-terminale, i GA possono essere richiesti in nessuna, una o entrambe le direzioni. Se un host prevede di supportare la comunicazione terminale-terminale, si suggerisce (suggested) che l'host fornisca all'utente un mezzo per segnalare manualmente che è tempo di inviare un GA tramite la connessione TELNET; tuttavia, questo non è un requisito per l'implementatore di un processo TELNET.
Si noti che la simmetria del modello TELNET richiede che ci sia un NVT a ciascuna estremità della connessione TELNET, almeno concettualmente.
STANDARD REPRESENTATION OF CONTROL FUNCTIONS (Rappresentazione standard delle funzioni di controllo)
Come indicato nell'introduzione a questo documento, l'obiettivo principale del protocollo TELNET è fornire un'interfaccia standard dei dispositivi terminali e dei processi orientati al terminale attraverso la rete. Le prime esperienze con questo tipo di interconnessione hanno mostrato che alcune funzioni sono implementate dalla maggior parte dei server, ma che i metodi di invocazione di queste funzioni variano ampiamente. Per un utente umano che interagisce con diversi sistemi server, queste differenze sono molto frustranti. TELNET definisce quindi una rappresentazione standard per cinque di queste funzioni, come descritto di seguito. Queste rappresentazioni standard hanno significati standard, ma non richiesti (con l'eccezione che la funzione Interrupt Process (IP) può essere richiesta da altri protocolli che utilizzano TELNET); cioè, un sistema che non fornisce la funzione agli utenti locali non ha bisogno di fornirla agli utenti di rete e può (may) trattare la rappresentazione standard per la funzione come un'operazione nulla (No-operation). D'altra parte, un sistema che fornisce la funzione a un utente locale è obbligato a fornire la stessa funzione a un utente di rete che trasmette la rappresentazione standard per la funzione.
Interrupt Process (IP) (Interrompere il processo)
Molti sistemi forniscono una funzione che sospende, interrompe, interrompe o termina l'operazione di un processo utente. Questa funzione viene utilizzata frequentemente quando un utente ritiene che il suo processo sia in un ciclo infinito, o quando un processo indesiderato è stato inavvertitamente attivato. IP è la rappresentazione standard per invocare questa funzione. Gli implementatori dovrebbero notare che IP può essere richiesto da altri protocolli che utilizzano TELNET, e pertanto dovrebbe (should) essere implementato se questi altri protocolli devono essere supportati.
Abort Output (AO) (Interrompere l'output)
Molti sistemi forniscono una funzione che consente a un processo, che sta generando output, di eseguire fino al completamento (o di raggiungere lo stesso punto di arresto che raggiungerebbe se eseguito fino al completamento) ma senza inviare l'output al terminale dell'utente. Inoltre, questa funzione tipicamente cancella qualsiasi output già prodotto ma non ancora effettivamente stampato (o visualizzato) sul terminale dell'utente. AO è la rappresentazione standard per invocare questa funzione. Ad esempio, un sottosistema potrebbe normalmente accettare un comando dell'utente, inviare una lunga stringa di testo al terminale dell'utente in risposta, e infine segnalare la disponibilità ad accettare il comando successivo inviando un carattere "prompt" (preceduto da <CR><LF>) al terminale dell'utente. Se l'AO fosse ricevuto durante la trasmissione della stringa di testo, un'implementazione ragionevole sarebbe quella di sopprimere il resto della stringa di testo, ma trasmettere il carattere prompt e il <CR><LF> precedente. (Questo è possibilmente in contrasto con l'azione che potrebbe essere intrapresa se fosse ricevuto un IP; l'IP potrebbe causare la soppressione della stringa di testo e un'uscita dal sottosistema.)
Dovrebbe essere notato, dai sistemi server che forniscono questa funzione, che potrebbero esserci buffer esterni al sistema (nella rete e nell'host locale dell'utente) che dovrebbero essere cancellati; il modo appropriato per farlo è trasmettere il segnale "Synch" (descritto di seguito) al sistema utente.
Are You There (AYT) (Ci sei)
Molti sistemi forniscono una funzione che fornisce all'utente una prova visibile (ad esempio, stampabile) che il sistema è ancora attivo e funzionante. Questa funzione può essere invocata dall'utente quando il sistema è inaspettatamente "silenzioso" per un lungo periodo, a causa della lunghezza non prevista (dall'utente) di un calcolo, di un carico di sistema insolitamente pesante, ecc. AYT è la rappresentazione standard per invocare questa funzione.
Erase Character (EC) (Cancellare il carattere)
Molti sistemi forniscono una funzione che elimina l'ultimo carattere precedente non eliminato o la "posizione di stampa"* dal flusso di dati fornito dall'utente. Questa funzione viene tipicamente utilizzata per modificare l'input da tastiera quando vengono commessi errori di battitura. EC è la rappresentazione standard per invocare questa funzione.
*NOTA: Una "posizione di stampa" può contenere diversi caratteri che sono il risultato di sovrastampe, o di sequenze come <char1> BS <char2>...
Erase Line (EL) (Cancellare la riga)
Molti sistemi forniscono una funzione che elimina tutti i dati nella "riga" di input corrente. Questa funzione viene tipicamente utilizzata per modificare l'input da tastiera. EL è la rappresentazione standard per invocare questa funzione.
THE TELNET "SYNCH" SIGNAL (Il segnale "Synch" TELNET)
La maggior parte dei sistemi time-sharing fornisce meccanismi che consentono a un utente di terminale di riacquistare il controllo di un processo "fuori controllo"; le funzioni IP e AO descritte sopra sono esempi di questi meccanismi. Tali sistemi, quando utilizzati localmente, hanno accesso a tutti i segnali forniti dall'utente, che siano caratteri normali o segnali speciali "fuori banda" come quelli forniti dal tasto "BREAK" del telescrivente o dal tasto "ATTN" dell'IBM 2741. Questo non è necessariamente vero quando i terminali sono collegati al sistema attraverso la rete; i meccanismi di controllo del flusso della rete possono causare che un tale segnale sia bufferizzato altrove, ad esempio nell'host dell'utente.
Per contrastare questo problema, viene introdotto il meccanismo "Synch" TELNET. Un segnale Synch consiste in una notifica TCP Urgent (TCP Urgent Notification), accoppiata con il comando TELNET DATA MARK. La notifica Urgent, che non è soggetta al controllo del flusso relativo alla connessione TELNET, viene utilizzata per invocare la gestione speciale del flusso di dati da parte del processo che lo riceve. In questa modalità, il flusso di dati viene immediatamente scansionato alla ricerca di segnali "interessanti" come definiti di seguito, scartando i dati intermedi. Il comando TELNET DATA MARK (DM) è il segno di sincronizzazione nel flusso di dati che indica che qualsiasi segnale speciale si è già verificato e il destinatario può tornare all'elaborazione normale del flusso di dati.
Il Synch viene inviato tramite l'operazione di invio TCP con il flag Urgent impostato e il DM come ultimo (o unico) ottetto di dati.
Quando più Synch vengono inviati in rapida successione, le notifiche Urgent possono essere unite. Non è possibile contare gli Urgent poiché il numero ricevuto sarà inferiore o uguale al numero inviato. In modalità normale, un DM è un'operazione nulla; in modalità urgente, segnala la fine dell'elaborazione urgente.
Se TCP indica la fine dei dati Urgent prima che venga trovato il DM, TELNET dovrebbe (should) continuare la gestione speciale del flusso di dati fino a quando non viene trovato il DM.
Se TCP indica ulteriori dati Urgent dopo che il DM è stato trovato, può essere solo a causa di un Synch successivo. TELNET dovrebbe (should) continuare la gestione speciale del flusso di dati fino a quando non viene trovato un altro DM.
I segnali "interessanti" sono definiti come: le rappresentazioni standard TELNET di IP, AO e AYT (ma non EC o EL); gli analoghi locali di queste rappresentazioni standard (se presenti); tutti gli altri comandi TELNET; altri segnali definiti dal sito che possono essere gestiti senza ritardare la scansione del flusso di dati.
Poiché un effetto del meccanismo SYNCH è lo scarto di essenzialmente tutti i caratteri (eccetto i comandi TELNET) tra il mittente del Synch e il suo destinatario, questo meccanismo è specificato come il modo standard per cancellare il percorso dei dati quando ciò è desiderato. Ad esempio, se un utente a un terminale causa la trasmissione di un AO, il server che riceve l'AO (se fornisce quella funzione) dovrebbe (should) restituire un Synch all'utente.
Infine, proprio come la notifica TCP Urgent è necessaria a livello TELNET come segnale fuori banda, così altri protocolli che utilizzano TELNET possono richiedere un comando TELNET che può essere visto come un segnale fuori banda a un livello diverso.
Per convenzione, la sequenza [IP, Synch] deve essere utilizzata come tale segnale. Ad esempio, supponiamo che un altro protocollo, che utilizza TELNET, definisca la stringa di caratteri STOP analogamente al comando TELNET AO. Immaginate che un utente di questo protocollo desideri che un server elabori la stringa STOP, ma la connessione è bloccata perché il server sta elaborando altri comandi. L'utente dovrebbe istruire il suo sistema a:
-
Inviare il carattere TELNET IP;
-
Inviare la sequenza TELNET SYNC, cioè:
Inviare il Data Mark (DM) come unico carattere in un'operazione di invio in modalità urgente TCP.
-
Inviare la stringa di caratteri STOP; e
-
Inviare l'analogo dell'altro protocollo al TELNET DM, se presente.
L'utente (o il processo che agisce per suo conto) deve (must) trasmettere la sequenza TELNET SYNCH del passo 2 sopra per garantire che il TELNET IP arrivi all'interprete TELNET del server.
L'Urgent dovrebbe risvegliare il processo TELNET; l'IP dovrebbe risvegliare il processo di livello superiore successivo.
THE NVT PRINTER AND KEYBOARD (La stampante e la tastiera NVT)
La stampante NVT ha una larghezza di carrello e una lunghezza di pagina non specificate e può produrre rappresentazioni di tutti i 95 grafici USASCII (codici da 32 a 126). Dei 33 codici di controllo USASCII (da 0 a 31 e 127) e dei 128 codici non coperti (da 128 a 255), i seguenti hanno un significato specificato per la stampante NVT:
NAME CODE MEANING
NULL (NUL) 0 Nessuna operazione Line Feed (LF) 10 Sposta la stampante alla riga di stampa successiva, mantenendo la stessa posizione orizzontale. Carriage Return (CR) 13 Sposta la stampante al margine sinistro della riga corrente.
Inoltre, i seguenti codici devono (shall) avere effetti definiti, ma non richiesti, sulla stampante NVT. Nessuna estremità di una connessione TELNET può (may) presumere che l'altra parte intraprenderà, o avrà intrapreso, un'azione particolare alla ricezione o trasmissione di questi:
BELL (BEL) 7 Produce un segnale udibile o visibile (che NON sposta la testina di stampa). Back Space (BS) 8 Sposta la testina di stampa di una posizione di carattere verso il margine sinistro. Horizontal Tab (HT) 9 Sposta la stampante alla prossima tabulazione orizzontale. Rimane non specificato come una delle parti determini o stabilisca dove si trovano tali tabulazioni. Vertical Tab (VT) 11 Sposta la stampante alla prossima tabulazione verticale. Rimane non specificato come una delle parti determini o stabilisca dove si trovano tali tabulazioni. Form Feed (FF) 12 Sposta la stampante in cima alla pagina successiva, mantenendo la stessa posizione orizzontale.
Tutti i codici rimanenti non causano alcuna azione da parte della stampante NVT.
La sequenza "CR LF", come definita, farà sì che il NVT sia posizionato al margine sinistro della riga di stampa successiva (come farebbe, ad esempio, la sequenza "LF CR"). Tuttavia, molti sistemi e terminali non trattano CR e LF in modo indipendente e dovranno fare qualche sforzo per simulare il loro effetto. (Ad esempio, alcuni terminali non hanno un CR indipendente dal LF, ma su tali terminali potrebbe essere possibile simulare un CR tramite backspace.) Pertanto, la sequenza "CR LF" deve (must) essere trattata come un singolo carattere "nuova riga" e utilizzata ogni volta che si intende la loro azione combinata; la sequenza "CR NUL" deve (must) essere utilizzata quando si desidera effettivamente solo un ritorno a capo; e il carattere CR deve (must) essere evitato in altri contesti. Questa regola fornisce garanzia ai sistemi che devono decidere se eseguire una funzione "nuova riga" o più backspace che il flusso TELNET contiene un carattere che segue un CR che consentirà una decisione razionale.
Si noti che "CR LF" o "CR NUL" è richiesto in entrambe le direzioni (in modalità ASCII predefinita), per preservare la simmetria del modello NVT. Anche se in alcune situazioni (ad esempio, con le opzioni di eco remoto e soppressione go ahead in vigore) può essere noto che i caratteri non vengono inviati a una stampante effettiva, tuttavia, per coerenza, il protocollo richiede che un NUL sia inserito dopo un CR non seguito da un LF nel flusso di dati. L'inverso di questo è che un NUL ricevuto nel flusso di dati dopo un CR (in assenza di negoziazioni di opzioni che specificano esplicitamente altrimenti) dovrebbe (should) essere rimosso prima di applicare la mappatura NVT al set di caratteri locali.
La tastiera NVT ha tasti, o combinazioni di tasti, o sequenze di tasti, per generare tutti i 128 codici USASCII. Si noti che sebbene molti non abbiano alcun effetto sulla stampante NVT, la tastiera NVT è in grado di generarli.
Oltre a questi codici, la tastiera NVT deve (shall) essere in grado di generare i seguenti codici aggiuntivi che, salvo diversa indicazione, hanno significati definiti, ma non richiesti. Le assegnazioni di codice effettive per questi "caratteri" si trovano nella sezione dei comandi TELNET, perché sono considerati, in un certo senso, generici e dovrebbero essere disponibili anche quando il flusso di dati viene interpretato come un altro set di caratteri.
Synch
Questo tasto consente all'utente di cancellare il suo percorso dati verso l'altra parte. L'attivazione di questo tasto causa l'invio di un DM (vedere la sezione dei comandi) nel flusso di dati e una notifica TCP Urgent è associata ad esso. La coppia DM-Urgent deve (must) avere il significato richiesto come definito precedentemente.
Break (BRK)
Questo codice è fornito perché è un segnale al di fuori del set USASCII a cui viene attualmente dato un significato locale in molti sistemi. È inteso per indicare che è stato premuto il tasto Break o il tasto Attention. Si noti, tuttavia, che questo è inteso per fornire un 129° codice per i sistemi che ne hanno bisogno, non come sinonimo della rappresentazione standard IP.
Interrupt Process (IP)
Sospende, interrompe, interrompe o termina il processo a cui è connesso il NVT. Inoltre, parte del segnale fuori banda per altri protocolli che utilizzano TELNET.
Abort Output (AO)
Consente al processo corrente di (apparentemente) eseguire fino al completamento, ma non invia il suo output all'utente. Inoltre, invia un Synch all'utente.
Are You There (AYT)
Invia al NVT una prova visibile (cioè, stampabile) che l'AYT è stato ricevuto.
Erase Character (EC)
Il destinatario dovrebbe (should) eliminare l'ultimo carattere precedente non eliminato o la "posizione di stampa" dal flusso di dati.
Erase Line (EL)
Il destinatario dovrebbe (should) eliminare i caratteri dal flusso di dati fino a, ma non includendo, l'ultima sequenza "CR LF" inviata sulla connessione TELNET.
Lo spirito di questi tasti "extra", così come degli effettori di formato della stampante, è che dovrebbero rappresentare un'estensione naturale della mappatura che deve già essere effettuata da "NVT" a "locale". Proprio come il byte di dati NVT 68 (104 ottale) dovrebbe essere mappato su qualsiasi sia il codice locale per "D maiuscola", così il carattere EC dovrebbe essere mappato su qualsiasi sia la funzione locale "Cancella carattere". Inoltre, proprio come la mappatura per 124 (174 ottale) è alquanto arbitraria in un ambiente che non ha un carattere "barra verticale", il carattere EL può avere una mappatura alquanto arbitraria (o nessuna affatto) se non esiste una funzione locale "Cancella riga". Analogamente per gli effettori di formato: se il terminale ha effettivamente una "Tabulazione verticale", allora la mappatura per VT è ovvia, e solo quando il terminale non ha una tabulazione verticale l'effetto di VT dovrebbe essere imprevedibile.