このページは乱ことNobuoNakakoが運用する「Etherealを使おう」の一部です。お時間があれば表紙も訪れてやってください

リンク等についてはこちら。間違いを見つけた時や「ここはこうした方が良い」等の意見は遠慮なくこちらまで。


The Ethereal manual

Telnetを知る(RFC0854)
プロトコル

このページを読む前に「Etherealの読み方」を読んでおいておく事を強くお薦めします。

Telnetはリモート・ホストと端末を接続するプロトコルです。このTelnetにより遠隔でサーバを操作したりする事が可能となっています。仮想端末とも言われます。

このプロトコルはOSI参照モデルでアプリケーション層の位置に存在します。Telnetの障害切り分けにEtherealを使用する場合、Telnetコマンドのキャプチャを調査する事をお薦めします。

RFC

Ethernetの代表的なRFCは0854になります。

その他RFC0855(Telnet option specifications)やRFC1282等も余裕があれば読んでください。

サンプルファイル

ここで解説するサンプルファイルは当然実際のTELNETのキャプチャデータで行いたいと思います。

サンプルキャプチャファイルではパソコン(SonyのVAIO)192.168.0.3が192.168.0.1(Sun V100)に対してTeraTermを使用してログインしたものです。

MACアドレスはそれらしいものに書き換えてあります。当然ですが色はサンプルファイルではつきません。(当然仮構築サーバです。現在は存在しません)

実際の端末ウィンドウ画面は下記の様になっています。

ダウンロードはこちら

ファイルの開き方は「キャプチャ結果を開く」を参照して下さい。

用語解説

Telnetの解説をする前に知っておいて欲しい用語があります。

NVT=ネットワーク仮想端末といわれるものです。NVTプリンタとキーボードの2つをもつ文字単位で処理する装置を言います。ソフトではTeraTerm等が有名です。

NVTプリンタ=NVTプリンタといってもプリンターの事ではありません。これは8ビット中7ビットで表現されるUS-ASCIIコードとNVT制御コードというTelnet制御コードの2つを合わせたNVT-ASCIIコードを使用して画面にTelnetの処理内容や処理結果を表示する機能をいいます。

Telnetコマンド=Telnetには様々なコマンドが存在します。これらは複数のRFCによって定義されていますがTelnetはセッションを張ったあとサーバとクライアントの間でこのコマンドを使用してネゴシエーションを行います。通常のWindowsソフト等のVT端末ではこのコマンドのやり取りは目に見えません。文字エコー等、実際にデータのやり取りをしている間でもコマンドのやり取りが去れます。

解説

サンプルデータのTelnetでは「セッションを張る」→「Telnetコマンドによるネゴシエーション」→「データのやり取り」→「ログアウト」→「TCPセッションを切る」の順番になっています。キャプチャデータのフレーム行番号でいうと「1〜3」→「4〜15」→「16〜87」→「88」→「89〜91」といった流れになります。

1.セッションをはる

セッションのキャプチャデータは1番〜3番の間の3行がそれに当たります。基本的にはTCPの3ウェイハンドシェイクです。

これを分かりやすく図にすると以下の様になります。

これでとりあえずPCの3033番ポートとサーバの23番ポート(TELNET)のコネクションが確立Telnetしデータが送受信できる状態になります。

非常に基本的なTCPセッションの張り方です。

2.Telnetコマンドによるネゴシエーション

Telnetは上記でコネクションが確立するとTelnetコマンドといわれるNVTで定められたコマンドを使用して各種設定の同期をとります。

サンプルでは4番〜15番にかけてがこの行為になります。これは基本的に1例であって必ずしもこうなるとは限りません。

それではまず4番のキャプチャ結果を選択して詳細表示を見てみて下さい。

上記の様な状態だと思います。4番はサーバである192.168.0.1がクライアント192.168.0.3に対してTelnetコマンドにて5点ばかり要求をしています。

Commandという文字は後に続く文字がTelnetコマンドによるものであるというのを表しています。それぞれを簡単な言葉であらわすと以下の様になります。

Command: ターミナルタイプを送信先で有効にしたい
Command: ウィンドウサイズを送信先で有効にしたい
Command: Xディスプレイ・ロケーションを送信先で有効にしたい
Command: 新環境変数オプションを送信先で有効にしたい
Command: 環境変数オプションを送信先で有効にしたい

それに対してクライアント192.168.0.3は5行目から解答しています。これらのやり取りを図に表すと以下の様になります。サンプルデータの詳細設定と照らし合わせて確認して下さい。

行番号
詳細フレームTelnetの内容
送信元
送信先
意味
4
Command: Do Terminal type

サーバ(192.168.0.1)

