Получить количество пакетов, переданных за соединение - PullRequest
0 голосов
/ 29 декабря 2010

Как узнать количество пакетов, переданных на одно TCP-соединение?

Я использую Java, но я знаю, что мне придется извлечь число из базовой ОС, поэтому этот вопрос применим к операционным системам Linux и Windows и, как я полагаю, будет иметь разные ответы для каждой из них.

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

Ответы [ 4 ]

2 голосов
/ 29 декабря 2010

Я думаю, что чистый java API не позволяет вам это делать. В качестве обходного пути я бы порекомендовал вам попробовать JPcap .

1 голос
/ 29 декабря 2010

Доступ к профилировщику TCP-соединений дает эту информацию на локальном или серверном уровне соединения. Количество пакетов обычно выше ожидаемого по нескольким причинам: пакеты заголовка и пакеты кадра, пакеты установления соединения и подтверждения или пакеты ответа, пакеты согласования и контроля безопасного протокола, пакеты, достаточно малые для обработки через оборудование телефонной линии POTS в некоторых типах соединения , идентификационные данные криптографии и пакеты управления алгоритмом, используемый протокол передачи данных, проходящий через соединение tcp, действующий в качестве нижнего транспортного уровня, фактические данные пользователя или приложения в пакетной и рамочной форме, пакеты и ответы разъединения соединения. Потоки могут часто сбрасываться, если существует многопоточная или многопользовательская ситуация, и каждый подключенный пользователь не может получить любые символы данных из выходного потока, которые только что были переданы другому пользователю.

1 голос
/ 29 декабря 2010

Похоже, что вы можете получить его (как пользователь root), изучив / proc / net / nf_conntrack или запустив утилиту "conntrack" с соответствующими параметрами.

Это предполагает, что отслеживание соединений сетевого фильтра включено, иесть утилита.

Вам нужно найти правильное соединение самостоятельно - но вы должны быть в состоянии определить его по src / dst / sport / dport

1 голос
/ 29 декабря 2010

Однако я бы начал с проверки, что ваш код правильно использует буферизацию.Если Nagle включен, ОС объединит эти записи вместе, даже если вы отправляете один байт за раз.Если Nagle выключен, ваш драйвер NIC все еще может объединять данные.Использование tcpdump / windump подтвердит фактические размеры отправленных пакетов.

Как часто приложение очищает поток, мало повлияет на частоту отправки данных операционной системой.Вы также можете использовать профилировщик, например yourkit, или системный инструмент, например strace, который может отслеживать количество вызовов ОС.

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