数据包tds通讯结构.docx
《数据包tds通讯结构.docx》由会员分享,可在线阅读,更多相关《数据包tds通讯结构.docx(19页珍藏版)》请在冰豆网上搜索。
数据包tds通讯结构
数据包(tds)通讯结构:
首先我们分析一下sql通讯的具体构架:
这就是客户端进行连接的过程:
当客户端连接到服务器时,应用程序请求连接远端计算机,Dbnetlib.dll将打开到连接中所指定的计算机网络名上的TCP端口1433的连接。
所有运行SQL服务器2000的计算机都监听此端口。
当一个客户端Dbnetlib.dll连接到该端口时,服务器将返回一个监听服务器上运行的所有实例的数据包。
对于每个实例,该数据包报告该实例正在监听的服务器网-库和网络地址。
应用程序计算机上的Dbnetlib.dll收到该数据包后,选择在应用程序计算机和SQL服务器实例上都启用的网-库,然后连接为此数据包中的网-库列出的地址。
微软公司sql服务器服务器组件接收来自客户端的sql语句并处理这些sql语句。
下图显示处理来自sql服务器客户端的sql语句所涉及的主要组件:
tds(不同版本的应用程序用不同的TDS协议)
∙下面有几点说明:
∙1.表格格式数据流
∙客户端使用称为表格格式数据流(tds)的sql服务器专用应用程序级协议来发送sql语句。
sql服务器2000接受tds的下列版本:
由运行来自sql服务器2000的sql服务器客户端组件版的客户端发送的tds8.0。
tds8.0客户端支持sql服务器2000的所有功能。
由运行来自sql服务器7.0版的sql服务器客户端组件版的客户端发送的tds7.0。
tds4.2客户端不支持sql服务器2000中引入的功能,而且服务器有时必须调整发送回tds7.0客户端的数据。
例如,tds7.0客户端不支持sql_variant数据类型,因此sql服务器2000必须将所有sql_variant数据都转换成unicode数据类型。
由从sql服务器6.5、6.0和4.21a中运行sql服务器客户端组件的客户端所发送的tds4.2。
tds4.2客户端不支持sql服务器2000中引入的功能,也不支持sql服务器7.0中引入的功能,而且服务器有时必须调整发送回tds4.2客户端的数据。
例如,tds4.2客户端不支持unicode数据类型,因此在给客户端发送unicode数据类型之前,sql服务器2000必须先将其转换成字符数据,这样做可能会丢失扩展字符。
tds4.2客户端还不支持比255个字节长的字符、varchar、二进位的或varbinary值,因此在将任何超过255的值发送给客户端之前,sql服务器2000必须先将其截断。
2.服务器网-库
tds数据包由用于sql服务器的微软公司OLEdecibel分贝提供程序、sql服务器odbc驱动程序或分贝分贝-库dll生成。
tds数据包然后被传递给sql服务器客户端网-库,客户端网-库将tds数据包封装为网络协议数据包。
在服务器上,服务器网-库接收网络协议数据包,且析取tds数据包并将其传递给关系数据库服务器。
在将结果返回给客户端时,这一进程反向执行。
每台服务器都可以同时监听几个网络协议,并为其监听的每个协议各运行一个服务器网-库
二.在sql服务器数据库传输过程中利用tds协议传输数据,下面我具体地分析tds包的结构:
一般来说,所有的数据包都有一个8个字节的通用包头
1字节1字节2字节2bytes1bytes1bytes
|----------|----------|---------|----------|-------+-----------|
|数据包|数据包|包的||||
|的类型|的|大小|信号数|包数|窗口|
||标志位||||状态|
+----------+----------+---------+----------|-------|-----------|
结构为:
0字节为包的类型:
其中:
0x01TDS4.2或7.0查询包
0x02TDS4.2或5.0请求包
0x04服务器的回应包
0x06取消
0x0FTDS5.0查询包
0x10TDS7.0请求包
(可能是bitwise加旗的)
1字节为包的状态:
0x00还有包后续包
....0...=(没有事件通知)
.....0..=(没有参与请求)
......0.=(没有参与确认)
.......0=(没有后续缓冲器)
0x01最后一个包
2字节为TDS包长
4字节为信道数
6字节包的数目
7字节窗口状态
0为不使用
1为使用
-------->登录
根据通用包头的结构我们可以了解到个任意包的类型是什么,但不管是什么包(查询包,请求包,还是响应包),一般情况下它一次最多只能传送512各字节,因此任何包它都要小于等于512个字节,也就是说如果发送包大于512个字节计算机在数据传输的时候就要把他分成几个部分,下面是一个请求包(tds5.0)他分成了两个包(共597个字节):
第一个包:
字节结构类型字段意义说明
8dbcharhost_name[30];主机名
38dbtinyinthost_name_length;主机名长度
39dbcharuser_name[30];用户名
69dbtinyintuser_name_length;用户名长度
70dbchar口令[30];用户密码
100dbtinyintpassword_length;用户密码长度
101dbcharhost_process[30];主机所处进程
131dbtinyinthost_process_length;主机所处进程的长度
132dbchar2字节int客户订购=3(2byteintISB在IO字节)
1334字节int客户订购=1(4byteintISB在IO字节)
134字符格式(字符格式=6(ASCII特性))
1358字节漂流物格式=10(8byteIEEE漂流物有LSB在瞧!
字节)
1368字节日期格式=9(8bytedatetimeLSM在瞧!
字节)
137dbtinyintuse_database是否用数据库(=1)
138dbtinyintbulk_copy复制大小
145139dbchar接口备用接口
140dbchardialog_type对话类型
141dbcharbuffer_size缓冲器大小(缓冲器大小=)
魔法[3]
148dbcharapp_name[30];应用名
178dbtinyintapp_name_length;应用名长度
179dbcharserver_name[30];SQL服务器名
209dbtinyintserver_name_length;服务器名长度
210dbcharmagic3;还没有结果
211dbtinyintpassword2_length;服务器密码长度
212dbcharpassword2[30];服务器密码
242dbcharmagic4[223];还没有结果
465dbtinyintpassword2_length_plus2;加密长度
466dbsmallintmajor_version;tds最高版本号
468dbsmallintminor_version;tds最低版本号
470dbcharlibrary_name[10];ct-库或分贝分贝-库
480dbtinyintlibrary_length;ct-库或分贝分贝-库
481dbsmallintmajor_version2;应用程序最高版本号
483dbsmallintminor_version2;应用程序最低版本号
485dbchar短日期型转换(转换简略datetime=0)
4864字节漂流物格式=13(4字节IEEE漂流物有LSB在瞧!
字节)
4874字节日期格式=17(4字节datetimeLSM在瞧!
字节)
488dbchar语言[30];使用语言
第二个包:
518dbtinyintlanguage_length客户机本地使用语言的长度
519dbcharlanguage_changes语言的改变(通知语言改变=0)
520dbsmallintold_secure;/*explaination?
*/
522dbtinyint加密;
522通过安全请求x0
....0...=(保证登录不请求定义)
.....0..=(没有用安全标签不要使用安全标签)
......0.=(没有挑战性请求不挑战登录)
.......0=(没有加密请求不加密登录)
523dbtinyintbulk_security大量安全大小复制安全小块=0
524dbcharsec_spare[9]//exlaination?
533dbcharchar_set[30]字符集名字=iso_1
563dbtinyintchar_set_length字符集名字长度=5
564dbtinyint通知字符设置改变=1
565dbcharblock_size[6]包的大小小包裹大小=512
571dbtinyintblock_size_length包大小的长度
572未知的字节/*是00000000*/
576dbtinyinttoken_typeTDS表示类型
577dbtinyinttoken_length表示类型的长度
578能力类型=1(请求能力)
579没有.能力咬的=7
580能力字节1=03
581capybility字节2=6d
.1......=支持tokenized文本和图象
..1.....=支持tokenized大小复制
....1...=支持敏感安全数据类型
.....1..=支持敏感安全数据类型
......1.=支持边界安全数据类型
.......1=之前悬而未决"创造proc"到动态准备声明
582capybility字节3=7F
.1......=支持接来首先行指针cornmands
..1.....=支持接来最后的行指针命令
..1....=支持接来完全的行指针命令
....1...支持接来亲戚行指针命令
.....1..=支持multi_rowfetchcursor命令
......1.=支持expelited注意
.......1=支持非-加速注意
583capybility字节4=FF
1.......=支持文本数据类型
.1......=支持图象数据类型
..1.....=支持十进的数据类型
...1....=支持长的varchar数据类型
....1...=支持长的变量长度二进位的数据类型
.....1..=支持无效力的整数
......1.=支持无效力的日期/时间
.......1=支持无效力的货币
584capybility字节5=FF
1.......=支持变量长度二进位的数据类型
.1......=支持8字节货币数据类型
..1.....=支持4字节moneydata类型
...1....=支持8字节日期/时间数据类型
....1...=支持4字节日期/时间数据类型
.....1..=支持4字节漂浮的点数据类型
......1.=支持8字节漂浮的点数据类型
.......1=支持数字的数据类型
585capybility字节6=FF
1.......=RPC请求使用TDS_DBRPC
.1......=支持1字节整数
..1.....=支持1字节整数
...1....=支持1字节整数
....1...=支持小块数据类型
.....1..=支持固定的长度特性数据类型
......1.=支持varchar数据类型
.......1=支持固定的长度二进位的数据类型
586能力字节7=铁
1.......=语言请求
.1......=RPC请求
..1.....=已注册的程序事件通知
...1....=支持多样的命令每请求
....1...=大小复制请求
.....1..=指针命令请求
......1.=动态sql请求
587能力类型=2(回答能力)
588没有.能力字节的=7
589能力字节7=00
590能力字节6=00
591能力字节5=00
592能力字节4=68
.1......=支持图象数据类型
..1.....=支持十进的数据类型
....1...=支持长的变量长度二进位的数据类型
593能力字节3=0A
594能力字节2=00
595能力字节1=00
596
TDS-----(Reponse
0x21(语言请求)
1字节4byte字符[n]
+--------+------+------------------+
|表示|长度|数据(对作用)|
+--------+------+------------------+
例如:
TDS表示类型=0x21(语言请求)
表示bypes保持=25(4字节)
消息=滴下桌子longquerytest
0x79(返回状态信息)
4字节
+------+----------+
|表示|返回状态|
+------+----------+
例如:
TDS表示类型=0x79
回来状态价值=0
0x81(删除行穿过指针)
int8int164bypesint8int8字符[n]
+---------+---------+--------+----------+----------+-------+
|表示|长度|游标号|游标状态|表名长度|表名|
+---------+---------+--------+----------+----------+-------+
例如:
TDS表示类型=0x81(删除行穿过指针)
表示字节保持=4
指针Id=0
指针状态=52(未知的指针状态)
桌子名字长度=0
桌子名字=组
行数据
0xA7(计算"控制")
1字节2byte2byte
+------+------+-------+
|表示|长度|?
?
|
+------+------+-------+
TDS表示类型=0xAE
表示字节保持=2
Unknow通常是0000
0xAA(错误消息)
int8int164typesint8int8
+------+------+--------------+-----+-----+
|表示|长度|服务器消息数目|状态|级别|
+------+------+--------------+-----+-----+
int8字符[n]int8int8字符[n]int16
+----------+--------+-------------+---------+----------+-------+
|消息长度|消息长度|服务器名长度|服务器名|程序名长度|线#|
+----------+--------+-------------+---------+----------+-------+
TDS表示类型=0xAA(错误消息)
表示字节保持=104
SQL服务器信息数=5105
通知情形=2
通知班级=16
消息长度=43
[43字节(s)文本的]
服务器名字长度=3
服务器名字=Z
程序名字长度=0
线#在一炉或proc=67
[121字节(s)行数据的]
0xAB(通知消息)
int8int164typesint8int8
+------+------+--------------+-----+-----+
|表示|长度|服务器消息数目|状态|级别|
+------+------+--------------+-----+-----+
int8字符[n]int8int8字符[n]int16
+----------+--------+-------------+---------+----------+-------+
|消息长度|消息长度|服务器名长度|服务器名|程序名长度|线#|
+----------+--------+-------------+---------+-----------+-------+
TDS表示类型=0xAA(通知消息)
表示字节保持=88
SQL服务器信息数=22001
通知情形=0
通知班级=1
消息长度=38
消息=RegQueryvalueEx()
服务器名字长度=222
服务器名字=Z
程序名字长度=86
线#在一炉或proc=38169
[61字节(s)行数据的]
0xAC(输出参数)
int16int8字符[n]5字节int8
+------+------+-----+---------+---------+-----------------+------+
||包长|列长|列名|?
?
|返回的数据类型|....|
+------+------+-----+---------+---------+-----------------+------+
这最后的信息取决于数据类型:
1.如果为固定的类型(大小为n)则:
n字节
+---------+
|数据|
+---------+
int8int8n字节
+-------------+---------------+--------+
2.否则为:
|列的大小|实际大小|数据|
+-------------+---------------+--------+
0xAD(登陆请求)
+-------+------+------+-----------+------------+-------------+-------------|
|表示|长度|状态|TDS版本号|应用程序长度|应用程序名字|应用程序版本号|
+-------+------+------+-----------+------------+-------------+-------------|
例如:
TDS表示类型=0xAD
Tokeng字节保持=20
登录状态=5(登陆请求完全成功)
TDS版本=50000
程序名字长度=10
程序名字服务器=sql服务器
服务器程序版本=1001
0xAE(用户控制列)
1字节2byte2byte
+------+------+-------+
|表示|长度|?
?
|
+------+------+-------+
TDS表示类型=0xAE
表示字节保持=2
Unknow通常是0000
0xD1(行(s)数据的)
int8变量大小
+----------+--------------------+
|表示|数据行|
+----------+--------------------+
数据行:
+----------+--------------------+
|数据行数|列名|长度|数据|
+----------+------+------+------+
例如:
TDS表示类型=0xD1(行(s)数据的)
行#列名字长度数据
1dbname5放2
1用户名称5客人
0xD3(数据-计算结果)
int8变量大小
+----------+--------------------+
|表示|数据行|
+----------+--------------------+
0xD7
0xE2(交换能力)
TDStokeng类型=0xE2(Exchangcapabiligies)
Toden字节保持=18
能力类型=1(请求能力)
的没有caability字节=7
能力字节7=E6
1.......=语言请求
.1......=RPC请求
..1.....=注册程序事件通告
.....1..=指针命令请求
......1.=动态SQL数据库请求
capybility字节6=FF
1.......=RPC请求使用TDS_DBRPC
.1......=支持1字节长的整型
..1.....=支持2字节长的整型
...1....=支持4字节长的整型
....1...=支持为位数据型
.....1..=支持固定长度字符型数据类型
......1.=支持字符型数据类型
.......1=支持固定长度整型数据类型
capybility字节5=FF
1.......=支持变量长度二进位的数据类型
.1......=支持8字节货币数据类型
..1.....=支持4字节moneydata类型
...1....=支持8字节日期/时间数据类型
....1...=支持4字节日期/时间数据类型
.....1..=支持4字节漂浮的点数据类型
......1.=支持8字节漂浮的点数据类型
.......1=支持数字的数据类型
capybility字节4=CF
1.......=支持文本数据类型
.1......=支持图象数据类型
....1...=支持长的变量长度二进位的数据类型
.....1..=支持无效力的整数
......1.=支持无效力的日期/时间
.......1=支持无效力的货币
capybility字节3=41
.1......=支持接来首先行指针cornmands
.......1=支持非-加速