Размер окна TCP libnids - PullRequest
       37

Размер окна TCP libnids

1 голос
/ 25 сентября 2011

Мое намерение - написать приложение. слой слой поверх либнид. Причина использования API libnids в том, что он может эмулировать функциональность TCP ядра Linux. Libnids возвратил бы hlf-> count_new, что число байтов от последнего вызова функции обратного вызова TCP. Однако tcp_callback вызывается каждый раз, когда приходит новый пакет, поэтому hlf-> count_new содержит один сегмент TCP.

Тем не менее, приложение. уровень должен принимать буфер окна TCP, а не отдельные сегменты TCP.

Есть ли способ получить данные окна TCP (а не сегмента TCP)? Другими словами, чтобы libnids доставлял данные буфера окна TCP.

Заранее спасибо!

1 Ответ

1 голос
/ 25 сентября 2011

У вас недоразумение.Окно TCP предназначено для контроля количества данных в полете.Чтения приложений не всегда вызывают изменения окна TCP.Таким образом, запрашиваемая вами информация недоступна в том месте, где вы ищете.

Рассмотрим, например, если окно имеет размер 128 КБ и было отправлено восемь байтов.Принимающий стек TCP должен подтверждать эти восемь байтов независимо от того, считывает ли их приложение или нет, в противном случае для соединения TCP истечет время ожидания.Теперь представьте, что приложение читает один байт.Для стека TCP было бы бессмысленно увеличивать окно на один байт - и если используется масштабирование окна, он не может сделать это, даже если захочет.

Итогда что?Если через четыре секунды приложение считывает еще один байт, снова настроить окно?Какой смысл в этом?

Цель окна - контролировать поток данных между двумя стеками TCP, предотвращать бесконечный рост буферов и контролировать объем данных «в полете».Это только косвенно отражает то, что приложение прочитало из стека TCP.

Странно, что вы даже захотите этого.Даже если бы вы могли сказать, что было прочитано приложением, какое это может быть использование для вас?

...