Важное отличие HTTP/1.1 от HTTP/2
В продолжение поста про дебаг джавы хотелось бы ещё рассказать про одну важную фишку, которой обладает HTTP/2 и не обладает HTTP/1.1, и с которой пришлось детально разбираться во время упомянутого дебага.
А именно я говорю про возможность отправлять несколько HTTP-запросов в рамках одного TCP соединения. Есть она в обеих версиях, но её реализации сильно отличаются друг от друга.
В HTTP/1.1 существуют keep-alive соединения, использование которых указывается в хедере «Connection: Keep-Alive». Значение keep-alive является дефолтным, но при этом вы можете указать «Connection: Close», и на каждый запрос у вас будет открываться новое соединение. Запросы и ответы на них в рамках keep-alive соединения должны идти последовательно: запрос -> ответ -> запрос -> ответ. Если на предыдущий запрос ещё не пришёл ответ, то следующий запрос в рамках текущего соединения отправить нельзя, только открывать новое. При этом теоретически в HTTP/1.1 есть возможность отправлять несколько запросов сразу, но ответы на них должны приходить в том же порядке, в котором были отправлены запросы. Это называется "pipelining", и он отключен в большинстве браузеров, так что считайте, что на практике его не существует.
В HTTP/2 все соединения по факту keep-alive, и нельзя указать, чтобы на каждый запрос открывалось новое. И самое важное: в HTTP/2 запросы и ответы в рамках соединения необязательно должны быть последовательными, как в HTTP/1.1. Это вам позволяет по сути вообще не открывать новых соединений с сервером, так как всё ваше общение будет происходить только в одном.
P.S. Keep-alive в HTTP/1 и HTTP/1.1 реализован одинаково, за исключением того, что в HTTP/1.1 он включен по дефолту.
Post #39
171

- 👍 3