下面是翻译国外的一篇博客,原文连接如下:

https://thesprawl.org/research/oracle-tns-protocol/

简介

TNS(Transparent Network Substrate) 协议用于客户端连接Oracle数据库,它可以使用其他一些协议进行通信,如:TCP/IP, IPX/SPX, IPC, Named Pipes等。

结构

TNS 包由一个header和payload 组成

HEADER


+--------------+--------------+

| Packet Length| Packet Chksm | 

+------+-------+--------------+    byte header

| Type | Rsrvd | Header Chksm | 

+------+-------+--------------+

|        P A Y L O A D        |

+-----------------------------+

字段说明:

l  Packet Length: 包长度字段

l  Packet Chksm:检测包

l  Header Chksm: 检测头

l  Type:         包类型

l  Rsrvd:        未使用

如上图:Packet Chksm 和 Header Chksm 通常是不变的,值为0.

Type字段是包的类型字段, 下面列出type 值对应的类型说明:

Type

Description

1

Connect

2

Accept

3

ACK

4

Refuse

5

Redirect

6

Data

7

NULL

8

----

9

ABORT

10

----

11

Resend

12

Marker

13

Attention

14

Control

Payload

Connect

连接类型数据如下所示:

Transparent Network Substrate Protocol
Packet Length:
Packet Checksum: 0x0000
Packet Type: Connect ()
Reserved Byte:
Header Checksum: 0x0000
Connect
Version:
Version (Compatible):
Service Options: 0x0000
Session Data Unit Size:
Maximum Transmission Data Unit Size:
NT Protocol Characteristics: 0xc60e
Line Turnaround Value:
Value of in Hardware:
Length of Connect Data:
Offset to Connect Data:
Maximum Receivable Connect Data:
Connect Flags : 0x61
Connect Flags : 0x61
Trace Cross Facility Item : 0x00000000
Trace Cross Facility Item : 0x00000000
Trace Unique Connection ID: 0x0000000000000000
Connect Data: (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=ORCL)(CID=(PROGRAM=
C:\oracle\product\10.2.\client_1\bin\sqlplus.exe)
(HOST=WINXPSP2)(USER=vmware)))(ADDRESS=(PROTOCOL=TCP)
(HOST=192.168.1.102)(PORT=)))
0.018134 192.168.1.108 192.168.1.102 TNS Request, Connect (), Connect
0c 0c 9a c7 0c fd 3d ..).....)..=..E.
0b a4 c0 a8 6c c0 a8 .&..@...p....l..
f1 ac a7 3e d2 7e ee .f.f.....>f.~.P.
ff ff fe ...............
2c 7f ff c6 0e c4 .,..............
3a .:....aa........
................
4f 4e 3d 4f (DESCRIPTION=(CO
4e 4e 5f 3d NNECT_DATA=(SERV
5f 4e 4d 3d 4f 4c ICE_NAME=ORCL)(C
00a0 3d 4f 4d 3d 3a 5c 6f ID=(PROGRAM=C:\o
00b0 6c 5c 6f 5c racle\product\
00c0 2e 2e 5c 6c 6e 5f 5c .2.0\client_1\bi
00d0 6e 5c 6c 6c 2e n\sqlplus.exe)(H
00e0 4f 3d 4e OST=WINXPSP2)(US
00f0 3d 6d ER=vmware)))(ADD
3d 4f 4f 4f 4c 3d RESS=(PROTOCOL=T
4f 3d 2e CP)(HOST=192.168
2e 2e 4f 3d .1.102)(PORT=
)))

Accept

接收类型数据如下所示:

Transparent Network Substrate Protocol
Packet Length:
Packet Checksum: 0x0000
Packet Type: Accept ()
Reserved Byte:
Header Checksum: 0x0000
Accept
Version:
Service Options: 0x0000
Session Data Unit Size:
Maximum Transmission Data Unit Size:
Value of in Hardware:
Accept Data Length:
Offset to Accept Data:
Connect Flags : 0x61
Connect Flags : 0x61
0c fd 3d 0c 0c 9a c7 ..)..=..).....E.
7c cf f9 bd c0 a8 c0 a8 .H|.@........f..
6c d9 b6 7a 0e a7 cb .l...g..z"....P.
ff 1d ....... .......
7f ff ........... aa..
......

