This is a really interesting question! I am going to drop my 2 cents, but please keep in mind that I am not an expert on System.Net.Sockets on WP7.
First, performance testing in the debugger should be ignored. The reason for this is that the extra overhead of stack trace logging always slows down applications, regardless of the OS / language / IDE. Applications must be profiled for performance in release mode and disconnected from the debugger. In your case its slower is disabled! Good, so try optimizing this.
If you suspect that packets are buffered (and this is a reasonable assumption), try sending a larger packet? Try linearly increasing the packet size and measurement delay. Could you write a simple microprofile in the code on the device, i.e. Using the DateTime.Now or Stopwatch class to record the delay time and packet size. Plotting a graph can give you a good idea of โโthe correctness of your theory. If you find that packets with 10 bytes (or even 100 bytes) will be sent instantly, I would suggest simply increasing the amount of data to transmit. This is a lame hack that I know, but if it didn't break ...
Finally, you say you are using TCP. Can you try instead of UDP ? TCP is not intended for real-time exchange, but rather for accurate communication. UDP by contrast is not checked for errors, you cannot guarantee delivery, but you can expect faster (lighter, lower latency) from it. Networks such as Skype and online games are built on UDP rather than TCP. If you really need a receipt confirmation, you can always create your own micro-protocol via UDP, using your own Cyclic Redundancy Check for error checking and the Request / Reply (confirmation) protocol .
Such protocols exist, see Reliable UDP , discussed in this previous question . There is a Java-based RUDP implementation, but I'm sure some parts can be ported to C #. Of course, the first step is to check if UDP really works!
Found this previous question that discusses the issue. Perhaps the problem is Wp7? Poor UDP performance with Windows Phone 7.1 (Mango)
It would still be interesting to know if increasing packet size or switching to UDP works
ok, so not a single sentence worked. I found this description of the Nagle algorithm, which groups packages as they are described. Installing NoDelay should help, but, as you say, does not.
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.nodelay.aspx
Besides. See this previous question where Keepalive and NoDelay were turned on / off to manually clear the queue. His proof is anecdotal, but worth a try. Can you answer and edit your question to post more recent results?
Socket "Flush" temporarily disabling NoDelay