|
お邪魔致します。このサイトの情報はPerlでのネットワークプログラム作成時に 大変参考にさせて頂いております。以前も一度この掲示板にてお世話になりました。 本日はFTPとHTTPの比較について質問がありやって来ました。 昨日書店で立ち読みした、発売したばかりの ASCII NETWORK MAGAZINE4月号 http://biz.ascii24.com/biz/n-mag/article/2001/02/23/623348-000.html に、比較的初心者向けのFTPプロトコルの解説記事があったのですが、その冒頭に 「FTPはHTTPよりわずかに速いため、現在もよく利用される」 という(言い回しが違うかもしれません)記述がありました。これは本当でしょうか? CやPerlでsocket関数を使いTCPのアプリケーション層のプログラムを作っている と、プロトコルがFTPであるのかHTTPであるのか(もしくはSMTPやPOP3なのか)は データを受信(または送信)するアプリケーションが判断することで、ネットワーク上 では区別されないように思えました。 ポート番号で区別できるという考えもありますが、もちろんWell-Knownポート以 外を使ったHTTPやFTPでの通信も可能ですよね。 IPパケットレベルでHTTPとFTPのパケットが区別され、FTPの方がわずかに速く通 信が可能という事はあるのでしょうか?いきなりで申し訳ありませんが、お答え頂ければ 幸いです。 |
|
>>1752 CZ > そうですか? スレッド表示など特に秀逸だと思ったのですが。 あ、アイコンがわかりにくいので拒否反応を示しただけですから、 聞き流してくださいまし。 > Internet Explorerやw3m等から見るとソースがこんな具合に > なっています。 IE5.5 で確認しました。原因究明はウチに帰って元データを 見てからにします。 >>1753 金床 > FTPはHTTPよりわずかに速いため FTP はコントロールコネクションとデータコネクションがありますが、 HTTP はコネクションは1本しか張らないので、FTP の方がわずかに 速い *かも* しれません。でも、誤差の範囲内だと思います。 なので、(この部分を見る限りでは) 不適切な解説だと僕は思います。 > IPパケットレベルでHTTPとFTPのパケットが区別され、FTPの方が > わずかに速く通信が可能という事はあるのでしょうか? アプリケーションゲートウェイ (delegate とか) で帯域制限でも しない限り ありえないです。金床さんが書かれている考え方は 正しいです。 |
|
お答え頂きありがとうございます。 >FTP はコントロールコネクションとデータコネクションがありますが、 >HTTP はコネクションは1本しか張らないので、FTP の方がわずかに >速い *かも* しれません。でも、誤差の範囲内だと思います。 これは、FTPのデータコネクションでは目的のデータ(ファイルやファイルリストなど)しかネットワーク上を 転送されないのに対し、HTTPでは最初にHTTPリクエストがネットワーク上を通るので、その分という事でしょうか。 それとも、データコネクションでのデータ受信(送信)中も、コントロールコネクションが何らかの役割を果たして いるという意味でしょうか。つまり、転送されるデータが巨大になればなるほどFTPとHTTPで差がでてくるような 現象が存在するのでしょうか? 最初に書くべきでしたが、私がここで対象にしている「FTPとHTTPの転送速度の差」は、 数Kb〜数百Kb程度の小さなファイルでのやりとりではなく、巨大なデータ(少なくとも10Mb程度) で現れる(かもしれない)差の事です。 >アプリケーションゲートウェイ (delegate とか) で帯域制限でも >しない限り ありえないです。 なるほど、やはりそうですよね。少し安心しました。 |
|
# おぉすごい書き込み…うちとは大違い(笑) 68user>お使いの OS は何でしょうか? はい、初心者入門用?(笑)VineLinux1.1CRです。 ちなみに5秒sleepした結果以下のようなログが生成されています。 2001-02-28 00:59:06 12:59am up 13:13, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 01:00:02 1:00am up 13:14, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 01:01:03 1:01am up 13:15, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 01:02:06 1:02am up 13:16, 1 user, load average: 0.00, 0.00, 0.00 〜略〜 2001-02-28 03:57:05 3:57am up 16:11, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 03:58:06 3:58am up 16:12, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 03:59:06 3:59am up 16:13, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 04:00:05 4:00am up 16:14, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 04:01:06 4:01am up 16:15, 1 user, load average: 0.00, 0.00, 0.00 2001-02-28 04:02:06 4:02am up 16:16, 1 user, load average: 0.08, 0.02, 0.01 2001-02-28 04:03:06 4:03am up 16:17, 1 user, load average: 0.72, 0.21, 0.07 2001-02-28 04:04:07 4:04am up 16:18, 1 user, load average: 1.08, 0.40, 0.14 2001-02-28 04:05:07 4:05am up 16:19, 1 user, load average: 1.21, 0.56, 0.21 2001-02-28 04:06:05 4:06am up 16:20, 1 user, load average: 0.60, 0.50, 0.21 2001-02-28 04:07:05 4:07am up 16:21, 1 user, load average: 0.22, 0.41, 0.19 2001-02-28 04:08:06 4:08am up 16:22, 1 user, load average: 0.08, 0.33, 0.18 このマシンは試験用のマシンで、ペンティアム166です。 ちなみに、マシンフル稼働状態だとloadの数値は最大いくつ位になるのでしょう? 金床>FTPはHTTPよりわずかに速いため、 これ、自分も以前も気になっていましたが、回線トラフィックの方が 影響が大きそうなのと、特に支障がなさそう(知らなくても)なので、 ほったらかしの疑問にしていました(^^; httpと違ってftpはデーターコネクションとコントロールコネクションが 独立している為に僅かに早いのかな?なんて勝手に想像しています。 # 無駄な反応してすいません。 |
|
あら?いろいろと書いているうちに、前後してしまった…(^^; |
|
金床> 私も詳細は判りません(手抜き)ですが、調べるなら参考まで。 日本語RFC(FTP) http://hp.vector.co.jp/authors/VA002682/rfc959j.htm |
|
>>1755 金床 ああ、逆でした。 FTP はコネクションを 2本張るので、3way handshake が2回行われ、 その分 HTTP の方がわずかに速い *かも* しれません。 あと、FTP だと USER/PASS/TYPE/PORT などのコマンドを発行した 後はレスポンスを待たなければいけませんが、HTTP だと最初に リクエストを送って、あとは受け取るだけなので、そういう点でも HTTP の方が速い *かも* しれません。 それらの差が *仮に* あったとして、なおかつ数十 KB 程度の 小さいデータの転送時には *仮に* 体感できたとしても、 > 巨大なデータ(少なくとも10Mb程度)で現れる(かも > しれない)差の事です。 データの転送自体の仕組みは全く変わらないため、転送データの サイズが大きくなればなるほど、差は目立たなくなるでしょう。 |
|
>データの転送自体の仕組みは全く変わらないため、転送データの >サイズが大きくなればなるほど、差は目立たなくなるでしょう。 納得行く答えを頂きました。ありがとうございます。 >すなさん RFC情報、どうもありがとうございます。 |
|
>>1756 すな > 2001-02-28 01:00:02 5秒 sleep したのですから、00:59:57 あたりに cron から 起動されているわけですか。手元の FreeBSD 4.1-RELEASE と Solaris2.6 で負荷をかけて試してみましたが、1秒程度遅く なることはあっても、早く起動されることは一度もありません でした。 となると、Vine の cron が腐ってるということになりませんかね。 > マシンフル稼働状態だとloadの数値は最大いくつ位になるのでしょう? とりあえず http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1119 を読んでください。理論的には、load average はどこまででも 増やすことができます。 |
|
68user>となると、Vine の cron が腐ってるということになりませんかね。 なるほど、と言う事はcronの実装も結構ディストリビューションで違うのですね。 というか、さすがSolarisと言うべきなのか… # マシンの内臓タイマーの精度とかも関係有るのかな? # このマシンはかなり時間が狂うので…(1日数秒はあたりまえ) >http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1119 なるほど、これも大変勉強になりました。 最初は単純にシステム負荷を100で割った(理由不明)数値なのかと思っていました。 Windows等のシステム負荷表示とはまったく違って、100%以上の負荷まで表示 している訳ですね。(待ちプロセスを負荷と言うかは別として) 説明も大変判りやすかったです。 |
|
>>1750 68userさん > あと、この BBS で <http://blade.nagaokaut.ac.jp/> という書き方をすると > <http://blade.nagaokaut.ac.jp/> > → <A HREF="<http://blade.nagaokaut.ac.jp/>"> > と置換されていましたが、さきほど直しました。 自作BBSを見ると正規表現部分*だけ*はほぼ同じでした。やはりここの掲示板のソースを引き写していたようです。(perlではなくrubyですが。)で,直していて気が付いたことですが, s!<A HREF="(.*?)>">(.*?)<</A>!<A HREF="$1">$2</A><!g; も加えておいた方がよいのでは。 |
|
<<1763 ん? 訂正。 s!<A HREF="(.*?)>">(.*?)></A>!<A HREF="$1">>$2</A>>!g; s!<A HREF="(.*?)<">(.*?)<</A>!<A HREF="$1"><$2</A><!g; こうですね。 |
|
<<1764 ん?? 何やってるんだろう。 s!<A HREF="(.*?)>">(.*?)></A>!<A HREF="$1">$2</A>>!g; s!<A HREF="(.*?)<">(.*?)<</A>!<A HREF="$1">$2</A><!g; これでいいんですね。 <<1762 はタイプミス <<1763 は勘違いでした。 板汚しですみません。 |
|
あっ、ウチも同じバグがある(^^; でも、書き戻しですね…、ちょっとテストさせてくださいm(_o_)m <http://x68000.startshop.co.jp/~68user/><http://www2s.biglobe.ne.jp/~cru/library/> |
|
おー、これってきっちりやると結構面倒かも。で、30分あれこれ やった結果…これでどだ! $_='hoge<http://x68000.startshop.co.jp/~68user/><http://www2s.biglobe.ne.jp/~cru/library/>fuga'; s/&/&/g; s/\"/"/g; s/</</g; s/>/>/g; $http_pattern = '((http|https)://[a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+)'; $out = ''; while (1){ if ( ! s!(.*?)($http_pattern)!! ){ $out .= $_; last; } $out .= $1; $buf = $2; $buf =~ s/((<|>|").*)//; $rest = $1; $buf =~ s!$http_pattern!<A HREF="$1">$1</A>!; $out .= $buf; $_ = $rest . $_; } print "$out\n"; 無限ループが恐いので (^^;、まだ wwwboard.cgi には組み込んでません。 |
|
無茶苦茶効率悪そうだし、未定義変数使用の警告が出るけど…(^^; $_='hoge<http://x68000.startshop.co.jp/~68user/><http://www2s.biglobe.ne.jp/~cru/library/>fuga'; $http_pattern = '(http|https)(://)(([a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+?)(>|<|")|([a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+))'; s/&/&/g; s/\"/"/g; s/</</g; s/>/>/g; s!$http_pattern!<A HREF="$1$2$4$6">$1$2$4$6</A>$5!g; |
|
>>1767 68userさん おはようございます。 > おー、これってきっちりやると結構面倒かも。 こんなに奥が深いものとは想像もつきませんでした。以前これに着手しかけて断念した覚えはあったのですが,なぜ断念したかは覚えていません。 > 無限ループが恐いので (^^;、まだ wwwboard.cgi には組み込んでません。 早速ruby文に変換して実働掲示板に使っています。無限ループになっても利用者が二人しかいないサーバだし,HTTPならすぐ切れそうだということで,心配はしていません。 そんなわけで,いつもありがとうございます。これからもお世話になります。 |
|
こんなのも。 $_='hoge<http://x68000.startshop.co.jp/~68user/><http://www2s.biglobe.ne.jp/~cru/library/>fuga'; $http_pattern = '((http|https)://[a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+)'; s/&/&/g; s/\"/"/g; s/</</g; s/>/>/g; @items = split(/(<|>|")/, $_); foreach (@items){ s|$http_pattern|<A HREF="$1">$1</A>|g; } $_ = join('', @items); print "$_\n"; アルゴリズム・正規表現が複雑にならないという点で、これが 一番よさげかなぁ。でも動作チェックと速度計測をしなくては。 もっとよいのを思いついた方は教えてください。 |
|
>>1770 68user commit しました。とか言ってみたり。 http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/cgi-bin/wwwboard.cgi |
|
>>1770 68userさん いいですねぇ。 これ頂きます。perl4でも動くし(^^; |
|
質問したいことがあります。それはあるプログラムでPIDを変数として 持っているときに、その変数のPIDのプロセスを殺す方法があれば教えて欲しいのですが。 よろしくお願いします |
|
>>1773 purine 必ず OS 名や使用している言語を書いてください。 kill コマンドか、システムコール kill を使います。 http://X68000.startshop.co.jp/~68user/unix/pickup?keyword=kill&target=command&partial=on |
|
japu さん (http://www.japu.org/) より、source.cgi に関して CGI Security Advisoriy をいただきました。 これは他サイトに HTTP でアクセスし、GET した結果を表示 するもので、 「CGI の小部屋」http://X68000.startshop.co.jp/~68user/Cgi-room/ からは <!-- --> でコメントアウトしてあったものです (なぜコメントアウトしたかは忘れた)。 # また、昔利用していた http proxy 経由でアクセスするため、 # X68000.startshop.co.jp からは正しく動作しませんでした。 しかし、トップページからはスクリプトのソースを見ることができ、 source.cgi 自体も実行可能なままになっていました。これに対して http://X68000.startshop.co.jp/~68user/Cgi-room/source.cgi?url=http://www.yahoo.co.jp';ls%20*' といったアタックが可能でした。これは open(IN,"$httptalker -get '$url'|"); の部分で open(IN,"$httptalker -get 'http://www.yahoo.co.jp';ls *''|"); と解釈されます。open の引数に ; ? * | などを渡すと、perl は /bin/sh を起動し、/bin/sh がコマンドを実行しますので、任意の コマンドが実行可能です。 で、SA を受けて open(IN, "-|") or exec($httptalker, '-get', $url); と修正しました。この場合は perl が直接 fopen(3) を呼ぶため、' ; * など が特別扱いされることなく、$httptalker の引数にそのまま渡ります。 source.cgi の更新履歴: http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/Cgi-room/source.cgi セキュリティホールを指摘して下さった japu さんに感謝いたします。 んで、 「CGI の小部屋」http://X68000.startshop.co.jp/~68user/Cgi-room/ ですが、もうメンテする気力がないし、技術的な興味もないし (nslookup とか whois コマンド呼ぶだけのスクリプト見てもおもしろくないでしょ)、例えば ドメイン名検索とかならもっと便利なサイトがあるので、この掲示板で誰からも 反応がなければ近日中に消すつもりです。 |
|
>>1775 68user > open(IN, "-|") or exec($httptalker, '-get', $url); > と修正しました。この場合は perl が直接 fopen(3) を呼ぶため 訂正。perl が直接 pipe(2)、fork(2)、exec(2) するため、でした。 |
|
CGIの小部屋は消さないで欲しいです. メンテ終了ページは倉庫ディレクトリなどに 移設するのみにしていただけると嬉しいです. 簡単な内容のものでも,知らない人に説明するとき サンプル的に便利に利用させていただいております. |
|
>>1777 Netboy > CGIの小部屋は消さないで欲しいです. 了解いたしました。と決まれば、見られても恥ずかしくない 程度に brush up せねば。 |
|
いつも質問ばかりですいませんのふくしです。 Perl で use strict 'vars'; とすると、変数を使うときは パッケージを明示するか、my 宣言しないと怒られますが、 $a、$b という変数は怒られないで、%main:: シンボルテーブルに 追加されますね。$aa だとダメ。$c もダメ。なぜでしょう? 恐れ入りますがご存知の方はご教示ください。 |