When you live in the boonies and your internet source is ADSL, connection issues can be frustrating. Like other connection related issues you need to trace and isolate the problem. Don't just bypass your router and plug your laptop into the modem. Instead, bypass your in-house telephone wiring and connect the modem straight to your external telephone box. It's simple to do. Conduct your tests. If you're still seeing an issue, call your phone/internet company and they will check your connection at the local switch—you may be set for a speed higher than the last mile to your building can handle. Ask the technician if you're using the modem they recommend, especially if yours is one you sourced yourself.
My own investigation revealed not only was our modem incompatible (unknown to the technician), not only was the connection set too high at the switch, but the in-house wiring was insufficient as well—and every phone was definitely filtered. I purchased a recommended modem from eBay ($40-$60), and the telephone company lowered our speed. My proudest moment however was installing a splitter right at the phone box with a dedicated line straight to the ADSL modem, and a single ADSL filter on the other (no filters necessary in the house). Our telephone box is old and it isn't pretty, but I'm damn proud.
Those three components needed work before I saw the last of the packet loss disappear, and now the connection is rock solid. Using the highly stable and fantastic Tomato firmware on an ASUS RT-N16 is the other half of excellent reliability, I wouldn't trust anything else to avoiding support calls from my parents or regular reboot cycles.
When I was on this adventure I needed a way to record when packet loss occurred, and so I created the following PowerShell script:
It performs a 2-hop trace route to yahoo.com every second. Since it's only 2 hops we're really just looking at the connection from local machine to router, and router to internet provider, thus yahoo.com can be any external address. (If your modem isn't bridged to your router, or you have other routers in place this script may not be sufficient as-is.) It then checks for dropped pings denoted by asterisks on each hop and logs a failure, noting whether it's between machine and router or router and ISP.
If you would like a graph of ping response times, you can use the following:
This one creates the graph (you will need gnuplot):
gnuplot's auto-scaling works excellent with any range: