Я реализовал HTTP / 2 в Jetty (сервер Java HTTP и WebSocket), поэтому я могу указать вам, как это было реализовано в Jetty - но вы можете посмотреть на другие проекты с открытым исходным кодом, которые реализуютHTTP / 2 и посмотрите, как они это сделали.
Реализация Jetty основана на классе FlowControlStrategy .
Существует две реализации: одна наивная (SimpleFlowControlStrategy) и одна.более эффективный (BufferingFlowControlStrategy).
В обоих случаях FlowControlStrategy получает события от реализации HTTP / 2, в частности:
- , когда кадр DATA отправляется другому узлу
- при получении кадра WINDOW_UPDATE от другого узла
- при получении кадра DATA от другого узла
- когда полученные данные используются приложением
В случае данных, отправляемых другому узлу, окно управления потоком «отправить» уменьшается;когда кадр WINDOW_UPDATE получен от другого однорангового узла, увеличивается окно управления потоком «send».
Аналогично, когда данные принимаются, окно управления потоком «receive» уменьшается;когда приложение использует полученные данные, окно управления потоком «прием» увеличивается - и, возможно, кадр WINDOW_UPDATE отправляется другому узлу, чтобы сигнализировать о том, что он может отправлять больше данных.
Требуется реализация HTTP / 2проверить эти два окна управления потоком и прекратить отправку данных, когда окно управления потоком «отправить» достигает нуля (или отрицательного значения);и сбой соединения, если он получает данные, когда окно управления потоком «получить» равно нулю (или отрицательно).После получения кадра WINDOW_UPDATE реализация HTTP / 2 должна возобновить отправку данных.
Это основной способ реализации управления потоком в HTTP / 2.В зависимости от используемой технологии и деталей реализации, есть еще много вещей, о которых нужно позаботиться, таких как организация очередей данных, копирование данных, безопасность потоков и т. Д., Но вы можете обратиться к ним во время написания реализации.
Веселитесь!