Refuse

拒绝类型数据如下所示:

 0.047753   192.168.1.102   192.168.1.108   TNS Response, Refuse (), Refuse
0c fd 3d 0c 0c 9a c7 ..)..=..).....E.
8f e2 c0 a8 c0 a8 ..S.@..."d...f..
6c f1 0d e8 a0 2d 2b 0d .l......-+g...P.
fe ff ..Y....g......".
5b 4f 4e 3d .[(DESCRIPTION=(
4d 3d 4e 4e 4d 3d TMP=)(VSNNUM=
3d )(ERR=
4f 5f 4b 3d )(ERROR_STACK=(
4f 3d 4f 3d ERROR=(CODE=
4d 3d )(EMFI=))))

如果有下面的错误则产生拒绝包:

TNS-12514 - TNS:listener could not resolve SERVICE_NAME given in connect descriptor caused by invalid SID string provided in the connect string.

Data Packet

DATA 包是类型6,包括2个字节的 flag 标志位,1字节的 packet id,可选的 TTI id,还有数据本身。

+-----------+----+-----+
| Data Flag | ID |<TTI>|
+----------------------+
| D A T A |
+----------------------+

字段说明:

l  Data Flag: 数据标识

l  ID:      包ID

l  TTI:       TTI(Two-Task Interface) ID

l  DATA:     有效数据

Data Flag 通常是 0x0000, 当所有数据发送完毕指示文件结尾,值为 0x0040

下面是列出了有效的数据包ID:

ID: 0x01

描述:协议协商。下面这些标识是可以接受的协议版本:

0x06 0x05 0x04 0x03 0x02 0x01 0x00

客户端平台字符串像:IBMPC/WIN_NT-8.1.0

示例:

0.277372   192.168.1.108   192.168.1.102   TCP kwdb-commn > iax
[PSH, ACK] Seq= Ack= Win= Len=
0c 0c 9a c7 0c fd 3d ..).....)..=..E.
4d c0 a8 6c c0 a8 .M..@...qt...l..
d9 0e a7 cd b6 7b ca .f.g........{.P.
fe a0 d0 .W.....%........
4d 2f ........IBMPC/WI
4e 5f 4e 2d 2e 2e N_NT-8.1..

ID: 0x02

描述:交换数据类型

示例:

0.437308   192.168.1.108   192.168.1.102   TCP kwdb-commn > iax
[PSH, ACK] Seq= Ack= Win= Len=
0c 0c 9a c7 0c fd 3d ..).....)..=..E.
6b c0 a8 6c c0 a8 .k..@...qU...l..
d9 0e a7 cd b9 b6 7c 6e .f.g........|nP.
fd b3 e2 .......C........
b2 b2 0d .....R!.........
ff ff 3f ..............?.
3f .?..............
3c 3c 3c ..<<<....

ID: 0x03

描述: TTI (Two-Task Interface)功能,作用是描述即将到来的数据包ID下面是一个TTI ID列表:

  • 0x02 Open
    0x03 Query
    0x04 Execute
    0x05 Fetch
    0x08 Close
    0x09 Disconnect/logoff
    0x0C AutoCommit ON
    0x0D AutoCommit OFF
    0x0E Commit
    0x0F Rollback
    0x14 Cancel
    0x2B Describe
    0x30 Startup
    0x31 Shutdown
    0x3B Version
    0x43 K2 Transactions
    0x47 Query
    0x4A OSQL7
    0x5C OKOD
    0x5E Query
    0x60 LOB Operations
    0x62 ODNY
    0x67 Transaction - end
    0x68 Transaction - begin
    0x69 OCCA
    0x6D Startup
    0x51 Logon (present password)
    0x52 Logon (present username)
    0x73 Logon (present password - send AUTH_PASSWORD)
    0x76 Logon (present username - request AUTH_SESSKEY)
    0x77 Describe
    0x7F OOTCM
    0x8B OKPFC

示例:

