共用方式為


將網路驗證程序追蹤至資料庫引擎

本文提供數個網路追蹤範例,在用戶端應用程式與 SQL Server 資料庫引擎(伺服器)之間的傳輸控制通訊協定 (TCP) 連線建立程式期間,擷取各種交握和驗證順序。

如需關閉連線的相關信息,請參閱追蹤 資料庫引擎 上的網路連線關閉順序。

驗證類型

您可以使用 Windows 驗證連線到 資料庫引擎(使用 KerberosNTLM 驗證),或 SQL 驗證。

本文也會說明多個作用中結果集 (MARS) 連線。 MARS 是 SQL Server 的一項功能,由 SQL Server 2005 (9.x) 引進,可在連接上執行多個命令,而不需要先清除第一個命令的結果,再執行第二個命令。 MARS 是透過會話多任務處理 (SMUX) 來達成。

此程式描述使用 SQL 驗證的一般登入程式,透過詳細的網路追蹤分析,顯示用戶端與伺服器之間對話的每個步驟。 範例網路追蹤會描述下列步驟:

  1. TCP 三向交握
  2. 驅動程式交握
  3. SSL/TLS 交握
  4. 登入封包交換
  5. 登入確認
  6. 執行命令並讀取回應
  7. TCP 四向關閉交握

範例網路追蹤

不論 Login Timeout 連接字串 中的設定為何,此交換都會配置 1 秒。

  • 用戶端IP位址為 10.10.10.10
  • 伺服器IP位址為 10.10.10.120

步驟 1: TCP 三向交握

所有 TCP 交談都是從用戶端傳送到伺服器的封包 (S旗標集) 開始SYN。 在 Frame 6127中,用戶端會使用暫時埠(由作業系統動態指派),並連線到伺服器埠,在此案例中為埠 1433。 伺服器會以自己的 SYN 封包回復, ACK 並設定旗標。 最後,用戶端會以封 ACK 包回應,讓伺服器知道它已收到其 SYN 封包。

此步驟會建立基本的 TCP 連線,就像命令一 telnet 樣。 操作系統會調解交談的這個部分。 此時,客戶端和伺服器對彼此一無所知。

