原文:ftp://ftp.rfc-editor.org/in-notes/rfc854.txt


ソーシャルブックマーク: このページをはてなブックマークに追加 このページをDeliciousに登録 このページをlivedoorクリップに登録
サイト内関連リンク:
RFC 855 TELNET オプション仕様(日本語訳)


Network Working Group
Request for Comments: 854

Obsoletes: NIC 18639

J. Postel
J. Reynolds
ISI
May 1983

TELNET プロトコル仕様

この RFC は ARPA インターネットコミュニティのための標準を規定する。ARPA インターネット上のホストはこの標準を採用し、実装することを期待される。

導入

TELNET プロトコルの目的は、極めて一般的な双方向の 8 ビット志向通信機能を提供することである。その第一の目標は、端末装置と端末志向プロセスとを互いにインターフェイスする標準的手法を与えることである。このプロトコルは端末-端末通信("リンク")や、プロセス-プロセス通信(分散コンピューティング)に利用されることも見込んでいる。

一般的考察

TELNET 接続は、TELNET 制御情報を散りばめられたデータを送信するために使用される Transmission Control Protocol (TCP) 接続である。

TELNETプロトコルは3つの主要な着想に基いて構築されている。第一に "ネットワーク仮想端末" の概念; 第二にオプション交渉の原則; そして第三に、端末とプロセスとの対称的ビューである。

  1. 最初に TELNET 接続が確立したとき、各終端は "ネットワーク仮想端末(Network Virtual Terminal)" (または単に NVT)への始点・終点と見なされる。NVT とは、正統な端末の、標準的でネットワーク規模で中間的な表現を提供する想像上のデバイスである。これは "サーバー" ホストと "ユーザー" ホストとが、互いの端末の特性と端末が処理する習慣とに関する情報を保持する必要性を排除する。全てのホスト(ユーザーおよびサーバー)は、ネットワーク越しに NVT を扱っているかのように自分のローカルデバイスの特性を決定する。これにより、互いに他の参加者も同じマッピングを行っていると見なすことが出来る。NVT は、過度の制限(ローカルの文字セットへとマッピングするのに十分な語彙をホストに提供しないこと)と、過度の包含(簡素な端末でユーザーにペナルティを課すこと)とのバランスを取るように意図されている。

    注意:通常 "ユーザー" ホストは物理的端末が取り付けられたホストであり、"サーバー"ホストは何らかのサービスを提供しているホストである。端末-端末間通信やプロセス-プロセス間通信の場合にも適用可能な別の考え方をすると、"ユーザー" ホストとは、通信を始めたホストである。

  2. オプション交渉の原則は、多くのホストは NVT で利用可能なサービスより広範で上位のサービスを提供したいだろうし、多くのユーザーは洗練された端末を持っており、最小限よりは洗練されたサービスを望むだろうという現実を考慮に入れている。TELNET プロトコルと独立して(しかし TELNET プロトコルに組み入れられて)許可されるであろう様々な "オプション" があり、それにはサーバーとユーザーとが TELNET 接続のためのより複雑な(もしかすると全く異なる)取り決めの利用に同意することを可能にする "DO, DON'T, WILL, WON'T" 構造(後で議論する)を使用することが許される。このオプションには文字セットやエコーモードなどの変更を含んでも良い。

    使用オプションを設定する場合の基本的戦略は、参加者のどちらか(あるいは両方)が、あるオプションが効果を持つという要求を発することである。その後もう一方の参加者は、その要求を受入れても拒否しても良い。もしその要求が受入れられると、その要求は即座に効果を現す。もしそれが拒否されると、その接続においてそのオプションに関連する部分は NVT 向けに規定されたままとなる。明らかに、参加者は有効化する要求を常に拒否しても良く、また全ての参加者は NVT をサポートする準備が出来ていなければならないため、オプションを無効化する要求を決して拒否してはならない。

    オプション交渉の文法は、両方の参加者があるオプションを同時に要求した場合、各々が相手側の要求をそのオプションの肯定承認と見なすことが出来るように設計されている。

  3. 交渉の文法のこの対称性は、潜在的に終りのない承認のループを発生させ得る -- 参加者がお互いに、受け取った命令を了承ではなく、了承されなければならない新しい要求と見なす。このようなループを防ぐために、以下の規則が普及している:
    1. 参加者はオプション状態の変更のみを要求して良い。すなわち参加者は、単に現在のモードを宣言するだけの "要求" を送信してはならない。
    2. 既に入っているモードに入るという要求と思われる情報を参加者が受け取った場合、その要求は確認されるべきではない。交渉における終わりの無いループを防ぐために、この非応答の規則は必須である。モード変更の要求に対しては(モードが変更されない場合でも)応答が送られることが必要とされる。
    3. 要求としてか了承としてかに関わらず、ある参加者が相手側にオプション命令を送り、かつそのオプションの使用が最初の参加者から相手側に送られるデータの処理に何らかの影響を持つ場合はいつでも、その命令が効果を現すことを望む時点でデータストリームにその命令を挿入しなければならない。 (要求の送信から承認の受信までにある程度の時間が経過した場合、それは拒否されても良いことに注意するべきである。従ってホストは、その "不確定な期間" をユーザーから隠すために、オプションを要求した後、それが受け入れられたか拒否されたかが分かるまでデータをバッファしても良い。)

