您的位置:首页 > 数据库 > Oracle

Oracle:TNS数据传输协议-进阶篇

2016-07-08 15:52 246 查看
工作流程
前面介绍了TNS协议数据包的基础结构,在对最基础的通信包结构有了一定了解后,有必要对整体工作流程有一定的认识。下面是一个应用程序到Oracle数据库的流程图。



从图中可以看出,我们研究的TNS数据传输协议是在Oracle Net这一层。 上层可以使用OCI、JDBC、.NET接口去访问数据库。在这里有个比较复杂的地方就是:我们通过抓包对比了OCI和JDBC的数据包,发现有很多地方存在着很明显的差异,这些受不同的TNS协议版本会有所不同(比如低版本客户端访问高版本服务端),虽然大部分向下兼容,但这给研究者带来了很大的复杂性。所以我们的研究是建立在Oracle11g的基础上,客户端也是采用11g的JDBC驱动。

登录及查询
下图是一个客户端从建立连接到查询的大致过程

 


基本上流程就是客户端先发起连接,服务端会返回四种状态:接受、
b5c0
拒绝、重新发送、重定向连接。一般情况下是会接受此连接的。接下来就是用户验证的过程,这其中交互比较多,其中还包含一些协商的过程。如果验证OK的话,后面客户端就可以进行查询了,如果发送了EOF标志,服务端将会主动关闭连接,整个过程就结束了。

工作模式
在TNS协议中,有一个名词叫做双任务接口(Two-Task Interface),这是客户端和服务端交互采用的一种工作模式。听起来有点抽象,下面用一个查询包来解释这种工作方式。

如下是调用 Statement::executeQuery() 函数产生的请求包,请求的命令为:select * from t_userinfo

0000   00 5d 00 00 06 00 00 00 00 00 03 5e 00 02 80 21  .].........^...!
0010   00 01 01 18 01 01 0d 00 00 04 ff ff ff ff 01 0a  ................
0020   04 7f ff ff ff 00 00 00 00 00 00 00 00 00 00 00  ................
0030   01 00 00 00 00 00 73 65 6c 65 63 74 20 2a 20 66  ......select * f
0040   72 6f 6d 20 74 5f 75 73 65 72 69 6e 66 6f 01 01  rom t_userinfo..
0050   00 00 00 00 00 00 01 01 00 00 00 00 00           .............

字段解释(按标记的颜色顺序)
005d000006000000:通用包头
0000:对于data类型的包,这表示dataflag。几乎大部分包都是此类型,而且一般值为0。参数含义后面将会有介绍
03:Function ID,可以理解为命令ID
5e:Subfunction ID,可以理解为具体的子命令ID
00:在11g的JDBC中,此值一直为0

几乎大部分交互会采用此方式进行,客户端发出具体的命令(例如图中的035e),这样就描述了这是一个查询包,服务端会根据此标志来做对应的处理。后面的结构中包含了查询命令等相关信息,目前我们已经能够正确的解析出SQL语句了。此文是让大家了解Oracle的整个工作流程及通讯的工作模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: