Stock Browser divide las solicitudes HTTP POST en segmentos TCP separados

Actualmente estoy probando diferentes navegadores web y dispositivos para verificar la compatibilidad con una interfaz web que se ha desarrollado. Nos hemos dado cuenta de que tenemos un problema con el código que ya está en producción. El error se produce porque cualquier solicitud HTTP POST enviada desde el navegador de Android (tanto en un Galaxy Nexus (ejecutando JB) como en un Galaxy Tab (ejecutando ICS)) se divide en dos segmentos TCP en el límite de los encabezados HTTP y HTTP POST. datos.

Curiosamente, Chrome para Android no muestra este mismo comportamiento, sino que toda la solicitud se envía como un paquete.

Ni siquiera estamos cerca de llegar a la MTU, así que eso no es un problema.

Mis preguntas son:

  1. ¿Hay alguna configuración que se pueda cambiar para evitar esto?
  2. Sé que tanto el navegador integrado de Android como Chrome usan Webkit, por lo que tenía la impresión de que estaba integrado en el sistema operativo Android, entonces, ¿por qué el comportamiento diferente entre los navegadores?
  3. Finalmente, ¿qué se gana o cuál es la intención detrás de esto?

Respuestas (1)

El navegador no controla directamente eso; es la elección del kernel, ya que el kernel es donde vive la implementación de TCP. Sin embargo, una forma en que la aplicación puede influir es configurando la TCP_NODELAYopción en el socket, que solicita que el kernel deshabilite el algoritmo de Nagle y envíe cada fragmento de datos lo antes posible.

Esto puede ser una optimización: dado que muchas solicitudes HTTP contienen solo encabezados y ningún cuerpo, es mejor que el kernel envíe un paquete con los encabezados de inmediato, en lugar de esperar un poco para ver si el navegador produce más datos que podrían caber en el mismo paquete.