一次为NetworkStream.Write()提供多少数据?

时间:2011-06-28 03:11:21

标签: c# .net sockets networking

我正在加密数据并将其写入网络流。

一旦每个16字节的加密块数据可用,我应该写入流吗?还是应该缓冲它?发送一串16字节写入而不是单个20千字节或1兆字节写入是否会降低性能?

1 个答案:

答案 0 :(得分:1)

尽可能多地喂它,它会告诉你它是否不能再使用了。 TCP将为您处理缓冲。

此外,您提供的越多 - 越好,它可能会导致更少的流量,因为数据包不会分散太多。

默认情况下,Socket使用Nagle algorithm,它旨在通过使套接字缓冲小数据包然后在某些情况下将它们组合并发送到一个数据包来减少网络流量。 TCP数据包由40个字节的标头和正在发送的数据组成。当使用TCP发送小数据包时,TCP报头产生的开销可能成为网络流量的重要部分。在负载很重的网络上,由此开销导致的拥塞可能导致丢失的数据报和重传,以及由拥塞引起的过多传播时间。如果连接上的任何先前传输的数据仍然未被确认,则Nagle算法会在新的传出数据从用户到达时禁止发送新的TCP段。

您可以关闭Nagle算法,但这可能会导致更多碎片和流量。