■ telnetの基本
前回に引き続き、今回もtelnetの話だ。
はい。
リモート接続して相手を操作するためのプロトコルですよね。
うむ。
仮想端末となるためのプロトコルだ。
でした。
くどいようだが、telnetは多くのプロトコルの原型ともなった、最も古いTCP/IPアプリケーション・プロトコルだ。
その特徴は、何も足さないことにある。
何も足さない?
なんかウィスキーのCMみたいですね。
ウィスキーはシングルモルトが好みだな。
ともかく、例えば「d」という文字を送信したい場合は、以下のようなパケットを送ることになる。
[Figure53-01:telnetデータ]
L2ヘッダって、レイヤ2ですからイーサネットの場合イーサネットヘッダですよね。
あとはIPヘッダとTCPヘッダと…。
「d」という文字、そのものだ。
もちろん、ビットで送るから「d」というビット列ということになる。
ははぁ。
「d」という文字以外何も送らないから、何も足さないってことですね。
そういうことだ。ちなみにtelnetではASCIIを使う。
普通、他のプロトコルは必ず送りたいデータ以外に制御用のヘッダをつけることが多い。
TCPヘッダやIPヘッダのようにですか?
そうだ。
軽いと言われるDNSでさえ、以下のようなヘッダをDNS要求や応答には必ずつける。
[Figure53-02:DNSヘッダ]
一列32ビットなので、32 × 3 で 96ビット(12バイト)は必要なわけだ。
でも、telnetは何もつけない、本当にそのまま送りたいデータを送るってことですね。
そういうことだ。
前回使ったムービーだが、こういう動きをするということだな。
[Figure53-11:Telnetでのデータの転送]
なるほど。
■ 1文字づつ送るということ
telnetは1文字づつ送るのだが。
1文字づつ送るといろいろと困ったことが起きる。
困った事?
例えば、ネット君が使うと、必ずコマンドをスペルミスするとかだ。
うわ、いきなり名指しで決め付けられてる。
必ずって博士。
必ずだ。
春の次には夏が、夏の次には秋がくるように。大自然の理だ。
だいしぜんのことわり、とか言われても。
で、スペルミスが困ったことなんですか? いやまぁ、確かに困ったことですけど。
うむ、つまりスペルミスをするということは。
1文字づつ送るのだから、間違ったスペルも送ってしまう、ということだ。
[Figure53-03:スペルミスをした場合]
あ〜、そういえばそうですよね。
でも、それなら間違った部分を消して、打ち直せばいいじゃないですか。
ふむ、つまりこういうことか?
[Figure53-04:スペルミスをした場合・2]
あれ?
「dier」とは聞いた事のないコマンドだな。
さて、何が原因だ?
何がって。
…消したことをリモートにも伝えないといけないってことですか?
うむ、いいぞネット君。
その通り、文字を消すためにバックスペースを押したならば、バックスペースを押したことを伝えなければならない。
なるほど。そう言われればそうですね。
うむ。なのでtelnetではいくつかの制御機能と標準NVT文字が使われる。
制御機能と標準NVT文字?
■ 標準NVT文字
まず、標準NVT文字から話そう。
キーボードには文字・数字・記号以外のキーが存在するな。
えぇ、Backspaceとか、TABとかSHIFTとか。
うむ。これらのキーを押したことをリモート側に伝えなければならない。
あ、はい。さっきの話ですよね。
ASCIIには、通常の95文字・数字・記号以外にも他の制御文字が用意されている。
ASCIIコード表を見てくれると嬉しい。 ▼ link
ははぁ。e-Wordsのコード表ですと、赤い文字のやつですか。
そうだ。特にtelnetでは8つの制御文字が使えるようになっている。
文字 | 10進コード | 16進コード | 意味 |
---|---|---|---|
NUL | 0 | 0x00 | ヌル文字 |
BEL | 7 | 0x07 | Bell文字 |
BS | 8 | 0x08 | バックスペース文字 |
HT | 9 | 0x09 | 水平タブ |
LF | 10 | 0x0A | 改行 |
VT | 11 | 0x0B | 垂直タブ |
FF | 12 | 0x0C | フォームフィード |
CR | 13 | 0x0D | 復帰 |
[Table53-01:制御文字]
まぁ、実際使われないものもあるが。これらの文字が仮想端末用に用意されているということだ。
ははぁ。
改行とかタブとかしたい場合は、ASCIIコードがもとから持っている制御文字を送ればいいってことですね。
うむ、その通り。
覚えておいて欲しいのは、改行だな。
改行? 「LF」ですよね。
うむ、ややこしいのだが。
これはOSによって扱いが違うのだよ。
というと?
UNIXでは「LF」、MacOSでは「CR」が使われる。
Windowsでは「LF」と「CR」を両方使うと改行になる。
?
なんでそんなややこしいことに。大体「CR」の「復帰」ってどういう意味ですか?
うむ。「CR」は「行頭復帰」、つまり「行の先頭へカーソルを移動」という意味なのだ。なのでMacOSではこれで改行される。
だが、Windowsだと「LF」は「カーソル位置は変わらす改行」、「CR」は「行は変わらず先頭へ」という意味になる。
[Figure53-05:LFとCR]
なので、「LF」+「CR」で改行となる。
これは改行キーを押したらどの文字を送るかということをtelnetクライアントを使うときに必ず設定する必要がある。
UNIXなら「LF」、Macなら「CR」、Windowsなら「LF+CR」…。
まぁ、多くの場合は「LF + CR」に設定しておけば問題ないといえば問題ない。
なんだ、そうなんですか。
■ 制御機能
他にもtelnetはいくつかの制御機能を持っている。
ほとんどのtelnetクライアントが持つ主要な機能は以下の通り。
制御 | 意味 | 役割 |
---|---|---|
AYT | [Are You There] 相手確認 | 相手が動作しているかどうか確認する |
EC | [Erase Character] 文字消去 | 最後の文字を消去する |
EL | [Erase Line] 行消去 | 最後の行をすべて消去する |
IP | [Interrupt Process] プロセス中断 | 操作の一時中断・割り込み・停止 |
AO | [Abort Output] 出力中止 | 出力を抑止する |
Synch | [Data Mark] データマーク | データ削除・リセット |
[Table53-02:制御機能]
EC、ELはそのままの意味だ。
[Figure53-06:EC・EL]
これらの制御機能は、ASCIIにないのでtelnetコマンドとして送る。
コマンド?
先ほどのNVT標準文字は、ASCIIコードにあったからそれを使えばよかったわけですよね。コマンドってのはどうやって送るんです?
それは次回の話だな。オプションとコマンドの話を次回はする。
ともかく、制御コマンドを送ることによって、いくつかの制御機能を実現している、ということだ。
ははぁ。次回ですね。
うむ。
さてEC、EL以外は説明が必要だろう。まずAYT。
Are You There?
「そこであなたです?」
ナイスな訳だ、ネット君。「あなたはそこにいますか?」だろう、普通。
送られてきたAYTを受け取ったホストは音声か視覚情報を返す。
AYTを受け取ったら、音声か視覚情報を返す?
……なんか、pingのEchoみたいですね。
というか、pingのEchoそのものだな。
相手がダウンしていないかどうか確認するために使うものだ。
う〜、ますますpingだ。
例えば、telnetクライアントでメジャーなフリーソフト「Tera Term Pro」の場合、以下のようにAYTを送ることができる。 ▼ link
[Figure53-07:AYT]
AYTを送ると、telnetサーバは自分の存在を通知する。
[Figure53-08:AYT]
「Are You There?」「Yes」
ははぁ、なるほど。「そこにいますか?」「はい」で相手の存在を確認したわけですね。
そういうことだ。相手がいきなりダウンしても、反応が返ってこないだけで本当にダウンしているのかどうかtelnetではわかりづらいから、AYTを使うのだ。
ふむふむ。
次はAOとIP、Synchだ。
AOは「出力抑制」。IPは「割り込み」。つまり何かしらの不具合などが起きたときに、結果を出力させないようにしたり、割り込んだりするわけだが、これには問題がある。
問題?
うむ。それはTelnetがTCPで動いているから起こる問題だ。
…TCPだから問題?
TCPって、優等生じゃないんですか?
ネット君もそれにこだわるな。
ともかく、こういう場合だ。
[Figure53-09:TCPによるIPの問題点]
あ〜、TCPフロー制御。
いったんバッファに溜められて、そこからシーケンス順に処理、でしたっけ。
うむ。順番に、正確に処理を行う方式としてTCPはフロー制御を行うのだが、こういう場合はそれがアダになる。
そうですね、ちっとも割り込んでませんものね。
うむ、この問題を解決するために使うのが、Synch。Data Markだ。
[Figure53-10:Synch]
TCP緊急ビット?
うむ。TCP緊急ビットがONのセグメントは他を差し置いて処理される。それを使って、割り込んだり、出力させないようにするわけだ。
ははぁ、なるほどです。
Synchは送信側・受信側双方とも現在バッファ中のデータを破棄する。
Synchは[synchronous]で「同期」という意味だから、双方ともリセットしてまたやり直しましょう、という意味があるとでも考えてくれたまえ。
同期、ですか?
データを破棄して、双方ともやり直し、と。
うむ。
なんとなく、納得です。
つまり、だ。telnetでは文字を1つ1つ送るのだが、それ以外の制御用の文字も送ることができる、ということだな。それを使ってローカルで使用可能な制御を実現するのだ。
ローカルで使用可能な制御を実現する…。
文字を消したり、割り込んだり、強制終了したりするってことですね。
うむ、リモートホストにそれを伝えることがちゃんとできる、ということだな。
ふむふむ。了解です。
さて、telnetのコマンドとオプションについて話さなければならないが。
長くなったのでまた次回。
いぇっさ〜。
3分間ネットワーキングでした〜♪
- ASCII
-
[American Standard Code for Information Interchange]
情報交換用米国標準符号。US-ASCIIとも言う。
7ビット+パリティ1ビットの8ビットで使用され、95種類の文字がある。
- 制御文字
- 通常のASCIIで使われる文字は、32〜126のコード(10進)ですが、制御文字は0〜31で定義されています。
- 仮想端末用
-
仮想端末[Network Virtual Terminal]なので、NVT。
つまり、NVT文字、ということです。
- 16進コード
- 16進数を表記するには先頭に「0x」をつけます。
- ネット君の今日のポイント
-
- telnetはヘッダをつけずに1文字づつ送信する。
- telnetはASCIIを使う。
- ASCIIで定義されている制御文字(NVT文字)も使うことができる。
- ASCIIで定義されていない制御も可能である。
- telnetコマンドを使って、ローカルで使用可能な機能をリモートに実現する。
- 参考リンク
-
- e-Words ASCIIコード表http://e-words.jp/?p=r-ascii▲
- Tera Term Home Page http://hp.vector.co.jp/authors/VA002416/▲