Broadband Watch logo
バックナンバー

その116「DLNAの仕組み」
[2007/03/26]
その115「ドメインとActive Directory」
[2007/03/19]
その114「ワークグループができること」
[2007/03/12]
その113「WPSの仕組み」
[2007/03/05]
その112「Gopherの生い立ちと現在」
[2007/02/26]
その111「Wikiの使われ方」
[2007/02/19]
その110「文字コードとは」
[2007/02/05]
その109「IISの生い立ち」
[2007/01/29]
その108「NASの登場と一般への普及」
[2007/01/22]
その107「HomePNAのいろいろ」
[2007/01/15]
その106「Ogg Vorbisの成り立ち」
[2006/12/25]
その105「MIDIの原理とSMFの構造」
[2006/12/18]
その104「AIFFの構造」
[2006/12/11]
その103「WAVの構造と現状」
[2006/12/04]
その102「WMAの歴史」
[2006/11/27]
その101「AACの特徴」
[2006/11/20]
その100「MP3/MPEG Audioの仕組み」
[2006/11/13]
その99「HSDPAの仕組み」
[2006/11/06]
その98「H.264・MPEG-4 AVCの特徴」
[2006/10/30]
その97「IEEE 802.16e(モバイルWiMAX)の特徴」
[2006/10/23]
その96「TIFFの特徴」
[2006/10/16]
その95「PNGの現状と今後」
[2006/10/02]
その94「GIFの構造」
[2006/09/25]
その93「10GBASEの種類(2)」
[2006/09/11]
その92「10GBASEの種類」
[2006/09/04]
その91「GbEのいろいろ」
[2006/08/28]
その90「JPEGの特徴」
[2006/08/21]
その89「DivXの広がり」
[2006/08/07]
その88「MPEGの仕組み」
[2006/07/31]
その87「WMVのこれまで」
[2006/07/24]
その86「AVIの生い立ちとそのコーデック」
[2006/07/10]
その85「QuickTimeの変遷」
[2006/07/03]
その84「Realのこれまでと今後」
[2006/06/26]
その83「ShareとWinny」
[2006/06/19]
その82「DOCSISの仕組み」
[2006/06/12]
その81「SQLインジェクションの流れ」
[2006/06/05]
その80「RSSの動作」
[2006/05/29]
その79「Skypeの仕組み」
[2006/05/22]
その78「BitTorrentの特徴と今後」
[2006/05/15]
その77「Winnyの仕組みと現状」
[2006/05/08]
その76「WinMXの特徴」
[2006/04/24]
その75「Gnutellaの歴史と構造」
[2006/04/17]
その74「Napsterの歴史」
[2006/04/10]
その73「P2Pのいろいろ」
[2006/04/03]
その72「IEEE 802.11nの動向」
[2006/03/27]
その71「ActiveX Scriptingの動作」
[2006/03/20]
その70「Ajaxの仕組み」
[2006/03/13]
その69「DHTMLの動作」
[2006/03/06]
その68「Scriptの定義」
[2006/02/27]
その67「JavaScriptの仕組み」
[2006/02/20]
その66「Javaの動作」
[2006/02/13]
その65「RFCのプロセス」
[2006/02/06]
その64「ActiveX DocumentとActiveX Controlの違いと共通点」
[2006/01/30]
その63「ActiveX Controlの機能」
[2006/01/23]
その62「ActiveXを構成するもの」
[2006/01/16]
その61「Cookieの仕組みと用途」
[2005/12/26]
その60「malwareとその分類」
[2005/12/19]
その59「rootkitの動作」
[2005/12/12]
その58「CSSの役割」
[2005/12/05]
その57「HTMLの変遷」
[2005/11/28]
その56「PONとその種類」
[2005/11/21]
その55「FWAの仕組み」
[2005/11/14]
その54「DoSとDDoS」
[2005/11/07]
その53「SNMPとMIBの動作」
[2005/10/03]
その52「Jumbo Frameとフレームサイズ」
[2005/09/12]
その51「WPA2の仕組み」
[2005/09/05]
その50「WPAとWPA-PSKの違い」
[2005/08/29]
その49「WPAの仕組み」
[2005/08/22]
その48「WebDAVの動作」
[2005/08/08]
その47「OFDMAの仕組みとOFDMとの違い」
[2005/08/01]
その46「OFDMの仕組み」
[2005/07/25]
その45「WiMAXの特徴」
[2005/07/11]
その44「Wi-Fiの役割」
[2005/07/04]
その43「FTPの目的と動作」
[2005/06/27]
その42「UPnPの動作」
[2005/06/20]
その41「ネットマスクの仕組み」
[2005/06/13]
その40「ARPの機能」
[2005/06/06]
その39「DNSの原理」
[2005/05/30]
その38「デフォルトゲートウェイの役割」
[2005/05/23]
その37「MACアドレスの仕組み」
[2005/05/16]
その36「スイッチとその進化」
[2005/05/09]
その35「ルータによるメリット」
[2005/04/25]
その34「ブリッジの原理」
[2005/04/18]
その33「リピータの機能」
[2005/04/11]
その32「IPアドレスのクラス」
[2005/04/04]
その31「ブロードキャスト/マルチキャスト/ユニキャスト」
[2005/03/28]
その30「SMTP AUTHと認証の種類」
[2005/03/14]
その29「Submissionポートとスパムメール対策」
[2005/03/07]
その28「Outbound Port25 Blockingとは」
[2005/02/28]
その27「PGPの仕組み」
[2005/02/21]
その26「PKIと認証局」
[2005/02/14]
その25「公開鍵暗号方式とは」
[2005/02/07]
その24「共通鍵暗号とは」
[2005/01/31]
その23「SSHの仕組みと応用」
[2005/01/24]
その22「SSLの役割」
[2005/01/17]
その21「POP3とIMAP4の違い」
[2004/12/27]
その20「POP3の役割と機能」
[2004/12/20]
その19「SMTPの機能と問題点」
[2004/12/13]
その18「SPIとパケットフィルタリング」
[2004/12/06]
その17「LANの概念とその広がり」
[2004/11/29]
その16「SIPの役割」
[2004/11/15]
その15「プロキシの利用」
[2004/11/08]
その14「VoIPの仕組み」
[2004/11/01]
その13「イーサネットとは」
[2004/10/25]
その12「IP/TCP/UDP/ICMPとは」
[2004/10/18]
その11「DHCPの役割」
[2004/10/04]
その10「MIMOとは」
[2004/09/27]
その9「DMZとその効果」
[2004/09/13]
その8「ファイアウォールとは」
[2004/09/06]
その7「NATとNAPTの違いとIPマスカレード」
[2004/08/30]
その6「VPNとVPNパススルーの仕組み」
[2004/08/23]
その5「無線LANの問題とWEP」
[2004/08/09]
その4「IEEE 802.11a/b/gって何を意味しているの?」
[2004/08/02]
その3「ダイナミックDNSって?」
[2004/07/26]
その2「グローバルIPアドレスとプライベートIPアドレス」
[2004/07/12]
その1「PPPoEって何だろう?」
[2004/07/05]