クライアント(192.168.0.3)
サーバでターミナルタイプを送信先で有効にしたい
Command: Do Negotiate About Window size サーバでウィンドウサイズを送信先で有効にしたい
Command: Do X Display Location サーバでXディスプレイ・ロケーション送信を送信先で有効にしたい
Command: Do New Environment Option サーバで新環境変数オプションを送信先で有効にしたい
Command: Do Environment Option サーバで環境変数オプションを有効にしたい
5
Command: Will Terminal Type
クライアント(192.168.0.3)
サーバ(192.168.0.1)
クライアントはターミナルタイプを受け入れます
Command: Do Suppress Go Ahead クライアントはデータ制御を送信先で有効にしたい
Command: Will Suppress Go Ahead クライアントはデータ制御を受け入れます
Command: Do Echo エコーを送信先で有効にしたい
Command: Will Negotiate About Windows Size ウィンドウサイズを受け入れます
6
 
サーバ(192.168.0.1)
クライアント(192.168.0.3)
ACKの送信
7
Suboption Begin: Negotiate About Window Size
クライアント(192.168.0.3)
サーバ(192.168.0.1)
ウィンドウサイズの調整
 ↑Width:80 Height:24  ↑幅80高さ24
Command: Suboption End サブオプションの終了
8
Command: Will Suppress Go Ahead
サーバ(192.168.0.1)
クライアント(192.168.0.3)
サーバはデータ制御を受け入れます
Command: Do Suppress Go Ahead サーバはデータ制御を有効にしたい
Command: Will Echo サーバはエコーを受け入れます。
9
Command: Won't X Display Location
クライアント(192.168.0.3)
サーバ(192.168.0.1)
クライアントはXディスプレイ・ロケーションを拒否します
Command: Won't New Envionment Option クライアントは新環境変数オプションを拒否します
10
Command: Don't X Display Location
サーバ(192.168.0.1)
クライアント(192.168.0.3)
サーバはXディスプレイ・ロケーションを無効にします
Command: Don't New Environment Option サーバは新環境変数オプションを送信先で無効にします
11
Command: Won't Environment Option
クライアント(192.168.0.3)
サーバ(192.168.0.1)
クライアントは環境変数オプションを拒否します
12
Command: Don't Envionment Option
サーバ(192.168.0.1)
クライアント(192.168.0.3)
サーバは環境変数オプションを送信先で無効にします
Suboption Begin: Terminal Type ターミナルタイプの調整
 ↑Send Your Terminal Type  ↑貴方のターミナルタイプを送信してください
Command: Suboption End サブオプションの終了
13
Command: Won't X Display Location
クライアント(192.168.0.3)
サーバ(192.168.0.1)
クライアントはXディスプレイを・ロケーションの無効を受け入れます
14
 
サーバ(192.168.0.1)
クライアント(192.168.0.3)
ACKの送信
15
Command: Won't New Envionment Option
クライアント(192.168.0.3)
サーバ(192.168.0.1)
クライアントは新環境変数オプションの無効を受け入れます
Command: Won't Environment Option クライアントは環境変数オプションの無効を受け入れます
Suboption Begin: Terminal Type ターミナルタイプの調整
 ↑Here's my Terminal Type
 value: vt100

ここに私のターミナルタイプを表示します。
VT100

Command: Suboption End サブオプションの終了

上記のやりとりは当然サーバやクライアントにより異なりますがまず標準的なやりとりといえます。調整している項目をまとめると下記の6つになります。

ターミナルタイプの調整(RFC1091)
サンプルでは4番5番12番15番でこのやり取りがされています。とりあえず4番でサーバ側からターミナルタイプの調整の有効がされ5番でクライアントがそれを受け入れています。その後12番でサーバから「貴方のターミナルタイプは何ですか?」と聞かれ15番でクライアントは「VT100」と返答しています。

ウィンドウズサイズの調整(RFC1073)
サンプルでは4番5番7番でこのやり取りがされています。とりあえず4番でサーバからウィンドウズサイズの調整の有効がされ 5番でクライアントがそれを受け入れています。その後7番でクライアントは「ウィンドウのサイズは幅80高さ24」と返答しています。

Xディスプレイ・ロケーションの調整(RFC1096)
サンプルでは4番9番10番13番でこのやり取りがされています。 とりあえず4番でサーバ側からXディスプレイ・ロケーションの調整の有効がされ9番でクライアントがそれを拒否しています。拒否されたサーバは10番でこのオプションを無効にしておりこれをクライアントは13番で受け入れています。

新環境変数オプションの調整(RFC1572)
サンプルでは4番9番10番15番でこのやり取りがされています。とりあえず4番でサーバ側から新環境変数オプションの調整の有効がされ9番でクライアントがそれを拒否しています。拒否されたサーバは10番でこのオプションを無効にしておりこれをクライアントは15番で受け入れています。

