TCP can be tuned quite a bit as the defaults don't always work well on things like high speed networks.

There are plenty of resources out on the web giving tuning advice:

The main thing for end nodes is that your TcpWindow needs to be bigger than the sum of your BandwidthDelayProduct.

Your speed is limited by the size of your packets (check your MSS), the loss rate, the RTT and how you use Delayed Acks. For an online calculator see:

More modern versions of the Linux kernel (since 2.4.17/2.6.7?) have full autotuning which should take care of most of this for you. If your kernel supports autotuning and it is enabled then

cat /proc/sys/net/ipv4/tcp_moderate_rcvbuf

should show the value 1. If you manually adjust buffer sizes in your program with setsockopt(2) then autotuning will be disabled for that connection (not recommended).