Optimización de Android | Preconexión de red

Autor: Tío Xanth

un ejemplo

Solicite la interfaz con el mismo nombre de dominio antes y después, y capture el paquete a través de Charles, y podrá ver el tiempo debajo de Timing:

  • En la segunda solicitud, las partes DNS, Connect y TLS Handshake son todas -, lo que indica que esta parte no requiere mucho tiempo. En comparación con las tres partes de la primera solicitud, 1 + 35 + 97= se guarda 133ms.
  • Por supuesto, el tamaño de la solicitud y la respuesta de la primera solicitud es ligeramente mayor que la de la segunda solicitud, y la velocidad es menor.Ignorando estas diferencias, cuando otras condiciones son las mismas, la segunda solicitud puede ser más rápida que la primera solicitud 133ms.

primero

la segunda vez

Esta es la multiplexación de conexión de http(s).

Multiplexación de conexión

Antes de eso, repasemos brevemente el proceso aproximado de iniciar una solicitud de red -> recibir una respuesta:

  1. El cliente inicia una solicitud de red.
  2. Resuelva el nombre de dominio a través del servicio DNS y obtenga la dirección IP (generalmente protocolo UDP)
  3. Establecer una conexión TCP (apretón de manos de tres vías)
  4. Establecer conexión TLS (Https)
  5. Enviar solicitud de red Solicitud
  6. Después de que el servidor reciba la Solicitud, ejecute la lógica y devuelva la Respuesta
  7. Cierra la conexión TCP (cuatro ondas)

A través de la multiplexación de conexiones, no es necesario repetir los pasos 2, 3 y 4 anteriores. Utilice RTT para definir esta duración, y RTT (Tiempo de ida y vuelta, tiempo de ida y vuelta) es el tiempo que tarda una solicitud de red en ir desde el origen hasta el destino y luego de regreso al origen. El tiempo ahorrado es entonces:

  • DNS generalmente usa el protocolo UDP.Recientemente, he revisado el contenido de DNS.Si la longitud del mensaje de respuesta de DNS es mayor a 512 bytes, se usará el protocolo TCP. De hecho, muchos servidores DNS están configurados para admitir solo UDP. Por lo tanto, este paso puede considerarse como un ahorro de 1 RTT.
  • Para establecer una conexión TCP, un protocolo de enlace de tres vías requiere 2 RTT.
  • Para establecer una conexión TLS, existen diferentes RTT según la versión de TLS.

HTTP versión 1.1 comienza con una conexión persistente de forma predeterminada, que se puede reutilizar, y la conexión se puede cerrar Connection:Closeagregando . Además, las conexiones persistentes inactivas se pueden cerrar en cualquier momento, incluso si no se envían Connection:Close, no significa que la conexión del servidor permanecerá abierta para siempre.

preconectar

Los marcos de trabajo de red de uso común, como OkHttp, etc., admiten las funciones HTTP1.1 y HTTP2, que también admiten la multiplexación de conexiones.

Podemos usar este mecanismo para hacer una preconexión, por ejemplo, cuando la pantalla de inicio de la aplicación está esperando, podemos preestablecer la conexión del nombre de dominio de la página clave, para que después de que el usuario ingrese a la página correspondiente, el El resultado de la solicitud de red se puede obtener más rápido y se puede mejorar la experiencia del usuario.

Simplemente puede iniciar una solicitud HEAD (sin cuerpo) para el enlace del nombre de dominio con anticipación, de modo que la conexión se pueda establecer con anticipación y la próxima solicitud para el mismo nombre de dominio se pueda reutilizar directamente.

private val client by lazy { OkHttpClient() }

btn.setOnClickListener {
    // 正式请求
    launch(Dispatchers.IO) {
        request()
    }
}

// 预连接
launch(Dispatchers.IO) {
    preRequest()
}

fun preRequest() {
    val request = Request.Builder()
        .head()
        .url("xxx")
        .build()
    client.newCall(request).execute()
}