その43「FTPの目的と動作」


FTPって何?

 FTPとは「File Transfer Protocol」の略で、本来は文字通り「ファイルを転送する」ためのプロトコルです。ただ最近では、FTPと言えばプロトコルそのものよりも、実際に転送を行なうツール類(例えば、WindowsやUNIXだと“ftp.exe”という名前になっています)や、手段(「このファイルをFTPしておきます」といった会話)だったりと幅広く使われています。

 ですので、「File Transfer Protocolそのもの、あるいはこのプロトコルを実装したサーバーやクライアント、もしくはこれらを使ってファイルを転送すること」という、ややこしい定義が1番現実に合っている気もします。


FTPの目的

 FTPは、RFC959で制定されており、制定時期は1985年と非常に早い時期です。最近では、ファイル転送といえばWebサーバーからHTTP経由でダウンロードする機会も多くなってきましたが、それ以前はFTPが最も多く利用される手段でしたし、さらに今でもまだまだ利用されています。なぜかといえば、1番効率が良いからという話なのですが、これにはもう少し説明が必要でしょう。

 ファイルを転送するという1点に絞って言えば、例えばメールの形で送るとか、telnetで相手と接続した上で専用転送プロトコル(Kermitがこの代表例ですが、ほかにもXMODEM/YMODEM/ZMODEMあたりは有名でした)を使うなど、FTPを使わない方法はいくつかあります。

 これらはいずれも、「ファイルのバイナリデータをテキストデータに変換して送り出し、受け取った側ではこれをバイナリファイルに戻す」という形で取り扱っていました。問題はこの「テキストへの変換」です。この方式にもいろいろあって、有名なところではBASE64と呼ばれる方式がありますが、これは3バイトのバイナリデータを4つのASCII文字に変換するという仕組みで、あとはこのASCII文字を転送すれば良いことになっています。そして、ASCII文字は1文字あたり1バイト必要ですから、3バイトのバイナリデータは4バイトのASCII文字になるわけで、データ量が33%増えてしまいます。例えば、3MBのデータなら、4MBをやりとりしないといけない計算になります。


 今の日本のように回線事情が非常によく、一般家庭ですら数MB/秒の帯域で接続できている環境ならばともかく、20年前の黎明期ではインターネットを構成する基幹サーバー間が数100kbps~数Mbps、アクセス回線が9,600bps(=1.2KB/秒)とか、そんな環境だったわけですから、トラフィックが増えるのは到底許容できません。

 20年前というと、日本でもjunetは立ち上がっていた頃ですが、当時はモデム以外の接続方法はなく、予算にゆとりのある人はTelebitという会社のTrailblazerというモデムを購入して28.8kbpsでの通信が可能でしたが、普通は2,400bpsや9,600bpsといったモデムを使って何とかやりくりするのが普通でした。こんな回線状況では、無駄に転送すべきサイズが増えることはなるべく避けたいと当然考えます(*1)。

 FTPはこうした状況に合わせ、なるべく無駄を省いた形でファイル転送を行なうことに専念したものです。最初に簡単なユーザー認証を行なったあとは、無駄なデータ変換や煩雑なハンドシェイクをなるべく省き、なるべく短時間でファイルを転送すること“のみ”に専念したプロトコルと言えるでしょう。