各々の参加者はもう一方の参加者から可能な最高のサービスを得ようと試みるため、TELNET 接続が最初に確立したとき、オプション要求は一時的に混乱するだろう。しかしその後でも、接続の特徴を動的に修正することでローカルの状態変化に合せるためにオプションを利用して良い。例えば NVT が使用する通信規則は(後で説明するように)、BASICのような "行単位(line at a time)" のアプリケーションの多くにはうまく適合するが、NLS のような "文字単位(character at a time)" のアプリケーションの多くには不十分にしか適合しない。ローカルプロセスのために "文字単位" の規則が適切な時には、サーバーはそれに必要とされる余分なプロセッサのオーバーヘッドを捧げるという選択をしてもよく、その場合は適切なオプションを交渉するかもしれない。しかしながらその場合でも、余分なプロセッサのオーバーヘッドを永久に負うのではなく、綿密な制御が不要になった時点で NVT に切り替える(すなわち交渉する)ことも出来る。

プロセスがオプションを単に再要求することによって拒否応答する場合、そのプロセスによって開始された要求は、終わりの無い要求のループを発生させる可能性がある。そのようなループの発生を防ぐため、一度拒否された要求は、何らかの変化があるまで繰り返すべきではない。これを操作上で見ると、プロセスが別のプログラムを実行した場合か、与えられたプロセスとオプションとの文脈において意味を持つ何かまたは別の命令をユーザーが与えた場合と考えることが出来る。良い経験則は、接続相手からの後続の情報の結果としてか、ローカルの人間の介入による要求があった場合かにのみ再要求を行うべきということである。

オプション交渉で利用可能な限定された文法のために、オプションの設計者が制約を感じるべきではない。この単純な文法の目的は、オプションを持つことを容易にすることである -- それに付いて知らないことを明言するのも同様に容易であるため。ある特定のオプションが "DO, DON'T, WILL, WON'T" で可能なものより豊富な交渉構造を必要とする場合の適切な方法は、両参加者がそのオプションを理解できることを確認するために "DO, DON'T, WILL, WON'T" を使用し、それが成功した後、よりエキゾチックな文法を自由に使用出来るようにすることである。例えば参加者は、行の長さを変更(確定)する要求を送っても良い。それが受け入れられれば、実際に行の長さを交渉するために別の文法を使用できる -- このような "副交渉(sub-negotiation)" には、許される最小限の行長、許される最大限の行長、望ましい行長等のフィールドが含まれるかもしれない。重要な概念は、両参加者がその拡張された文法を解析する能力があるという(通常の)交渉が事前に成立するまで、このような拡張された交渉は決して開始されるべきではないということである。

