3 Minutes NetWorking
No.55

3Minutes NetWorking

第55回telnet(3) telnetオプション

■ エスケープシーケンス

インター博士

前々回、前回で説明した通り、telnetでは文字だけを送る。

ネット助手

なにも足さないんでしたよね。

インター博士

うむ。そうだ。例えば「A」を送りたかったら、データとしてASCIIコードの0x41を入れて送る。
だが、ここで問題は前回出てきた制御機能だ。

ネット助手

制御機能が問題?
文字を消したり、出力を中止させたりする機能ですよね。ないと困るのに何が問題なんです?

インター博士

例えば、文字消去(EC)は送る場合のビットは0xF7だ。
つまり、こうなる。

[Figure55-01:制御機能を送る]

ネット助手

あれ?
なんかおかしいですね。

インター博士

うむ。これは制御コードとして送ったECを文字として認識してしまうことが原因だ。
なので、ECの前に「これはASCIIコードではありません」という記号を入れる必要がある。

ネット助手

ははぁ、文字として認識されないために、マークをつけておくんですね。

インター博士

そういうことだ。このような記号のことをエスケープシーケンスという。

ネット助手

えすけーぷしーけんす?
「脱出手順」?

インター博士

そうだな、通常の処理から「脱出」するためにつけるコードだ。例えばHTMLでは「&」がそうだ。
telnetはコマンドやオプションを送るために、0xFFを使う

ネット助手

0xFF、ですか。

インター博士

このコードはInterpret as Command(IAC)と呼ばれる。1バイトすべて「1」のコードだな。
これをtelnetコマンドの前につけるのだよ。

[Figure55-02:エスケープシーケンス・IAC]

ネット助手

ははぁ、なるほど。
こうすれば制御コードを文字として認識されずに送ることができるわけですね。

■ telnetコマンド

インター博士

さて、前回説明すると言ったtelnetコマンドだが、前回説明した文字消去(EC)、相手確認(AYT)やデータマーク(DM)などを含めて、以下の通りだ。

コード名前意味
0xF0[Sub-negotiaon End] 2次交渉終了2次交渉パラメータの終了
0xF1[No Operation] オペレーションなしオペレーションなし。受信した側はこれを無視する
0xF2[Data Mark] データマークデータ削除・リセット
0xF3[Break] ブレークブレーク
0xF4[Interrupt Process] プロセス中断操作の一時中断・割り込み・停止
0xF5[Abort Output] 出力中止出力を抑止する
0xF6[Are You There] 相手確認相手が動作しているかどうか確認する
0xF7[Erase Character] 文字消去最後の文字を消去する
0xF8[Erase Line] 行消去最後の行をすべて消去する
0xF9[Go Ahead] 送信勧誘送信するように受信側にうながす
0xFA[Sub-negotiation Begin] 2次交渉開始2次交渉の開始
0xFBWILLオプション希望
0xFCWON'Tオプション拒絶
0xFDDOオプション実行要求
0xFEDON'Tオプション使用中止
0xFF[Interpret as Command] コマンドとして解釈telnetエスケープシーケンス

[Table55-01:telnetコマンド]

ネット助手

あ〜、いっぱいありますねぇ。0xFで始まるコード全部の16種類ですか。
聞いた事のないものもありますね。

インター博士

うむ、重要なコマンドについては、次のtelnetオプションとあわせて説明しよう。

■ telnetオプション

インター博士

さて、telnetではいくつかのオプション機能がある。このオプション機能を使って仮想端末の設定を変更することができる。

ネット助手

仮想端末の設定? どんな設定を変更できるんです?

インター博士

うむ、それについては後で順をおって話していくとして。まず話すべきはtelnetオプションの設定方法だ。
つまり、相手にオプションの使用を打ち合わせるわけだ。

ネット助手

打ち合わせる。
「こっちはこのオプションを使うけど、どうよ?」「いいよ〜」っていうやりとりをするんですね。

インター博士

その通り。
ここで使うのはWILLWON'TDODON'Tの4つのtelnetコマンドだ。

[Figure55-03:telnetオプション交渉]

インター博士

「WILL」「DO」「WON'T」「DON'T」の組み合わせは以下の形だ。

送信側受信側
相手にオプション使用を要求DOオプションを使用するWILL
オプションを使用しないWON'T
自分がオプション使用を宣言WILLオプションを許可するDO
オプションを許可しないDON'T
相手のオプション使用をやめさせるWON'T自身のオプションを無効にするWON'T
自分のオプションの無効化を宣言DON'T了解するDON'T

[Table55-02:オプション交渉の組み合わせ]

ネット助手

「WILL」→「DO」、「DO」→「WILL」、「WON'T」→「WON'T」、「DON'T」→「DON'T」ですね。
相手のオプションをやめさせたり、自分のオプションの無効化ってのは、受信側は拒否できないんですか?

インター博士

