什么是TDS
TDS数据库是一个比较少见的数据库类型。TDS指的是Tabular Data Stream,这是一种微软SQL Server使用的协议,实现了在SQL Server和客户端之间的数据交换。TDS也可以称为SQL Server的网络协议,因此TDS数据库也就是使用了TDS网络协议进行数据交换的数据库。
TDS相关资料
- TDS Protocol Documentation: 这是微软官方提供的TDS协议文档,详细介绍了TDS协议的各个方面,包括报文格式、命令集、数据类型等。官方文档通常是深入了解一个技术的最佳选择。
- OpenTDS: 这是一个开源的TDS协议库,其中包含了完整的TDS协议实现以及各种常见的TDS命令的实现。你可以通过阅读源代码来深入了解TDS协议的实现细节。
- FreeTDS: 这是一个用于Unix/Linux系统的TDS协议库,同样提供了完整的TDS协议实现,以及各种常见的TDS命令的实现。它的主要应用场景是在Unix/Linux下访问SQL Server数据库。
- TDS Protocol: 这是一篇介绍TDS协议的博客文章,其中详细解释了TDS的报文格式和各种命令的含义。尽管这篇文章发表于2009年,但它依然是深入了解TDS协议的好资料之一。
Microsoft SQL Server TDS Protocol Documentation: 这是Michael Aspengren在1993年为Microsoft SQL Server 4.2所写的TDS文档。虽然早已不是最新的版本,但是这份文档详细描述了TDS协议的报文格式和命令定义。
sql server安装
微软官方下载地址:
https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
微软官方针对sql server提供了多种不同的许可版本
其中可以免费使用的是
- Evaluation (免费,无生产许可,180 天限制)
- Developer (免费,无生产许可,可用作非生产环境的测试)
- Express (阉割版本)
同时提供Linux版本
windows
- 打开安装包
- 点击安装,选择基本类型
- 接收软件安装许可
- 选择安装位置
- 安装
- 安装完成后,安装ssms
- 从官网下载ssms(数据库管理工具)打开安装
- 打开测试
LInux环境安装
微软官方提供了linux安装教程,已red had系为例
- 添加软件源
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo 安装( centos 7 中 make gcc,glibc版本低,重新升级需要花费很大的精力,因此搭建新的环境测试,安装部署环境 fedota38 )
sudo yum install -y mssql-server
使用完整路径运行mysql-conf setup
sudo /opt/mssql/bin/mssql-conf setup
- 选择版本
- 选择语言
- 设置密码
设置完密码后,sqlserver 就已经安装完成了,调用
systemctl status mssql-server
可以查看服务状态
遇到问题: mssql-server 启动失败,
安装过程中出现了很多问题,比如 fedora 中liblcap版本为2.4.0 而 mssql-server的依赖为2.4.2 ; /opt/mssql/lib中没有libcrypto与libssl的动态库,解决了这些问题后又出现了配置初始化失败的问题,暂时没找到解决办法,因不涉及应用,只是搭建测试环境,暂缓解决。TDS
表格数据流(TDS)协议版本7和8,以下简称“TDS”,是用于在客户端和数据库服务器系统之间传输请求和响应的应用程序级协议。在这样的系统中,客户端通常会与服务器建立一个长连接。一旦使用传输层协议建立了连接,就可以使用TDS消息在客户机和服务器之间进行通信。如果需要,数据库服务器也可以充当客户机,在这种情况下,必须建立单独的TDS连接。
TDS包括用于身份验证和标识、通道加密协商、发出SQL batches、存储过程调用、返回数据和事务管理器请求的工具。返回的数据是自描述的和面向记录的。数据流描述被返回的行的名称、类型和可选描述。
流程概要图
表格数据流(Tabular Data stream, TDS) 协议版本7和8是一个应用层请求/响应协议,它促进了与数据库服务器的交互,并提供以下功能
- 身份认证与通道加密
- sql中的请求规范
- 存储过程或者用户定义函数的调用,同时包括远程调用
- 返回数据
事务管理请求
TDS 是应用层协议,可以利用TLS协议对通讯进行加密,TDS 7.x版本中,TLS信道加密是可选项,TDS 8.0以后的版本,TLS加密已经变成了一种必选项。
关键词说明(Glossary)
文档部分关键字说明
- Azure Active Directory Authentication Library(ADAL): .net 提供的一种身份认证工具,允许获得认证的开发者安全的调用api。
- big-endian 大端对齐
- bulk insert: 一种表的表示方法。
- common language runtime user-defined type (CLR UDT): dot net 支持的一种用户定义的公共语言,用于运行时程序集的创建和定义。
- data classification: 一种信息保护框架
- data stream:数据流
- Distributed Transaction Coordinator (DTC):一种Windows服务,用于协调跨多个资源管理器(包括数据库)的事务。
- enclave: 仅在服务器端使用的受保护内存区域。该区域位于SQL Server的地址空间内,充当可信的执行环境。只有在enclave内运行的代码才能访问该enclave中的数据。即使使用调试器,也不能从外部查看envlave内的数据和代码。
- SQL batch: sql语句
SQL statement: 服务器能够理解的语言中的字符表达式
消息结构
客户端消息类型
- Pre-Login :在TCP握手之后,用户登录之前,确定编码格式,通讯加密方式等信息
- Login:当用户决定向服务端建立一个TDS链接时,客户端会发送一条登录信息数据流,客户端可以跟服务器建立多条链接,但是每条链接建立的方式都是相同的。服务端接受到客户端的登录信息之后,会在必要的时候进行握手认证,并向客户端表示接受或者拒绝链接。
- Federated Authentication Token :令牌证书认证,如果客户端指定要求用令牌登录,并且服务端支持,则登录信息用令牌登录
- SQL Batch :发送一条或者一批sql语句,一条sqlBatch可以跨包传输,使用unicode编码
- Bulk Load :在批量插入/批量加载操作中,SQL语句由后跟二进制数据的Unicode字符串组成。客户端发送INSERT BULK SQL语句,然后发送描述原始数据的COLMETADATA令牌(2.2.7.4节)。然后将多行二进制数据发送到服务器。数据的格式不是存储行格式,而是COLMETADATA标记所描述的格式。该流与从服务器选择数据而不是发送到服务器的数据相同。
- Remote Procedure Call: 客户端发送一条RPC消息给服务器,在服务器上执行一个远程处理命令。消息是一条二进制数据流,并且,这条二进制数据流中包含rpc名称或者名称标识符,选项和语句。 rpc消息是一条独立的tds消息,并且不包含sql语句,但是一条rpc报文可以拥有多条rpc消息。
- Attention:客户端通过发送attention消息,可以打断或者取消当前请求。
Transaction Manager Request:客户端可以请求链接加入MSDN_DTC描述的事务
服务器消息类型
- pre-Login response:一条没有token的报文数据流,这个数据流包含了pre-login 的响应消息
- login response:登录消息的响应报文
- federated authentication information :令牌证书认证。
- row data:查询结果返回
- return status:存储过程由服务器执行后,服务器必须返回一个状态值
- return parameters:不论是sql batch还是rpc batch消息请求的数据,返回的数据都是一个表格数据,(返回参数)
- response completion:执行了一批sql语句后,服务端必须为每一组sql语句提供一个确认消息(官方文档称其为DONE token,这里认为是确认消息)
- error and info :错误与信息消息
attention acknowlegement:中断与取消消息的确认消息(DONE token)
packet
一条消息(message)可以包含一条或者多个mssql packet,一条mssql packet 会有一个packet header,通常情况下, packet heaer后还会报文的消息。每一条新的message 都是一条新的packet
packet header
官方文档里给出说是报文头,实际上这个应该是整个数据流的头,根据报文分析,在每一条报文中,首先会有一个packet header 去标明该条报文中是什么消息类型,总共占用八字节的长度
- Type:一个字节,描述了消息类型
下面这个表标识了客户端与服务端各个消息的类型
- status
status 占一个字节,使用了五个bit位分别标识了一种状态
0x00 | 正常报文 |
---|---|
0x01 | 最后一条消息 |
0x02 | 从客户端发往服务端,忽略这个事件 |
0x08 | 重置链接,并清除所有状态(必须在第一条packet,且与下面这个状态不能同时设置) |
0x10 | 重置链接,保留状态 |
- length
网络字节序,占两个字节,包含packet header的八个字节,从这个packet到下一个packet header 的长度。这个长度必须大于512字节,小于32767字节,packet的大小,必须小于4096 大小,知道长度协商成功,默认大小就是4096. - spid
由服务器发给客户端的 process id , 用于标识服务器上的哪个现成给客户端发送的这个packet, 用于调试,客户端也有可能发送这个标识,如果客户端没有发送,则全置零,占两个字节 - packetid
占一个字节,用于标识一条message的编号,从1 - 256 递增,这个值当前被忽略了 - window
这个值目前没用,占一个字节。
packet Data
packet data 跟在header后面,包含了mssql的主要通讯数据,一条packet是有可能跨越多个报文的。
Packet Data Token and Tokenless Data Streams
packet 包含两种类型,一种是Token 一种是 tokenless。 tokenless 一般用于相对较简单的数据传输,token较为复杂,一条packer可能包含多个token/tokenless 消息。
下面是哪些消息使用token 哪些使用tokenless
消息类型 | 客户端/服务器 | 是否使用token |
---|---|---|
pre-login | c | n |
login | c | n |
federated authentication token | c | n |
sql command | c | n |
bulk load | c | y |
remote procedure call(rpc) | c | y |
attention | c | n |
transaction manager request | c | n |
pre-login response | s | y |
feerated autheenrication information | s | y |
featureextack | s | y |
login response | s | y |
row data | s | y |
return status | s | y |
return parameters | s | y |
response completion | s | y |
session state | s | y |
error and info | s | y |
attention acknowledgement | s | n |
- tokenless stream
一些消息并不使用token去描述数据部分作为数据流,所有的信息需要描述包含在packet head 中的packet data。 - token stream
token是一个复合型的类型,包含有多种不同的消息类型,由一个字节标识token类型,后面跟上每个token的数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。