什么是TDS

TDS数据库是一个比拟少见的数据库类型。TDS指的是Tabular Data Stream,这是一种微软SQL Server应用的协定,实现了在SQL Server和客户端之间的数据交换。TDS也能够称为SQL Server的网络协议,因而TDS数据库也就是应用了TDS网络协议进行数据交换的数据库。

TDS相干材料

  1. TDS Protocol Documentation: 这是微软官网提供的TDS协定文档,具体介绍了TDS协定的各个方面,包含报文格式、命令集、数据类型等。官网文档通常是深刻理解一个技术的最佳抉择。
  2. OpenTDS: 这是一个开源的TDS协定库,其中蕴含了残缺的TDS协定实现以及各种常见的TDS命令的实现。你能够通过浏览源代码来深刻理解TDS协定的实现细节。
  3. FreeTDS: 这是一个用于Unix/Linux零碎的TDS协定库,同样提供了残缺的TDS协定实现,以及各种常见的TDS命令的实现。它的次要利用场景是在Unix/Linux下拜访SQL Server数据库。
  4. TDS Protocol: 这是一篇介绍TDS协定的博客文章,其中具体解释了TDS的报文格式和各种命令的含意。只管这篇文章发表于2009年,但它仍然是深刻理解TDS协定的好材料之一。
  5. 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提供了多种不同的许可版本
其中能够收费应用的是

  1. Evaluation (收费,无生产许可,180 天限度)
  2. Developer (收费,无生产许可,可用作非生产环境的测试)
  3. Express (阉割版本)
    同时提供Linux版本

windows

  1. 关上安装包
  2. 点击装置,抉择根本类型
  3. 接管软件装置许可
  4. 抉择装置地位
  5. 装置
  6. 装置实现后,装置ssms
  7. 从官网下载ssms(数据库管理工具)关上装置
  8. 关上测试

LInux环境装置

微软官网提供了linux装置教程,已red had系为例

  1. 增加软件源
    sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo
  2. 装置( centos 7 中 make gcc,glibc版本低,从新降级须要破费很大的精力,因而搭建新的环境测试,装置部署环境 fedota38 )

    sudo yum install -y mssql-server
  3. 应用残缺门路运行mysql-conf setup

    sudo /opt/mssql/bin/mssql-conf setup
  4. 抉择版本
  • 抉择语言
  • 设置明码
  • 设置完明码后,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-logincn
logincn
federated authentication tokencn
sql commandcn
bulk loadcy
remote procedure call(rpc)cy
attentioncn
transaction manager requestcn
pre-login responsesy
feerated autheenrication informationsy
featureextacksy
login responsesy
row datasy
return statussy
return parameterssy
response completionsy
session statesy
error and infosy
attention acknowledgementsn
  • tokenless stream
    一些音讯并不应用token去形容数据局部作为数据流,所有的信息须要形容蕴含在packet head 中的packet data。
  • token stream
    token是一个复合型的类型,蕴含有多种不同的音讯类型,由一个字节标识token类型,前面跟上每个token的数据。