Oracle(TNS)协议解析及C/C++代码解析
Oracle客户端和服务器使用TNS作为其数据交换协议。 它提供了一种对用户透明的层, 为不同的工业标准协议提供统一, 通用的接口。
基本上是TNS以这样的方式指定了端口1521上的会话是“控制”的各种会话。 Oracle侦听器进程在此端口上侦听。连接到此端口后,客户端请求Oracle“服务”。如果侦听器知道此类服务,则将“重定向”消息发送回客户端。
在分析期间,通过Wireshark的抓取Oracle TNS协议解析分析。
TNS 协议版本
协议版本 | Oracle 版本 |
---|---|
SQL*Net v1 | Oracle Database Server 6 |
SQL*Net v2 | Oracle Database Sever 7 (7.0.15.4) |
Net8 | Oracle Database Server 8.x 开始 |
Oracle Net | Oracle Database Server 9 以后 |
实际上TNS 属于 Oracle Net 的一部分, 我们通常所说的 TNS 协议其实是 SQL*Net 协议,现在 Oracle 将它称之为 Oracle Net
Oracle Net Stack通信
数据库服务器是管理数据库的Oracle软件,客户端是从服务器请求信息的应用程序。 客户端和服务器通信的方式称为客户端/服务器堆栈。
通过数据库服务器端上的类似通信堆栈接收来自客户端通信堆栈发送的客户端应用程序的信息。 数据库服务器侧的过程流程与客户端的进程流相反,通过通信层的信息升高。
该通信架构基于开放系统互连(OSI)模型。 在OSI模型中,单独的计算机之间的通信以堆叠的方式发生,其中通过几层代码从一个节点传递给另一个节点,包括:
除了支持 TCP/IP 协议之外,TNS 协议还支持以下基础网络协议:
- TCP/IP (IPv4 and IPv6)
- TCP/IP with SSL
- Named Pipes
- Sockets Direct Protocol (SDP)
客户端/服务器连接进程中的所有Oracle软件都需要现有的网络协议栈来在传输层的两台计算机之间建立计算机级连接。
网络协议负责将数据从客户端计算机传输到数据库服务器计算机,此时数据将数据传递给服务器端Oracle协议支持层。
TNS 协议基本结构分析
Packet length:是整个TNS报文的长度。
Packet Checksum: 默认不生成,用0填充。
Packet Type:标志TNS数据包的类型,可能的数据包类型是:
#define TNS_TYPE_CONNECT 1
#define TNS_TYPE_ACCEPT 2
#define TNS_TYPE_ACK 3
#define TNS_TYPE_REFUSE 4
#define TNS_TYPE_REDIRECT 5
#define TNS_TYPE_DATA 6
#define TNS_TYPE_NULL 7
#define TNS_TYPE_ABORT 9
#define TNS_TYPE_RESEND 11
#define TNS_TYPE_MARKER 12
#define TNS_TYPE_ATTENTION 13
#define TNS_TYPE_CONTROL 14
#define TNS_TYPE_MAX 19
type的最大值为19, 超过19都不是TNS的报文。
Reserved :为 00。
header Checksum: 默认不生成,用0填充。
Oracle TNS 协议解析
下面对Oracle TNS 协 议做较为详细的解析。
- Connect
客户端连接数据库,首先发送 Connect 报文,连接数据包是类型1。
连接数据是表单的字符串(source_route = yes)(hop_count = 0)(connect_data =((sid =)cid =(program =)(host =)(user =)))或类似的。
示例连接数据:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=ahost)(Port=1521))
(CONNECT_DATA=(SID=test)(CID=(PROGRAM=)(HOST=abcdef)(USER=root))))
报文中重点包含 客户端可以使用的 NS 版本范围,及连接数据。
- Accept
数据库服务器收到正确的连接请求,最终会回应 Accept 报文,在Accept之前会回应 Resend 或者 Redirect报文。
Accept报文中重点包含服务器接受的NS 版 本。
- Refuse
当客户端发 起错 误的连接时, 会收 到 服 务 器 返 回 的 Refuse 报 文。
- Redirect
当客户端收到 Redirect 报文,将终止当前的网络连接(FIN, ACK),使用 Redirect 报文中的参数(协议、主机及端口)重新发起 连接。
- Data
要了解Data报文,关键是需要知道TTCCode的含义:
#define SQLNET_SET_PROTOCOL 1
#define SQLNET_SET_DATATYPES 2
#define SQLNET_USER_OCI_FUNC 3
#define SQLNET_RETURN_STATUS 4
#define SQLNET_ACCESS_USR_ADDR 5
#define SQLNET_ROW_TRANSF_HDR 6
#define SQLNET_ROW_TRANSF_DATA 7
#define SQLNET_RETURN_OPI_PARAM 8
#define SQLNET_FUNCCOMPLETE 9
#define SQLNET_NERROR_RET_DEF 10
#define SQLNET_IOVEC_4FAST_UPI 11
#define SQLNET_LONG_4FAST_UPI 12
#define SQLNET_INVOKE_USER_CB 13
#define SQLNET_LOB_FILE_DF 14
#define SQLNET_WARNING 15
#define SQLNET_DESCRIBE_INFO 16
#define SQLNET_PIGGYBACK_FUNC 17
#define SQLNET_SIG_4UCS 18
#define SQLNET_FLUSH_BIND_DATA 19
#define SQLNET_SNS 0xdeadbeef
#define SQLNET_XTRN_PROCSERV_R1 32
#define SQLNET_XTRN_PROCSERV_R2 68
- Marker
Marker 报文的作用是通知客户端或服务器停止发送数据, Marker 报文仅有 3 个字节。
Oracle(TNS)协议解析及C/C++代码解析
switch (type){case TNS_TYPE_CONNECT:dissect_tns_connect(oracle_data,offset);break;case TNS_TYPE_ACCEPT:dissect_tns_accept(oracle_data,offset);break;case TNS_TYPE_REFUSE:dissect_tns_refuse(oracle_data,offset);break;case TNS_TYPE_REDIRECT:dissect_tns_redirect(oracle_data,offset);break;case TNS_TYPE_ABORT:dissect_tns_abort(oracle_data,offset);break;case TNS_TYPE_MARKER:dissect_tns_marker(oracle_data,offset);break;case TNS_TYPE_ATTENTION:dissect_tns_marker(oracle_data,offset);break;case TNS_TYPE_CONTROL:dissect_tns_control(oracle_data,offset);break;case TNS_TYPE_DATA:dissect_tns_data(oracle_data,offset);break;default:break;}
解析运行:
总结
本文分析了Oracle的网络结构和报文基本结构,最后对TNS的关键报文进行了较为详细的解析及代码实现。
欢迎关注微信公众号【程序猿编码】,需要Oracle TNS完整源码和报文请添加本人微信号(c17865354792)
参考:1. https://docs.oracle.com/cd/B28359_01/network.111/b28316/architecture.htm#NETAG004
2.http://www.oracle-internals.com/?p=22
Oracle(TNS)协议解析及C/C++代码解析相关推荐
- 抓包oracle密码,Oracle TNS 协议抓包分析
TNS 协议传输可以使用 TCP/IP 协议.使用 SSL 的 TCP/IP 协议.命名管道和 IPC 协议传输,其中 TCP/IP 协议传输是使 用明文传送. 这里只分析基于 TCP/IP 协议上的 ...
- oracle TNS: 协议适配器错误 解决办法
解决ORA-12560: TNS: 协议适配器错误 造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个: 1.监听服务没有起起来.windows平台个一如下操作:开始---程序--- ...
- Oracle tns 协议
下面是翻译国外的一篇博客,原文连接如下: https://thesprawl.org/research/oracle-tns-protocol/ 简介 TNS(Transparent Network ...
- Oracle TNS协议中数据包的内部结构
在线路上看到的包绝大多数是数据包(类型6).对数据包而言,TNS包头后面的一个字(WORD)用来存储数据标志位(data flag).如果这个包是一个断开连接包,那么这个字(WORD)被设为0x004 ...
- iOS开发学习之YYKit中YYText的深入解析,YYTextShadow的代码解析
上面的阴影效果是用这样的代码实现的: 可以看到先生成了 YYTextShadow, 然后赋值给了 attributedString 的 yy_textShadow,然后再把 attributedStr ...
- java解析pos,POS响应代码解析
代码 POS显示的内容原因/操作员应采取的措施00交易成功 承兑或交易成功 01 交易失败 请联系发卡行 查发卡行 02 交易失败 请联系发卡行向发卡行查询 ...
- Psins代码解析之静基座仿真(test_SINS_static.m)傅科、修拉周期水平通道误差传播(test_SINS_static_verify.m)
静基座条件下:速度矢量为0:地理位置精确已知: 一.静基座下,陀螺仪和加速度计数据仿真: imustatic.m 重力矢量和地球自转角速度在地理坐标系下: 上式中,Wnen为0,Wnnb为0,即静基座 ...
- 【项目实战】WaveNet 代码解析 —— train.py 【更新中】
WaveNet 代码解析 -- train.py 文章目录 WaveNet 代码解析 -- train.py 简介 代码解析 全局变量解析 函数解析 main() get_arguments() va ...
- Tensorflow YOLO代码解析(1)
YOLO (You Only Look Once:Unified,Real-Time Object Detection) 提出了一种实时端到端的目标检测算法,之前写过一份关于YOLO论文的解读,可供参 ...
最新文章
- 解决svn图标不显示(绝对有用)
- 锅巴H264播放器地址和说明
- paraview如何查看速度三维坐标_AutoCAD三维建模与AutoLISP地形展点检查隧道工程开挖效果...
- 拿签证威胁外籍博士后,实验室导师真的可以为所欲为?
- 大结局:GitHub正式归于微软旗下,新CEO下周一上任“三把火”
- 【QT源码】系列01
- java拆分日期_Java根据控制台输入的特定日期格式拆分日期
- ORACLE10G让空间管理变轻松【SPACE MANAGEMENT MAKE EASILY ON ORACLE10G】
- 学习React之前你需要知道的的JavaScript基础知识
- seqlist插入java_线性表插入c语言代码我想问的是seqlist *l中的*l不是太理解。它指向了哪里...
- 【离散数学】集合论 第三章 集合与关系(4) 集合的归纳定义、归纳证明、数学归纳法第一/二原理
- 三菱GXWorks2 CPU软元件存储器的全部清除
- 俺的三国武将观(一)
- 淘宝图片上传接口,淘宝图片搜索商品接口,以图搜货接口,淘宝拍立淘接口
- Linux:crond任务调度之at定时任务
- 镜像站:Github, Wiki, Google
- 港科夜闻|全国政协副主席梁振英先生率香港商企及机构代表一行到莅临香港科大(广州)访问交流...
- LeetCode刷题:完全平方数
- 网际,MAC,DNS,僵木蠕,木马,APT,dns隐蔽隧道,.pcap,开源情报,元数据,带外管理,磁盘阵列RAID,DRAC,ARP,充分必要条件
- marktext安装配置-设置中文语言包