*1:このあたりは、1985年に通信の自由化が行なわれて以降、急速に変わりました。それ以前は公衆回線にモデムを接続することができなかった関係で、専用線を引くことが事実上、モデム利用の前提だったため、モデムの金額も信じられないほど高価だったのですが、自由化されると競争原理なども働き、あっという間に高速化と低価格化が進みました。とはいえ、絶対的なスピードはやはり数kbps~数10kbpsのオーダーでしたから、やはり無駄を省くのは至上命題でした。


FTPの動作

図1:FTPの手順
 FTPの動作は、図1に示す通りの簡単なものです。この図の中で、赤(クライアント→サーバー)と青(サーバー→クライアント)は、いずれもテキスト形式のメッセージで、緑色(ファイル転送)の部分だけはバイナリ形式の場合もあります。“場合もある”というのは、バイナリを使わない場合もあるからです。

 FTPが登場した当時、通信する相手はUNIX同士でしたから、ファイルの互換性に関しては考える必要がなかったのですが、その後さまざまな種類のマシン(OS)が登場してくると、テキストに関しては少し困ったことになりました。有名なところでは、UNIX系では改行をLF(Line Feed)というコードで示しますが、PCでは改行をCR(Carridge Return)+LF(Line Feed)という2つのコードで示します。そして、このPCとUNIXの間でテキストファイルを送った場合、以下のような問題が出てきてしまいました。

