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

Posted 平民软件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle:TNS数据传输协议-进阶篇相关的知识,希望对你有一定的参考价值。



上两周我们曾给大家介绍过TNS协议数据包的基础结构。想必大家对基础的通信包结构都有了一定了解。这次主要是想和大家讲讲应用层到Oracle之间的工作流程及主要工作模式。


工作流程

基础的通信包结构有了一定了解后,我们有必要对整体工作流程有一定的认识。

下面是一个应用程序到Oracle数据库的流程图。 Oracle:TNS数据传输协议-进阶篇

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


登录及查询

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


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


工作模式

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

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


字段解释(按标记的颜色顺序)

005d000006000000:通用包头

0000:对于data类型的包,这表示dataflag。几乎大部分包都是此类型,而且一般值为0。参数含义后面将会有介绍

03:Function ID,可以理解为命令ID

5e:Subfunction ID,可以理解为具体的子命令ID

00:在11g的JDBC中,此值一直为0


几乎大部分交互会采用此方式进行,客户端发出具体的命令(例如图中的035e),这样就描述了这是一个查询包,服务端会根据此标志来做对应的处理。后面的结构中包含了查询命令等相关信息,目前我们已经能够正确的解析出SQL语句了。此文是让大家了解Oracle的整个工作流程及通讯的工作模式。





以上是关于Oracle:TNS数据传输协议-进阶篇的主要内容,如果未能解决你的问题,请参考以下文章

oracle TNS:适配器错误问题

安装oracle10的错误“ORA-12560 TNS 协议适配器错误”怎么解决

oracle 11g R2,运行SQLPlus 出现ORA-12560 TNS:协议适配器错误, 我该怎么办?

ORACLE数据库用cmd连接时总是说TNS:协议适配器错误,怎么办,listener服务开了自动停止

cmd中登录Oracle 显示ORA-12560: TNS: 协议适配器错误

连接oracle出现ORA-12541:TNS:无监听程序