Oracle TNS协议中数据包的内部结构

September 1, 2009

在线路上看到的包绝大多数是数据包(类型6)。对数据包而言,TNS包头后面的一个字(WORD)用来存储数据标志位(data flag)。如果这个包是一个断开连接包,那么这个字(WORD)被设为0×0040–否则,一般设为0×0000。

注意:

所有的Oracle版本中都存在一个故障(bug):在服务器处理一个数据包(类型6)的时候,该数据包的数据标志位的第2个比特已被设置,但第1个(最不重要的)比特没有被设置(例如,数字2,6,10,14等)。如果服务器受到这样的包,它就会花费点所有可利用的CPU处理时间,以一个死循环而告终。很明显,这对服务器性能会产生消极的影响。

数据标志位后面的一个字节(第11个字节)决定了数据包里的内容:

0×01表示协议商议。这里,客户机降可以接受的协议版本发送给服务器–他们是6,5,4,3,2,1和0.服务器回复一个通用的版本(例如,6或5),不过它还会发送一些额外的信息,如它使用的字符集,这个集合共有多少个字符,版本字符串和服务器标志。

0×02表示交换数据类型表示法。

0×03表示一次双任务接口(Two-Task Interface,TTI)函数调用。下面的表列出了一些函数:

0×02   Open

0×03   Query

0×04  Execute

oxo5   Fetch

oxo8   Close

0×09   Disconnect/logoff

oxoc   Autocommit on

oxod   Autocommit off

oxoe  commit

oxof  rollback

ox14  Cancel

0x2B  Describe

0×30 Startup

0×31  Shutdown

0x3b   version

ox43  K2 Transactions

0×47   Query

0x4A   OSQL7

ox5c    OKOD

ox5e   Query

ox60   LOB operations

ox62   ONDY

ox67    Transaction – end

ox68    Transaction – begin

ox69    OCCA

ox6d   startup

ox51     Logon (present password)

ox52    Logon (present username)

0×73  Logon(present password  -sned AUTH_PASSWORD)

ox76  Logon (present username – request AUTH_SESSKEY)

0×77   Describe

ox7F  OOTCM

ox8B  OKPFC

其中某些函数的调用优先于身份验证–例如,版本(ox3B)TTI函数:

0×08 表示:”OK” — 由相应某个客户机的服务器发送。

ox11 表示扩展的TTI函数。这些事在更高版本的Oracle中被引入的,因此为了向下兼容,没有使用oxo3。

下面给出了一些函数代码:

ox6b   Switch or Detach Session

ox78   Close

0×87   OSCID

0x9A   OKEYVAL

0×20 在调用外部过程并且带有服务限制的情况下使用。

0×44  也在调用外部过程并且带有服务限制的情况下使用。

检查Oracle JDBC驱动(classes12.zip)并不是获得TNS协议句柄的最佳方法,最佳方法是用一个网络嗅探器从线路上抓取一些包,然后观察接下来发生的情况。

转载请注明源地址: www.youyus.com

© 2009, Oracle Clinic. All rights reserved.

tags:
posted in it技术, oracle by admin

Follow comments via the RSS Feed | Leave a comment | Trackback URL

Leave Your Comment

Comment moderation is enabled. Your comment may take some time to appear.

 
CopyRight YOUYUS.COM