fun request() {
    val request = Request.Builder()
        .get()
        .url("xxx/yyy")
        .build()
    client.newCall(request).execute()
}

Puede capturar el paquete y ver la solicitud de encabezado enviada al ingresar por primera vez y la solicitud de obtención enviada al hacer clic en:

preconectar

petición formal

Se puede ver que cuando se hace una solicitud formal, se reduce el tiempo de los tres pasos anteriores. También puede consultar la información sobre Conexión y TLS por separado:

preconectar

petición formal

Se puede ver que al hacer una solicitud formal, estos dos se reutilizan (enfóquese en las partes TLS Session Resumedy Connection Server Connection).

Además, hay un grupo de conexiones ConnectionPool en OkHttp. Al usar la conexión Connect, la conexión existente se reutilizará primero y se creará una nueva conexión cuando no haya una conexión disponible. El número de conexiones en el pool de conexiones es limitado (parece ser 5 por defecto), si el negocio es complejo y hay muchas solicitudes, el pool de conexiones puede estar lleno, lo que liberará la preconexión realizada anteriormente. Por lo tanto, una forma relativamente sencilla es aumentar adecuadamente la capacidad y el tiempo de espera del conjunto de conexiones.

Resumir

A través del mecanismo de multiplexación de la conexión http(s), podemos considerar el uso de la conexión previa para optimizar la velocidad de solicitud de la red en ciertos escenarios en la aplicación, lo que requiere que juzguemos si realizar la conexión previa de acuerdo con los escenarios comerciales reales y la presión del servidor.

Además, podemos aumentar adecuadamente la capacidad y el tiempo de espera del grupo de conexiones. Dado que la conexión es bidireccional, incluso si el cliente mantiene la conexión, el servidor cerrará automáticamente la conexión de acuerdo con el número real y la duración de la conexión. Por lo tanto, es general para aumentar el grupo de conexiones.No aumentará la presión del servidor.

El efecto de la conexión previa en realidad está relacionado con la configuración del servidor. Si el servidor establece un tiempo de espera de conexión muy pequeño, es posible que sea necesario restablecer la conexión para cada solicitud, de modo que la conexión previa del cliente se vuelva inválida y el El servidor también necesita crear y destruir continuamente conexiones TCP en lugar de desperdiciar más recursos; si el servidor establece el tiempo de espera de la conexión en un valor alto, la conexión anterior no se liberará durante mucho tiempo, lo que afectará la cantidad de servicios de servidor simultáneos y afectan a las nuevas solicitudes. Por lo tanto, la sintonización requiere una coordinación multiterminal y una consideración integral .

Notas de estudio de Android

Optimización del rendimiento de Android: https://qr18.cn/FVlo89
Vehículo de Android: https://qr18.cn/F05ZCM
Notas de estudio de seguridad inversa de https://qr18.cn/CQ5TcL
Android: Principios del marco de trabajo de Android: https://qr18.cn/AQpN4J
Audio y video de Android: https://qr18.cn/Ei3VPD
Jetpack (incluido Compose): https://qr18.cn/A0gajp
Kotlin: https://qr18.cn/CdjtAF
Gradle: https://qr18.cn/DzrmMB
OkHttp Notas de análisis de código fuente: https://qr18.cn/Cw0pBD
Flutter: https://qr18.cn/DIvKma
Android Eight Knowledge Body: https://qr18.cn/CyxarU
Notas principales de Android: https://qr21.cn/CaZQLo
Android Preguntas de entrevistas anteriores: https://qr18.cn/CKV8OZ
2023 Última colección de preguntas de entrevistas de Android: https://qr18.cn/CgxrRy
Ejercicios de entrevistas de trabajo de desarrollo de vehículos de Android: https://qr18.cn/FTlyCJ
Preguntas de entrevistas de audio y video:https://qr18.cn/AcV6Ap

Supongo que te gusta

Origin blog.csdn.net/weixin_61845324/article/details/132103498
Recomendado
Clasificación