■ エスケープシーケンス
前々回、前回で説明した通り、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次交渉の開始 |
0xFB | WILL | オプション希望 |
0xFC | WON'T | オプション拒絶 |
0xFD | DO | オプション実行要求 |
0xFE | DON'T | オプション使用中止 |
0xFF | [Interpret as Command] コマンドとして解釈 | telnetエスケープシーケンス |
[Table55-01:telnetコマンド]
あ〜、いっぱいありますねぇ。0xFで始まるコード全部の16種類ですか。
聞いた事のないものもありますね。
うむ、重要なコマンドについては、次のtelnetオプションとあわせて説明しよう。
■ telnetオプション
さて、telnetではいくつかのオプション機能がある。このオプション機能を使って仮想端末の設定を変更することができる。
仮想端末の設定? どんな設定を変更できるんです?
うむ、それについては後で順をおって話していくとして。まず話すべきはtelnetオプションの設定方法だ。
つまり、相手にオプションの使用を打ち合わせるわけだ。
打ち合わせる。
「こっちはこのオプションを使うけど、どうよ?」「いいよ〜」っていうやりとりをするんですね。
その通り。
ここで使うのはWILL、WON'T、DO、DON'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」オプションを送り、使わないようにしている。
[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では特別な意味を持つ「>」や「<」を表示するために、「>」などのように「&」をつけた文字列をつかう。
- Interpret as Command(IAC)
- コマンドとして解釈。
- バイナリデータ
- 厳密にいえば、すべてのデータはバイナリ(2進数・0と1のみのビットデータ)ですが、文字(テキスト)データという意味でよく使われます。
- いくつものRFC
-
代表的なものでも、854〜860、1091、1096、1184などがあります。
参考リンクで「telnet option」で検索すると、67個もひっかかります。
- キャラクタ転送モード
-
[character at a time]
characterは文字の意味。
ECHOとSuppress Go Aheadが必須。
- VT-100
- DEC社の端末の名前。UNIXなどの端末として広く利用されていた。
- ネット君の今日のポイント
-
- telnetコマンドを送るには、エスケープシーケンスであるIACを使う。
- telnetオプションを使うことによって、様々な設定を変更できる。
- オプションはコマンドの「DO」「WILL」を使って交渉する。
- NVTの種類を交渉によって決定する。
- 相手と状況に応じて適切なNVTを選択可能である