Как посчитать байты с помощью send () в C, включая размер протокола? - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь подсчитать общее количество отправленных байтов из моей программы, но не могу получить точное значение.Все мои функции вызывают одну функцию, которая отправляет данные на мой сервер с помощью функции send ().В этой функции я получаю возврат send () и сумму в глобальный счетчик.Это работает нормально.Но когда я сравниваю с утилитой 'iftop' (sudo iftop -f 'port 33755'), я получаю больше данных о iftop, чем в моем приложении ... и думаю, что из-за данных заголовка / протокола tcp.Я действительно не знаю, как рассчитать это.Я отправляю пакеты, используя send () и переменную длину данных, поэтому я не уверен, что можно определить / рассчитать размер TCP-пакета оттуда.Я знаю, что каждый пакет TCP отправляет заголовок TCP, но я не уверен, сколько пакетов отправлено.Могу ли я считать, что при каждом вызове send (), если длина данных меньше 1518 (ограничен размер пакета TCP?), Это всего лишь один пакет TCP, и мне нужно суммировать длину заголовка TCP?Даже если я отправил один байт?Если да, то сколько это лишних байтов из структуры TCP?!

Для информации: я использую GCC на linux в качестве компилятора.

Tks!

1 Ответ

0 голосов
/ 12 марта 2019

Как посчитать байты с помощью send () в C, включая размер протокола?

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

Могу ли я предположить, что при каждом вызове send (), если длина данных меньше 1518 (размер пакета TCP ограничен?), Это всего лишь один пакет TCP, и мне нужно суммировать длину заголовка TCP?

Нет, это не будет безопасным предположением.Основная проблема заключается в том, что ядро ​​не обязательно сопоставляет данные, передаваемые каждым вызовом send(), с его собственной последовательностью пакетов.Он может объединять данные из нескольких send() в меньшее количество пакетов.Кроме того, однако, он может использовать либо меньший MTU, либо больший, чем по умолчанию Ethernet, равный 1500 байт, в зависимости от различных факторов, и, кроме того, вам необходимо вписать заголовки пакетов в выбранный MTU, поэтому полезная нагрузка, переносимая одним пакетом, равнаменьше, чем это.

Я подозреваю, что вы делаете это слишком сложно.Если это задача, которая была вам назначена - например, домашнее задание, - то, на мой взгляд, предполагается, что вы рассчитываете только общий размер полезной нагрузки, а не издержки протокола.В качестве альтернативы, если вам необходимо учесть накладные расходы, то я предполагаю, что вы должны оценить , основываясь на измеренных или предполагаемых характеристиках сети.Если вы сами поставили эту проблему, я могу только сказать, что люди обычно делают одно из двух описанных мной вычислений, а не то, о котором вы спрашивали.

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