当前位置: 首页 > article >正文

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

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


http://www.lryc.cn/news/2416924.html

相关文章:

  • C# DataTable 总结常用方法
  • Xamarin移动开发的优点和缺点
  • gcc 编辑器基本使用
  • pr找不到msvcr110.dll无法执行代码怎么解决?总结7个有效方法分享
  • 析构函数
  • Jquery各版本下载,附Jquery官网下载方法
  • 16进制颜色
  • 详解 LPC
  • 坑逼的PL2303与WIN11
  • 安装天堂遇到的问题及解决方法
  • 两款WiFi无线网络扫描工具软件 WirelessMon Xirrus WiFi Inspector
  • DTM、DEM、DSM与DOM的概念
  • ebook_7种开放式eBook格式指南
  • QGC地面站使用教程
  • BootStrap----table
  • 并发编程之CyclicBarrier详解
  • 【笔记】w5500 官方DHCP库 使用
  • c语言钩子函数
  • 无忧启动源码 仿音速启动
  • 简易钓鱼网站的构建(Kali SetoolKit)
  • UNIX环境高级编程——UNIX基础知识
  • 我的ubuntu8.04安装经验
  • 常见几种浏览器兼容性问题与解决方案
  • Autodesk CAD帮助文档总结二 DXF 概述
  • smb+服务器+修复,Microsoft Windows
  • MySQL如何卸载干净以及下载、安装教程
  • oTree学习教程(七)Apps rounds
  • label设置自动换行的方法
  • HI3516DV300笔记(二)硬件适配
  • 单目3D检测新SOTA!PersDet:透视BEV中进行3D目标检测