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.youyus.com
posted on 2009-09-02 11:20 Oracle和MySQL 阅读(745) 评论(0) 编辑 收藏 举报