数据包tds通讯结构.docx

上传人:b****5 文档编号:8347829 上传时间:2023-01-30 格式:DOCX 页数:19 大小:39.37KB
下载 相关 举报
数据包tds通讯结构.docx_第1页
第1页 / 共19页
数据包tds通讯结构.docx_第2页
第2页 / 共19页
数据包tds通讯结构.docx_第3页
第3页 / 共19页
数据包tds通讯结构.docx_第4页
第4页 / 共19页
数据包tds通讯结构.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据包tds通讯结构.docx

《数据包tds通讯结构.docx》由会员分享,可在线阅读,更多相关《数据包tds通讯结构.docx(19页珍藏版)》请在冰豆网上搜索。

数据包tds通讯结构.docx

数据包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=支持非-加速

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1