I believe that even if you have enough bandwidth to cope with the amount of data you want to send, there's too much overhead and latency with sending that many packets. When sending over TCP you need to send the packet which will have a small delay as it gets sent onto the actual network (regardless of the time it takes to actually travel to the other computer) and then you need to wait for an acknowledgement that the client has received the packet before continuing or if no ack is received, send the packet again.
Also with using packet sizes of 2kb you're packets may be being fragmented as they don't actually fit within one frame of data, which will obviously take a little longer to send. Also if you have a small maximum packet size then the messages will actually be split into separate TCP packets which is going to incur quite a lot more overhead.
Page about MTU[
^]
The problem your having may be more to do with the limitations of the network rather than the performance of the code. What you might like to try is sending the same amount of much smaller messages and see how it copes.