0.475183   192.168.1.108   192.168.1.102   TCP kwdb-commn > iax
[PSH, ACK] Seq= Ack= Win= Len=
0c 0c 9a c7 0c fd 3d ..).....)..=..E.
b7 c0 a8 6c c0 a8 ....@...p....l..
d9 0e a7 cd fc b6 7c .f.g........|.P.
fd 9d 8a 2d e0 ...-............
6c c8 d5 .v.l...........
c3 e0 bf c5 ................
4d 0d 0d 5f SYSTEM.....AUTH_
4d 4e 4c 4e TERMINAL.....WIN
0f 0f XPSP2.........AU
5f 4f 4d 5f 4e 4d 0b TH_PROGRAM_NM...
00a0 0b 6c 6c 2e ..sqlplus.exe...
00b0 0c 0c 5f 4d ......AUTH_MACHI
00c0 4e 4f 4b 4f NE.....WORKGROUP
00d0 5c 4e \WINXPSP2.......
00e0 5f ..AUTH_PID.....
00f0 3a :.........A
5f 6d UTH_SID.....vmwa
re....

ID: 0x08

描述:“OK”服务器给客户端的响应

示例:

0.568852   192.168.1.102   192.168.1.108   TCP iax > kwdb-commn
[PSH, ACK] Seq= Ack= Win= Len=
0c fd 3d 0c 0c 9a c7 ..)..=..).....E.
cd 7c d5 f9 c0 a8 c0 a8 ..|.@.......f..
6c d9 b6 7c 0e a7 ce dc .l...g..|.....P.
fb a6 cf a5 ..!.............
0c 0c 5f ........AUTH_SES
4b SKEY ... 23B7160
4BBB8D9C712DC55D
4086C22B2.......
................
................
00a0 ................
00b0 0c ...........A!..
00c0 ................
00d0 ...........

ID: 0x11

描述:TTI (Two-Task Interface)功能扩展,下面是一些附加的标志

  • 0x6b 开关或者分离会话
  • 0x78 关闭
  • 0x87 OSCID
  • 0x9A OKEYVAL

示例:

0.972469   192.168.1.108   192.168.1.102   TCP kwdb-commn > iax
[PSH, ACK] Seq= Ack= Win= Len=
0c 0c 9a c7 0c fd 3d ..).....)..=..E.
c0 a8 6c c0 a8 .T..@...qh...l..
d9 0e a7 d2 ba b6 7e ab .f.g........~.P.
fb 0e be 2c .v.....,........
6b d3 .k..............
3b fb f4 fa 6c fa ;.........p...l.
..

ID: 0x20

描述:使用外部的程序和服务注册

示例:

ID: 0x44

描述:使用外部的程序和服务注册

示例:

ID: 0xdeadbeef

描述:附加网络选项,客户端可协商附加连接熟悉,例如:认证,加密,数据完整性,监控,

注意:wireshark 中叫这个包为 Secure Network Services

示例:

0.094489   192.168.1.108   192.168.1.102   TNS Response, Data (), SNS
0c 0c 9a c7 0c fd 3d ..).....)..=..E.
d0 f4 c0 a8 6c c0 a8 ....@...p....l..
d9 0e a7 cb b6 7a .f.g........zBP.
ff df ef a8 ................
dead beef 9e 0a ....... ........
0a .......... .....
9c c7 c7 f3 de ad be ................
ef ................
0a ............ ...
e0 e1 fc ff ................
00a0 4e ....NTS.........
00b0 0a 0c 0c .... ...........
00c0 0f 0a 0b ................
00d0 0a .... .........

根据 "Oracle Hacker's Handbook" 这是一个bug 在所有版本的oracle。

当一个服务器解析一个 DATA 数据包时,DATA  flags的第二个bit 设置但第一个bit(最低位)未设置(例如:2,6,10,14等等)。当服务器接收这样的包,它会陷入一个无限循环,占有所有的CPU处理时间。显然这对服务器性能产生负面影响。

