Seguimiento de la secuencia de cierre de la conexión de red en el Motor de base de datos

En este artículo se presentan ejemplos de una traza de red que captura la secuencia que tiene lugar cuando se cierra una conexión TCP entre una aplicación cliente y el Motor de base de datos de SQL Server (el servidor). Comprender estos patrones es fundamental para diagnosticar el comportamiento de red, identificar estrategias de agrupación y optimizar la administración de conexiones en aplicaciones web o de servicio.

Cierre de tipos de conexión

En este artículo se proporcionan ejemplos de conexiones TCP normales y varias conexiones de conjuntos de resultados activos (MARS). MARS es una característica de SQL Server, introducida con SQL Server 2005 (9.x), que permite ejecutar varios comandos en una conexión sin tener que limpiar los resultados del primer comando, antes de ejecutar el segundo comando. MARS se logra mediante la multiplexación de sesiones (SMUX).

En esta sección se describen varios ejemplos de cierre de una conexión de red.

  • La dirección IP del cliente es 10.10.10.104
  • La dirección IP del servidor es 10.10.10.22

Paquetes de cierre

En este ejemplo se muestra una secuencia de cierre de conexión normal. Tenga en cuenta los números de fotograma bajos y los desplazamientos temporales. Es más probable que esta secuencia sea un cierre de conexión agrupado. Esto debería ocurrir dentro de los 30 segundos posteriores al inicio de la traza, o también es posible que vea paquetes keep-alive.

Diagrama del cierre en cuatro pasos de una sesión TCP.

Frame Offset    Source IP    Dest IP      Description
----- --------- ------------ ------------ ---------------------------------------------------------------------------
   50 4.1529661 10.10.10.104  10.10.10.22 TCP:Flags=...A...F, SrcPort=4657, DstPort=1433, PayloadLen=0, Seq=413460761
   51 4.1529661  10.10.10.22 10.10.10.104 TCP:Flags=...A...., SrcPort=1433, DstPort=4657, PayloadLen=0, Seq=280398321
   52 4.1529661  10.10.10.22 10.10.10.104 TCP:Flags=...A...F, SrcPort=1433, DstPort=4657, PayloadLen=0, Seq=280398321
   54 4.2330441 10.10.10.104  10.10.10.22 TCP:Flags=...A...., SrcPort=4657, DstPort=1433, PayloadLen=0, Seq=413460761

Instrucciones Transact-SQL y paquetes de cierre

En este ejemplo se muestra cómo cerrar una conexión no agrupada, después de dos instrucciones Transact-SQL. Si esta conexión no formara parte de un pool, también podría ver paquetes de keep-alive asociados a la devolución de la conexión al pool de conexiones, en lugar de los paquetes de cierre inmediatamente después de la última respuesta del servidor. Se recomienda agrupar conexiones en cualquier tipo de aplicación web o de servicio para permitir la reutilización de la conexión. La agrupación de conexiones reduce el número de conexiones al servidor y minimiza el costo y el retraso asociados a las nuevas conexiones.

Frame Offset    Source IP    Dest IP      Description
----- --------- ------------ ------------ ---------------------------------------------------------------------------
  364 9.1949581 10.10.10.104  10.10.10.22 TDS:SQLBatch, Version = 7.300000, SPID = 0, PacketID = 1, Flags=...AP..., S
  365 9.1949581  10.10.10.22 10.10.10.104 TDS:Response, Version = 7.300000, SPID = 130, PacketID = 1, Flags=...AP...,
  366 9.3043331 10.10.10.104  10.10.10.22 TDS:SQLBatch, Version = 7.300000, SPID = 0, PacketID = 1, Flags=...AP..., S
  367 9.3072631  10.10.10.22 10.10.10.104 TDS:Response, Version = 7.300000, SPID = 130, PacketID = 1, Flags=...AP...,
  375 9.4078491 10.10.10.104  10.10.10.22 TCP:Flags=...A...F, SrcPort=4647, DstPort=1433, PayloadLen=0, Seq=157672648
  376 9.4078491  10.10.10.22 10.10.10.104 TCP:Flags=...A...., SrcPort=1433, DstPort=4647, PayloadLen=0, Seq=192890973
  379 9.4078491  10.10.10.22 10.10.10.104 TCP:Flags=...A...F, SrcPort=1433, DstPort=4647, PayloadLen=0, Seq=192890973
  397 9.5221071 10.10.10.104  10.10.10.22 TCP:Flags=...A...., SrcPort=4647, DstPort=1433, PayloadLen=0, Seq=157672649

Conexión inactiva o agrupada que se cierra

La conexión se cierra 10 segundos después del último intercambio de keep-alive (consulte la columna Delta).

Nota:

El analizador marca erróneamente el paquete inicial ACK+FIN (Frame 1881) como un paquete keep-alive, porque el paquete keep-alive ACK anterior. Sin embargo, está iniciando el cierre de la conexión.

Frame Offset     Delta      Source IP   Dest IP     Description
----- ---------- ---------- ----------- ----------- -----------------------------------------------------------------
 1314 16.3641802  0.0000000 10.10.10.45 10.10.10.51 TCP:[Keep alive]Flags=...A...., SrcPort=51708, DstPort=1433, Payl
 1317 16.3677083  0.0035281 10.10.10.51 10.10.10.45 TCP:[Keep alive ack]Flags=...A...., SrcPort=1433, DstPort=51708, 
 1327 16.4269375  0.0592292 10.10.10.51 10.10.10.45 TCP:[Keep alive]Flags=...A...., SrcPort=1433, DstPort=51708, Payl
 1328 16.4269637  0.0000262 10.10.10.45 10.10.10.51 TCP:[Keep alive ack]Flags=...A...., SrcPort=51708, DstPort=1433, 
 1881 26.7918499 10.3648862 10.10.10.45 10.10.10.51 TCP:[Keep alive ack]Flags=...A...F, SrcPort=51708, DstPort=1433, 
 1886 26.7929474  0.0010975 10.10.10.51 10.10.10.45 TCP:Flags=...A...., SrcPort=1433, DstPort=51708, PayloadLen=0, Se
 1888 26.7929474  0.0000000 10.10.10.51 10.10.10.45 TCP:Flags=...A...F, SrcPort=1433, DstPort=51708, PayloadLen=0, Se
 1890 26.7929947  0.0000473 10.10.10.45 10.10.10.51 TCP:Flags=...A...., SrcPort=51708, DstPort=1433, PayloadLen=0, Se