Почему HTTP/2 является бинарным, а HTTP 1.1 текстовым?
Почему HTTP/2 является бинарным, а HTTP 1.1 текстовым?
Не пойму принципиальной разницы. Например, если данные чисто текстовые в HTTP1.1 и HTTP/2 разницы никакой не будет? (и то и то текстовое)? Но по HTTP1.1 же и так передавались бинарники, помимо текста (фото, видео и т.д.), например при загрузке в поле формы, то получается HTTp1.1 тоже по сути бинарный?
https://http2.github.io/faq/#why-is-http2-binary
Перевод: Потому что удобнее в бинарном протоколе прикручивать дополнительные фишки, которых в HTTP/2 огромная прорва, и удобнее его реализовывать, потому что отпадает нужда в парсинге текстовых данных.
Максим Гришин Я видимо неправильно сформулировал вопрос. Почему HTTP 1.1 считается текстовым, а не бинарным, если в HTTP 1.1 также передаются и бинарные данные помимо текста (например при отправке формы фото, видео и т.д.).
В то же время в HTTP/2 как и в HTTP1.1 может быть передан текст, то он не совсем бинарный уже получается что ли?)
test2235, если вы посмотрите, как именно передаются бинарные данные в HTTP/1.1, сильно удивитесь - там base64, т.е. принудительная конвертация в текстовые. Именно поэтому HTTP/1.1 является текстовым - все его элементы должны быть строками и подчиняться парсингу по разделителям. Передавать текст как бинарные данные проблем просто не составляет - отправляете поток байт и всё.
Максим Гришин, Ох ты жесть. Это перед отправкой на моем компе все данные сначала тупо в base64 конвертятся? В чем идея такого извращения? При чистой отправке данные бы четко передались, в любом случае принимающая программа будет их интерпретировать в нужный формат, так тут еще зачем-то предварительно в base64
test2235, дык протокол HTTP изначально не рассчитывался на передачу бинарных данных, эту фичу потом допиливали в условиях уже появившихся ограничений . Даже несчастный <img src="..."> и тот пришлось отдельно впиливать, уже в HTML, и обеспечивать возможность передачи изображений (и потом отдельно файлов) в HTTP. Легаси как оно есть.
Максим Гришин я только не пойму, как определяется, должно ли быть сконвертировано в base64 или нет? Если байт свыше 127-го - то типа бинарник и надо его сконвертировать? Т.е. бинарник все что выше 127-го бита? Например, если HTML-документ содержит русские или французские символы в utf-8, как этот документ будет кодироваться в текстовый формат перед передачей?
test2235, при передаче от клиента к серверу - всё, что blob, преобразуется, всё что названо текстом - нет (по умолчанию, некоторые сайты прогоняют текст из полей в base64 вручную и результат уже отправляют). При передаче от сервера клиенту - бинарные данные ходят как есть, но в ответе должен стоять заголовок Content-Type, указывающий клиенту, какого типа данные ему передаются (скажем, "image/jpeg"), и Content-Length, чтобы клиент знал, сколько байт ему читать, после чего клиент их интерпретирует как есть. По-моему так.
Ну текст все-таки то-же бинарные данные. Тут имеется в виду "легко читаемые человеком".
В давнюю эпоху все протоколы были "текстовыми", так их легче было отлаживать. Telnet-ом спокойно почту можно было читать с POP сервера и файл по FTP отправлять. Но сейчас это никому не нужно, и просто дает большой overhead в протоколе. Поэтому и избавились.
Xilian Реально не пойму в чем разница. Если в HTTP1.1, как и в HTTP/2 может передаваться как текст, так и бинарные данные. Тогда почему один протокол считается текстовым а другой бинарным?