Oracle tns 协议的更多相关文章

  1. oracle监听程序无法启动(TNS-12560: TNS: 协议适配器错误,TNS-00530: 协议适配器错误)

    问题描述1:   C:\Users\Administrator>lsnrctl start LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Pr ...

  2. oracle之 ORA-12557: TNS: 协议适配器不可加载

    操作系统:windows 7数据库版本: 11.2.0.1问题描述:直接通过 sqlplus sys/oracle@10.10.100.109:1521/ysxt as sysdba 可以登录,但是通 ...

  3. 转)TNS协议--翻译自《The Oracle Hackers Handbook》

    在开发源工具解决Oracle中的问题时,必须了解TNS协议.在努力理解TNS协议的时候,Oracle JDBC驱动程序(classes12.zip)会是一个很有用的资源TNS头. 每个TNS包都有一个 ...

  4. Oracle用imp导入dmp 提示遇到 ORACLE 错误 12560 TNS: 协议适配器错误 解决方法

    用imp命令导入dmp文件时提示以下错误: IMP-00058: 遇到 ORACLE 错误 12560 : ORA-12560: TNS: 协议适配器错误 : IMP-00000: 未成功终止导入 : ...

  5. oracle:ora-12560 tns 协议适配器错误

    今天新安装了一个oracle server,实例启动了,监听状态也正常. [oracle@db ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0 ...

  6. ORACLE中的Net Configuration Assistant 点击后无反应, sqlplus登录数据库提示Oracle11g ORA-12560: TNS: 协议适配器错误

    首先是对于点击无反应问题: 如果是客户端下的Net Configuration Assistant可用,而服务器端的Net Configuration Assistant等工具不可用的原因如下. 环境 ...

  7. 【Oracle】ORA-12560: TNS: 协议适配器错误

    问题现象: ORA-12560: TNS: 协议适配器错误 解决方法: 启动监听服务

  8. 安装完ODAC,出现ORA-12560:TNS:协议适配器错误 12541 无监听程序的解决

    进入系统环境变量设置,查看Path路径,发现D:\oracle\product\11.2.0\client_1等路径放到了oracle11g数据库路径前面,将新加入的路径置后即可解决ORA-12560 ...

  9. TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序

    文章转自:http://www.luocs.com/archives/464.html 此文版权归作者 – yaogang所有,转载请注明yaogang©www.luocs.com. Luocs说:这 ...

随机推荐

  1. 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 464  Solved: 221[Submit][Stat ...

  2. EasyPusher进行Android UVC外接摄像头直播推送实现方法

    最近EasyPusher针对UVC摄像头做了适配.我们结合了UVCCamera与EasyPusher,支持将UVC摄像头的视频推送到RTSP服务器上.在此特别感谢UVCCamera这个牛逼的项目! 来 ...

  3. Python爬虫-- Scrapy框架

    Scrapy框架 Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码.对于会阻塞线程的操作包含访问文件.数据库或者Web.产生新的进程并需要 ...

  4. php中$t=date()函数参数意义及时间更改

    php中date()函数用的最多的是:date('Y-m-d H:i:s', time());  这里面的参数意义分别是:Y - 年,四位数字; 如: "2016":m - 月份, ...

  5. java ClassLoader类加载器

    原文 首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java ...

  6. SpringBoot学习笔记(10):使用MongoDB来访问数据

    SpringBoot学习笔记(10):使用MongoDB来访问数据 快速开始 本指南将引导您完成使用Spring Data MongoDB构建应用程序的过程,该应用程序将数据存储在MongoDB(基于 ...

  7. nokogiri

    Nokogiri的用法我推荐三篇非常给力的文章:http://ruby.bastardsbook.com/chapters/html-parsing/http://ruby.bastardsbook. ...

  8. 【Leetcode-easy】Remove Nth Node From End of List

    思路1:设置两个指针p1,p2指向表头,p1先走n步.再两个指针同时走.当p1指针指到链表尾部时,P2指针已经在需要删除节点的前一位.一定要注意一些细节. class ListNode { int v ...

  9. php设计模式课程---9、桥接模式是什么

    php设计模式课程---9.桥接模式是什么 一.总结 一句话总结: 一个类没干完,另外一个类接着给它干完 实质是类的拼接,也就是用类的组合代替了类的继承,因为类的组合可以有很多种方式,所以桥接就是类的 ...

  10. 引用 qsort与sort的比较

    引用 linpder 的 qsort与sort的比较     在C/C++标准库中提供了快速排序的函数qsort():在STL中也提供了sort()排序函数,那么这两个函数哪个快呢?之前与代码-> ...