ネットが遅くてイライラしてない!?

ふと思った事なのですが、フリーソフト等ダウンロードをFTPで行った際、たまに「ファイルが破損」しています。
といったエラーになる場合があります。

再ダウンロードするとうまく動く(解凍できたり)のです。

そこで質問なんですが、
FTPはTCPを使用していると思っています。
TCPというと参考書などには「再送制御?」なるものがあり、
確実なファイル転送がおこなえるような記述がなされています。

TCP環境下でビットの欠落が起こるえるんでしょうか?

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

大事な事が抜けていました。



「確実なパケット転送」の意味ですが、これは「送ろうとしたパケットが確実に相手に転送される」と言う意味ではありません。そんな保証はどこにもありませんし誰も保証してくれません。

「確実なパケット転送」の本当の意味は「転送を試みた後に『転送成功』と言われたパケットは、パケットの内容が元と違ってたり化けてたり欠落していたりせずデータが正しいのは保証する。だが『転送失敗』と言った場合は『失敗したのは保証する』けども、その他は一切保証しない。データの中身もどうなってるか判らない」と言う意味です。

つまり「転送を試みたら失敗と言われた」とか「転送を試みたらいつまで経っても転送が終らず、結果待ちしてるうちに接続が切れる」と言う事もある、と言う事です。

これもやっぱり「TCPエラーやTCPタイムアウトに対してソフトウェアがどういう挙動を取るか」の問題になります。

この回答への補足

回答ありがとうございます。

ダウンローダーは「正常終了」になっています。
ということは

・パケットはきちんと送られているが、パケットを結合するクライアントソフト側に問題がある。
・パケットの転送失敗とTCPではなっているが、クライアントソフトがエラーをスルーしてしまう?などクライアントソフトの仕様に問題がある。

ということでよろしいのでしょうか。

補足日時:2006/03/31 13:46
    • good
    • 0

FTPにはいくつかの転送モードがありますが、一番使われているのは、ファイルをそのままTCPで送り、TCP接続を閉じることによってファイル末を示すというものです。


この場合、何らかのトラブルでデータ転送のTCP接続が途中終了してしまった場合と最後まで転送し終わって接続をクローズした場合とが区別できない事があります。結果として、正常終了したのに尻切れトンボのファイルがクライアント側に残る、と思います。
詳しくはFTPのRFCを読んでください。
    • good
    • 0

ブラウザでのFTP転送に失敗しているのなら、始めからそう書いた方がよくありませんか?


またブラウザ搭載のダウンローダー?なら、そのダウンローダー名とバージョンも必要でしょう。

サーバー上にあるファイルは破損していない事が大前提ですが、その確認はとれていますか?
UDPで転送しているのなら兎も角、TCPで転送しているのに破損してしまうのはchie65536さんが書いたように、ソフトウェアが起因している可能性大です。

普通のブラウザでFTP接続してDLしてみましたか?

この回答への補足

ブラウザ搭載以外にも専用ソフトでも経験しています。

補足日時:2006/07/03 11:38
    • good
    • 0

問題の切り分けが出来ていません。



FTPは「ファイルのアップロードやダウンロードが途中で中断され完了しないで終り、転送先に尻切れになったファイルが作られる事もある」と言う前提で設計されています。

その為、一部のFTPサーバーには「中断した転送を再開するオプション」があります。

あくまでも、これは「FTPのプロトコルがそういう風に設計されている」のが原因で、TCPとかは無関係の話です。

TCPが保証しているのは「確実なファイル転送」ではなくて「確実なパケット転送」な筈です。

もちろん、パケットのビット欠落が起きればちゃんと再送制御が行われますし、接続が切れない限りは相手に「パケットが」確実に届きます。

ですので、FTPサーバーソフトやFTPクライアントソフトがファイルを幾つものパケットに分割して転送する際、1つ1つのパケットがパケット単位で確実に転送されるのがTCPにより保証されます。

しかし、全部のパケットが全部キッチリ正しい順番で転送されるかどうかは、TCPにとっては「俺はそんなの知ったこっちゃない。俺にパケット転送依頼してる上位のソフトウェアに文句言え」なのです。

「全部のパケットが全部キッチリ転送されて、転送されたパケットが正しい順番になって、ローカルディスクにちゃんとセーブされて、正しいファイル名が付く」かどうかは、FTPサーバーソフトとFTPクライアントソフトが保証すべき問題であり、ストレートに言えば「ソフトウェアの問題」です。
    • good
    • 0

TCP接続を行っていたとしても、パケットの欠落はありますよ。


