In my experience, limited single-threaded throughput is due to low-level packet loss.
TCP treats packet loss as a signal of congestion, and slows down to avoid the network collapse - as it is designed to do.
However, packet loss which is *not* due to congestion will also cause TCP to slow down. Examples include links with low level bit errors, or microbursts of packets overflowing the limited buffer space in some switch in the path.
The formula is here:
https://en.wikipedia.org/wiki/TCP_tuning#Packet_loss
The maximum throughput of a single TCP connection, in bytes per second, is MSS / (RTT * sqrt(Ploss))
If a single stream is limited to 300Mbps with 9ms round-trip time, this formula predicts your packet loss is
(1460/.009/(300000000/8))^2 = .0000187
which is about 1 in 50,000 packets dropped; a very tiny amount of loss indeed.
The TCP throughput you can get goes down as the RTT goes up. This becomes a real problem when doing inter-continental transfers.
Such tiny amounts of packet loss are very hard for the ISP to diagnose, especially as there are all sorts of places this might occur, and it's understandable that the ISP says "there's no problem".
However, iDNet do risk losing their reputation as "top class" service provider if they can't get to the bottom of it, when other ISPs demonstrably perform better. If they're serious about it, they could install perfSonar nodes at various points in their network and measure packet loss between them.
If you really need to upload or download large files at such high rates, the best way to do it is with multiple TCP streams, using a protocol designed for this application, e.g. GridFTP, or even Bittorrent.
Edited by candlerb (Tue 05-Aug-25 14:53:35)