什么是 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 的数据。