要約すると、どちらかの参加者からオプション XXX を実行したいという希望(提案)を示すために WILL XXX が送信され、DO XXX と DON'T XXX がそれに対する肯定と否定である。同じくもう一方の参加者(すなわち DO の受信者)がオプション XXX を実行し始めるという希望(要求)を示すために DO XXX が送信され、WILL XXX と WON'T XXX がそれに対する肯定と否定である。全てのオプションが有効でない時に残るものが NVT であるので、DON'T 応答と WON'T 応答とが行われても、両端末がその接続を処理できる状態は保たれることが保証される。従って全てのホストは、サポートしないオプションを全く認識せず、理解できない全てのオプション要求を単に拒否する(すなわち断る)ような TELNET プロセスを実装しても良い。

TELNET プロトコルはユーザー-ユーザー(リンク)とサーバー-サーバー(分散コンピューティング)とを容易かつ自然に網羅するために、可能な限りサーバー-ユーザーが対称的になるように作られてきた。オプションはその目的を推進することを期待される(しかし絶対必要条件ではない)。どのような場合でも、この対称性は厳しい規則というより、むしろ運用上の原則であることが明示的に確認されている。

新しいオプションを確立する手続きに関する情報として、関連文書 "TELNET オプション仕様(TELNET Option Specifications)" を参考にするべきである。

ネットワーク仮想端末(THE NETWORK VIRTUAL TERMINAL)

ネットワーク仮想端末(NVT)は双方向キャラクタデバイスである。NVT はプリンタとキーボードとを持つ。プリンタは入力データに応答し、キーボードは TELNET 接続上で送信される出力データや、"エコー" が望まれる場合には NVT のプリンタへも送られる出力データを生成する。"エコー" がネットワークを通ることは期待されないだろう("リモート" エコーモードの操作を有効にするオプションは存在するが、いかなるホストもこのオプションの実装を要求されない)。ここでの修正を除いて、コードセットは 8 ビットフィールドに置かれる 7 ビット USASCII である。いかなるコード変換もタイミングの考慮もローカルの問題であり、NVT には影響を与えない。

データの伝送
ネットワークを通しての TELNET 接続が本質的に全二重であっても、NVT はラインバッファモードの半二重デバイスと見なされる。すなわち、これと逆のオプションが交渉されない限り、あるいは交渉されるまで、以下のデフォルト条件がその TELNET 接続上のデータ転送に適用される。
  1. 完全な1行分のデータの送信準備が出来るか、ローカルで定義された明示的な送信の合図が起こるまで、ローカルのバッファ容量が許す限り、データはそれが生成されたホスト内に蓄積されるべきである。この合図はプロセスや人間のユーザーによって生成することが出来る。

    この規則の動機は、"エコー"がネットワークを通らないというデフォルトの NVT 仕様と相まって、ネットワーク入力割り込みを処理することが一部のホストにとって高コストだからである。そのため、ある程度のデータを送信元でバッファすることは合理的である。多くのシステムは、各入力行の終わりに何らかの処理アクションを行う(ラインプリンタやパンチカードでさえ、たびたびこのように動作する傾向がある)ので、通信は行の終わりで発生するべきである。一方でユーザーまたはプロセスは、時に行が終わっていない状態のデータを提供することが必要、または望ましいということを見いだすかもしれない。ゆえに実装者は、バッファされている全てのデータを即座に送信するためのローカルな合図の手段を提供するように警告される。

  2. あるプロセスが NVT プリンタへのデータを送り終え、さらにそれ以上処理する NVT キーボードからのデータがキューにない時(すなわち TELNET 接続の一方のプロセスが、もう一方からの入力無しには進めない時)、そのプロセスは TELNET の Go Ahead(GA) 命令を送信しなければならない。

    通常サーバーホストは処理を開始するために(行末またはローカル定義の文字に加えて)特別な合図を必要としないため、この規則には、端末が行末毎に TELNET GA 命令を送信することを要求する意図はない。むしろこの TELNET GA は、IBM 2741 のような "ロック可能" なキーボードを持つ物理的に半二重の端末をユーザーのローカルホストが操作することを助けるために設計されている。この種の端末の説明は、GA 命令の適切な利用を説明する助けになるかもしれない。

    端末-コンピュータの接続は、常にそのユーザーかそのコンピュータの制御下にある。どちらも相手から一方的に制御を奪うことはできず、むしろ制御の終わりには明示的にその制御を戻さなければならない。端末側においてハードウェアは、"行" が終わるたびに(すなわち、ユーザーによって "新規行(New Line)" キーが押された時に)制御を戻すように構成される。これが起こったとき、取り付けられた(ローカルの)コンピュータは入力データを処理し、出力を生成するべきかどうかを決め、出力を生成するべきではない場合は端末に制御を戻す。出力を生成するべき場合、すべての出力が送信されるまでそのコンピュータによって制御が保持される。

    ネットワークを通してこのタイプの端末を使用することの難しさは明らかなはずである。"ローカル"のコンピュータは、もはや行末の合図を知った後に制御を保持するかどうかを決定することはできず、その決定はデータを処理している"リモート" のコンピュータによってのみ可能である。ゆえに TELNET GA 命令は、"リモート" の(サーバー)コンピュータが "ローカル" の(ユーザー)コンピュータに、その端末のユーザーへ制御を渡す時であることを知らせることが出来るメカニズムを提供する。これは、ユーザーが端末の制御を与えられるべき時に(そして、その時にのみ)送信されるべきである。GA 命令の早まった送信は出力をブロックする結果となり、ユーザーは送信システムが停止したと思い込み、手動で回線を切るかもしれないということに注意してほしい。