うむ、それはできないことになっている。「WON'T」には「WON'T」、「DON'T」には「DON'T」しか返せない。
さて、telnetが使えるオプションはいくつもあるが、代表的なオプションは以下の通り。

コード名前意味
0x00[Transmit Binary] バイナリ転送IAC以外の文字列はバイナリデータと解釈される
0x01[Echo] エコーデータのエコー
0x03[Suppress Go Ahead] Go Ahead抑止Go Aheadコマンドを使わないようにする
0x05[Telnet Status Option] telnet状態オプション相手側のtelnetオプションの状態を見られるようにする
0x06[Telnet Timing Mark] telnetタイミングマーク受信したデータが処理済ならばタイミングマークというデータを送る
0x18[Terminal Type] ターミナルタイプターミナルタイプを交換可能にし、適切なターミナルタイプを設定する
0x22[Telnet Line Mode] telnetラインモード行単位で転送できるようにする

[Table55-03:telnetオプション]

ネット助手

ははぁ、一杯あるんですねぇ。

インター博士

そうだな。telnetは新しい機能が求められるたびに、新たなオプションを追加してきている。
1つのRFCだけでなく、いくつものRFCで定義されているのだよ。 ▼ link

ネット助手

へぇ。さすが由緒あるプロトコルですね。

■ ECHO オプション

インター博士

ポイントとなるオプションについていくつか説明しておいた方がいいだろう。
まず、ECHOオプション

ネット助手

探信音(ピンガー)ー!!

インター博士

おいおい。

ネット助手

ECHOって、pingですよね。第35回で説明された。

インター博士

確かにICMPのECHOはpingだ。
今回のECHOは似ているようでちょっと違う。表示のECHOだ。

ネット助手

表示のECHO?

インター博士

うむ。普通にパソコンを使っている時は考えにくいことがだが、本来キーを入力することとそのキー入力の結果を表示することは別だ。

ネット助手

……?
キー入力したからといって、表示されるわけではないってことですか?

インター博士

まぁ、そういうことだな。telnetに限った話ではなく、CUI環境下ではキー入力をECHOしないと表示されない。
図で説明しよう。

[Figure55-04:ECHOオプション]

ネット助手

リモートエコーとローカルエコー?

インター博士

うむ。相手からの返信によって表示されるのがリモートエコー。自分自身で表示するのがローカルエコーだ。
telnetのデフォルトではサーバがリモートエコーを返す。そして普通ローカルエコーはしない

ネット助手

何故です? サーバがリモートエコーを返すのはいいとして、ローカルエコーはしたほうが便利なのに。

インター博士

サーバがリモートエコーを返すから、ローカルエコーは邪魔なんだよ。
入力すると、リモートエコーの分と、ローカルエコーの分で2つ表示されてしまう。例えば「telnet」と入力した場合、「tteellnneett」になってしまう。

ネット助手

あ〜、なるほど。

■ Go Ahead

インター博士

次は「Go Aheadコマンド」と「Go Ahead抑止オプション」についてだ。

ネット助手

ご〜あへっど。
「前に進め?」

インター博士

まぁ、それでもいいんだが。どちらかというと「次に進め」だな。
Go Aheadコマンドは半二重通信時に使用するものだ。

ネット助手

半二重通信というと。
受信と送信を切り替えて使うトランシーバーみたいな通信ですよね。

インター博士

うむ。なので「〜〜〜、以上、送信終わり」という言葉がトランシーバーではよく使われるな?

ネット助手

あ〜、そうですね。
それを言葉の最後につけないと、受信と送信の切り替えのタイミングがわからないですものね。

インター博士

そうだ。telnetの半二重通信での「以上、送信終わり」が「Go Aheadコマンド」だ。

ネット助手

ははぁ、なるほど。
送信の最後に「Go Ahead」をつけて、「送信が終わりました。次はあなたの番です」ってするわけですね。

インター博士

うむうむ。そういうことだ。
だが、通常Go Aheadは使わない

ネット助手

…なんですか、それ?

インター博士

なぜかというと、telnetは全二重通信のTCPで動くからだ。
いちいち「Go Ahead」とか言わなくても、送信も受信もできる。

ネット助手

じゃあ、なんでこんなのがあるんです?

インター博士

一応本来のデフォルト設定だから、だな。
なので現在では「Suppress Go Ahead」オプションを送り、使わないようにしている

Suppress Go Ahead

[Figure55-05:Suppress Go Ahead]

ネット助手

由緒あるプロトコルだから、こういうのが残っちゃってるんですねぇ。

■ telnetラインモード

インター博士

telnetは1文字ずつ送る。これが通常のキャラクタ転送モードだが、欠点がある。

ネット助手

欠点?
シンプルでいいと思いますけど。

インター博士

1文字送るのに、IPヘッダとTCPヘッダなどを合わせて63バイト以上必要であるし、サーバからリモートエコーが返って来た場合その倍になる。ちょっと効率悪いよな。

ネット助手

そういわれれば、そうですね。

インター博士

なので、行単位で送る。これがラインモードだ。

