Your internet speed measurement
I think this is a measurement unit error, your internet speed is measured in kilobits while uploads and downloads tend to be measured in kilobytes, this causes confusion and pain to users who (quite rightfully) expect these things to be measured in the same way.
Your internet upstream speed is 800-950 kilobits, we divide this by 8 to get speed in kilobytes:
950 / 8 = 118.75 kilobytes
To me this sounds very much like the speed you are getting, ignoring random jumps to 200kbps which could simply be due to bursts, stalls, measurement errors or other freak occurrences.
The upshot of this is that your internet connection, computer and network are fine, the down side is that you are fully saturating your internet connection and that is making it difficult for website requests and downloaded data acknowledgments to get through.
I would recommend finding some bandwidth management software and try halving the speed you are uploading at, if suddenly everything is more responsive then your problem is well and truly a saturated internet pipe.
Why uploads kill internet speed.
Just thought I would add some details regarding why saturating your internet connection causes slow response times for normal browsing...
Almost all programs that deal with the network will be working through some kind of FIFO ("First In, First Out") buffer, which basically means that there is a queue of data to come into the machine and a queue of data going out of the machine.
Typically for all the incoming data any program that is expecting data is able to empty their incoming buffer pretty quickly and send a small "acknowledge" packet back to request the next block of data. That acknowledge gets put on the outgoing queue and, as typically there isn't much outgoing traffic makes it to the front of the outgoing queue pretty much instantaneously and so the cycle of download and acknowledge continues.
This FIFO queue becomes a problem when you start uploading. Lets say that Window might have a queue of 400 kilobytes, I don't know for sure but it seems a reasonable number these days. What that means is when you upload a small file of say 200 kilobytes then it will get pushed onto the queue and the program can continue on and assume the data has been sent or at least will be gone quite quickly, say 1-2 seconds at most, hardly noticeable really.
When you start uploading larger files though this queue becomes a bottleneck, one program filling this queue as fast as it is allowed to will mean that another program that just wants to send one small "give me this web page" request will have to wait for one full turn through the entire length of the queue which, with a 400 kilobyte queue at about 125 kilobytes bandwidth means that it will take at least 3 seconds before it gets to the front and has left the queue, it might receive a block of data back quite quickly as the downstream buffer is pretty empty but then the "send me more data" request will take another 3 seconds before it can make its way out of the queue again.
It's all the time waiting in the queue that will cause the website requests to timeout while uploading data, most sites and browsers are tuned to expect the turnaround to be under a second from the request of data to starting to receive it so having this big buffer in the way causes markedly larger delays than they expect. As that queue buffer gets larger so does the time for any request to make it through the queue and out onto the actual internet.
When you limit the bandwidth of any given program what you are effectively doing is slowing the rate that that program can put the data on the queue, this means that the queue can be emptied at a rate faster than it is being filled and prevents the queue from getting full. Any other program that puts data or a request on the queue can expect a shorter time for it to reach the front of the queue (as it is no longer anywhere near full) and so the connection seems to "just work better".
Wow, that was longer than I expected.
You have too many variables against you.
Logically, your path of connection is:
- Computer -> Router
- Router -> Modem
- Modem -> ISP
- ISP -> routes
- routes -> SpeedTest.net
- reverse
routes is determined by traceroute from your connection to speedtest.net and reverse is the same connection back, perhaps on different routes.
One. Assuming that your connection to the router is greater than 30Mbps then let's temporarily eliminate that connection (Unless you're using a WirelessB Router which has transfer rates of 11Mbps).
Two. If the patch cable from your Router to your Modem is a 10Mbps Base Ethernet cable then you will never see 30Mbps connections from your computer.
Three. If your Modem has a low SNR then you may need to have this boosted by your ISP. Even if they can provide you with that fast of a connection, if you have a lot of noise in your line whether from an amplifier that you installed prior to the modem connection or just poor connection to your ISP, this could cause interference and you will not see the full bandwidth that you're paying for. Also, you may have issues with the protocols that you're transferring on. They may restrict torrents to only 10Mbps where as port 80 traffic transfers at 30Mbps.
Four. You should google Internet Health Report to see if there are major internet backbones down that could be causing your connection issue. (http://www.internetpulse.net/) If you're experiencing slow speeds intermittently then it could be due to an internet backbone having issues. Internet Backbones are what piece together and tie in all of our networks together. They relay traffic and provide connections to various ISPs. By having a greater latency on a backbone where you have traffic going through, it may look like you're having issues connecting to some websites but not others. Below is a screenshot taken just a minute ago.
Five. Just because you have 30Mbps connection doesn't mean that you will achieve those speeds if the host providing you that information is not uploading at that speed. If the SpeedTest.net server that you're testing with is only capable of uploading at 10Mbps then that is the greatest speed that you will see. You should always test against other servers when using SpeedTest.net because they may not always give you the fastest server. They usually just pick the one with a quick ping. Doesn't necessarily mean the fastest. For example, using SpeedTest on your phone may pick a location far from you and return slow results. Sometimes picking one closer or a different server will return various results. It's a hit or miss.
Conclusion. Easiest thing you can do to test this is eliminate the number of jumps. Connect your computer directly to your modem. Go to your ISP's website and see if they have a speed test on their server. Use that speed test to see if you get the results that you're paying for. Otherwise, if you complain to them that one website or one thing that your doing is slow then you leave yourself open to having a crummy explanation given to you by your ISP when there is an actual issue at hand. You can log into your modem (sometimes 192.168.100.1) to see what SNR you're actually getting to your ISP.
Best Answer
For more details on how TCP connections and acknowledgments work, see Diogo's answer
When you visit a site, something like this happens:
A connection is made with your DNS server (if not already done) of which your computer already knows the IP address of (or through some automatic mechanism that requests this information from your ISP), sending packets in order to connect and to acknowledge the connection has been made. After the connection has been made, your site asks the IP address of the site you visit such that it knows what computer to contact to get the site. This means it sends a packet containing the domain name to get that response. Later it also sends a packet to close the connection.
A connection is made to the web server which hosts the site you want to visit, this again sends a packet to connect and to acknowledge the connection. After that it makes a request for the page you want to visit, again sending a packet. Then it responds and you get served the HTML of the web page which indicates the structure of the page (not the layout).
Because you only have the structure, you still need to fetch the rest. So, additional requests (a SU question is like 40 requests) are made to get scripts, styles and media like images and the like. And because some of these might not be on the same web server as you visit, additional DNS resolving might take place bringing you back to step 1.
On top of that all, note that every packets you receive are acknowledged adding yet another source of data that gets uploaded, to spare out on packets usually multiple packets are acknowledged at once. Thus, when you receive something you will send to the server that you have received it so it knows that what it send didn't get lost somewhere. That way, the server doesn't have to try sending it again.
The bottom line is that you can't download something without first connecting and uploading some requests to the servers you are downloading from. And that's what makes up for a little upload...
And it's not like that you only click, you do more than that, let's take your question as an example: You have typed around 500 characters, a character counts as 1 byte (if ASCII character, all are in this case) and can be from 1 to 4 bytes (if an Unicode character). So, your question actually takes 0.5 KB or 0.00005 MB! But it's not just the question that gets send to us, it's also surrounded by a POST or AJAX request which asks the server to store your question and the packet headers itself.
If you add everything up it becomes reasonable to reach a few megabytes in a few hours or so.