кэширование пакетов данных - PullRequest
0 голосов
/ 09 июня 2010

Не уверен, что это правильное место, чтобы спросить, но здесь идет ...

Я реализовал UDP-клиент / сервер, используя обычные сокеты в Linux.

(Предполагается, что между этими двумя хостами нет сетевой стороны, которая каким-либо образом мешает пакету, а просто передает его как есть)

Использует ли ядро ​​какое-либо кэширование / оптимизацию этих пакетов UDP (это тот же самый пакет данных, который я отправляю каждый раз)

Я провожу некоторое тестирование, которое "пинг-понгс" различает по размеру пакетов между клиентом / сервером, и хочу знать, нужно ли мне каждый раз заполнять пакет случайными данными или я могу просто отправить этот пакет с "фиксированным содержимым" время? (размер пакета остается неизменным для каждого теста).

Ответы [ 3 ]

2 голосов
/ 09 июня 2010

Если BPF (пакетный фильтр Беркли) или его эквивалент (например, брандмауэр) не был настроен для проверки трафика и, возможно, его изменения, стек должен блаженно не знать о полезных нагрузках в ваших дейтаграммах. Вы должны снова и снова использовать одни и те же пакеты.

0 голосов
/ 22 июня 2010

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

int rcvbuflen = 0x20000; // 128kb
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen, sizeof(rcvbuflen));

Вы можете использовать getsockopt для проверки текущего размера буфера.

0 голосов
/ 18 июня 2010

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

Ядро не 'кэширует' пакеты, а буферизует их. По крайней мере, будет выходной буфер, в котором пакеты заканчиваются, пока сетевая линия не освободится, и входной буфер, в котором полученные пакеты хранятся, пока ваш код не вызовет метод recv.

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

...