Сколько данных для подачи NetworkStream.Write () за один раз? - PullRequest
2 голосов
/ 28 июня 2011

Я шифрую данные на лету и записываю их в сетевой поток.

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

1 Ответ

1 голос
/ 28 июня 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...