三向交握的圖表。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6127  116.5776698 10.10.10.10  10.10.10.120 TCP:Flags=......S., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702293, Ack=0, Win=8192 ( Ne
6128  116.5776698 10.10.10.120 10.10.10.10  TCP:Flags=...A..S., SrcPort=1433, DstPort=60123, PayloadLen=0, Seq=4095166896, Ack=4050702294, Win=
6129  116.5786458 10.10.10.10  10.10.10.120 TCP:Flags=...A...., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702294, Ack=4095166897, Win=

在此步驟中[Bad CheckSum],警告是良性的,而且是啟用總和檢查碼卸除的指標。 也就是說,它們會在網路堆疊中的較低層級新增,而不是使用追蹤。 如果沒有其他資訊,這個警告會指出是否已在用戶端或伺服器上進行網路追蹤。 在此情況下,它會出現在初始 SYN 封包上,因此追蹤是在用戶端上進行。

步驟 2。 驅動程式交握

用戶端驅動程式和 SQL Server 都需要彼此瞭解一點。 在此交握中,驅動程式會將一些資訊和需求傳送至伺服器。 這項資訊包括是否要加密數據封包、是否要使用多個作用中結果集(MARS)、其版本號碼、是否要使用同盟驗證、連線 GUID 等等。

伺服器會回應其資訊,例如是否需要驗證。 此順序會在執行任何類型的安全涉之前發生。

驅動程式交握的圖表。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6130  116.5786458 10.10.10.10  10.10.10.120 TDS:Prelogin, Version = 7.1 (0x71000001), SPID = 0, PacketID = 0, Flags=...AP..., SrcPort=60123, Ds
6131  116.5805998 10.10.10.120 10.10.10.10  TDS:Response, Version = 7.1 (0x71000001), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=1433, Dst

步驟 3: SSL/TLS 交握

SSL/TLS 交握會從 Client Hello 封包開始,然後是 Server Hello 封包,再加上一些與安全通道相關的額外封包。 此步驟是交涉安全性密鑰來加密封包的位置。 一般而言,只有登入封包已加密,但用戶端或伺服器也可能需要加密數據封包。 選擇 TLS 版本會在登入的這個階段發生。 如果 TLS 版本未排隊,或沒有任何加密套件,用戶端或伺服器可以在此階段關閉連線。

SSL/TLS 交握的圖表。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6132  116.5835288 10.10.10.10  10.10.10.120 TLS:TLS Rec Layer-1 HandShake: Client Hello. {TLS:328, SSLVersionSelector:327, TDS:326, TCP:325, IP
6133  116.5845058 10.10.10.120 10.10.10.10  TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Hello Done. {TLS:328, SSLVersionSe
6134  116.5864588 10.10.10.10  10.10.10.120 TLS:TLS Rec Layer-1 HandShake: Client Key Exchange.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec La
6135  116.5923178 10.10.10.120 10.10.10.10  TLS:TLS Rec Layer-1 Cipher Change Spec; TLS Rec Layer-2 HandShake: Encrypted Handshake Message. {TL

步驟 4. 登入封包

此封包已加密,視您的網路剖析器而定,可能會顯示為 SSL Application DataTDS:Data。 如果此步驟之後的所有封包也會顯示為 SSL Application Data,則會加密連線。

SQL 登入的圖表。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6136  116.5932948 10.10.10.10  10.10.10.120 TLS:TLS Rec Layer-1 SSL Application Data {TLS:328, SSLVersionSelector:327, TDS:326, TCP:325, IPv4:3

步驟 5: 登入確認

否則,您會看到回應封包,其會確認登入(具有登入 ACK 令牌),或將 Login Failed 錯誤訊息傳回給用戶端。

以下是您可能會在封包十六進位數據中看到成功登入的範例:

.C.h.a.n.g.e.d. .d.a.t.a.b.a.s.e. .c.o.n.t.e.x.t. .t.o. .'.A.d.v.e.n.t.u.r.e.W.o.r.ks'

SQL 登入確認的圖表。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6137  116.5962248 10.10.10.120 10.10.10.10  TDS:Response, Version = 7.1 (0x71000001), SPID = 96, PacketID = 1, Flags=...AP..., SrcPort=1433, Ds

步驟 6。 執行命令並讀取回應

命令會以 或 TDS:RPCRequest 封包的形式TDS:SQLBatch傳送。 前者會執行一般 Transact-SQL 語句,後者則執行預存程式。 如果命令冗長,您可能會在回應封包中看到 TCP 接續封包;如果傳回多個數據列,您可能會在回應封包中看到。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6138  116.5991538 10.10.10.10  10.10.10.120 TDS:SQLBatch, Version = 7.1 (0x71000001), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=60123, Ds
6139  116.5991538 10.10.10.120 10.10.10.10  TDS:Response, Version = 7.1 (0x71000001), SPID = 96, PacketID = 1, Flags=...AP..., SrcPort=1433, Ds
6266  116.8032558 10.10.10.10  10.10.10.120 TCP:Flags=...A...., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702956, Ack=4095168204, Win=

步驟 7。 TCP 四向關閉交握

Microsoft驅動程式會使用四向交握來關閉連線。 許多第三方驅動程式只是重設連線以關閉它,使得更難區分正常和異常關閉。

四向交握是由傳送封包至伺服器的用戶端 FIN 所組成,伺服器會以 ACK回應。 然後,伺服器會傳送自己的 FIN 封包,客戶端會認可 (ACK)。

如果伺服器先傳送封 FIN 包,當客戶端和伺服器無法交涉安全通道時,通常會在 SSL/TLS 交握中看到異常關閉。

四向交握的圖表。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6362  116.9097008 10.10.10.10  10.10.10.120 TCP:Flags=...A...F, SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702956, Ack=4095168204, Win=
6363  116.9097008 10.10.10.120 10.10.10.10  TCP:Flags=...A...., SrcPort=1433, DstPort=60123, PayloadLen=0, Seq=4095168204, Ack=4050702957, Win=
6364  116.9097008 10.10.10.120 10.10.10.10  TCP:Flags=...A...F, SrcPort=1433, DstPort=60123, PayloadLen=0, Seq=4095168204, Ack=4050702957, Win=
6366  116.9106778 10.10.10.10  10.10.10.120 TCP:Flags=...A...., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702957, Ack=4095168205, Win=