没有合适的资源?快使用搜索试试~ 我知道了~
首页ORACLE-TNS协议分析详解.doc
ORACLE-TNS协议分析详解.doc
需积分: 50 2.1k 浏览量
更新于2023-05-25
评论
收藏 478KB DOC 举报
ORACLE-TNS协议分析详解 文档,具体1 TNS介绍,2 TNS数据格式 3 典型的使用序列 三个部分
资源详情
资源评论
资源推荐

ORACLETNS协议分析
1 TNS介绍
TNS协议是ORACLE服务端和客户端通讯的协议。TNS协议传输可以使用TCP/IP协议
使用SSL的TCP/IP协议、命名管道和IPC协议传输,其中TCP/IP协议传输是使用明文传送
这里我们只分析基于TCP/IP协议上的TNS数据。
ORACLE网络通讯协议 TNS有许多版本,并且大部分向下兼容,我们主要 oracle
9.2.0.1.0客户和服务间的传输协议,他的协议版本号为312,其兼容到300。
TNS协议有一个通用的头,通用头包含一个请求数据类型。不同的服务请求和数据传
输使用不同的请求数据类型。对于通常意义的查询操作一般使用数据类型,当出现错误或
其他情况时可能使用其他类型。在分析过程中发现以下类型数据:
查询语句出错会用标记(marker)类型
客 户 端 向 服 务 器 请 求 失 败 ( 如 不 存 在 的 服 务 I D) , 服 务 器 会 发 送 拒 绝
(refuse)类型
客户机登陆会发送连接类型,而服务器返回一个重定向类型数据
当重定向端口连接完成后客户端重现发送连接类型数据,服务器返回接受类型数
据,然后能够正常通讯。
2 TNS数据格式
TNS数据包含一个通用的包头,这个包头包含包校验,包长度和包类型等信息。
不同的类型的数据实现不同功能的数据传输。
Common Packet Header 8
通用包头
Data 可变 数据

2.1 通用包头格式
每个TNS完整数据都包含一个通用包头,他说明接受数据的长度及其相关校验和解析
的信息。
Length 2 包的长度,包括通用包头
Packet check sum 2
包的校验和
Type 1 TNS类型
Flag 1
状态
Header check sum 2 通用头的校验和
注:
Length:包长度(包括包头)
Type: 数据包的类型
类型号 类型说明
1 连接(CONNECT)
2
接受(ACCEPT)
3 确认(ACK)
4
拒绝(REFUTE)
5 重定向(REDIRECT)
6
数据(DATA)
7 NULL
8
9 中止(ABORT)
10
11 重新发送(RESEND)
12
标记(MARKER)
13 ATTENTION
14
控制(CONTROL)
2.2 连接包结构(0 x01)
在客户端和ORACLE要建立连接时,客户端首先发送一个连接结构,然后服务器返回
重定向包(参见2.5)。
typedef struct TNS_CONNECT_header{

UCHAR NS_ver[2];
UCHAR Compatible_ver[2];
UCHAR ser_opt1;
UCHAR ser_opt2;
UCHAR SDU_size[2];
UCHAR TDU_size[2];
UCHAR NT_protocol_ch1;
UCHAR NT_protocol_ch2;
UCHAR Max_packets[2];
UCHAR Hardware_1[2];
UCHAR data_length[2];
UCHAR Offset[2];
UCHAR Max_data[4];
UCHAR flag0;
UCHAR flag1;
/*java thin interface has no items and id,
if it is not jdbc thin, use offset to override these
有些版本TNS协议中没有下面几项*/
UCHAR item1[4];
UCHAR item2[4];
UCHAR ID[8];
UCHAR unknown[8];
/*followed by decode_des_conn_data */
//连接字符串
}TNS_CONNECT_HEADER;
连接字符串格式:
连接功能 连接字符串
PING (CONNECT_DATA=(COMMAND=ping));
SHOW (CONNECT_DATA=(COMMAND=SHOW LOGFILE));
VERSION (CONNECT_DATA=(COMMAND=version));
STATUS (CONNECT_DATA=(COMMAND=STATUS));
ESTABLISH (CONNECT_DATA=(SID=OBJ_SRVR)
(CID=(PROGRAM=)(HOST=140.211.111.111)
(USER=SOME_USER)));
ESTABLISH_REAL_DB (CONNECT_DATA=(SID=wouprd)
(CID=(PROGRAM=)(HOST=spruce.ous.edu)

(USER=some_user)));
SERVICE_REGISTER (CONNECT_DATA=(COMMAND=service_register)(LOAD=0)
(MAXLOAD=1)
(INSTANCE_LOAD=0)
(INSTANCE_MAXLOAD=0)
(SHUTDOWN_NOTIFY=ON)(FLAGS=0)
(SERVICE=obj_srvr)(INFO=PID$COLON$pid)
(DISPLAY=PRESPAWNED SERVER)
(SERVICE_ID=BBB99B99999B-99BB-B999-B99BB9999B99)
(CLASS=ORACLE)(VERSION=81500)
(ADDRESS=(PROTOCOL=tcp)
(HOST=spruce.ous.edu)(PORT=$port)));
REDIRECT (ADDRESS=(PROTOCOL=tcp)
(HOST=140.211.116.176)(PORT=$port));
如:
数据库一般的连接,即ESTABLISH的连接字符串为:
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=topsec-syangjp)
(PORT=1521)
)
(CONNECT_DATA=
(SID=test)
(SERVER=DEDICATED)
(CID=
(PROGRAM=D:\oracle\ora92\bin\sqlplusw.exe)
(HOST=TOPSEC-MYANGJP)
(USER=myangjp)
)
)
)

2.3 接受包结构(0 x02)
用户重定向之后,需要用重定向端口向服务器发送连接,客户端发送连接包,服务器
连接成功则返回接受包,否则返回refuse包
struct TNS_ACCEPT_header{
unsigned char NS_ver[2];
unsigned char ser_opt1;
unsigned char ser_opt2;
unsigned char SDU_size[2];
unsigned char TDU_size[2];
unsigned char Hardware_1[2];
unsigned char data_length[2];
unsigned char Offset[2];
unsigned char flag0;
unsigned char flag1;
//unsigned char unknown[8];
/*no following data*/
};
2.4 拒绝包结构(0 x04)
typedef struct TNS_REFUSE_header{
UCHAR uUserRefuseReason;
UCHAR uSysRefuseReason;
unsigned short int data_length;
//拒绝字符串
}TNS_REFUSE_HEADER;
拒绝字符串:
REFUTE (DESCRIPTION=
(TMP=)
(VSNNUM=153092352)
(ERR=12505)
(ERROR_STACK=
剩余21页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0