Oracle:TNS数据传输协议-进阶篇
2016-07-08 15:52
246 查看
工作流程
前面介绍了TNS协议数据包的基础结构,在对最基础的通信包结构有了一定了解后,有必要对整体工作流程有一定的认识。下面是一个应用程序到Oracle数据库的流程图。
![](https://img-blog.csdn.net/20160708155248134?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从图中可以看出,我们研究的TNS数据传输协议是在Oracle Net这一层。 上层可以使用OCI、JDBC、.NET接口去访问数据库。在这里有个比较复杂的地方就是:我们通过抓包对比了OCI和JDBC的数据包,发现有很多地方存在着很明显的差异,这些受不同的TNS协议版本会有所不同(比如低版本客户端访问高版本服务端),虽然大部分向下兼容,但这给研究者带来了很大的复杂性。所以我们的研究是建立在Oracle11g的基础上,客户端也是采用11g的JDBC驱动。
登录及查询
下图是一个客户端从建立连接到查询的大致过程
![](https://img-blog.csdn.net/20160708155243775?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
基本上流程就是客户端先发起连接,服务端会返回四种状态:接受、
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的整个工作流程及通讯的工作模式。
前面介绍了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的整个工作流程及通讯的工作模式。
相关文章推荐
- ORACLE创建表之前判断表是否存在与SQL Server 对比使用
- Oracle Sales Cloud简单介绍
- 简单的tomcat+oracle+jsp用例
- oracle 恢复truncate表
- FA-Oracle ERP 资产模块的非常规功能探讨
- oracle分析函数:四、listagg和wmsys.wm_concat
- 迎战大数据-Oracle篇
- 迎战大数据-Oracle篇
- 迎战大数据-Oracle篇
- oracle分析函数:三、first,first_value,lag,lead函数
- 轻松三步教你配置Oracle—windows环境
- oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法
- oracle 12c:新特性-自动存储管理(ASM)中的增强
- oracle 12c:新特性-同时在多个表上收集统计数据
- oracle 12c:新特性-同时在多个表上收集统计数据
- oracle 12c:新特性-同时在多个表上收集统计数据
- 包失效,无法编译
- linux下ORACLE数据库中创建新用户
- oracle 11g 修改private ip, public ip, vip, scan ip
- oracle sqlloader