当然ながら、これはユーザーからサーバーへの通信には適用されない。この方向において GA はいつ送信されても良いが、全く送られなくても良い。同様に TELNET 接続がプロセス間通信に使用される場合、GA はどちらの方向にも送られる必要はない。最後に端末間通信の場合、GA は一方向にも双方向にも必要とされない。ホストが端末間通信をサポートすることを計画している場合、TELNET 接続上で GA が送られる時を手動で知らせる手段をユーザーに提供することが推奨される。しかしながら、これは TELNET プロセスの実装者に課される必要条件ではない。

少なくとも概念上、TELNET モデルの対称性は TELNET 接続の各々の端に NVT が存在することを必要とすることに注意してほしい。

制御機能の標準表現
この文書の導入で述べたように、TELNET プロトコルの主な目的は、ネットワークを通して端末デバイスと端末志向プロセスとの標準インターフェイスを提供することである。この種の相互接続の初期の経験は、特定の機能はほとんどのサーバーで実装されているが、その機能を呼び出す方法は非常に異なっていることを明らかにした。複数のサーバーシステムと対話する人間のユーザーにとって、これらの違いは非常に不満である。ゆえに TELNET は、以下で説明するような5つの機能の標準的表現を定義する。これらの標準的表現は、標準的(しかし必須ではない)という意味を持つ(ただし TELNET を使用する他のプロトコルがプロセス割り込み(Interrupt Process: IP)機能を必要とする場合を除く)。すなわち、ローカルユーザーにその機能を提供しないシステムは、ネットワークユーザーにもそれを提供する必要はなく、その標準的表現を "無操作(No-operation)" として扱って良い。一方、ローカルユーザーにその機能を提供するシステムは、その標準的表現を送信するネットワークユーザーにも同じ機能を提供することを強制される。
プロセス割り込み(Interrupt Process)(IP)
多くのシステムはユーザープロセスの処理を一時停止・割り込み・中止・終了させる機能を提供している。この機能は、自分のプロセスが無限ループに入ったとユーザーが思った時や、不意に意図しないプロセスが起動された時などに頻繁に使用される。IP はこの機能を呼び出すための標準的表現である。実装者は、TELNET を使用する他のプロトコルによって IP が要求されても良く、ゆえにそれらの他のプロトコルがサポートされるならば、IP も実装されるべきであるということに注意するべきである。
出力中断(Abort Output)(AO)
多くのシステムは、出力を生成するプロセスが完了(または、完了に向けて実行中であればそのプロセスが到達した同じような停止ポイントに到達)しても、ユーザーの端末に出力を送信しないことを許可している。さらに、一般にこの機能は、既に生成はされているがまだ実際にユーザーの端末に印刷(または表示)されていない出力を消去する。AO はこの機能を呼び出すための標準的表現である。例えば一部のサブシステムは、ユーザーの命令を正常に受け取り、その応答としてユーザー端末に長いテキスト文字列を送り、最後にユーザー端末に(<CR><LF>を前に置く) "プロンプト" 文字を送ることで次の命令を受け入れる用意が出来たという合図を送るかもしれない。テキスト文字列の送信中に AO を受信した場合、合理的な実装は、テキスト文字列の残りは抑制するが、プロンプト文字とその前の <CR><LF> とは送信するだろう。(これは IP を受信した場合に取るであろう動作とは異なるだろう。IP はテキスト文字列を抑制し、サブシステムから抜けるだろう。)
この機能を提供するサーバーシステムは、システムの外部(ネットワーク内とユーザーのローカルホスト内)にも消去されるべきバッファが存在する可能性があることに注意するべきである。これを実行する適切な方法は、ユーザーのシステムに "Sync" シグナル(後述)を送信することである。
存在確認(Are You There)(AYT)
多くのシステムは、そのシステムがまだ立ち上がって稼動していることの目に見える(例えば印刷可能な)証拠をユーザーに示す機能を提供している。この機能は、予期しない長時間の計算や異常に重いシステム負荷などによってシステムが長時間に渡り予想外に "沈黙" した場合に、ユーザーによって起動される。AYT はこの機能を呼び出すための標準的表現である。
文字削除(Erase Character)(EC)
多くのシステムは、ユーザーによって提供されたデータのストリームから、最後に置かれた削除されていない文字または "印字位置"* を削除する機能を提供している。一般にこの機能は、タイプミスしたときにキーボード入力を編集するために使用される。EC はこの機能を呼び出すための標準的表現である。

