Оценка пропускной способности TcpClient

Я хочу создать инструменты оценки пропускной способности с помощью TcpClient. У меня проблема в том, что я хочу выполнить измерение в заранее определенное время (вместо предопределенной длины данных буфера для передачи). Если я использую циклы (многократно передаю небольшие фрагменты данных), не замедлит ли это производительность (фрагментация вручную или автоматическая фрагментация)?


person Syaiful Nizam Yahya    schedule 16.12.2010    source источник


Ответы (1)


Это зависит от того, отключите ли вы алгоритм Nagle. Если вы это сделаете, то да, вы сами будете фрагментировать вещи. Если вы этого не сделаете, вы вряд ли достигнете своей цели, потому что данные могут быть фактически записаны не тогда, когда вы думаете... если только другой конец соединения не отправит обратно окончательный " акк" конечно.

Я бы посоветовал вам использовать небольшую выборку для определения приблизительной скорости, а затем создать на ее основе более крупную выборку, прогнозируя, сколько времени это займет. Вам все равно придется измерять время — вы не собираетесь нажимать точное предопределенное время — так что это не должно иметь большого значения. В любом случае, вы всегда можете отрегулировать размер по мере продвижения — я предполагаю, что вы в конечном итоге отправите много пакетов, если только это не очень медленная сеть, поэтому, если вы на полпути решите отправить только 200 КБ вместо 300 КБ, это не должно иметь большого значения.

Конечно, это может звучать как ваше первоначальное предложение, но я говорю только об отправке «довольно больших» фрагментов данных за вызов... скажем, 16 КБ. (В любом случае, намного больше, чем размер пакета.) Это не должно сильно повлиять на фрагментацию, но все же позволит вам немного настроить вещи по ходу дела. Я бы не советовал вам отправлять крошечные, крошечные пакеты.

person Jon Skeet    schedule 16.12.2010
comment
Извините за вопрос, но я действительно не понимаю. Поправьте меня если я ошибаюсь. Если я отключу алгоритм Нагла, я должен вручную фрагментировать свои данные, многократно отправляя небольшие фрагменты данных. если я не отключу алгоритм Nagle, мои данные будут автоматически фрагментированы. если я не отключу алгоритм Нагла, я вряд ли достигну своей цели (оценка пропускной способности?), потому что отправленные данные могут не быть фактически получены, когда я думал, что они были получены. тут как то запутался. - person Syaiful Nizam Yahya; 16.12.2010
comment
@publicENEMY: Я должен уточнить... если вы можете заставить другой конец соединения давать вам какую-то ценность, когда он получает все - эффективно делая подтверждение видимым на уровне приложения - тогда все будет в порядке... немного неэффективно с точки зрения вычислительной мощности на отправляющей стороне, но вряд ли будет значительным по сравнению с синхронизацией сети. - person Jon Skeet; 16.12.2010
comment
Здесь я думал, что tcp надежен (гарантирует получение правильных данных). говорят, что если я отключу nagle, нет гарантии, что отправленные данные будут получены? - person Syaiful Nizam Yahya; 16.12.2010
comment
@publicENEMY: Надежность в том, что пока поток работает, вы будете получать данные правильно и по порядку. Но то, что запись на TcpClient вернулась, еще не означает, что данные уже поступили на другой конец. (И это верно независимо от того, отключили ли вы алгоритм Nagle на самом деле. Просто без Nagle каждая запись будет отправлять пакет немедленно.) - person Jon Skeet; 16.12.2010
comment
Спасибо за разъяснение, Джон Скит. Очень признателен. - person Syaiful Nizam Yahya; 16.12.2010
comment
@publicENEMY: Надеюсь, это имеет определенный смысл. Это, конечно, не самый ясный мой ответ на все времена :) В любом случае, каким бы плохим ни было объяснение, я думаю, что мой последний совет уместен - используйте куски, которые велики по сравнению с пакетами, но малы по сравнению с общей суммой. данных, которые вы будете передавать. - person Jon Skeet; 16.12.2010