I can't even FTP to this external server in normal FTP mode, I have to use Passive Mode:
To be expected, if the external server is behind a firewall not allowing a standard ftp connection..

If this is true
instant, but then the actual upload appears to take something like three or four minutes.

and this is true
A desktop FTP client upload is also more or less instant for the same file.

then you are making the connection and transferring the file. Therefore passive/active is certainly not the problem.

I am guessing your problem is one or a combination of TCP window sizing (mismatches across the transit interfaces), or MTU/sizing or path MTU discovery enabling/disabling.

Here's why:


A desktop ftp client probably has dynamic auto window sizing, negotiating the transfer sizing all along, or some have FTP window sizing negotiation with the server at that level . . So it's possible that your client ftp app on a desktop system is going to transfer the file successfully based on its own capabilities, starting out with small window sizing, and figuring out optimizing the transfer before doing it.

And that may not be the case at all on your Linux server on the transfers to the external Windoze server.

The logon is instant, the CWD is instant, the rename of the old file with ".bak" is instant
All of which make perfect sense since these operations are invoked with small commands, all of which fit within one packet and are executed either locally or remotely without further data payload to transfer

Now if you're root on the box you'll have the luxury of changing the following settings on Linux (2.4 kernel?), which could be affecting things, if they have been set away from the usually very good defaults. Look in /proc/sys/net/ipv4 at the tcp tuning stuff

These are all normally set to "1"
/proc/sys/net/ipv4/tcp_timestamp /proc/sys/net/ipv4/tcp_window_scaling /proc/sys/net/ipv4/tcp_sack

And this is usually set to "0"
/proc/sys/net/ipv4/ip_no_pmtu_disc

And then you have the send and receive socket buffer sizes
/proc/sys/net/core/rmem_default (default receive window) /proc/sys/net/core/rmem_max (maximum receive window) /proc/sys/net/core/wmem_default (default send window) /proc/sys/net/core/wmem_max (maximum send window) /proc/sys/net/ipv4/tcp_rmem (memory reserved for TCP rcv buffers) /proc/sys/net/ipv4/tcp_wmem (memory reserved for TCP snd buffers)

Here's the values on my default system:
/proc/sys/net/ipv4 # cat tcp_wmem 4096 16384 131072 /proc/sys/net/ipv4 # cat tcp_rmem 4096 87380 174760

I don't see that Net::FTP or Net::Config contain ways to handle transfer size negotiation. But at least you could check if your base system has been drastically altered... or there may be some wierd issue between the firewall and Windows box interface negotiating..

If it's not any of this stuff, please post the answer if you find one.. this kind of stuff also happens a lot with scp, sftp across certain "broadband routers" and crap 802.11b hardware...

If all else fails, it's perfectly permissible to blame the Microsoft system on the other endpoint:)

This and also this one are great resources..


In reply to Re: Net::FTP takes a very long time in Passive mode by hsinclai
in thread Net::FTP takes a very long time in Passive mode by Cody Pendant

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.