【文章內(nèi)容簡介】
客戶端合法性和查找遠(yuǎn)端代理地址。將網(wǎng)絡(luò)套接字和管道描述符全部放入一個SELECT描述字段中,該字段中的項對應(yīng)可以進(jìn)行I/O的描述符。通過監(jiān)控這個字段可以獲知那個I/O端口上有數(shù)據(jù)達(dá)到。求出包括網(wǎng)絡(luò)套接字和父子進(jìn)程間管道描述字的最大值。SELECT監(jiān)聽I/O。一旦數(shù)據(jù)到達(dá),進(jìn)行一下處理如果表中網(wǎng)絡(luò)套接字有數(shù)據(jù)發(fā)到,則調(diào)用處理子程序,該子程序首先判斷該請求的源是否合法,是否需要漫游處理,然后選擇預(yù)先分配的一個空閑進(jìn)程處理請求。如果管道描述字有數(shù)據(jù)發(fā)到,則表示對應(yīng)子進(jìn)程處理請求完畢,子程序恢復(fù)空閑狀態(tài)。圖 41 系統(tǒng)網(wǎng)絡(luò)通信算法一個可擴(kuò)展的AAA 協(xié)議棧10使用本協(xié)議棧開發(fā)的 RADIUS 服務(wù)員系統(tǒng)的系統(tǒng)邏輯流程如下。初 始 化 配 置 ( 是 否 派 生 子 進(jìn) 程 、 字 典 文 件 和 日 志 文 件 路 徑 、終端參數(shù))登記各種信號處理例程s i g n a l ( )讀取配置文件r a d c o n f i g _ i n i t ( ) , 讀入主機(jī)地址、端口號、最大請求個數(shù)、代理服務(wù)超時時間、最大請求超時時間)讀取字典文件d i c t _ i n i t ( ) , 將字典內(nèi)容放入內(nèi)存組織成為鏈表, 以后使用派生后臺進(jìn)程f o r k ( ) , 退出當(dāng)前會話, 這樣脫離命令行關(guān)閉終端c l o s e ( ) , 顯示軟件版本打開知名端口o p e n _ u d p s o c k ( ) 綁定端口清空所有網(wǎng)絡(luò)套接字端口F D _ C L E A R ( ) , 準(zhǔn)備監(jiān)聽派生指定個數(shù)的子進(jìn)程c h i l d _ m a k e ( ) , 并監(jiān)控父子進(jìn)程間通信的讀寫管道申請表空間, 調(diào)用T U X E D O , 讀取客戶端列表和代理服務(wù)員列表放入內(nèi)存表中u p d a t e _ c l i e n t s ( ) u p d a t e _ p r o x y ( )將監(jiān)控描述符字段清零并置位F D _ Z E R O ( )循環(huán)非阻塞監(jiān)控以上端口S E L E C T ( ) , 根據(jù)情況分別執(zhí)行以下子程序F D _ I S S E T ( )認(rèn)證記賬端口請求, 調(diào)用認(rèn)證處理r a d _ r e q u e s t ( ) 代理認(rèn)證記賬端口請求, 調(diào)用代理處理R a d _ p r o x y ( ) 子進(jìn)程發(fā)送信號,處理子進(jìn)程完畢。子進(jìn)程空閑置位。圖42 系統(tǒng)邏輯流程一個可擴(kuò)展的AAA 協(xié)議棧11RADIUS 服務(wù)員中采用基于數(shù)據(jù)報的并發(fā)無連接網(wǎng)絡(luò)通信算法、進(jìn)程處理采用主進(jìn)程循環(huán)處理,子進(jìn)程順序處理算法。并且為提高效率,采用進(jìn)程預(yù)分配的方法。系統(tǒng)運行時,由空閑子進(jìn)程組成一個空閑進(jìn)程池,當(dāng)有請求時,主進(jìn)程順序選擇一個空閑子進(jìn)程完成請求。子進(jìn)程完成請求后通知父進(jìn)程。示意見圖43。RADIUS主進(jìn)程子進(jìn)程池空閑子進(jìn)程接收新請求的子進(jìn)程正在處理請求的子進(jìn)程完成子進(jìn)程通知父親圖43 系統(tǒng)運行時進(jìn)程關(guān)系圖包處理邏輯流程協(xié)議棧中的主進(jìn)程在處理請求包時所作處理如圖44 所示。接 收 數(shù) 據(jù) 包 到 緩 沖 區(qū) r e c v f r o m ( )判斷包源客戶端的合法性如果是認(rèn)證包系列用f i n d _ c l i e n t ( )如果是記賬包系列用c a l c _ a c c t r e q ( )將緩沖區(qū)打成請求頭結(jié)構(gòu)r a d r e c v ( )判斷是否需要代理h a n d l e _ p r o x y ( )需要代理, 調(diào)用代理模塊保存漫游狀態(tài)p u s h _ p r o x y ( )發(fā)送到遠(yuǎn)端s e n d p r o x y 2 s e r v e r ( )不需要代理, 判斷是否是重包查找空閑子進(jìn)程登記包特性到子進(jìn)程結(jié)構(gòu)中將請求包放入緩沖區(qū)通過F I F O 發(fā)送給子進(jìn)程圖44 主進(jìn)程處理請求包流程一個可擴(kuò)展的AAA 協(xié)議棧12協(xié)議棧中對于代理漫游包的處理如圖 45 所示。接收數(shù)據(jù)包到緩沖區(qū)recvfrom()判斷包源服務(wù)員的合法性find_server()將緩沖區(qū)打成請求頭結(jié)構(gòu)radrecv()找出包對應(yīng)的描述符查找發(fā)送時記的請求頭pop_proxy()轉(zhuǎn)發(fā)響應(yīng)給最初的客戶端sendproxy2client()圖 45 漫游請求包流程協(xié)議棧中子進(jìn)程處理請求包的流程圖如圖 46 所示。循環(huán)等待父進(jìn)程發(fā)送處理消息read()將接收到的緩沖區(qū)打成請求頭結(jié)構(gòu)radrecv()根據(jù)不同請求包類型, 調(diào)用用戶自定義回調(diào)函數(shù)響應(yīng)模塊如認(rèn)證處理rad_authenticate()等處理完畢, 返回繼續(xù)等待下一個請求圖 46 子進(jìn)程處理請求包流程從圖中可以看出,協(xié)議棧的用戶只需要編寫用戶處理請求包的回調(diào)函數(shù),對于其它過程則可以不用關(guān)心。測試環(huán)境和方法一個可擴(kuò)展的AAA 協(xié)議棧13本協(xié)議棧的測試環(huán)境可以象開發(fā)環(huán)境一樣,有多種組合。下面選取其中一種,以協(xié)議棧為基礎(chǔ)的RADIUS 系統(tǒng),如圖47 所示。本地RADIUS服務(wù)員ORACLE數(shù)據(jù)庫遠(yuǎn)端RADIUS服務(wù)員RADIUS客戶端測試程序圖 47 協(xié)議棧測試環(huán)境其中本地 RADIUS 服務(wù)員接收發(fā)自RADIUS 客戶端的請求,ORACLE 數(shù)據(jù)庫作為存儲用戶數(shù)據(jù)和配置信息的服務(wù)器。遠(yuǎn)程RADIUS 服務(wù)員接收漫游用戶的認(rèn)證請求。測試程序負(fù)責(zé)產(chǎn)生測試呼叫。測試分為兩個部分:功能測試和性能測試。功能測試包括對RADIUS 服務(wù)員中是否滿足RFC2138 和RFC2139 中規(guī)定功能的測試;性能測試包括在大并發(fā)用戶量下系統(tǒng)的響應(yīng)時間和正確率。需要編寫一個能完成測試要求的測試程序。此測試程序運行于RADIUS 客戶端,通過進(jìn)程間通信模仿調(diào)用方程序。測試前還要編寫一個模擬數(shù)據(jù)生成程序,它負(fù)責(zé)從數(shù)據(jù)庫中抽取數(shù)據(jù),模仿呼叫數(shù)據(jù)。接口回調(diào)函數(shù)開發(fā)者通過回調(diào)函數(shù)來使用本協(xié)議棧,在請求包處理回調(diào)函數(shù)中,開發(fā)者可以使用協(xié)議棧提供的各種實用函數(shù),包括屬性提取函數(shù)、加密解密函數(shù)、包發(fā)送接收函數(shù)、打包函數(shù)和訪問數(shù)據(jù)庫函數(shù)。一個典型的回調(diào)函數(shù)例子的流程圖如下。一個可擴(kuò)展的AAA 協(xié)議棧14判斷用戶名長度是否合法判斷是否有屬性getattribute()抽取SESSION_INDEX屬性放入響應(yīng)鏈表中抽取相應(yīng)請求屬性getattribute()應(yīng)用客戶端口令解密請求口令decrypt_password()調(diào)TUXEDO訪問數(shù)據(jù)庫取口令get_password()判斷為正確,并發(fā)送響應(yīng)send_accept()判斷為錯誤,并發(fā)送響應(yīng)send_reject()圖 48 典型回調(diào)函數(shù)流程圖第五章協(xié)議棧功能特點協(xié)議實現(xiàn)全、互通性較高:本協(xié)議?;救繉崿F(xiàn)了IETF 中關(guān)于RADIUS 的相關(guān)協(xié)議。由于本協(xié)議棧完全遵守IEFT 的關(guān)于RADIUS 的各個協(xié)議,所以在以本協(xié)議棧為基礎(chǔ)開發(fā)的RADIUS 系統(tǒng)可以完全實現(xiàn)互通,在和其它標(biāo)準(zhǔn)RADIUS 系統(tǒng)也可以實現(xiàn)較大程度上的互通。多種驗證類型:在驗證過程中,RAS 和RADIUS 服務(wù)員傳送口令信息,這個口令信息通過RAS 和RADIUS 服務(wù)員之間的共享密鑰加密??诹钚畔⒃从谟脩糨斎?,根據(jù)用戶選擇可以有以下三種:PAP(Password Authentication Protocol 口令驗證協(xié)議)非常簡單,用戶發(fā)送口令給RADIUS 服務(wù)員,RADIUS 服務(wù)員通過數(shù)據(jù)庫或操作系統(tǒng)來驗證。用戶發(fā)送口令給RAS 的過程中,口令以明文方式傳送。RAS 傳送口令給RADIUS 的過程中,使用共享密鑰加密。最后RADIUS 服務(wù)員以口令明文的方式進(jìn)行驗證。CHAP(Challenge Handshake Authentication Protocol 挑戰(zhàn)握手驗證協(xié)議)避免在任何通信連接中使用口令明文。在CHAP 中,RAS 首先生成一個隨機(jī)數(shù)(稱為挑戰(zhàn))并發(fā)送給用戶,用戶的PPP 端生成一個由口令和挑戰(zhàn)組成的單向摘要并發(fā)送