After reading about lowerping.com and also reading about an ISP that is providing a similar service to it's customers I decided to do a bit of investigation into how the wow server/client communicate.
There is a definite issue, no it isn't a bug as such, just a limitation of TCP/IP. it could be worked around at the blizzard end!
But, I've found out how to work around it. This is information I believe benefits everyone, so basically hey lowerping.com, eat a bowl of **** for not sharing it.
Anyway! HERE GOES.
SOMEWHAT DUBIOUS TECHNICAL EXPLANATION (I'm a software developer who likes to play at network sysadmin).
-------------------------------------------------------------------------------------------------------
OK to sum up. I'm far from a network god, but!
Here is the technical explanation at least as to *why* this occurs.
Boosting Socket Performance on Linux
I'm not entirely concerned with the technical details, but here's what I do to fix it.
Basically on a higher latency connection (trans-pacific for example) your TCP ACKS have an inherent delay. This can be up to .2-.5 of a second. I myself live in New Zealand and I get 150ms flat to the wow servers, and 300-400 in game.
Here is a BAD ACK (for wow traffic).
11:28:00.686393 IP 12-129-225-21.attens.net.3724 > myip.cable.telstraclear.net.1230: P 14746:14824(78) ack 162 win 14600
11:28:00.857213 IP myip.cable.telstraclear.net.1230 > 12-129-225-21.attens.net.3724: . ack 14824 win 17520
0.170820 (170ms+) ack reply.
This sucks because while our client is twiddling its thumbs holding on to that ack, the wow server
can't/won't send us any more data. This artifically inflates our ping. For me it seems to be in the realm of 170ms. WHen you're already
pinging at 150 to the US this obviously isn't good as it creates aping of at LEAST 320ms+.
Here is a GOOD ACK (for wow traffic, for other kinds of traffic this would probably be suboptimal).
14:19:36.001116 IP 12-129-225-21.attens.net.3724 > myip.cable.telstraclear.net.58484: P 7468:8463(995) ack 53 win 4537 <nop,nop,timestamp 286604871 1342539>
14:19:36.001301 IP myip.cable.telstraclear.net.58484 > 12-129-225-21.attens.net.3724: . ack 8463 win 4006 <nop,nop,timestamp 1342554 286604871>
0.000185 sec ack reply, letting the WoW server know we can handle more data ASAP! So it will send us this data ASAP!
What is happening is your client is hoping that the wow server will send it some more data in that timeframe, which it will only have to ACK once
for multiple packets. BUT, the wow people have actually done a great job of implementing what is a stunningly low bandwidth network engine. So in reality
for pretty much every packet the wow server sends you your client can send that ACK back right away, instead of waiting for more data. There's really very few packets
being sent, so waiting for more to arrive just artifically inflates the latency.
HOW TO FIX
----------
There may be other ways to skin this cat. As I said, it works for me (well) and I'm not persuing it further.
You need a linux gateway, using iptables.
You need the following software installed on the gateway and the knowledge of how to use it, as well as superuser privileges.
(although if stuff is already installed it'll probably work fine).
socat
iptables
Step 1. You need to redirect all wow traffic to your gateway localhost, using iptables.
You need to know the IP address of your wow server to do this. In my case this is blackrock. The wow port appears to be 3724.
In a terminal: sudo iptables -t nat -A PREROUTING -p tcp -d your.wow.server.ip.address --dport 3724 -j REDIRECT --to-ports 3724
This will break wow, as all traffic outgoing on 3724 is now going to the loopback interface.
Step 2. We take that traffic coming to the loopback interface, modify the way it communicates with the WoW server and forward it to the wow server.
Wow will no longer be broken.
So on our gateway we start socat. Socat is an amazing tool and I recommend it to anyone that likes futzing with tcp and other streams. I picked on it in this
cause because it can modify the way client/server tcp communications behave, but that's only the tip of the iceberg as to what this tool is capable of. My hat
off to the author.
In this case, socat is accepting incoming tcp traffic on 3724 (where we redirected our wow traffic to) and forwarding that traffic
In a terminal: sudo socat -d -d -d TCP4-LISTEN:3724,nodelay,fork,reuseaddr,su=nobody TCP4:12.129.225.21:3724,nodelay
(could use -lmlocal2 to log to syslog after connection is accepted, could also use & to tie it off from the terminal)
I've set it up here so it will accept more than one connection, should you have more than one wow using PC on your local lan.
I only have one, and haven't tested this festure, but it should work. You could also set up a SOCKS server for external access
and it should work fine.
Now, you can fire up WoW on a machine on your local LAN and in the terminal you started socat in, it should start printing out
a bunch of debugging information (you can lessen this later by removing the -d switches).
All going well wow will connect to your server and you'll be off. My latency typically sits at about 250ms in Shattrath and 180-200
in other zones. Which is a stellar improvement on the 350-450 I used to get.
BUT HOW DOES IT WORK??!
-----------------------
socat creates a socket connection to the wow server and sets the TCP_NODELAY option. Your ACK packets will now be sent instantly
instead of being held in case more data arrives. It's that simple. Linux doesn't have a TCP switch to make this happen so I use
socat. It's better that way anyway as it doesn't affect my applications globally, just WoW.
Mac users, I believe in OSX there is a kernel option for ACK delay (net.inet.tcp.delacktime). I don't know about this myself not
owning a mac but lowering it may produce similar results. Note: try at own risk and it will probably apply globally to your OSX
install and therefore hurt high bandwidth applications and downloads.
WHY DON'T BLIZZARD IMPLEMENT THIS IN THE CLIENT?
------------------------------------------------
You do have to wonder. I basically researched and implemented this over the course of 4-5 hours. It is a simple option that can be
set in any socket capable application. Blizzard could and should make this a switch in the wow client.
The answer is that probably the majority of their customers live in the USA, and that basically it wasn't worth their time to
investigate. That said their network code guys should have been more proactive about this.
P.S. Blizz you should hire me, I just helped you out. My rates are very competitive!
Note: If your ping is absolute rubbish this wont fix that (but it will help), you need to get a real ISP.