[Figure55-06:telnetラインモード]

インター博士

実際はもうちょっと細かくサブオプションを設定するのだが。
大雑把にこの方式だ。効率がいいので、telnetアプリケーションにはラインモードがデフォルトになっているものも存在する。

ネット助手

確かにこっちの方が効率がいいですね。というか、普通にデータ転送って考えたらこっちですよね。

インター博士

まぁ、そうかもしれんな。
ポイントはローカルエコーが必須という点と、ローカルで編集機能が使えることだな。

ネット助手

ローカルで編集機能が使える?

インター博士

うむ、telnetのNVTが持っている機能は、ローカルで使えないことには駄目だ、ということだ。

ネット助手

へぇ。でも大体持ってますよね。

インター博士

まぁ、パソコン用のtelnetクライアントはほとんど持っているな。

ネット助手

ですよね。

■ ターミナルタイプ

インター博士

実は簡単にNVTというが、実はいくつか種類がある。

ネット助手

NVTに種類?
仮想端末なのにですか?

インター博士

うむ。仮想とはいえ端末なのだから、種類によって仕様が違う
なので、双方で同じ仕様の端末を使わなければならない

ネット助手

仮想なのに仕様があるんですか。
なんか変な感じですね。

インター博士

うむ、一番よく使われる仮想端末のタイプはVT-100というタイプだが、これは昔に実在した端末の形式なのだよ。
この実際のVT-100がよく使われていたので、telnetの仮想端末でもこのVT-100と同じ仕様にすることが多い。

ネット助手

なるほど。

インター博士

それでだ。サーバ側とクライアント側、同じ仕様の端末を使わなければならない。
一番簡単なのは、サーバと同じ仕様に設定しておいて接続することだ。

ネット助手

そりゃまぁ、そうですね。

インター博士

だが、相手が使える端末の種類を知り、より多くの機能を持つ端末を選択できた方が効率がいい。
その時使うのが、ターミナルタイプオプションだ。

[Figure55-07:ターミナルタイプオプション]

インター博士

この形で使用可能な端末の種類を問い合わせる
そして、最後に返って来た端末の種類を採用する。

ネット助手

最後に返ってきた種類?

インター博士

うむ。このような形だ。

[Figure55-08:ターミナルタイプの交渉]

インター博士

端末の種類を交渉することによって、最小限の機能しか使えなければそれを、より高機能の端末が使えるならばそちらを選択できるわけだ。

ネット助手

ははぁ、使える端末をある程度自由に選べるんですね。

インター博士

つまり、柔軟に機能を選択できるわけだな。
このように、古いプロトコルのtelnetだが、新しい機能を取り入れていくわけだ。

ネット助手

なるほどなるほど。
新しい端末の種類ができれば、それを使うことによってその端末が持つ機能を使うようにしていくわけですね。

インター博士

そういうことだ。
さて、ずいぶんと長くなったが、telnetはこれでお終いにしておこう。

ネット助手

はい。

インター博士

アプリケーション・プロトコルの説明で、何故一番最初にtelnetを説明したかわかってくれたか?

ネット助手

リモートログインですね、博士。

インター博士

うむ、それと最もシンプルなデータ転送という点だな。
telnetは単純かつ明確にデータを送る手段としてその他のプロトコルの基礎とも言えるプロトコルなのだよ。

ネット助手

なるほどです。

インター博士

さて、telnetは最も古いプロトコルだと話したが。
次回からは同じく由緒あるプロトコルであるFTPの説明をしよう。

ネット助手

いぇっさ〜。
3分間ネットワーキングでした〜♪

エスケープシーケンス
[ESCape sequence]
特殊な文字やコード、半角文字と全角文字の切り替えなどのため付加される特別なコード。
ソフトウェアごとにいろいろある。
HTMLでは「&」
HTMLでは特別な意味を持つ「>」や「<」を表示するために、「&gt;」などのように「&」をつけた文字列をつかう。
Interpret as Command(IAC)
コマンドとして解釈。
バイナリデータ
厳密にいえば、すべてのデータはバイナリ(2進数・0と1のみのビットデータ)ですが、文字(テキスト)データという意味でよく使われます。
いくつものRFC
代表的なものでも、854〜860、1091、1096、1184などがあります。
参考リンクで「telnet option」で検索すると、67個もひっかかります。
キャラクタ転送モード
[character at a time]
characterは文字の意味。
ECHOSuppress Go Aheadが必須。
VT-100
DEC社の端末の名前。UNIXなどの端末として広く利用されていた。
ネット助手ネット君の今日のポイント
  • telnetコマンドを送るには、エスケープシーケンスであるIACを使う。
  • telnetオプションを使うことによって、様々な設定を変更できる。
    • オプションはコマンドの「DO」「WILL」を使って交渉する。
  • NVTの種類を交渉によって決定する。
    • 相手と状況に応じて適切なNVTを選択可能である

3 Minutes NetWorking No.55

管理人:aji-ssz(at)selene.is.dream.jp