・PC→UNIX:各行の最後に、余分なCRのコードが入って見える
・UNIX→PC:行区切がなく、代わりにLFコードのみが入った長い1行として見える

 日本の場合はまた、漢字コードの問題も出てくるなど、単にファイルをそのまま転送しただけでは十分でない場合が見られるようになりました。


 そこで、ファイル転送にはASCIIモードと呼ばれるものと、バイナリ(BINARY)モードと呼ばれるものが出現しました。これはもっぱらFTPクライアント側の処理になりますが、バイナリモードの場合、ファイルには一切手を加えることなく転送します。ところが、ASCIIモードの場合は原則として(*2)テキストとして転送しますが、その際に改行コードや漢字コードなどを自動的に適切なものに変換する、という処理を行なうのが一般的です。

 もう1つ、最近のFTPの動作で忘れてはならないのがPASV方式です。通常、FTPではサーバーとクライアントが1つずつポートを用意し、そこに要求と返答をそれぞれ送る形になります(図2)。


図2:通常のFTPの接続方式 図3:通常の接続方式での問題

図4:PASV方式
 ところが昨今は、ルータやファイアウォール、あるいはプロキシなどがクライアントとインターネットの間に存在するのが普通で、クライアントからサーバーに要求は送れても、その結果をサーバーから受け取ることができない(図3)という事態がしばしば起きるようになりました。これを解決するのがPASV方式です。図4のように、受信用のポートもサーバー側に持たせることで、ファイアウォールと関係なく受信できるようにするものです。

*2:古いFTPクライアントの場合、インターネットが8bitクリーンでなかった時期の配慮として、テキストでもバイナリで送るように実装しているものがあります。


FTPの今後

 最初に述べた通り、FTPは過去の貧弱な回線を有効に使うためのものなので、現在では次第に利用される範囲が減りつつあるのは事実です。とはいえ、最近ではギガバイト単位のファイル、DVDの内容をそのままISO化して配布なんていう強烈な例も出てきました。筆者が最近体験した例をご紹介すると、米NovellSuSE Linux Professional 9.3を、そのままDVDメディアに焼くとブートできるisoイメージとして配布していますが、ファイルサイズは1.4GBにも達しています。このクラスとなると、httpを使ってダウンロードすると無駄に時間と帯域を浪費してしまいます。また、1.4GBものバイナリデータをテキストフォーマットに変換し、またあとでそれを戻すという処理も馬鹿になりません。そんなわけでNovellは配布をftpで行なっています。こうした用途に、引き続きftpは使われてゆくでしょう。

 一方セキュリティ面では、ftpのセッション最初にユーザー名とパスワードを平文で送っているほか、データにもなんの暗号化を施してない関係で、盗聴されるとデータ自体までそのまま盗まれてしまいます。こうしたことを防ぐため、SSHの上でFTPセッションを通すSFTP(その23で少し触れました)と、FTP自体をSSL/TLSセッション上に通すFTPS(FTP over SSL/TLS)がありますが、どちらも幅広く使われているとは言いがたい状況です。

 理由の1つは、FTPは不特定多数にファイルを配布するケースで多く使われているので、そもそもセキュアにしてもあまり意味がないということです。これを逆にいえば、特定の人間との間で(秘密にしておきたい)データ交換をする場合、FTPをそのまま使うと危険度が高いということでもあります。話を戻すと、(暗号化方式が異なるため)FTPSとSFTPの間にまったく互換性がないのも、セキュアなFTPの普及を妨げる要因の1つになっているようです。とはいえ、次第にセキュアFTPも広がりつつあるので、もうしばらくするとトレンドが明確になってくるかもしれません。





2005/06/27 11:08

槻ノ木 隆
 国内某メーカーのネットワーク関係「エンジニア」から「元エンジニア」に限りなく近いところに流れてきてしまった。ここ2年ほどは、企画とか教育、営業に近いことばかりやっており、まもなく肩書きは「退役エンジニア」になると思われる。(イラスト:Mikebow)
Broadband Watch ホームページ
Copyright (c) 2005 Impress Corporation, an Impress Group company. All rights reserved.