TCPプロトコルはデータの抜けや重複、送信側で送ったデータがそのままの順序で正しく受信側へ届くという“信頼性”があるだけで“完全”ではありません。

確かに送信側から受信側へ正しく届かなかった場合は再送する事になっていますが、その再送もうまくいかず結果的に破損した状態になってしまう事があります。

結局はネットワークの状態に因るところが大きいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ブラウザ搭載のダウンローダによりおこなっていますが、
「正常終了」しているのに「ファイル破損」状態になってしまいます。
これは「正常終了」とするクライアントソフト側の問題であり、TCP側は転送エラーのようなものを出力して終わり。
というイメージでよろしいでしょうか。

お礼日時:2006/03/31 13:43

いくつ物要因がありますが


よくある要因のひとつとして
ファイルをDL中になんらかの理由で
タイムアウトを起こしたとします。
(回線の混雑だったりサーバがこけたり
いろいろな要因で)
そのようなファイルは壊れたファイルになりますよね。

この回答への補足

回答ありがとうございます。

ファイルは正常終了で生成されている(例えばlzh)が、
解凍するとファイル破損になる。
という状況なのですが

回答者様が言われている「タイムアウト」は
「パケット一つ一つ」の「タイムアウト」ということでよろしいでしょうか。

他回答者さまのをみると、その場合、タイムアウトと表示するのはクライアントソフト次第ということでしょうか。

補足日時:2006/03/31 13:35
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qftpでダウンロードすると、ファイルが壊れてしまいます

お世話になります。
ftpで、getを使って
get test.jpg
のようにjpgファイルをダウンロードすると、実際のファイルサイズより大きくなり、また「ファイルが壊れている」という表示が出てしまいます。
申し訳ありません。どなたか、助けていただけないでしょうか。
よろしくお願いいたします。

Aベストアンサー

FTPには、バイナリモードとテキストのASCIIモード、二種類の転送方法があります。

モードを指定せずに get コマンドを実行すると、テキストのASCIIモードで転送処理が行われます。テキストのASCIIモードでは、かってに文字コードを変換するので、想定しているものと別の状態になる場合があります。

これを、バイナリモードに宣言してから、get コマンドを実行すれば、送信側と受信側とでまったく同じファイルが作成されます。

> get test.jpg
このコマンドを実行する前に、

> bin
と入力して、バイナリモードの宣言をしてみてください。

QFTPの送信結果を検知したい

WindowsでFTPをバッチファイルから呼び出すことを考えています。FTPで送信エラーが発生した場合に、FTPのエラーとして検知したいのですが、その方法をご存じのかたおりましたら教えて下さい。(Windows-NTで標準で提供されるFTPを使用しています)直接私が確認したわけではありませんが、FTP送信でエラーが発生してもFTPの終了コードが0になってしまうらしく、FTPのエラーを検知できないそうです。WindowsであればWindows-NT以外の環境でもかまいませんので、ご存じのかたおりましたら教えて下さい。

Aベストアンサー

標準のツールでやるなら、ftpコマンドの出力をファイルにリダイレクトして、find か findstr コマンドで適当な文字列の有無で判断するしかないですね。

>FTPで転送後に転送先のホスト内のある処理が自動的に動き
とのことですが、転送先ホストで単純にデータファイルの有無で先に進むと、転送途中のファイルを読んだり、転送エラーで途中で終わったファイルを読んだりする可能性があるので、普通は、転送元でデータファイルの正常転送を確認後に目印ファイル(中身は空でよい)を送り、転送先では目印ファイルがあることでデータファイルが正しく受信できたことを判断して目印ファイルを消して先に進む(データファイルを処理する)のが良く使われる手法です。

QFTPでエクセルをPUTするとファイルが破損する

このサイトを参考にvbaでFTPでファイル転送を実装しようとしています。
http://www.happy2-island.com/access/gogo03/capter90302.shtml


FtpPutFile Lib "wininet.dll"


上記のFTPプットの部分で問題がありそうです。

ローカルからLAN経由で接続されたFTPサーバーを使い
ファイルサーバーへエクセルファイルをアップロードしたいのですが
ファイルが破損して開けなくなってしまいます。

バイナリ転送、アスキー転送と転送モードを変えて試しても
NGでした。

xmlファイルなどテキストであれば問題なくアップロードできました。


エクセルファイルはFTP転送できないのでしょうか?
なにかよい方法があれば教えてください。

宜しくお願い致します。

Aベストアンサー

バイナリ転送で出来るはずです。
Option Explicit は記述してますか?


人気Q&Aランキング