Stock Browser разделяет запросы HTTP POST на отдельные сегменты TCP

В настоящее время я тестирую различные веб-браузеры и устройства на совместимость с разработанным веб-интерфейсом. Мы поняли, что у нас есть проблема с кодом, который уже находится в производстве. Ошибка возникает из-за того, что любые запросы HTTP POST, отправленные из браузера Android (как на Galaxy Nexus (с JB), так и на Galaxy Tab (с ICS)) разбиваются на два сегмента TCP на границе заголовков HTTP и HTTP POST. данные.

Интересно, что Chrome для Android не демонстрирует такого же поведения, а весь запрос отправляется как один пакет.

Мы даже не приблизились к MTU, так что это не проблема.

Мои вопросы:

  1. Есть ли какая-либо конфигурация, которую можно изменить, чтобы предотвратить это?
  2. Я знаю, что и встроенный браузер Android, и Chrome используют Webkit, и у меня сложилось впечатление, что он встроен в ОС Android, так почему же разное поведение между браузерами?
  3. Наконец, что получается или какова цель этого?

Ответы (1)

Браузер не контролирует это напрямую; это выбор ядра, поскольку именно в ядре живет реализация TCP. Однако одним из способов, которым приложение может повлиять TCP_NODELAYна это, является установка параметра сокета, который требует , чтобы ядро ​​отключило алгоритм Нэгла и отправило каждый фрагмент данных как можно скорее.

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