在线路上看到的包绝大多数是数据包(类型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.
