Why Choose a France VPS for Your Hosting Need
When it comes to selecting a location for your VPS (Vir...




A bulk transfer between two continents is not limited by the bandwidth you paid for. It is limited by how many bytes the two endpoints are willing to keep in flight at the same time, and by default that number is far smaller than the link can carry.
Here is the scene that produces most tickets of this shape. An engineer rents a server with a 30 Mbps port, runs a speed test against a nearby city, and reads 30 Mbps. Satisfied, they point a replication job at a bucket eleven time zones away. The job reports 7 Mbps. Nothing is broken. No provider is throttling anything. The port is idle most of the time, because the two ends keep stopping to wait for each other.
This is the bandwidth-delay product, and the uncomfortable part is that it is a division problem. You cannot buy your way out of it with a faster port, because the port speed is not in the numerator.
For a single TCP connection, sustained throughput has an upper bound that looks like this:
throughput = bytes in flight / round-trip time
That is Little's law applied to a pipe. "Bytes in flight" is the amount of unacknowledged data the sender has pushed onto the network and the receiver has committed to accepting. "Round-trip time" is how long it takes an acknowledgement to come back. Divide one by the other and you get the rate the connection can sustain, no matter how fat the pipe underneath it is.
The connection's capacity to hold data, meanwhile, is the bandwidth-delay product:
BDP = bandwidth x round-trip time
At 30 Mbps and a 150 ms round trip, that is 30,000,000 x 0.150 / 8 = 562,500 bytes, or about 549 KiB. The pipe can hold 549 KiB in transit. If the sender only puts 128 KiB on the wire before stopping to wait for an acknowledgement, the pipe runs at roughly a quarter of its capacity and the other three quarters are simply wasted. The bytes are not being delayed. They are not being lost. They are not being sent.
Notice what is absent from both formulas: the port speed does not appear in the throughput equation at all. It appears only in the BDP, which tells you how big a window you would need in order to use it. A 100 Mbps port and a 30 Mbps port across the same 150 ms path move within a few percent of the same number of megabytes per second, for the same reason.
The default is not arbitrary, and it is not a bug. It is 1990s arithmetic that survived into 2026 because it is still correct for the case it was designed for.
The TCP header's window field is 16 bits wide, which caps a plain advertised window at 65,535 bytes. That is fine on a local network: at a 1 ms round trip, 65,535 bytes in flight already sustains over 500 Mbps. It is hopeless on a path that crosses an ocean.
Two mechanisms exist to lift the cap, and both have conditions attached.
Window scaling. RFC 7323 adds a 14-bit scale factor that multiplies the advertised window. The theoretical ceiling is 65,535 x 2^14 = 1,073,725,440 bytes, just under 1 GiB. The option is negotiated during the handshake, so both ends must offer it. It is enabled by default on Linux (net.ipv4.tcp_window_scaling = 1), which is why this problem usually shows up as a tuning problem rather than a protocol wall.
Buffer autotuning. The kernel grows a socket's buffer to match what the path needs, but only up to a ceiling that depends on installed memory. On Linux, net.ipv4.tcp_rmem is a three-number vector: minimum, default, maximum. The minimum is 4 KiB. The default is 131,072 bytes, which is what produces an initial advertised window of 65,535. The maximum sits somewhere between 131,072 bytes and 32 MiB depending on how much RAM the machine has. The send side, net.ipv4.tcp_wmem, defaults to 16 KiB and maxes out between 64 KiB and 4 MiB, and it does not override net.core.wmem_max.
So on a freshly provisioned cloud instance you get two numbers that matter. The 131,072-byte default is the one that governs a connection that has just started, and it is the reason an untuned transfer is slow. The RAM-derived maximum is the one that governs a connection the kernel has decided to grow, and it is the reason a tuned transfer sometimes refuses to get faster.
Three footnotes that are easy to miss.
Autotuning can only grow a buffer up to the maximum in tcp_rmem (net.ipv4.tcp_moderate_rcvbuf defaults to 1, and its stop condition is that third value). Setting the socket option SO_RCVBUF or SO_SNDBUF explicitly turns autotuning off for that socket, so a well-meant application-level buffer override can freeze the window at whatever value it was given. And net.ipv4.tcp_limit_output_bytes, which caps how much a socket keeps queued locally, defaults to 4 MiB - comfortable at a 150 ms round trip, but the first thing to check on a very long haul.
Ask a specific question and the answer becomes a distance. At what round trip does a 128 KiB window stop being able to fill a 30 Mbps port?
131,072 bytes x 8 / 30,000,000 bits per second = 34.95 ms. That is the crossover. Below it, the default window is sufficient and the port is the binding constraint. Above it, the window is the binding constraint and the port is decoration.
A 34.95 ms round trip corresponds to about 17.5 ms one way. Light in fibre travels at roughly 200,000 km/s, so 17.5 ms is about 3,500 km of path. That is the distance at which the default configuration of a 30 Mbps server stops being able to use the bandwidth it was sold.
The table below is the same calculation swept across realistic round trips. Readings are for a single un-tuned TCP connection on a 30 Mbps port.
| Round trip | Achievable, 128 KiB window | Share of a 30 Mbps port | Share of a 100 Mbps port |
|---|---|---|---|
| 25.7 ms | 40.8 Mbps | 100% | 41% |
| 60 ms | 17.5 Mbps | 58% | 17% |
| 92 ms | 11.4 Mbps | 38% | 11% |
| 117 ms | 9.0 Mbps | 30% | 9% |
| 150 ms | 7.0 Mbps | 23% | 7% |
| 180 ms | 5.8 Mbps | 19% | 6% |
| 300 ms | 3.5 Mbps | 12% | 4% |
Read the last two columns together and the commercial implication is blunt. Going from a 30 Mbps port to a 100 Mbps port on a 180 ms path takes you from 5.8 Mbps to 5.8 Mbps. You are buying a wider road on which the same number of cars are driving, because the cars are what is scarce.
Raising the window is not a complete fix, because a larger window means more packets in flight and therefore more packets exposed to loss at any moment. The standard model for what loss does to a single TCP connection is the Mathis equation:
throughput = 1.22 x MSS / (round-trip time x square root of loss rate)
With a 1,460-byte maximum segment size, this is what it produces:
| Round trip | 0.01% loss | 0.1% loss | 1% loss | 2% loss |
|---|---|---|---|---|
| 25.7 ms | 175 Mbps | 55.4 Mbps | 17.5 Mbps | 5.5 Mbps |
| 60 ms | 75.1 Mbps | 23.8 Mbps | 7.5 Mbps | 2.4 Mbps |
| 117 ms | 38.5 Mbps | 12.2 Mbps | 3.9 Mbps | 1.2 Mbps |
| 150 ms | 30.0 Mbps | 9.5 Mbps | 3.0 Mbps | 0.95 Mbps |
The exponent is the story. A loss rate of one packet in a thousand, which looks like clean networking on a monitoring dashboard, cuts a 150 ms connection to 3 Mbps. Raise the window and you improve throughput only until the extra packets in flight start colliding with the loss rate. This is why buffer tuning delivers a step change and then plateaus, and why the plateau moves down as the path gets longer.
Loss-based congestion control also explains a behaviour that looks like a provider problem. When a connection is loss-limited, its throughput is choppy: it ramps, drops, ramps again. When it is window-limited, throughput is flat and low. Flat and low means tuning. Sawtooth means loss.
You do not need a packet capture to tell these apart. You need one command and one arithmetic check.
ss -ti on the sending host during a transfer prints, per connection, the current congestion window, the smoothed round-trip estimate, the retransmit count, and whether the socket is congestion-window-limited. That single line distinguishes the three cases.
| What you observe | What it means | Ordered first fix |
|---|---|---|
| Throughput is almost exactly window / round trip; doubling the buffer doubles the rate; retransmits near zero | Window-limited. The receiver is refusing to accept more data. | Raise the receive window within the RAM-derived ceiling |
| Throughput is flat regardless of buffer size; retransmit counter climbing; throughput tracks the Mathis curve | Loss-limited. The window is already large enough; the path is dropping. | Parallelise or switch congestion control, not buffers |
| One stream is slow but N streams give roughly N times the throughput; per-connection rate unchanged | Per-connection ceiling. Aggregate capacity is available. | Add streams |
| Throughput matches window / round trip on the server but not on the client | The bottleneck window is at one end only. Check the other host. | Verify both endpoints |
The arithmetic check is the one worth doing before anything else: take measured throughput, multiply by measured round trip, and compare the result to the window you believe is in use. If the product lands on the default, you have found the ceiling. If it lands somewhere above the default but below your buffer setting, the buffer is not the constraint and you should stop tuning it.
Slow cross-region transfers attract confident diagnoses. Most of them are testable in ten minutes, and most of the time they are wrong.
| Diagnosis | What the evidence would look like if it were true | Why it usually is not |
|---|---|---|
| The port is too small | A single-stream transfer saturates the port on a short path, and only underperforms on long ones | If it saturates on a short path, the port is not the variable that changed. Distance is. |
| The provider is throttling | Throughput capped at a round number; equal for short and long paths; N streams also capped at the same total | Window limiting produces a cap that varies with round trip and lifts as you add streams. Throttling does not. |
| Peering or routing is bad | Elevated latency and loss on the path, visible in traceroute and in jitter | Frequently true as an aggravating factor, but you need the loss numbers to claim it - flat low throughput with no loss is not routing. |
| The disk or CPU cannot keep up | The sending process never fills the socket; local write throughput is the floor | Testable: if a local network transfer also fails to reach line rate, look here. If only the remote one does, look at the window. |
There is a cost argument buried in the first row that is worth stating plainly. Upgrading the port on a high-latency path is the most expensive way to buy nothing. Upgrading the instance so the kernel's autotuning ceiling is higher has a similar shape: a larger machine raises tcp_wmem's maximum, which helps, but it does not raise the 131,072-byte default that governs the first seconds of every connection, and it does nothing at all about loss. Both purchases are sometimes right. Neither is the first move.
Work down this list. Stop when the measured throughput stops improving.
ss -ti shows a window far above 65,535 on an established connection when scaling negotiated. If it does not, the option did not survive the handshake and no amount of local tuning will help.sysctl net.ipv4.tcp_rmem and net.ipv4.tcp_wmem; if the last value is under what the path needs, raise it. Then confirm the transfer changed, because a change in a sysctl that does not move a number is not a fix.The four-line worksheet is the whole method. Do it before the first byte moves, and you will know within an order of magnitude whether a job is a two-hour job or a two-day job.
SO_RCVBUF disables autotuning.Run the arithmetic on 100 GiB and the shape of the problem appears immediately.
| Effective rate | How it arises | 100 GiB takes |
|---|---|---|
| 1 Mbps | Severe loss on a long path | 238.6 hours (9.9 days) |
| 7.0 Mbps | 128 KiB window at a 150 ms round trip | 34.1 hours (1.4 days) |
| 30 Mbps | Port saturated - requires a short path or a tuned window | 7.95 hours |
| 100 Mbps | Port saturated on a short path | 2.39 hours |
| 559 Mbps | A 16 MiB window at a 150 ms round trip | 0.43 hours |
| 1 Gbps | Port saturated, short path | 0.24 hours |
Two habits make this worksheet reliable. Measure round trip to the actual destination host, because the number you need is the one your transfer will experience - the discipline is the same one used for measuring exchange API round-trip time before relocating a trading bot. And decide the aggregation question separately: how much monthly volume a port can carry is a different calculation from how fast one transfer will run, and the two are frequently confused. The first is covered in how much bandwidth you actually need; this article is about the second.
Everything above is a software ceiling, and software ceilings can be moved. Underneath them is a physical one that cannot.
Light in fibre travels at about 200,000 km/s, which is 5 microseconds per kilometre. A round trip is there and back, so the floor is 10 microseconds per kilometre of path, before any router, any queue, and any congestion. That yields the following minima from a Hong Kong node.
| Destination | Great-circle distance | Round-trip floor | Achievable with a 128 KiB window |
|---|---|---|---|
| Taipei | 810 km | 8.1 ms | 129 Mbps |
| Manila | 1,140 km | 11.4 ms | 92 Mbps |
| Ho Chi Minh City | 1,490 km | 14.9 ms | 70 Mbps |
| Seoul | 2,070 km | 20.7 ms | 51 Mbps |
| Singapore | 2,570 km | 25.7 ms | 41 Mbps |
| Tokyo | 2,890 km | 28.9 ms | 36 Mbps |
| Jakarta | 3,260 km | 32.6 ms | 32 Mbps |
| Mumbai | 4,300 km | 43.0 ms | 24 Mbps |
| Dubai | 5,900 km | 59.0 ms | 18 Mbps |
| Frankfurt | 9,200 km | 92.0 ms | 11 Mbps |
| London | 9,650 km | 96.5 ms | 11 Mbps |
| Los Angeles | 11,650 km | 116.5 ms | 9 Mbps |
| Washington DC | 13,100 km | 131.0 ms | 8 Mbps |
| Sao Paulo | 18,000 km | 180.0 ms | 6 Mbps |
Compare the fourth column with the port sizes sold on entry tiers and the selection question answers itself. If your counterparties are in Taipei, Manila, or Ho Chi Minh City, the distance is short and the default configuration is not a problem. If they are in Frankfurt or Los Angeles, the distance alone roughly halves your achievable rate before any tuning, and the floor does not move because you bought a bigger instance.
This floor is also the reason the topic keeps mattering. Geoff Huston's review of the Telegeography keynote at NANOG 98, published on 28 October 2026, puts international bandwidth demand growth at about 30% a year: roughly 2 Pbps of additional in-service international capacity per year today, rising past 10 Pbps per year by 2035. The same review notes that the four largest hyperscalers now fund 38% of submarine cable investment privately and participate in a further 25% through consortia - 63% in total - and that the transatlantic route is 85% privately funded.
The other half of the picture is that the physical plant is ageing. An earlier APNIC analysis, published 14 October 2026, counts about 1.5 million kilometres of subsea cable across 607 in-service systems, finds that 86% of faults are caused by fishing activity or anchoring, and records a longest single repair of 947 days. Around 60 vessels worldwide are capable of doing the work, and roughly a quarter of current cable kilometres - about 845,000 km - is expected to be retired by 2030. That is the supply side of every long-haul transfer budget written this year. The floor is a property of where the two ends are, and it is not going to move.
The analysis above turns into a purchase decision at exactly one point: whether your round trip falls below or above the crossover for the entry tier you are considering.
The Hong Kong lightweight tiers on the Hong Kong node cloud server page each ship a 30 Mbps outbound bandwidth allocation, from the 1 vCPU / 2 GB / 40 GB entry at $6.75 per month up to the 4 vCPU / 8 GB / 120 GB tier at $24 per month, with included monthly traffic rising from 1 TB to 4 TB across the five tiers. All five carry a renewal price equal to the first-term price, which matters for a replication job you intend to leave running. The page also lists five enterprise-grade configurations from $20.32 to $192.89 per month on 5 to 50 Mbps allocations with unmetered traffic, alongside a 99.95% availability commitment and 17 or more availability zones.
Read those against the crossover table. A 30 Mbps allocation stops being the binding constraint at about a 35 ms round trip, which is roughly 3,500 km. Eight of the zones on that page sit inside that radius from the Hong Kong node - Taipei, Manila, Ho Chi Minh City, Bangkok, Jakarta, Singapore, Tokyo and Seoul - and for those destinations the 30 Mbps port is genuinely the limit, so the entry tier is a coherent purchase. For Frankfurt, London, Los Angeles or Sao Paulo it is not, and no tier on the page changes the arithmetic, because the constraint there is the window and the distance rather than the port. What the Hong Kong location does buy in that case is the shortest path to the Asian destinations that are within reach of the crossover threshold in the first place - which is the same structure examined, from the latency side, in why region choice is an arithmetic problem.
For workloads where the remote endpoints are far away, the honest answer is that the topology is wrong rather than the server too small. Move the compute, cache the working set locally, or accept the transfer time and schedule around it. Where a single long-haul session does have to complete in a predictable window, the lever is streams and congestion control rather than port width - a distinction with the same shape as the one in the four lines of a game server's latency budget, where the term people measure is usually the smallest one.
Because they are not measured against the same destination. A speed test almost always targets a nearby endpoint, where the round trip is small and even the default window saturates the link. The transfer crosses a continent. Run the speed test against a host at the transfer's destination and the two numbers will agree.
On a long path, no. The achievable rate at an un-tuned 128 KiB window is independent of port size, so on a 180 ms path a 30 Mbps port and a 100 Mbps port both deliver about 5.8 Mbps. A larger port only helps after the window and loss limits have been raised above where the port becomes the constraining factor.
It depends on distance, not on the number. The question to ask is whether the destination is inside roughly 3,500 km. Inside that radius a 30 Mbps allocation is usable in its default state. Beyond it, expect to get a fraction of the advertised rate per connection until the window is raised - and expect the fractions in the crossover table above.
They avoid the specific mechanism, because there is no advertised TCP window to be the bottleneck. They do not avoid the physics or the loss. A well-implemented UDP transfer protocol actively manages its own send rate against measured capacity, which is exactly the job TCP's window and congestion control would otherwise do badly on a long path. The floor in the region table applies to both.
Because each connection carries its own window, its own congestion state, and its own loss recovery. N connections put roughly N times as many bytes in flight, which is the quantity that was capping the single stream. The gain continues until the port or the path's loss rate becomes binding - which is why parallel transfer tools tend to hit a plateau of their own rather than scaling indefinitely.
The reason this topic keeps generating support tickets is that the failure looks like a capacity problem and is in fact a configuration and distance problem. The port is idle. The provider is doing nothing wrong. The link is not congested. What is missing is bytes in flight, and the fix is a division you can do on paper in about two minutes.
Measure the round trip to the real destination. Compute window divided by round trip. Compare the answer to the rate you are seeing. In most cases the two will match within a few percent, and the argument is over. If your destinations are inside about 3,500 km of a Hong Kong node, an entry tier with a 30 Mbps allocation in its default state is the right shape of purchase. If they are not, the honest recommendation is to change the topology or the schedule rather than the plan, and to spend the tuning effort on streams and congestion control where the arithmetic actually rewards it.
SurferCloud runs 17 or more availability zones, with the Hong Kong node anchoring the regional map published on that page. The lightweight Hong Kong tiers start at $6.75 per month and renew at the same price. If you are sizing a replication job and want the zone list next to the crossover table above, the Hong Kong node cloud server plans are the place to start.
When it comes to selecting a location for your VPS (Vir...
Shopify is a popular e-commerce platform that helps mer...
In today’s digital world, having a fast, secure, and ...