■ 取るに足らないFTP
4回続けてFTPの説明をしたわけだ。
ファイル転送という、インターネットワークで頻繁に使われるものを行うためのプロトコルだったな。
そうですね。
FTPによるファイル転送ってよく使いますものね。
うむ。最近はHTTPによる転送がもっともよく使われているとはいっても、FTPのファイル転送機能にはまったくかなわないからな。
ただ、そんなFTPにも欠点はある。
欠点?
なんかありましたっけ?
それはTCPを使うところと、複雑な機構のためアプリケーションが大きいところだ。
TCPを使うところが欠点?
それだったら、他のTCPを使うアプリケーションも必ず欠点があるってことじゃないですか?
まぁ、確かにそう言われればそうなのだが。前にも説明したとおり、小さいサイズのデータのやり取りにおいて、TCPは重厚すぎるのだよ。
FTPで転送するデータは大きいサイズのものばかりではない。
小さいサイズ向きではないってのはわかりますけど。
それと、アプリケーションのサイズが大きい?
そうだ。FTPは複雑な機構により、柔軟なファイル転送機能を持つが、どうしてもアプリケーションのサイズが大きくなってしまう。
でも、大きいっていっても、1ギガとかじゃないですよね?
それは極端な大きさだな、おい。確かに通常のPCならば問題にするサイズではない。
だが、ファイル転送を行うのはPCだけではなく、ハードディスクを持たないルータやディスクレスマシンなどもファイル転送を行う必要がある。
ルータやディスクレスマシン…。
例えば、Cisco製のルータは、そのOSであるIOSのバージョンアップのために、IOSのデータをファイル転送してルータにダウンロードする。
つまり、ハードディスクではなくROM内におさまるファイル転送アプリケーションが必要なのだよ。
ははぁ。ハードディスクじゃなくて、ROMにアプリケーションを入れる、と。
ROMに入れるにはFTPは大きすぎるってことですか。
そういうことだ。
そこで、FTPをもっと簡略化したプロトコルが使用される。これをTFTPという。 ▼ link
とりびあるふぁいるとらんすふぁーぷろとこる?
「とりびある」ってなんです?
取るに足りないとか、つまらないとか。
ネット君を指し示す時に使用される形容詞の一つだな。
僕は「取るに足りない」人間なんですか…。
そう嘆くな。TFTPにも使い道がある通り、ネット君にも何かしらの取り得があるさ。
どこにあるかは知らんがな。
うぅぅぅ。
まぁ、ともかく。その「取るに足らない」FTPがTFTPなわけだ。
なんともストレートなネーミングだな。
なんとも親近感を抱かせる名前ですね。
■ TFTPの特徴
その「取るに足らない」FTP、実際は「簡易型」FTPだがそのFTPとの違いはといえば。
- TCPではなくUDPを使う
- ユーザ認証を行わない
- コマンドは読み出し(RRQ)と書き込み(WRQ)のみ(FTPでのRETR/STOR)
- ワーキングディレクトリ変更(CWD)やリスト表示(LIST)などがない
UDPを使うのはともかく。
ファイル転送以外は何もしないですね。
その通り。ファイルの一覧表示すらない。
書き込み/読み出ししかないのだよ。
なるほど。まさしく「簡易型」FTPですね。
でも、ユーザ認証もないんですね。
うむ、その点でセキュリティに問題点があることは間違いない。
だが、まぁ、簡易型だしな。
そうですね、簡易型ですものね。
■ UDPを使ったファイル転送
さて、ネット君。TFTPはUDPを使う。
UDPは以前も話したとおり、コネクションレス型で、確認応答もなければ、受け取ったデータを並び替えるなどもしない。
3分間ネットワーキング第44回ですね。
そこで話した言葉を覚えているか?
「UDPを使うアプリケーションは信頼性を確保する仕組みを自分で持つ」、と説明した。
あ〜、そんなことを聞いた様な。
ということは、TFTPは信頼性を確保する仕組みを自分で持っている、ってことですか?
その通り。
まず、TFTPでは転送するデータを512バイト単位で区切る。そして先頭から1から始まるブロック番号をつける。
[Figure61-01:TFTPの転送ブロック]
512バイトで分割。
で、1から順番に番号をつけるんですね。TCPと似てますね。
3分間ネットワーキング第40回の話だな。だが、TCPのシーケンス番号の割り振りとはちょっと違うな。TCPは1バイトづつ番号がつくからな。
さらに、TFTPは必ず1番から始まる。
[Figure40-03:TCPでのデータとシーケンス番号]
さて、TFTPでは512バイトのブロックごとに転送を行う。
送る際に、転送するブロックのブロック番号をつけて送る。TFTPのデータはこういう形になる。
[Figure61-02:TFTPデータフォーマット]
ブロック番号をつけて転送する。
やっぱりTCPっぽいですよね。
うむ。役割もTCPのシーケンス番号に似ている。
つまり、受け取った側は確認応答(ACK)を返すのだよ。
[Figure61-03:TFTP確認応答フォーマット]
データを送ると、確認応答を返す。
ますますTCPだ。
注意して欲しいのは、TCPは「次に欲しいデータのシーケンス番号」を返すが、TFTPは「受け取ったデータのブロック番号」を返すところだ。もちろん何のためにこの番号があるかといえば、再送制御のためだ。
[Figure61-04:TFTPでの再送制御]
つまり、ウィンドウ制御を行わないTCPのような制御なわけだな。
シンプルに、ACKが返って来たら次のデータの繰り返しだ。
ウィンドウ制御を行わない…。
同時にいくつも送らないで、1つ1つ送るってことですね。
そういうことだ。単純な方法だが、有効だ。
このようにTCPの代わりにTFTP自身が信頼性を確保する仕組みをもっているわけだな。
なるほど。アプリケーションが信頼性を確保する仕組みを自分で持つってこういうことだったんですね。
うむ。さらに、FTPでのデータ終了はTCPのFIN、コネクション切断が示す。
だが、TFTPではこうなる。
[Figure61-05:TFTPでのデータの終了]
ははぁ。512バイト未満なら終了、ですか。
■ TFTPの動作
では、TFTPの実際の動作だが。
まず、クライアントから読み出し(RRQ)か、書き出し(WRQ)の要求が送られる。データの中身はこうだ。
[Figure61-06:TFTP読み出し/書き出し要求]
読み出し/書き出しのコードと、ファイル名…。
nullってのはなんであるんです?
ファイル名とモードは可変長だ。なので区切りがないとどこまでがファイル名で、どこからがモードなのかわからない。よってその区切りをするためにnullを入れる。
なるほど。
で、モード。これはFTPのモードと同じですか?
基本的には同じだ。
モードの部分には、ASCIIコードで以下の文字列が入る。
- netascii … FTPのASCIIモード。受信側が自分の使用する文字コードに変換して保存。
- octat … FTPのBinaryモード。送信側から無変換で送信される。
- mail … netasciiモードと同じ。ファイル名の変わりにメールを受信するユーザ名が入る。ほとんど使われない。
ははぁ。FTPと同じようにコードの変換が行われるんですね。
そうだな。「簡易型」とはいえ、FTPはFTPだからな。
さて、実際の動きはこうなる。
[Figure61-07:TFTPの動作]
ははぁ。なんか変な動きですねぇ。
サーバが送信する時は、69番以外のランダムなポートを使うんですか? なんでそのまま69番を使わないんですか?
それは、複数のTFTPクライアントに対応するためだ。
複数に対応する?
そうだ。もし、データ転送を69番を使って行う場合。
データ転送中に他のクライアントから要求が来ても受け取れない。
[Figure61-08:69番を使い続けた例]
よって、要求ごとにランダムなポート番号を使ってデータを転送する。
69番を使うのは要求のみだ。
[Figure61-09:ランダムなポートを使用した例]
は〜。そりゃ上手くできてますねぇ。
……。要求を受けるポートと、データを転送するポートが別? なんか似たようなことを聞いたような…。
うむ、なかなかいい所をついてきているな、あと一歩だ。
そう。つまりFTPで言うところの制御コネクションとデータコネクションだな。
あ〜〜。
そうそう、それですよ。
UDPにはコネクションの概念はないが、まぁ、似たような形でデータを転送するわけだ。
なるほど。簡易型とはいえFTPの名前を持つだけありますねぇ。
やっぱり似てますよ。
うむ。簡易型だが、立派なファイル転送用のプロトコルだ。
ですね。
このように、簡単で小さなアプリケーションのため、ルータやディスクレスマシンなどのROMに搭載できるわけだ。
これはこれでよいのだが、そのためあまりよくないことに使われたりもする。
よくないこと?
例えば、TFTPは小さいため、ワームのような小さなプログラムでもTFTP機能を持つことができる。
わーむ。
悪いことする「虫」ですね。
ワームでもTFTPを持つことができるため、自己増殖の手段としてTFTPを使うことがある。
自分自身をダウンロードしたりすることによって感染していくのだな。
うわぁ、陰険だ。
一番有名な例は、2003年夏に大流行したMS.BLASTだな。 ▼ link
えむえすぶらすと。
なんでしたっけ? 再起動を連発させる奴でしたっけ?
そう、それだ。
MS.BLASTはWindowsの脆弱性を利用してTFTPクライアント機能を持つワームが侵入し、その後TFTPを使ってMS.BLAST本体をダウンロードするのだ。
ははぁ。
ワームでも持つことができるくらい簡易なプロトコルなんですねぇ、TFTPって。
そういうことだ。
さて、今回はここまでにしておこう。
はい。
次回からは、DNSだ。
了解です。
3分間ネットワーキングでした〜♪
- IOS
-
[Internetworking OS]
正確には「Cisco IOS」。Cisco製のルータ、スイッチなどに搭載されているOS。
- TFTP
-
[Trivial File Transfer Protocol]
簡易FTPプロトコル。
RFC1350で規定。
- ブロック番号
-
ブロック番号は下の図にあるように2オクテット(16ビット)なので、最大値は65535。
1ブロックは512バイトなので、TFTPの最大転送量は 65,535 × 512 = 33,553,920 の33MBとなる。
ただし実際は、最後のブロックは512バイト未満である必要があるため、 33,553,919バイトが最大転送量。
- ワーム
-
[worm]
自己増殖をしながら、破壊活動をするプログラム。
ウィルスと混同しがちだが、自らをネットワークなどにより複写する機能を有する。
有名なものは「I Love You」や「Code Red」。
- MS.BLAST
-
Windows NT系列(NT、2000、XP、2003)が持つ脆弱性を利用したワーム。
2003年8月に大流行した。
参考リンクはIPA(情報処理振興事業協会)のMS.BLASTについての特設ページ。
- ネット君の今日のポイント
-
- FTPをもてないようなホストでもファイル転送を行うことが出来るためのプロトコルがTFTP。
- TFTPはUDPを使い、ファイルの読み出しと書き込みのみを行う。
- TFTPはユーザ認証がないため、セキュリティが弱い。
- TFTPは確認応答を使って信頼性を確保する。
- 要求を受けるポートと、データを転送するポートを分け、複数からの同時要求も可能にしている。
- 参考リンク
-
- RFC1350http://www.rfc-editor.org/rfc/rfc1350.txt▲
- IPA 「W32/MSBlaster」ワームに関する情報http://www.ipa.go.jp/security/topics/newvirus/msblaster.html▲