Поделиться через


Трассировка последовательности закрытия сетевого подключения на движке базы данных

В этой статье приведены примеры сетевой трассировки, которая фиксирует последовательность при закрытии подключения по протоколу TCP между клиентским приложением и сервером базы данных SQL Server (сервер). Понимание этих шаблонов имеет решающее значение для диагностики сетевого поведения, определения стратегий пула и оптимизации управления подключениями в веб-приложениях или приложениях-службах.

Закрытие типов подключений

В этой статье приведены примеры обычных TCP-соединений и нескольких активных наборов результатов (MARS). MARS — это функция SQL Server, представленная в SQL Server 2005 (9.x), которая позволяет выполнять несколько команд в соединении без необходимости очистки результатов из первой команды перед выполнением второй команды. MARS достигается посредством мультиплексирования сеансов (SMUX).

В этом разделе описывается несколько примеров закрытия сетевого подключения.

  • IP-адрес клиента 10.10.10.104
  • IP-адрес сервера 10.10.10.22

Закрытие пакетов

В этом примере показана обычная последовательность закрытия соединения. Обратите внимание на низкие числа кадров и смещения времени. Эта последовательность, скорее всего, представляет собой закрытие соединения из пула. Это должно происходить в течение 30 секунд после начала трассировки, или вы также можете увидеть пакеты keep-alive.

Схема четырехстороннего закрытия сеанса 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

Инструкции Transact-SQL и закрывающие пакеты

В этом примере показано закрытие непулированного подключения после двух инструкций Transact-SQL. Если бы это подключение не включалось в пул, вы могли бы также увидеть пакеты поддержания соединения, связанные с возвращением подключения в пул подключений, вместо закрывающих пакетов сразу после последнего ответа сервера. Мы рекомендуем объединять подключения в пул в любом веб-приложении или служебном приложении, чтобы обеспечить повторное использование подключений. Пул подключений уменьшает количество подключений к серверу и сокращает затраты и задержку, связанные с новыми подключениями.

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

Неактивное или подключение из пула закрывается

Подключение закрывается через 10 секунд после предыдущего keep-alive обмена (см. столбец Delta).

Примечание.

Средство синтаксического анализа ошибочно помечает начальный ACK+FIN пакет (Frame 1881) как keep-alive пакет ACK, из-за предыдущего keep-alive пакета. Однако оно инициализирует закрытие подключения.

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