Как мы могли обмануть HTTP-протокол?

Хотя HTTP вездесущ, он имеет свой багаж заголовков, что в моем случае становится все большей проблемой. Мои данные для передачи составляют йоту размера заголовка HTTP.

  • Есть ли другой протокол, который я могу использовать, который все еще понятен браузерам и другим сетям и не имеет багажа HTTP?
  • Есть ли какой-либо другой способ пропустить заголовки и добавить их в пункт назначения, чтобы по сети передавались только минимальные данные?

person Kevin Boyd    schedule 19.09.2009    source источник
comment
Почему бы вам не использовать только те поля заголовка, которые вам нужны? Есть только некоторые из них, которые действительно необходимы.   -  person Gumbo    schedule 19.09.2009
comment
Вы действительно, кажется, спрашиваете: как я могу уменьшить эти заголовки. Если вы используете фреймворк, я бы посмотрел его документацию, чтобы увидеть, где добавляются заголовки, и пошел оттуда.   -  person Matt Howell    schedule 19.09.2009


Ответы (3)


  1. No.
  2. No.

Многие заголовки HTTP являются необязательными. Типичный запрос браузера намного больше, чем минимальный запрос, который может выглядеть так:

GET /doc HTTP/1.1
Host: example.com
Connection: close

(Могу с уверенностью сказать, что запросы такой формы работают, т.к. постоянно использую их при тестировании ответа веб-сервера через telnet example.com 80.)

Возможно, вы можете получить полезные результаты, просто опуская некоторые заголовки.

person chaos    schedule 19.09.2009
comment
Ух ты! это выглядит хорошо, можем ли мы обойтись только этим минимальным заголовком? - person Kevin Boyd; 19.09.2009
comment
Возможно. Все зависит от того, что значит «обойти». - person chaos; 19.09.2009
comment
Я использую Java ME для отправки запросов, есть ли механизм для обнуления других заголовков или мы должны отправлять для них пустые строки? - person Kevin Boyd; 19.09.2009
comment
Извините, я не знаком с Java ME. Вам нужно будет изучить его документацию или спросить кого-нибудь, кто знает, что он делает. - person chaos; 19.09.2009
comment
Соединение IIRC закрыто по умолчанию и не требует указания. - person some; 19.09.2009
comment
@some: HTTP 1.0 по умолчанию имеет значение connection: close, HTTP 1.1 по умолчанию имеет значение connection: keep-alive. - person Tim Sylvester; 19.09.2009

HTTP-запросы могут быть довольно маленькими. Как указывает хаос в его ответе, вам действительно не нужно отправлять много заголовков с запросом. Единственный необходимый заголовок — Host. Я могу еще больше упростить пример с хаосом, используя HTTP 1.0, который не поддерживает постоянные соединения.

GET / HTTP/1.0
Host: example.com
                                       (blank line is necessary)

Ответ может быть таким же простым

HTTP/1.0 200 OK
Content-Type: text/html

data content

В этом случае накладные расходы HTTP составляют около 40 байтов в запросе и ответе. Стандартный TCP-пакет имеет размер 1500 байт, поэтому в ответном пакете остается достаточно места для фактических данных.

Есть и другие заголовки HTTP, и они имеют значение. Вы можете включать информацию о кеше и выполнять условные GET. Вы можете использовать постоянный сокет HTTP/1.1, чтобы ускорить последующие запросы. И т. д., и т. д. Вам не нужно использовать ничего из этого, если вы не хотите, но есть одна приятная особенность HTTP: есть стандартный способ делать более сложные протоколы, когда вам это нужно.

Что касается выполнения минимального HTTP в JavaME, если вам действительно важен каждый байт, вам может быть лучше написать свой собственный простой HTTP-клиент, работая с простым TCP сокет. Если вы разговариваете с известным сервером, вам вообще не нужно много реализовывать. (Если вы общаетесь с произвольными серверами, вам нужно уделять больше внимания обработке ошибок, перенаправлениям и т. д.).

person Nelson    schedule 19.09.2009
comment
Хотя это СИЛЬНО не одобряется HTTP RFC, вы также можете избавиться от заголовка Host в запросе, если сервер, с которым вы связываетесь, не является многосетевым веб-сервером (т. е. несколько веб-сайтов/доменов совместно используют один IP-адрес). См. w3.org/Protocols/rfc2616/rfc2616-sec19. .html#sec19.6.1.1 - person Marc Novakowski; 22.09.2009

WebSockets появятся в HTML5 и должны соответствовать вашим потребностям. Стандартное HTTP-соединение можно пересмотреть, чтобы изменить протокол на веб-сокеты. Но я подозреваю, что спецификация может быть немного молодой, но она может соответствовать всем требованиям.

person krosenvold    schedule 19.09.2009
comment
Я так думаю; Я видел, как ребята из компании kaazing демонстрировали это. Однако пока не ожидайте большой поддержки браузеров. - person krosenvold; 19.09.2009