Всем привет.

Интересует знания тех, кто ковырял стэк ТСР/IP от кейла. В нем есть режим управления потоком, с заданным окном.

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

У нас данные по ТСР валятся быстрее чем уходят в обслуживаемое устройство, потому мы сделали ФИФО, наполняем его по ТСР, и отгружаем исполнителю.
Установили режим контроля потока данных, и задали окно.

Внимание вопрос! Когда надо сбрасывать окно? Сколько в фифо должно быть места чтобы можно было сбросить окно?
Мы посчитали что когда в фифо есть место на прием данных размером с окно, можно вызывать функцию сброса окна. Так как за раз не может придти данных больше чем окно.

Но вот что меня беспокоит.

к примеру пусть окно 10 байт
в фифо есть 10 байт свободного места
окно пустое

1. в окно приходят 5 байт по ТСР, но callback функция в которой эти данные перегрузятся в фифо еще не вызвана
2. так как в фифо есть место под данные, вызывается функция сброса окна
3. вызывается callback функция и 5 байт падают в FIFO,

в результате окно сброшено, но в фифо место только на 5 байт вместо 10.

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

А может не надо парится и авторы это все уже учли? кто ковырялся в стэке как там происходит сброс окна, он учитывает принятые, но не выбранные данные?