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

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

注意:

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

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

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

0x02表示交换数据类型表示法。

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

0x02   Open

0x03   Query

0x04  Execute

oxo5   Fetch

oxo8   Close

0x09   Disconnect/logoff

oxoc   Autocommit on

oxod   Autocommit off

oxoe  commit

oxof  rollback

ox14  Cancel

0x2B  Describe

0x30 Startup

0x31  Shutdown

0x3b   version

ox43  K2 Transactions

0x47   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)

0x73  Logon(present password  -sned AUTH_PASSWORD)

ox76  Logon (present username – request AUTH_SESSKEY)

0x77   Describe

ox7F  OOTCM

ox8B  OKPFC

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

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

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

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

ox6b   Switch or Detach Session

ox78   Close

0x87   OSCID

0x9A   OKEYVAL

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

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

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

转载请注明源地址: www.askmac.cn

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号