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
原文地址:https://www.cnblogs.com/macleanoracle/p/2967331.html