* 注意: "印字位置"は、重打ちや <文字1>BS<文字2>...のようなシーケンスの結果として、いくつかの複数の文字を含んでも良い。

行削除(Erase Line)(EL)
多くのシステムは、入力の現在行にある全てのデータを削除する機能を提供している。一般にこの機能はキーボード入力を編集するために使用される。EL はこの機能を呼び出すための標準的表現である。
TELNET "SYNCH" シグナル
ほとんどのタイムシェアリングシステムは、"暴走した(runaway )" プロセスの制御を端末ユーザーが取り戻すことを可能にするメカニズムを提供しており、前述の IP と AO はそのメカニズムの例である。(ローカルで使用される場合)そのようなシステムは、それが通常の文字であろうと、テレタイプの "BREAK" キーや IBM 2741 の "ATTN" キーによって生成されるような特別な "範囲外(out of band)" のシグナルであろうと、ユーザーによって生成される全てのシグナルにアクセスする。端末がネットワークを通してシステムに接続している場合、これは必ずしもそうではない。ネットワークのフロー制御メカニズムは、そのようなシグナルをどこか別の所(例えばユーザーのホスト内)にバッファさせるかもしれない。

この問題に対処するために、TELNET の "Synch" メカニズムが導入されている。Synch シグナルは、TELNET 命令 DATA MARK と、それに関連する TCP の Urgent 通知とから成る。Urgent 通知(これは TELNET 接続に付随するフロー制御には支配されない)は、それを受け取ったプロセスがデータストリームの特別な処理を呼び出すために使用される。このモードにおいてデータストリームは、間にある邪魔なデータを捨てられながら、以下で定義されている "興味深い(interesting)" シグナルを即座にスキャンされる。TELNET 命令 DATA MARK(DM) はデータストリーム内の同期マークであり、何らかの特別なシグナルが既に発生しており、受信者はデータストリームの通常の処理に戻ることが出来るということを示す。

