Diagnosing FTP Speed and Connection Problems: A Network Debugging Guide
When FTP slows down, the cause is rarely "FTP is slow" — it's usually a local-network issue, an intermediate routing problem, a misconfigured passive-mode range, or a server-side bottleneck. This is the debugging guide: ping for basic reachability, MTR for per-hop loss, iperf3 for raw bandwidth, and the order to investigate so you get to the answer in under an hour.
When an FTP transfer is slow, the question is rarely "is FTP the problem?" — it's "where in the path is the problem?" Local network, your ISP, the routing path, an intermediate firewall, the FTP server itself, or the protocol overhead. This post is the debugging guide: a five-step order of investigation, the tools you'll actually use (ping, mtr, iperf3, your FTP client's verbose logging), and the common patterns that point to specific root causes.
The five places "slow FTP" can come from
Before any tool, the mental model:
- Your local network or machine. WiFi instead of wired, saturated upstream, CPU pegged, antivirus scanning every transferred byte.
- Your ISP or the network path. Packet loss, congestion, peering issues, transit-provider problems.
- A firewall or NAT in the path. Deep packet inspection slowing FTP control/data channel coordination, NAT rewriting
PASVresponses incorrectly. - The FTP protocol itself. Active vs passive mode misconfiguration, ASCII vs binary transfer mode, lack of resume on large files.
- The server side. Server CPU saturated, disk I/O saturated, storage backend slow, concurrent-connection limit hit.
Most "slow FTP" tickets resolve in #1, #2, or #4. The order of investigation below catches each cause efficiently.
Step 1: Establish baseline reachability with ping
ping -c 20 sftp.example.com
Look at the output for two things:
- Average round-trip time. Should be roughly what geography predicts — same-region: 5–30 ms; cross-region: 30–100 ms; cross-continent: 100–250 ms; satellite: 500–1500 ms. Higher than that for the expected geography is a flag.
- Packet loss. Anything above 0% in a quiet network is suspicious. 1–2% loss can degrade FTP throughput dramatically because TCP retransmits eat into the effective bandwidth.
If ping is broken entirely ("Request timeout" for every packet), the server might block ICMP — that's not the same as the server being down. Try connecting to the actual FTP port instead:
nc -vz sftp.example.com 21 # for FTP
nc -vz sftp.example.com 22 # for SFTP
nc (netcat) reports "succeeded" if the port accepts connections. That confirms basic reachability even when ICMP is blocked.
Step 2: Find the slow hop with mtr
ping tells you reachable; mtr tells you where in the network path the slowness lives.
mtr -r -c 100 sftp.example.com
The -r flag runs in report mode (10 probes per hop), -c 100 increases the probe count to surface intermittent issues, and the output shows per-hop loss and latency. See our guide to reading MTR output for the patterns worth recognizing.
The key pattern for slow-FTP debugging: if loss starts at a specific hop and continues to the destination, that hop is the bottleneck. If loss appears at one hop but the destination is clean, that's just ICMP rate-limiting at the intermediate router (cosmetic, not affecting real traffic).
If MTR shows the problem is on your ISP's network, your options are limited — file a ticket with the ISP, or route around it via VPN. If it's at the destination's network, the FTP service provider needs to address it.
Step 3: Measure raw bandwidth with iperf3
If MTR is clean but FTP is still slow, the problem isn't packet loss — it might be bandwidth. Test raw throughput between your machine and the server with iperf3:
# On the server:
iperf3 -s
# On your client:
iperf3 -c sftp.example.com -t 30
Compare the result to what your FTP transfer is achieving. If iperf3 shows 100 Mbps and your FTP transfer is getting 10 Mbps, the protocol or server-side is the bottleneck, not the network. If iperf3 matches the FTP transfer rate, the network is the constraint.
iperf3 only works if you can run it on the server — typical for self-hosted infrastructure, not for hosted FTP providers. For hosted, use file downloads of known-size test files as a substitute (download a 100 MB test file, time it, compute throughput).
Step 4: Rule out protocol-level issues
FTP has a few configuration gotchas that look like slowness:
Active vs passive mode. Active-mode data connections fail through most modern firewalls — see our active vs passive FTP explainer. Symptoms: directory listing works fine but file transfers hang. Fix: switch the client to passive mode.
ASCII vs binary transfer mode. FTP's ASCII mode translates \r\n line endings, adding per-byte overhead. For binary files (everything that isn't plain text), make sure the client is in binary mode:
ftp> binary
This is rare in modern clients (which default to binary), but a custom script using the legacy ftp CLI may default to ASCII.
Small TCP window sizes. Long-distance transfers can be bottlenecked by TCP's bandwidth-delay product. If your transfer caps at a fraction of available bandwidth on a high-latency link, the TCP window may be too small. Modern clients handle this automatically; legacy ones might not.
Lack of resume on large files. If a transfer is restarting from byte zero on every retry, you're paying full bandwidth for partial progress. See our FTP resume guide for the resume mechanics.
Step 5: Check server-side bottlenecks
If everything in steps 1–4 is clean, the server itself might be the constraint:
- CPU saturation — encryption overhead on FTPS / SFTP transfers can saturate a single CPU core on older hardware. Check the server's CPU utilization during a transfer.
- Disk I/O saturation — for large transfers, the server's disk subsystem can become the bottleneck.
iostat -x 1shows per-disk utilization. - Concurrent-connection limit hit — most FTP daemons cap concurrent connections. If you're transferring multiple files in parallel and hitting the limit, additional transfers queue up.
- Storage backend slow — if the server is backed by network storage (NFS, S3-backed FUSE, SAN), the backing storage's latency adds to every operation.
For hosted FTP services, the provider's status page is usually the right starting point for these. For self-hosted, the standard Linux observability tools (top, iostat, vmstat, ss -s) tell the story.
Common patterns and their causes
After running through the steps above, the most common diagnosis patterns:
- Throughput well below available bandwidth, no packet loss in MTR → probably TCP window size on a high-latency link, or FTP protocol overhead. Switching to SFTP (single connection) sometimes helps; for very large transfers, parallel chunked uploads (multipart S3) work better than serial FTP.
- Transfer starts fast then degrades → typically a queued backend or a thermal-throttling issue on the server. Less common cause: ISP throttling for "heavy users."
- Directory listing fast, file transfer slow → almost always passive-mode-port-range firewall issue. The control channel works but the data channel is hitting a constrained path.
- One specific time of day slow → network congestion or server load at predictable hours. Less actionable on the client side.
- Consistently slow regardless of file size → server-side CPU / disk bottleneck. Check the server's utilization during a transfer.
- Slow only on TLS connections → cipher mismatch or session-reuse issues. Try forcing a different cipher in the client.
The modern way: a platform that observes itself
Files.com is the File Orchestration Platform we'd recommend for FTP / SFTP workflows where transfer reliability matters. The platform handles the network-side concerns that turn into support tickets — passive mode auto-configured, TLS auto-managed, geographic load balancing for global teams — and provides per-transfer observability that makes "why was that transfer slow?" answerable:
- Per-transfer audit logs with start time, end time, byte counts, and transfer rate.
- Geographic load balancing routes connections to the nearest endpoint, reducing the latency contribution to slow transfers.
- Modern protocol support — HTTP-based REST API and SDKs for cases where the FTP-protocol overhead is the bottleneck.
- Webhook notifications on transfer completion or failure so automation knows immediately when something didn't finish.
Start a free Files.com trial — no credit card, provisioned in about 10 minutes.
For teams that need to run file-transfer infrastructure inside their own datacenter, the free ExaVault on-premise appliance handles SFTP / FTPS / FTP / WebDAV with proper passive-mode configuration from a self-hosted VM image.
FAQ
Why is FTP so slow?
The most common causes: passive-mode firewall configuration broken (control channel works, data channel hangs), TCP window size too small for high-latency links, server-side CPU or disk saturation, or — for FTPS specifically — TLS cipher overhead on older hardware. Use mtr to identify where in the path the slowness lives before assuming it's the FTP protocol.
How do I test FTP speed?
Three approaches: time a known-size file transfer and compute throughput (simple, works against any FTP server), run iperf3 between client and server (precise, requires running it on both ends), or use a built-in FTP-speed-test feature in your client (FileZilla has one in the queue view). For network-path-specific testing, mtr -r -c 100 sftp.example.com shows per-hop latency and loss.
What's a good FTP transfer speed?
Depends on the network path. Within the same datacenter or region, 100+ MB/s is achievable. Across regions on a normal commercial internet connection, 10–50 MB/s is more typical. Cross-continental or via consumer broadband, 1–10 MB/s is common. Throughput well below those ranges suggests a specific issue worth diagnosing.
How do I ping an FTP server?
ping sftp.example.com
That tests basic reachability via ICMP. If ICMP is blocked (some servers and most cloud load balancers rate-limit ICMP responses), test the actual FTP port instead:
nc -vz sftp.example.com 21
nc -vz sftp.example.com 22
Why does my FTP connection time out?
Three common causes: server is down or unreachable; firewall blocks the control port (21 for FTP, 22 for SFTP); or — most often — passive-mode data ports aren't open on the firewall in front of the server. Symptoms differ: control-port firewall failure means you can't even log in; passive-port failure means you log in fine but file transfers hang.
What's the difference between ping and MTR?
ping tests round-trip time to a single destination. mtr tests round-trip time to every hop along the path. When something is slow, ping tells you "yes, it's slow"; mtr tells you which hop is causing the slowness. See the MTR guide.
How do I check FTP connection quality?
Run mtr -r -c 100 sftp.example.com for a 100-probe report. Clean output (zero loss at the destination, consistent latency) means the network path is fine. Loss starting at a specific hop and continuing to the destination means that hop is the bottleneck. Latency spikes at an intermediate hop that don't propagate to the destination are cosmetic (ICMP rate-limiting), not real performance issues.