Есть три способа управления потоком:
- Если вы перегружены, вы бросаете данные на пол.
- Если вы не можете предоставить услугу для запроса из более высокого уровня, как правило, потому что ваша локальная очередь заполнена, вы возвращаете ошибку в этот более высокий уровень.
- Вы заблаговременно уведомляете верхние слои о том, что они должны замедлиться.
На уровне Ethernet метод 3 поддерживается через кадры паузы. Часто более высокие уровни не поддерживают метод 3, но вместо этого поддерживают метод 2. Когда у слоя есть слой под ним, который поддерживает метод 3, но слой выше него поддерживает только метод 2, он может временно прекратить передачу данных на нижние уровни, в результате чего метод 2 будет применяться к более высоким уровням.
Или, более конкретно, когда вы получаете кадр паузы, вы останавливаете механизм отправки и устанавливаете таймер для перезапуска механизма отправки в соответствующее время. Пока механизм отправки остановлен, ваши локальные очереди будут заполняться данными из более высоких уровней. Если они заполняются, вы возвращаете "занятые" ошибки на более высокие уровни, и они обрабатывают это, однако, уместно.