2011-06-28 78 views
2

我正在對數據進行加密並將其寫入網絡流。一次提供多少數據給NetworkStream.Write()?

一旦每個16字節的加密塊數據變得可用或應該緩衝它,我應該立即寫入流中嗎?發送一串16字節的寫入而不是單個20千字節或1兆字節寫入會有性能損失嗎?

回答

1

儘可能多地餵它,它會讓你知道它是否不能再服用。 TCP將爲您處理緩衝。

此外,你喂的越多 - 越好,它可能會導致更少的流量,因爲數據包不會被分割得太多。

默認情況下,Socket使用Nagle algorithm,該設計旨在通過使套接字緩衝小型數據包,然後在某些情況下將它們組合併發送到一個數據包中來減少網絡流量。一個TCP數據包由40個字節的頭部和正在發送的數據組成。當小數據包與TCP一起發送時,由TCP報頭產生的開銷可能成爲網絡流量的重要組成部分。在負載較重的網絡上,由此開銷導致的擁塞可能導致數據報和重傳丟失,以及擁塞造成的傳播時間過長。當新的傳出數據從用戶到達時,如果連接上的任何先前傳輸的數據仍未被確認,則Nagle算法禁止發送新的TCP段。

您可以關閉Nagle算法,但這可能會導致更多的碎片和流量。