2011-06-28 2 views
2

Я шифрую данные «на лету» и записывая их в сетевой поток.Сколько данных для подачи NetworkStream.Write() за раз?

Должен ли я записываться в поток, как только будут доступны данные зашифрованного блока размером в 16 байт или я должен его буферировать? Есть ли штраф за исполнение при отправке писем из 16 байтов, а не на 20 килобайт или 1 мегабайт?

ответ

1

Кормите его столько, сколько у вас есть, это даст вам знать, если он больше не может принять. TCP будет обрабатывать буферизацию для вас.

Кроме того, чем больше вы кормите - тем лучше, это, скорее всего, приведет к уменьшению трафика, поскольку пакеты не будут сильно фрагментированы.

По умолчанию Socket использует Nagle algorithm, который предназначен для снижения сетевого трафика, заставляя сокет буферизовать небольшие пакеты, а затем объединять и отправлять их в одном пакете при определенных обстоятельствах. Пакет TCP состоит из 40 байтов заголовка и отправляемых данных. Когда небольшие пакеты данных отправляются с TCP, накладные расходы, возникающие из заголовка TCP, могут стать значительной частью сетевого трафика. В сильно загруженных сетях перегрузка, возникающая в результате этих накладных расходов, может привести к утрате дейтаграмм и повторных передач, а также к чрезмерному времени распространения, вызванному перегрузкой. Алгоритм Nagle запрещает отправку новых сегментов TCP, когда новые исходящие данные поступают от пользователя, если какие-либо ранее переданные данные в соединении остаются неподтвержденными.

Вы можете отключить алгоритм Nagle, но это, скорее всего, приведет к большей фрагментации и трафику.

Смежные вопросы