參考文獻:
netmon中解析非1433連接埠的TDS協議
TDS的解析
在前面一篇部落格netmon中解析非1433連接埠的TDS協議中我們提到了netmon如何去解析非1433連接埠的TDS。我們是通過在tcp.npl這個檔案中添加具名執行個體的tcp連接埠號碼,讓該連接埠的tcp包跳轉到tds.npl中去解析。下面我們來看一下tds.npl中有哪些內容呢?首先我看到在tds.npl中定義了一個 TDSPacketTypeTable:
View Code
Table TDSPacketTypeTable( value ){ switch( value ) { case 0x01: "SQLBatch"; case 0x02: "PreTDS7Login"; case 0x03: "RPCRequest"; case 0x04: "Response"; case 0x06: "Attention"; case 0x07: "BulkLoadBCP"; case 0x0E: "TransMgrReq"; case 0x10: "Login7"; case 0x11: "SSPIMessage"; case 0x12: "Prelogin"; case 0x17: "SSL"; default: "Undefined"; }}
這裡面的這些值是不是很熟悉?是的,這些就是我們TDS包的名字,比如我們會見到TDS:SQLBatch、TDS:Response等等。這些名詞都是有netmon中的tds.npl這個parser解析出來,其實網路包中傳輸過來的就是一些位元據,通過這個value netmon解析出其中的內容。
OSI七層網路通訊協定
在Network Protocols and TDS Endpoints中提到:
"When the SQL Server Database Engine communicates with an application, it formats the communication in a Microsoft communication format called a tabular data stream (TDS) packet. The network SQL Server Network Interface (SNI) protocol layer, which replaces the Net-Libraries for SQL Server 2000 and Microsoft Data Access Components (MDAC), encapsulates the TDS packet inside a standard communication protocol, such as TCP/IP or named pipes."
上面提到了TDS packet會被tcp協議封裝。這就涉及到了OSI七層網路通訊協定的內容。OSI將網路通訊工作分為七層,由高到低依次為物理層、資料連結層、網路層、傳輸層、會話層、展示層和應用程式層。
各層的作用和應用
1.物理層。物理層規定了啟用、維持、關閉通訊端點之間的機械特性、電氣特性、功能特性以及過程特性。物理層為上層協議提供了一個傳輸資料的物理媒體。屬於物理層定義的典型規範包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。
2.資料連結層。資料連結層在不可靠的物理介質上提供可靠的傳輸。資料連結層的作用包括:物理地址定址、資料的成幀、流量控制、資料的檢錯、重發等。資料連結層協議的代表包括:SDLC、HDLC、PPP、STP、框架轉送等。
3.網路層。網路層負責對子網間的資料包進行路由選擇。網路層還可以實現擁塞控制、網際互連等功能。網路層協議的代表包括:IP、IPX、RIP、OSPF等。
4.傳輸層。傳輸層是第一個端到端,即主機到主機的層次。傳輸層負責將上層資料分段並提供端到端的、可靠的或不可靠的傳輸。此外,傳輸層還要處理端到端的差錯控制和流量控制問題。
傳輸層協議的代表包括:TCP、UDP、SPX等。
5.會話層。會話層管理主機之間的會話進程,即負責建立、管理、終止進程之間的會話。會話層還利用在資料中插入校正點來實現資料的同步。
6.展示層。展示層對上層資料或資訊進行變換以保證一個主機應用程式層資訊可以被另一個主機的應用程式理解。展示層的資料轉換包括資料的加密、壓縮、格式轉換等。
7、應用程式層。應用程式層為作業系統或網路應用程式提供訪問網路服務的介面。應用程式層協議的代表包括:Telnet、FTP、HTTP、SNMP等。
在各層之間,資料是以什麼單位進行傳輸的?
這個問題比較有意思,資料在各層之間的單位都是不一樣的,在物理層資料的單位稱為位元(bit);在資料連結層,資料的單位稱為幀(frame);在網路層,資料的單位稱為資料包(packet);傳輸層,資料的單位稱為資料區段(segment)。在netmon中有一個frame number這個列。應該就是資料連結層的傳輸單位。
netmon trace解析
netmon會解析出許多內容,下面分析一些主要的內容,如下表格所示:
| Phase |
What |
How |
Why |
| Intial connection |
TCP:Flags=......S., SrcPort=60201, DstPort=37937, |
TCP handshake |
Initial connection |
| TCP:Flags=...A..S., SrcPort=37937, DstPort=60201, |
mapping tcp session to socket |
| TCP:Flags=...A...., SrcPort=60201, DstPort=37937, |
Sync starting sequence |
| |
Sync sliding window |
| Prelogin |
TDS:Prelogin, Version = 7.3 (0x730b0003), |
Version, Encryption, |
SQL allocate worker and thread for new connection setting up contexts (encryption and MARS) |
| TDS:Response, Version = 7.3 (0x730b0003), |
ThreadID, MARS |
| |
InstanceName |
| Login |
|
TLS handshake |
|
| TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Hello Done. |
|
| TLS:TLS Rec Layer-1 HandShake: Client Key Exchange.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec Layer-3 HandShake: Encrypted Handshake Message. |
authentication and identification |
| TLS:TLS Rec Layer-1 Cipher Change Spec; TLS Rec Layer-2 HandShake: Encrypted Handshake Message. |
channel encryption negotiation, |
| TLS:TLS Rec Layer-1 SSL Application Data |
|
| TDS Batch/ response |
TDS:SQLBatch, Version = 7.3 (0x730b0003), |
TDS command /response |
Process SQL request |
| TDS:Response, Version = 7.3 (0x730b0003), |
| Keepalive |
TCP:[Keep alive]Flags=...A...., SrcPort=60201, DstPort=37937, |
maintain idled session |
reduce connection overhead. |
| TCP:[Keep alive ack]Flags=...A...., SrcPort=37937, DstPort=60201, |
Deal with idle time before connection.close |
| Disconnect |
TCP:Flags=...A...F, SrcPort=61543, DstPort=37937, |
TCP session finish |
|
| TCP:Flags=...A...., SrcPort=37937, DstPort=61543, |
Close c/s session, delete port pair |
| TCP:Flags=...A...F, SrcPort=37937, DstPort=61543, |
Recycle the worker, SPID etc. |
| TCP:Flags=...A...., SrcPort=61543, DstPort=37937, |
Release TCP session memory. |