環境変数オプションの調整(RFC1571)
サンプルでは4番11番12番15番でこのやり取りがされています。とりあえず4番でサーバ側から環境変数オプションの調整の有効がされ11番でクライアントがそれを拒否しています。拒否されたサーバは12番でこのオプションを無効にしており、これをクライアントは15番で受け入れています。

データ制御の調整
サンプルでは5番8番でこのやり取りがされています。とりあえず5番でクライアントはデータ制御のサーバ側での有効化とクライアント側での受け入れ体制をとり、サーバに対して返答を求めます。サーバは8番でこれに対する返答をしています。

エコーの設定(RFC857)
サンプルでは5番8番でこのやり取りがされています。とりあえず5番でクライアントはエコーの送信先で有効を要求し、サーバはそれに対して8番で受け入れています。

この他にもTelnetには様々なオプションが存在します。これらのオプションはRFC855を始めとする多くのRFCで参照する事ができます。代表的なものは855、856、858、859、860、1091、1184等です。

DoとWILL、WON'TとDON'Tの関係は知っておく必要があると思いますので以下に解説したいと思います。

4番のキャプチャ結果を見て下さい。サーバは5つのDoを出しています。それに対する解答に2種類ある事に気付いてください。Doに対してWillを返しているのはターミナルタイプとウィンドウズサイズの調整です。次にWon'tを返しているのはXディスプレイ・ロケーションと新環境変数、環境変数の3つです。Doに対してWillを返した場合、「送信側で有効にしたい」という要求に「受け入れます」と返答した事になります。Doに対してWon'tを返した場合、「送信側で有効にしたい」という要求に「拒否します」と返答した事になります。

さて、今度は11番のキャプチャ結果を見て下さい。11番のキャプチャ結果では10番でクライアントが「環境変数は拒否します」と答えられたのに対しサーバはDon'tという形で「送信先で無効にしたい」と改めて主張しています。それに対しクライアントは15番で「Won't」と答えています。これは「無効を受け入れます」という意味になります。前にあったDoに対するWon'tと今回は意味が違う事に注意して下さい。

この様にDoの後のWon'tなのかDon'tの後のWon'tなのかにより意味が異なってきます。これはWon'tに限らずDoもWillもDon'tも同じ事が言えます。書くパターンを下記に表しておきましたので参照して下さい。

Willの後にDoを返す 有効にしたいという主張に対しそれを受け入れる
Willの後にDon'tを返す 有効にしたいという主張に対しそれを拒否する
Doの後にWillを返す 送信先で有効にしたいという要求に対しそれを受け入れます
Doの後にWon'tを返す 送信先で有効にしたいという要求に対しそれを拒否する
Won'tの後にDon't 無効にしたいという主張に対しそれを受け入れる
Don'tの後にWon't 送信先で無効にしたいという要求に対しそれを受け入れる

3.データのやりとり

実際のデータのやり取りはサンプルデータで16番から88番までがそれに該当します。

さてこちらの方もすべて説明する訳にはいきませんがとりあえず重要な部分を開設していきたいと思います。まずサンプルファイルの16番を見て下さい。

詳細フレームは下記の様になっているかと思います。

実際のVT画面では下記様になっています。

意味は非常に簡単です。「rn」となっているのは改行を表しています。つまり2回改行して「SunOS 5.8[改行]」というデータという事になります。この\r\nはWindowsの一般的な改行コードになります。(知っている方は知っていると思いますが・・・)\r\000(\r)はUNIXの改行コードになります。

大体この調子でDateは流れていきます。さて18番のキャプチャデータについてですが、Loginという文字がサーバから出力されたものと同時に「Do Echo」が入っています。これに対しクライアントは19番で「Won't Echo」と返し、さらにサーバは20番で「Don't Echo」としています。
これは基本的にサーバが文字エコー送信先で有効にしたいと主張したに対しクライアントはそれを拒否、これを受けたサーバはさらに文字エコーの送信先での無効化を主張しているという流れになります。これは自動ログインをサーバがクライアントにたいして促しているものです。

22番から33番は「test」というログインアカウントを入力している所です。クライアントが「t」と打つとサーバから「t」と返ってきているという事に気づいて下さい。これはキー入力の送信とその入力した文字をNVTに出す為のサーバからの送信の2つがある為です。
従って、パスワードの入力である37番から47番はクライアントの入力に対してサーバはACKを返す事によりNVTへパスワードの出力がされない様にしています。

4.セッションを切る

一応「exit」と入力した後の88番のキャプチャデータがログアウトになります。

セッションを切るコマンドがTelnetで流されると今度は通常のTCPフローでセッションが切られます。これが89番・90番・91番になります。

これを図にすると下記の様になります。


Copyright 2003 by Nobuo Nakako All right reserved.