Why is my 802.11g wireless LAN so slow?
Solution 1:
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.
Solution 2:
They are sharing the same channel. From what I know so far (not much) you are sharing the 54 Mbit/s between devices. So you are actually transferring data at 18 Mbit/s, add some overhead and some collision/resent ... Try connecting one of the devices with a wired connection and you will see the speed increase by more than double.
Solution 3:
Without frame bursting, TCP over 802.11g was only about 40-45% efficient. So even if you always got the 54 megabits/sec signaling rate between one client and the AP, you'd probably only see somewhere around 23 megabits/sec of throughput between the wireless client and something on the wired Ethernet on the far side of the AP.
Wireless to wireless data transfers only get half that speed because each packet has to cross the air twice: once from the source client to the AP, and once from the AP to the destination client. This is called "Intra-BSS Relay", and the 802.11 standard requires APs to do this, to avoid the "hidden node problem" where two wireless clients are each in range of the AP, but are not in range of each other. So I'd expect you to get around 11 megabits/sec of TCP throughput wireless to wireless through an AP, assuming everything's always getting the 54 megabits/sec signaling rate, and your client and server software use TCP as efficiently as IPerf does.
The fact that you're only getting 6-9 mbps sounds a little low. It would be interesting to see what performance you get if you temporarily turn off wireless encryption. Some older/cheaper equipment slowed down if you turned encryption on. Just to keep things clean, use IPerf for this test.
If turning off encryption doesn't get you up to around 11mbps, the next thing I'd check is your TCP receive window. It would be interesting to know what TCP receive window IPerf is reporting your OSes as using by default. If it's less than 64K, it would be interesting to see if setting it to 64K by adding the the -w 64K
option to IPerf gets you to 11 megabits/sec of throughput. Honestly 20K ought to be enough for a 54 megabits/sec connection with a typical 3ms round trip time, but sometimes the latency increases when the network is fully loaded, so going to 64K TCP receive windows isn't out of the question.