




已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
UNIX網(wǎng)絡的服務器程序設計方法(劉凱 劉春旭,四川大學計算機學院)摘要:介紹了幾種網(wǎng)絡操作模式和UNIX下基于TCP/IP協(xié)議的網(wǎng)絡客戶/服務器模式的程序架構。重點對客戶/服務器模式中服務器程序的幾種設計方法進行了討論。關鍵詞:客戶/服務器,Socket,進程,并發(fā)服務器1引言11幾種網(wǎng)絡模式的介紹對等網(wǎng)絡(PeertoPeer)模式不需要專用服務器,每一臺工作站都能充當網(wǎng)絡服務的請求者和提供者,都有絕對自主權,也可以互相交換文件。這種類型的網(wǎng)絡軟件被設計成每一個實體都能完成相同或相似的功能。服務器(ServerBased)模式以服務器為中心,嚴格地定義了每一個實體的工作角色,即網(wǎng)絡上的工作站無法在彼此間直接進行文件傳輸,需通過服務器作為媒介,所有的文件讀取,消息傳送等也都在服務器的掌握之中??蛻?服務器(Client/Server)模式(有時也稱為主從式Master/Slave)指將需要處理的工作分配給客戶端和服務器端處理,所謂的客戶和服務器并沒有一定的界限,這取決于運行什么軟件,簡單的講,客戶是提出服務請求的一方,而服務器是提供服務的一方。在客戶/服務器模式中服務器端所提供的功能不僅僅是文件、數(shù)據(jù)庫等服務,還應當有相應的計算、通信等能力也就是說在工作時由客戶端和服務器端各自負擔一部分計算或通信的功能??蛻?服務器模式已經(jīng)成為計算機網(wǎng)絡互連中最重要的應用技術之一,它把一個大型的計算機應用系統(tǒng)變?yōu)槎鄠€能互為獨立的子系統(tǒng),而服務器便是整個應用系統(tǒng)資源的存儲與管理中心,多臺客戶機則各自處理相應的功能,共同實現(xiàn)完整的應用。瀏覽器/服務器(Browser/Server)模式從本質(zhì)上將,仍然是客戶/服務器模式(是客戶/服務器模式的特例)。只不過在某些應用方面,如數(shù)據(jù)庫服務,它將傳統(tǒng)的二層客戶/服務器結構發(fā)展成三層的客戶/服務器結構并在Internet上應用而已。在上述幾種模式中,客戶/服務器模式具有靈活多變的體系結構、豐富的開發(fā)環(huán)境和強大的設備驅(qū)動能力。12本文所采用的網(wǎng)絡應用程序編程接口網(wǎng)絡程序之間進行通訊,必須建立在一定的通訊協(xié)議基礎之上。對于UNIX下的應用程序,可用的協(xié)議有TCP/IP的傳輸控制協(xié)議TCP(Transmission Control Protocol)和用戶數(shù)據(jù)報協(xié)議UDP(User Datagram Protocol),XNS(Xerox Network System)的定序分組協(xié)議SPP(Sequential Pocket Protocol)和網(wǎng)際數(shù)據(jù)報協(xié)議IDP(Internetwork Datagram Protocol)以及ARPANET的接口報文處理機鏈路IMPLINK(Interface Message Processor Link)等。因為Internet的普及,使得TCP/IP成為使用最廣泛的協(xié)議。UNIX下基于TCP/IP協(xié)議的網(wǎng)絡應用程序編程接口API(Application Programming Interface)有兩種:源自BSD UNIX的Socket API和AT&T的傳輸層接口TLI(Transport Layer Interface)的超集X/Open傳輸接口XTI(X/Open Transport Interface)。這兩種API都是面向客戶/服務器模式的。由于Socket API已經(jīng)成為事實上的標準,因此本文在介紹服務器端程序的設計方法時也采用Socket API。2客戶/服務器模式的Socket實現(xiàn)框架21 TCP/IP Socket的基本原理。TCP/IP對外提供的只是編程接口而非用戶服務,真正的用戶服務還得靠編寫相應的服務程序來實現(xiàn)。TCP/IP的Socket API編程接口構成了使用協(xié)議的網(wǎng)絡應用程序視圖。服務程序客戶程序Socket APITCP/IP協(xié)議物理介質(zhì)圖1網(wǎng)絡應用程序、Socket API和TCP/IP的關系Socket API在BSD UNIX中首次提出,其目的是為了解決網(wǎng)絡間程序通訊的問題。就其原理而言,面向連接的Socket類似于電話系統(tǒng),無連接的Socket類似于電報系統(tǒng)。Socket實質(zhì)上是為網(wǎng)絡程序提供了通訊的端點號。對于每個網(wǎng)絡程序的一個Socket,它首先有一個半相關的端點號的描述:協(xié)議,本地地址,本地端口,如果它是與另一個Socket連接了的,則有一個相關的端點描述:協(xié)議,本地地址,本地端口,遠程地址,遠程端口。每個Socket有一個本地唯一的由操作系統(tǒng)分配的編號。22 Socket 的系統(tǒng)調(diào)用Socket是面向客戶/服務器模式設計的,它針對客戶和服務器程序提供了不同的系統(tǒng)調(diào)用。同時它還分為面向連接和無連接兩種類型。下表列出了Socket API的基本函數(shù)(這里就不對調(diào)用參數(shù)進行說明了)。 表1 基本的Socket系統(tǒng)調(diào)用函數(shù)名用途使用者相關協(xié)議說明socket建立一個通訊端點客戶、服務器TCP、UDPbind為一個連接的本地socket賦名客戶、服務器TCP、UDP使用TCP時,使用者為服務器;使用UDP時,使用者為客戶listen監(jiān)聽socket上的連接服務器TCPaccept接受socket上的連接服務器TCPconnect對socket進行連接初始化客戶TCPread從socket接收信息客戶、服務器TCPwrite向socket發(fā)送信息客戶、服務器TCPrecvfrom從socket接收信息客戶、服務器UDPsendto向socket發(fā)送信息客戶、服務器UDPclose關閉socket客戶、服務器TCP、UDP23面向連接和無連接的客戶/服務器模式的程序流程框架圖服務器socket ( )服務響應服務請求建立連接處理服務請求bind ( )listen ( )accept ( )阻塞并等待客戶的連接請求read ( )write ( )客戶socket ( )connect ( )write ( )read ( )圖2 面向連接的客戶/服務器模式服務器服務響應服務請求bind()recvfrom()阻塞并等待客戶數(shù)據(jù)處理服務請求sendto()socket()客戶recvfrom()sendto()bind()socket()圖3 無連接的客戶/服務器模式3服務器程序的設計方法31總述客戶程序一般比較簡單,而服務器程序就比較復雜了,因為對服務器程序的設計,必須考慮到其響應速度和響應能力等服務性能因數(shù)。本文主要討論的是面向連接的服務器程序設計方法。總體上服務器程序可分為兩類:并發(fā)服務器(Concurrent Server)和串行服務器(Iterative Server)。前者主要針對實時性的客戶/服務器模式,后者主要針對服務量小的客戶/服務器模式。32 TCP串行服務器程序串行服務器程序是這樣的:每次它只能為一個連接過來的客戶程序提供服務,只有在完全處理了一個客戶的請求后,才能響應下一個客戶的請求,即按照FIFO的原則響應請求。一般很少使用串行服務器程序,不過諸如時間/日期等服務量小的且實時性要求不高的服務器程序可以使用該方式。從進程控制的角度來講,該方式的速度是最快的,因為它不進行進程控制,系統(tǒng)開銷小。33 傳統(tǒng)的TCP進程并發(fā)服務器程序在這種方式下,并發(fā)服務器程序在收到客戶程序請求后,派生出一個子進程來為該客戶程序服務,自己則回到等待狀態(tài),準備接收下一個客戶程序的請求,子進程在服務完成后退出。其中,作為父進程的并發(fā)服務器程序成為主服務器(master),具體處理客戶請求的子進程成為從服務器(slave)。響應子進程接管連接客戶程序slave服務請求父進程返回生成子進程fork()連接connect()處理請求master接受客戶請求accecp()圖4 傳統(tǒng)的TCP進程并發(fā)服務器程序框架并發(fā)服務器的問題在于派生子進程(fork()操作)時會消耗CPU的很多時間,這對需要響應數(shù)目眾多的客戶進程的服務器進程所在的系統(tǒng)是極為不利的,例如對于Web服務器就是這樣。34 TCP預先派生子進程并發(fā)服務器程序在傳統(tǒng)的TCP進程并發(fā)服務器程序的基礎上,可以對響應方式進行一些改造。傳統(tǒng)的TCP進程并發(fā)服務器程序的響應方式是即響應即派生子進程。現(xiàn)在將這種方式改變?yōu)椋悍掌鞒绦騿雍缶拖壬扇舾勺舆M程以備響應,這些子進程構成服務子進程組,而父進程則成了監(jiān)控進程。fork可用子進程組父進程子進程1子進程2子進程3客戶2客戶1子進程N圖5 TCP預先派生子進程這里需要解決的問題是:怎樣保持一定量的可用子進程;服務請求到達時,喚醒子進程的機制應該怎樣以及父進程怎樣將必要的信息傳遞給子進程。父進程監(jiān)視可用子進程的數(shù)量,當數(shù)量低于某個閾值時就再派生一些子進程,當數(shù)量高于某個閾值時就終止一些可用子進程。當然,總的子進程數(shù)量也應當有個上限值,以防止系統(tǒng)資源消耗完。這樣就使得可用子進程數(shù)及總的子進程數(shù)保持在一定范圍之內(nèi)了。預先生成得子進程在各自調(diào)用accept()后進入睡眠狀態(tài)。由于這些子進程共用一個socket結構,當一個可戶請求到達時,就會造成驚群(thundering herd)喚醒所有的子進程。當然,只有最先被調(diào)度的子進程才會獲得客戶的連接,其他的子進程會再次進入睡眠狀態(tài)。這種情況會導致系統(tǒng)性能的下降。解決這個問題的方法是給accept上鎖,即保證accept操作的原子性。有些UNIX系統(tǒng)在內(nèi)核已經(jīng)解決了這一問題,就無須再給accept上鎖了。如果子進程只是父進程的副本,基本上就不用額外考慮進程通訊的問題了。如果將父進程改造成類似于inetd的守護進程(啟動后先調(diào)用fork()生成子進程,再通過exec系統(tǒng)調(diào)用執(zhí)行服務處理程序),就必須解決父進程同子進程之間的通訊問題。UNIX下進程通訊的機制有多種,如管道(pipe),具名管道(named pipe),IPC消息(InterProcess Communication Message)等。這里我們使用IPC消息隊列來向子進程傳遞socket描述字。消息隊列客戶1客戶2父進程子進程1子進程2子進程3可用子進程組子進程N圖6 使用IPC消息機制的TCP預先派生子進程方法35 TCP線程并發(fā)服務器程序線程的執(zhí)行效率比進程高10到100倍。編寫線程函數(shù)時必須注意函數(shù)的線程安全性。并非所有的UNIX系統(tǒng)或同種UNIX的不同版本都支持線程。由于在方法上線程服務器程序同進程服務器程序的設計差不多,這里就不作多的描述了。4結束語編程人員在編寫具體的服務器程序時,應當結合具體的應用、網(wǎng)絡結構和網(wǎng)絡性能等情況,盡可能地提高服務效率和網(wǎng)絡安全性。參考文獻1網(wǎng)絡操作系統(tǒng)的分類lease.qz.f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 義齒車間管理制度
- 樂捐基金管理制度
- 云南保密管理制度
- 互助保障管理制度
- 井下車場管理制度
- 井控工作管理制度
- 交投安全管理制度
- 2025年歷史文化街區(qū)保護與城市更新項目社區(qū)文化保護與傳承研究報告
- 2025年冷鏈物流溫控技術在不同冷鏈產(chǎn)品中的應用對比報告
- 交通報銷管理制度
- 校園欺凌模擬法庭劇本
- 復合性潰瘍的健康宣教
- 山東電動伸縮雨棚施工方案
- 新媒體營銷技術與應用PPT完整全套教學課件
- 第5章紅外教學課件
- 卡氏肺孢子蟲肺炎
- 大足縣某水庫除險加固工程施工組織設計
- 基于單片機數(shù)字電壓表電路設計外文文獻原稿和譯文
- JJG 1149-2022電動汽車非車載充電機(試行)
- 2023版浙江評審衛(wèi)生高級專業(yè)技術資格醫(yī)學衛(wèi)生刊物名錄
- GB/T 1689-1998硫化橡膠耐磨性能的測定(用阿克隆磨耗機)
評論
0/150
提交評論