Какие гарантии существуют для сброса буферов отправки TCP, если таковые имеются, когда подсистема морозильной камеры зависает cgroup?
Рассмотрим следующий сценарий: сервер A, работающий в контрольной группе, отправляет данные на сервер B через TCP. Сокет TCP настроен на использование алгоритма Naggle (т. TCP_NODELAY
опция не установлена). Следовательно, Отправить
передача данных через сокет не блокируется для ACK сервера B, а возвращается после того, как данные, которые должны быть отправлены, были скопированы в буфер отправки TCP. После этого, но до отправки данных на сервер B, cgroup замораживается.
Что происходит с данными в буфере отправки TCP?
- Будет ли операция замораживания ждать, пока все данные в буфере не будут подтверждены сервером B? Что делать, если приемный буфер сервера B заполнен? Будет ли замораживание бесконечно ждать подтверждения сервера B?
- Будет ли замораживание не ждать ACK сервера B и продолжать отправлять данные после размораживания контрольной группы? Если задержка между замораживанием и оттаиванием достаточно велика для того, чтобы сервер B закрыл TCP-соединение, данные в буфере будут потеряны.
Ссылки на спецификации и гарантии такого поведения приветствуются. Но, может быть, нет никаких гарантий, поэтому полагаться на любое поведение было бы ненадежно?
Предыстория вопроса заключается в том, что мне интересно, насколько осторожным нужно быть при отправке данных через TCP на AWS Lambda (я предполагаю, что AWS Lambda использует контрольные группы для замораживания/оттаивания после/до обработки вызова Lambda). Достаточно ли сбросить буферы приложений в буфер отправки TCP-сокета/TCP? Или нужно убедиться, что сервер B получил данные на прикладном уровне, например, используя HTTP и ожидая HTTP-ответа сервера?