Synch は Urgent フラグがセットされた TCP 送信操作により実現され、最後の(または唯一の)データオクテットとして DM が送信される。

いくつかの Synch が連続して送信された場合、それらの Urgent 通知はマージされても良い。受信数は送信数以下になるはずなので、Urgent の数を数えることは不可能である。通常のモードでは DM は何もせず、緊急(urgent)モードではその緊急処理の終了を示す。

DM が見つかる前に TCP が Urgentデータの終わりを示した場合、 TELNET は DM が見つかるまでそのデータストリームの特別な処理を続けるべきである。

DM が見つかった後に TCP がさらに Urgent データを示した場合、その原因は後続の Synch によるものだけである。TELNET はもうひとつの DM を見つけるまでそのデータストリームの特別な処理を続けるべきである。

"興味深い(interesting)" シグナルとは、次のようなものであると定義される:IP、AO、AYT の各 TELNET 標準表現(EC、EL は含まれない); (もしあれば)これらの標準表現のローカルの類義語; その他の全ての TELNET 命令; データストリームのスキャンを遅らせることなく作用することが出来るその他のサイト定義のシグナル。
SYNCH メカニズムの効果のひとつが、Synch の送信者と受信者との間の本質的に(TELNET 命令を除く)全ての文字の無視であることから、このメカニズムは望みの時にデータパスを消去するための標準的手法としても規定される。例えば、もしある端末のユーザーが AO を送信したら、それを受信したサーバーは(もしサーバーがその機能を提供していれば)そのユーザーに Synch を返すべきである。
最後に、範囲外のシグナルとして TELNET レベルでは TCP Urgent 通知だけが必要なので、TELNET を使用する他のプロトコルは、異なるレベルの範囲外のシグナルと見なせる TELNET 命令を要求しても良い。
慣例的にシーケンス [IP,Synch] がそのようなシグナルとして使用される。例えば、他の(TELNET を使用する)プロトコルが、文字列 STOP を TELNET 命令 AO の類義語として定義していると仮定しよう。そのプロトコルの使用者がサーバーに STOP 文字列を処理するよう頼んだが、サーバーは他のコマンドを処理中であったため、その接続がブロックされたとしよう。このときユーザーは、システムに次のように指示するべきである。
  1. TELNET の IP 文字を送信
  2. TELNET の SYNC シーケンスを送信、すなわち:

    TCP Urgent モードの送信操作における唯一の文字として Data Mark (DM) を送信する。

  3. 文字列 STOP を送信、そして
  4. もしあれば、そのプロトコルにおける TELNET DM の類義語を送信
ユーザー(またはユーザーの指示に従って動作しているプロセス)は、サーバーの TELNET インタープリタを TELNET IP が通過するのを確実にするために、上記ステップ2の TELNET SYNCH シーケンスを送信しなければならない。

Urgent は TELNET プロセスを覚醒させるべきである。IP は、その次に上位のレベルのプロトコルを覚醒させるべきである。

