Oracle:TNS数据传输协议-基础篇

简介
TNS协议是ORACLE服务端和客户端通讯的协议。目前有许多版本,并且大部分向下兼容。我们主要在Oracle 11g的版本上研究客户端和服务端之间的传输协议。网络上关于TNS协议的介绍资料比较少,毕竟它不是开源的数据库,但研究的人还是有不少。在目前所有的可学习资源中,oracle的jdbc驱动无疑是研究TNS协议的最佳选择,通过反编译出来的java代码,可以清楚的看到整个调用流程。该工程代码量相对来说比较多,处理逻辑也偏于复杂,需要进行深入且长久的研究才有一定的成果。


数据包结构

每个包有一个包头(Header),该包头包含了一个具体的请求数据类型,不同的服务请求和数据传输使用不同的请求数据类型。包头后面是数据部分(Data)。需要注意的是它们的编码方式是按照Big-Endian(也就是我们常说的大端)方式进行编码的。


下表是一个完整包的格式:

数据类型
内容
描述
ub2 length
包的完整长度
最大长度是SDU(Session Data Unit )
ub2 packet checksum
包的校验和
ub1
type
包类型
ub1
flag
标志
ub2
header checksum
包头的校验和
...
DATA
数据部分

包类型
类型
含义
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)

一般建立连接的过程会出现Connect, Resend, Accept,Refute类型的包,后面数据交互大部分使用的是Data类型的包,另外查询出错会出现Marker类型的包。研究时可以关注这些类型的包。

连接过程
客户端工具:sqldeveloper 3.0.04
服务器:CentOS release 6.3(Oracle 11g)
打开抓包工具Wireshark,在过滤栏中输入tns,使用sqldeveloper连接服务器,这样可以过滤出oracle客户端和服务器端的交互过程,如图:


可以看出客户端开始会发送一个连接包(Connect),服务端回复了一个要求客户端重新发送的包(Resend),客户端再次发送连接包(Connect),服务端开始回复确认接受连接(Accept)。后面就是用户验证、数据交互的过程了。


包基础结构分析
现在用连接包来简单分析包的基本结构,下面是连接包的数据,按十六进制进行显示。
0000   00 d6 00 00 01 00 00 00 01 36 01 2c 0e 41 20 00  .........6.,.A .
0010   7f ff 4f 98 00 00 00 01 00 9c 00 3a 00 00 00 00  ..O........:....
0020   01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0030   00 00 00 00 00 00 00 00 00 00 28 44 45 53 43 52  ..........(DESCR
0040   49 50 54 49 4f 4e 3d 28 43 4f 4e 4e 45 43 54 5f  IPTION=(CONNECT_
0050   44 41 54 41 3d 28 53 49 44 3d 6f 72 63 6c 29 28  DATA=(SID=orcl)(
0060   43 49 44 3d 28 50 52 4f 47 52 41 4d 3d 53 51 4c  CID=(PROGRAM=SQL
0070   20 44 65 76 65 6c 6f 70 65 72 29 28 48 4f 53 54   Developer)(HOST
0080   3d 5f 5f 6a 64 62 63 5f 5f 29 28 55 53 45 52 3d  =__jdbc__)(USER=
0090   41 64 6d 69 6e 69 73 74 72 61 74 6f 72 29 29 29  Administrator)))
00a0   28 41 44 44 52 45 53 53 3d 28 50 52 4f 54 4f 43  (ADDRESS=(PROTOC
00b0   4f 4c 3d 74 63 70 29 28 48 4f 53 54 3d 31 37 32  OL=tcp)(HOST=172
00c0   2e 33 30 2e 31 32 2e 36 29 28 50 4f 52 54 3d 31  .30.12.6)(PORT=1
00d0   35 32 31 29 29 29                              521)))

字段解释(按标记的颜色顺序)
00d6:包的大小为214字节
0000:包的校验和,一般为0
01:包类型,对照表格,此包为连接类型的包
00:一般为0
0000:包头的校验和,一般为0

后面的为连接包中具体的数据了,我们可以看到后面还包含连接字符串信息。
具体数据在此就不多做论述。今天在这里只是讲述每个包的基础结构,先了解基础才能往更高层次的方向去研究。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值