最后更新:2022-01-24 14:54:35 手机定位技术交流文章
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 协议还支持以下基础网络协议:
客户端/服务器连接进程中的所有Oracle软件都需要现有的网络协议栈来在传输层的两台计算机之间建立计算机级连接。
网络协议负责将数据从客户端计算机传输到数据库服务器计算机,此时数据将数据传递给服务器端Oracle协议支持层。
TNS 协议基本结构分析
Packet length:是整个TNS报文的长度。
Packet Checksum: 默认不生成,用0填充。
Packet Type:标志TNS数据包的类型,可能的数据包类型是:
type的最大值为19, 超过19都不是TNS的报文。
Reserved :为 00。
header Checksum: 默认不生成,用0填充。
Oracle TNS 协议解析
下面对Oracle TNS 协 议做较为详细的解析。

客户端连接数据库,首先发送 Connect 报文,连接数据包是类型1。
连接数据是表单的字符串(source_route = yes)(hop_count = 0)(connect_data =((sid =)cid =(program =)(host =)(user =)))或类似的。
示例连接数据:
报文中重点包含 客户端可以使用的 NS 版本范围,及连接数据。
数据库服务器收到正确的连接请求,最终会回应 Accept 报文,在Accept之前会回应 Resend 或者 Redirect报文。
Accept报文中重点包含服务器接受的NS 版 本。
当客户端发 起错 误的连接时, 会收 到 服 务 器 返 回 的 Refuse 报 文。
当客户端收到 Redirect 报文,将终止当前的网络连接(FIN, ACK),使用 Redirect 报文中的参数(协议、主机及端口)重新发起 连接。
要了解Data报文,关键是需要知道TTCCode的含义:
Marker 报文的作用是通知客户端或服务器停止发送数据, Marker 报文仅有 3 个字节。
Oracle(TNS)协议解析及C/C++代码解析
解析运行:
总结
本文分析了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
本文由 在线网速测试 整理编辑,转载请注明出处。