The rule of thumb for TCP throughput over Wi-Fi is that you can get 50-60% of your signaling rate. So in your case, you should see 75-90 megabits per second of TCP throughput.
Wait, why is your TCP window size just 8 KibiBytes? That strikes me as an absurdly low default.
Let's see what yours should be by calculating a "Bandwidth x Delay product" for your connection.
If Windows 7 is reporting that you're getting a 150 mbps signaling rate, that's 150,000,000 bits per second, so let's use that as the bandwidth number.
As for delay, well, my average ping round trip time over Wi-Fi to my AP is a little under 3 milliseconds. But you're going from one wireless client to another, which gets relayed by the AP (to avoid the hidden node problem), so I'm guessing if you pinged one of your wireless clients from the other one, you'd get a round trip time of up to 6ms.
So 150,000,000 bits/sec of bandwidth * 0.006 seconds of delay = 900,000 bits you need to be able to put "in flight" before getting an Ack back, in order to keep the pipe full.
900,000 bits / 8192 bits per KibiByte = about 110 KibiBytes of TCP window needed. Let's be generous and make it a nice round 128.
Try adding -w 128K
to your iperf
argument lists on both the client and the server to force the TCP window to something reasonable, and see if that helps.
Since wireless is a fickle medium and there can sometimes be latency spikes due to transient noise forcing link-layer packet retransmissions, you could even try going larger than that, maybe up to 512KiB, but at some point there will be diminishing returns.
If increasing your TCP window size gets you up to around 75 megabits/sec of TCP throughput in IPerf, but if Windows 7 is defaulting your window size to 8KiB, then you probably need to figure out how to get Windows 7 to pick a better default TCP window size for all TCP connections.
First of all it's really hard get the 20mbit/s, it'll always be around 16-18mbit/s (also check that in speedtest.net you choose megabits as preference to meassure speed) because of the latency or saturation of the network.
If you live in a place with a lot of wireless routers around it may cause some interference with the channels (here's a guide on how to optimize that). Also you may want to limit your data transfer mode to g-only so your router/computer stop transfer in b band that can slow things down a little bit.
Other things you can do: change DNS to either OpenDNS or Google Public DNS, if your router/computer has the option of afterburner turn it on, limit the data transfer to 54mbps only, and open ports for specific applications like torrent clients or things like that from your router.
Best Answer
Don't forget that there's a lot of encryption and protocol overhead when the clients talk to the access points.
My experience: On a 54 MBit WLAN you'll reach about 2 MB/s (Megabyte/s) if your connection is really good and there are not to many other clients and networks around.