日期:2014-05-16  浏览次数:20478 次

oracle NET学习(1):NET-8和监听器行为分析

环境:

14:56:24 sys@ORCL (^ω^) select * from v$version where rownum=1;

BANNER
--------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod


    oracle NET 涉及面面方方,包括服务端、客服端、防火墙等,且以OS NET为基础搭建。oracle NET能够建立客服端或应用服务器到数据库服务器的连接,并负责连接的维护和数据的传送。客户端和服务端必须使用相同的协议,其中最流行的当属TCP/IP。

 

    1 oracle 网络体系结构

    oracle的网络架构基于OSI七层模型

    客户端的OCI和服务端的OPI组成了会话层,负责在客户端和服务端之间建立一个完整的sql会话,功能包括:

         ㈠ 解析sql,进行语法分析
         ㈡ 为sql申请和分配cursor
         ㈢ 为sql提供绑定变量
         ㈣ 从服务器的数据字典获取记录的元数据
         ㈤ 执行sql
         ㈥ 返回结果
         ㈦ 关闭cursor

    TTC层对应OSI的表示层,负责客户端和服务器之间字符集和数据类型的转换。

    NET8,之所以称之为8,大抵是因为独立于OSI任何一层,配置oracle网络连通能力,实际上就是配置NET8这一层,而NET8这一层包括两个部分,服务器端的监听器、客户端的TNS.

 

    2 监听器

 

    在服务端,oracle NET包括一个活动的进程叫监听器。监听器活着的意义,就只是传递用户的请求。监听器必须存在于服务端。是客户端和服务端的中间组件。监听器的功能只是负责建立客户端和服务端的连接,它并不承担客户端和服务端的通信。监听器启动后,会去读取监听器配置文件--listener.ora。位于$ORACLE_HOME/network/admin下。通过命令lsnrctl可进入监听器的属性配置。OS命令tnsping只能判断客户端到监听器的连接是否通畅,与服务端是否正常运行无任何瓜葛。客户进程通过读取tnsnames.ora请求和服务器建立连接,如果是一条专用服务器连接,监听器进程就会为客户端创建一个server process (通过fork()创建)。

 

    这其中涉及三种进程:服务进程、监听进程、客户进程。工作原理如下:

          ① 服务器端启动监听进程,这个进程会在一个固定的IP和端口上监听用户请求
          ② 用户进程向指定的IP和端口发出连接请求,送达给监听进程
          ③ 监听进程收到用户请求后,会fork()一个服务进程
          ④ 监听进程把用户请求转发给服务进程,此时,监听进程的使命就此结束,不在参与后续的任何工作,回去继续监听其他用户的请求
          ⑤ 服务进程和用户进程建立连接后,开始处理和返回用户的请求,直到用户进程结束连接。

    类比一下,oracle NET如同非诚勿扰,监听进程犹如乐嘉和孟非,服务进程和客户进程如同男方、女方,双方牵手之后的事情就不在是乐嘉和孟非的事情了

   

[oracle@localhost ~]$ lsnrctl 

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 11-SEP-2012 09:57:03

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:

start               stop                status              
services            version             reload              
save_config         trace               spawn               
change_password     quit                exit                
set*                show*