NVT プリンタと NVT キーボード
NVT プリンタは不特定の送り幅とページ長とを持ち、全 95 個の USASCII 文字(コード 32〜126)の表現を提供出来る。33 個の USASCII 制御コード(0〜31 と 127)と 128 個の範囲外のコード(128〜255)との内、以下のコードは NVT プリンタにとって特別な意味を持つ。
名称 コード 意味
NULL (NUL) 0 無操作
改行(Line Feed)(LF) 10 水平位置を保ちながらプリンタを次の行に進める。
復帰(Carriage Return)(CR) 13 プリンタを現在行の左端に移動する。
さらに、以下のコードが NVT プリンタに影響を与えるものとして定義されるべきである(しかし必須ではない)。TELNET 接続におけるどちらの端末も、これらの送信や受信によって相手側が何らかの特定の動作を取る(または取った)と仮定してはならない。
ベル(BELL)(BEL) 7 聞こえるか目に見えるシグナルを生成する(印字ヘッドは移動しない)。
バックスペース(Back Space)(BS) 8 印字ヘッドを左端に向かって1文字分移動する。
水平タブ(Horizontal Tab)(HT) 9 プリンタを次の水平タブ位置に移動する。両方の参加者がタブ位置をどのように決定・確立するかは、まだ規定されていない。
垂直タブ(Vertical Tab)(VT) 11 プリンタを次の垂直タブ位置に移動する。両方の参加者がタブ位置をどのように決定・確立するかは、まだ規定されていない。
改ページ(Form Feed)(FF) 12 水平位置を保ちながらプリンタを次のページに移動する。
残りの全てのコードは NVT プリンタに如何なる動作も起こさせない。
シーケンス "CR LF" は、定義されている通り、NVT に次の印字行の左端に位置付けさせるだろう(シーケンス "LF CR" も同様)。しかしながら多くのシステムと端末は、CR と LF とを独立して扱わず、従ってその効果を模倣するために何らかの努力をしなければならないだろう。(例えば一部の端末は LF から独立した CR を持たないが、そのような端末ではバックスペースによって CR を模倣することが出来るかもしれない。) ゆえにシーケンス "CR LF" は、その結合された動作を意図されている場合はいつでも、単独の "新規行" 文字として扱われなければならない。シーケンス "CR NUL" は本当に改行だけが望まれるところで使用されなければならず、その他の文脈での CR 文字は無視されなければならない。この規則は、"新規行" の機能か複数のバックスペースか、どちらを実行するかを決定しなければならないシステムに対し、TELNET ストリームの CR の後には合理的な決定を可能にする 1 文字が含まれているという保証を与える。

NVT モデルの対称性を維持するために、"CR LF" や "CR NUL"は(デフォルトの ASCII モードにおいて)両方向で要求されることに注意してほしい。例えある状況(例えばリモートエコーと go ahead 抑制オプションが効いている状況)では文字が実際のプリンタに送られないことが分かっているとしても、それでもなお一貫性のために、このプロトコルはデータストリーム中で LF に続けてではなく CR に続けて NUL が挿入されることを要求する。逆に、データストリーム内で CR の後に受信した NUL は(別の方法で明示的に指定されたオプションの取り決めが無い場合には)、NVT がローカルの文字セットに変換する前に捨てられるべきである。

NVT キーボードは、全 128 個の USASCII コードを生成するために、キーやキーの組み合わせ、連続するキー操作を持っている。その多くは NVT プリンタに影響を与えないが、NVT キーボードがこれらを生成する能力を持っていることに注意してほしい。
これらのコードに加えて、NVT キーボードは以下のような定義済みの(ただし必須ではない)意味を持つ追加のコードを生成する能力を持つべきである(注記されているものを除く)。これらの "文字" の実際のコード割り当ては、TELNET 命令セクションに書かれている。なぜなら、これらはある意味では一般的なものと見られ、データストリームが別の文字セットとして解釈される場合でも利用可能であるべきだからである。
Synch
このキーは、ユーザーによる相手側へのデータパスの消去を可能にする。このキーの活性化によりデータストリーム中に DM が送信され、それに TCP Urgent 通知が結び付けられる。DM-Urgent の組み合わせは先に定義された意味を持つ。
中断(Break)(BRK)
このコードは USASCII 外のシグナルではあるが、現状多くのシステムにおいてローカルの意味を与えられているために提供されている。これは Break キーや Attention キーが押されたことを表すことを意図している。しかしながらこれは、標準的表現 IP の類義語としてではなく、これを必要とするシステムのための 129 番目のコードとして提供されていることに注意してほしい。
プロセス割り込み(Interrupt Process)(IP)
NVT が接続しているプロセスの一時停止・割り込み・中止・終了。これもまた、TELNET を使用する他のプロトコルのための範囲外のシグナルの一部である。
出力中止(Abort Output)(AO)
現在のプロセスの完了を許可するが、ユーザーにその出力を送信しない。さらに、ユーザーに Synch を送信する。
存在確認(Are You There)(AYT)
AYT が受信されたことの目に見える(すなわち印刷可能な)証拠を NVT に送り返す。
文字削除(Erase Character)(EC)
受信者は、最後に置かれた削除されていない文字または "印字位置" をデータストリームから削除するべきである。
行削除(Erase Line)(EL)
受信者は、TELNET 接続で送られたデータストリームから、最後の "CR LF" までさかのぼって(しかし CR LF 含まずに)文字を削除するべきである。
これらの "追加(extra)" キー(プリンタフォーマットエフェクタも同様)の精神は、既に "NVT" から "ローカル" になされていなければならないマッピングの自然な拡張を表現するべきである、ということである。NVT のデータバイト 68(8進数 104)が "大文字 D" のためのローカルコードにマップされるべきであるのと同じく、EC 文字はローカルの "文字削除" 機能にマップされるべきである。さらに、"垂直バー" を持たない環境における 124(8進数 174)のマッピングがある程度恣意的であるのと同じく、ローカルの "行削除" 機能が存在しない場合、EL 文字はある程度恣意的なマッピングを持って(または全く無くても)良い。フォーマットエフェクタも同様で、端末が実際に "垂直タブ" を持っている場合の VT のマッピングは明らかであり、VT の影響が予想できないのは端末が垂直タブを持たない場合だけのはずである。

