参考文献:
TDS的解析
在前面一篇博客netmon中解析非1433端口的TDS协议中我们提到了netmon如何去解析非1433端口的TDS。我们是通过在tcp.npl这个文件中添加命名实例的tcp端口号,让该端口的tcp包跳转到tds.npl中去解析。下面我们来看一下tds.npl中有哪些内容呢?首先我看到在tds.npl中定义了一个 TDSPacketTypeTable:
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. |