TELNET 命令構造

全ての TELNET 命令は少なくとも2バイトのシーケンスから成る。命令コードの後に "コマンドとして解釈(Interpret as Command)"(IAC)エスケープ文字が続く。オプション交渉を扱う命令は3バイトのシーケンスで、3バイト目が参照されるオプションのコードである。この形式は、"データ空間" がより広範囲に使用されても、予約された命令の値を持つデータとの衝突が最小にになるように選ばれた。そのような衝突は、不便で非能率的な、データバイトをデータストリームに "エスケープする" 作業を必要とする。現状の設定では、唯一 IAC のみがデータとして送信される場合に二重化される必要があり、その他の 255 個のコードは透過的に渡すことが出来る。

以下は定義済み TELNET 命令である。これらのコードとコードシーケンスとは、直前に IAC が来た場合にだけ示されている意味を持つことに注意してほしい。

名称 コード 意味
SE 240 副交渉の終わり
NOP 241 無操作
Data Mark 242 Synch のデータストリーム部分。
これは常に TCP Urgent 通知を伴うべきである。
Break 243 NVT 文字 BRK
Interrupt Process 244 IP 機能
Abort output 245 AO 機能
Are You There 246 AYT 機能
Erase character 247 EC 機能
Erase Line 248 EL 機能
Go ahead 249 GA シグナル
SB 250 後に続くのが示されたオプションの副交渉であることを表す
WILL (オプションコード) 251 示されたオプションの実行開始、または実行中かどうかの確認を望むことを表す
WON'T (オプションコード) 252 示されたオプションの実行拒否または継続実行拒否を表す
DO (オプションコード) 253 示されたオプションを実行するという相手側の要求、またはあなたがそれを実行することを期待しているという確認を表す
DON'T (オプションコード) 254 示されたオプションを停止するという相手側の要求、またはあなたがそれを実行することをもはや期待しないという確認を表す
IAC 255 データバイト 255

接続確立

TELNET の TCP 接続は、ユーザーのポート U とサーバーのポート L との間で確立される。サーバーはそのような接続を、そのウエルノウンポート L で待ち受ける。TCP 接続は全二重であり、ポートの組で識別されるので、サーバーはポート L と別のユーザーポート U とを含む多くの同時接続を確立することが出来る。

ポート割当て
サービスホストへのリモートユーザーアクセスに使用される場合(すなわちリモート端末アクセスの場合)、このプロトコルにはポート 23(8進数27)が割当てられる。すなわち、L=23 である。