![顧客服務(wù)員程序的設(shè)計(jì)要點(diǎn)說明_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/bac5c1ba-7035-4f7b-8e86-7e357d789bff/bac5c1ba-7035-4f7b-8e86-7e357d789bff1.gif)
![顧客服務(wù)員程序的設(shè)計(jì)要點(diǎn)說明_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/bac5c1ba-7035-4f7b-8e86-7e357d789bff/bac5c1ba-7035-4f7b-8e86-7e357d789bff2.gif)
![顧客服務(wù)員程序的設(shè)計(jì)要點(diǎn)說明_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/bac5c1ba-7035-4f7b-8e86-7e357d789bff/bac5c1ba-7035-4f7b-8e86-7e357d789bff3.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、更多企業(yè)學(xué)院:中小企業(yè)管理全能版183套講座+89700 份資料總經(jīng)理、高層管理49套講座+16388份資料中層管理學(xué)院46套講座+6020份資料國(guó)學(xué)智慧、易經(jīng)46套講座人力資源學(xué)院56套講座+27123份資料各階段員工培訓(xùn)學(xué)院77套講座+ 324份資料員工管理企業(yè)學(xué)院67套講座+ 8720份資料工廠生產(chǎn)管理學(xué)院52套講座+ 13920份資料財(cái)務(wù)管理學(xué)院53套講座+ 17945份資料銷售經(jīng)理學(xué)院56套講座+ 14350份資料銷售人員培訓(xùn)學(xué)院72套講座+ 4879份資料第四章 顧客服務(wù)員程序設(shè)計(jì)4.1網(wǎng)絡(luò)服務(wù)模式近年來,在信息系統(tǒng)中廣泛使用的信息共享模型是顧客/服務(wù)器模型,這種計(jì)算模式迅速取代了
2、以主機(jī)為主導(dǎo)的集中式計(jì)算方法。顧客/服務(wù)器計(jì)算具有自己的一組行業(yè)術(shù)語。表4-1列出了一些術(shù)語,這些術(shù)語經(jīng)常出現(xiàn)在對(duì)顧客/服務(wù)器產(chǎn)品和應(yīng)用的描述中。表4-1顧客/服務(wù)器術(shù)語術(shù)語說明應(yīng)用程序編程接口( API)一組支持顧客/服務(wù)器之間進(jìn)行相互通信的函數(shù)和可調(diào)用程序顧客一個(gè)服務(wù)的請(qǐng)求方,通常是一個(gè)末端系統(tǒng),能夠從服務(wù)器處查詢信息中間件一組驅(qū)動(dòng)程序、應(yīng)用程序編程接口或其它軟件,用于改善顧客/服務(wù)器之間的連接關(guān)系數(shù)據(jù)庫(kù)是一種把信息訪問限制于按照搜索條件選擇數(shù)據(jù)的數(shù)據(jù)庫(kù)服務(wù)器是一臺(tái)計(jì)算機(jī),通常是一臺(tái)高性能工作站、 小型機(jī)或大型機(jī),擁有供網(wǎng)絡(luò)中 眾多用戶訪問的信息結(jié)構(gòu)化查詢語言(SQL)由IBM開發(fā)、由AN
3、SI標(biāo)準(zhǔn)化的一種語言,用于對(duì)關(guān)系數(shù)據(jù)庫(kù)的尋址、創(chuàng) 建、更新和查詢顧客/服務(wù)器環(huán)境中最基本元素是顧客和服務(wù)器。顧客通常是PC或工作站,為端用戶提供非常友好的界面, 例如微軟的 Windows等。服務(wù)器為顧客提供一組共享的用戶服務(wù)程 序。最常見的是數(shù)據(jù)庫(kù)服務(wù)器,服務(wù)器能夠使很多顧客共享對(duì)同一信息源的訪問。除了顧客和服務(wù)器,組成顧客 /服務(wù)器模型的第三個(gè)基本要素是網(wǎng)絡(luò)系統(tǒng)。顧客。服務(wù) 器計(jì)算是分布式計(jì)算。用戶、應(yīng)用程序和資源是分布式的,用來響應(yīng)實(shí)際業(yè)務(wù)請(qǐng)求,并且它 們通過局域網(wǎng)、廣域網(wǎng)或 In ternet連接起來。顧客/服務(wù)器模型與分布式處理有很多不同點(diǎn),主要有:在用戶自己的系統(tǒng)中為該用戶提供界面
4、友好的應(yīng)用程序。這使得用戶可以在很大程度上控制時(shí)間安排和計(jì)算機(jī)使用類型,并使得部門管理者具有響應(yīng)本地需求的能 力。盡管應(yīng)用是分散的,但仍然強(qiáng)調(diào)數(shù)據(jù)的集中以及很多網(wǎng)絡(luò)管理和使用功能的集中。 對(duì)于用戶組織和廠商來說,他們有一個(gè)共同的承諾,使系統(tǒng)開放和模塊化。這意味 著用戶在選擇產(chǎn)品和混合使用來自眾多廠家的設(shè)備時(shí)具有很大的選擇性。網(wǎng)絡(luò)互聯(lián)是操作的基礎(chǔ),網(wǎng)絡(luò)管理和網(wǎng)絡(luò)安全在組織和操作系統(tǒng)中具有很高的優(yōu)先權(quán)。顧客/服務(wù)器應(yīng)用顧客/服務(wù)器體系結(jié)構(gòu)的核心是應(yīng)用程序級(jí)任務(wù)在顧客和服務(wù)器之間的分配。圖4-1給出了這個(gè)模型的一般情況。無論是顧客還是服務(wù)器,最基本的軟件是運(yùn)行在硬件平臺(tái)上的操作系統(tǒng),顧客的平臺(tái)和操作
5、系統(tǒng)可能和服務(wù)器的不同。事實(shí)上,在網(wǎng)絡(luò)環(huán)境下,可能會(huì)有很 多不同類型的顧客平臺(tái)和操作系統(tǒng)以及很多類型的服務(wù)器平臺(tái)和操作系統(tǒng)。只要特定的顧客和服務(wù)器共享相同的通信協(xié)議并支持相同的應(yīng)用程序,低層的細(xì)節(jié)不必考慮。顧客表示服務(wù)請(qǐng)求/應(yīng)答服務(wù)器應(yīng)用邏輯(顧客部分)4應(yīng)用邏輯(服務(wù)器部分)通信軟件通信軟件顧客操作系統(tǒng)協(xié)議交互服務(wù)器操作系統(tǒng)硬件平臺(tái)硬件平臺(tái)圖4-1顧客/服務(wù)器體系結(jié)構(gòu)使顧客和服務(wù)器能夠交互的基礎(chǔ)是通信軟件,這種軟件主要例子是TCP/IP。所有這些支持軟件(通信軟件和操作系統(tǒng))的主要任務(wù)是,為分布式的應(yīng)用程序提供一個(gè)基本結(jié)構(gòu)。在理論上,應(yīng)用程序所執(zhí)行的實(shí)際功能可以針對(duì)顧客和服務(wù)器分割開來,方法
6、是使平臺(tái)和網(wǎng)絡(luò)資源達(dá)到最優(yōu)化。且使用戶執(zhí)行各種任務(wù)及相互之間合作使用共享資源的能力達(dá)到最優(yōu) 化。在某些情況下,這些都要求大批的應(yīng)用程序軟件在服務(wù)器上執(zhí)行,而在其它一些情況下,多數(shù)應(yīng)用程序邏輯上位于顧客端。顧客/服務(wù)器環(huán)境能夠成功的一個(gè)基本因素是用戶將系統(tǒng)當(dāng)作一個(gè)整體而與之打交道的方式。因此,顧客端的用戶界面的設(shè)計(jì)是十分重要的。在大多數(shù)顧客/服務(wù)器系統(tǒng)中,都突出強(qiáng)調(diào)了要提供易于使用、易于學(xué)習(xí)、功能強(qiáng)大并且靈活的圖形用戶界面(GUI )。顧客/服務(wù)器應(yīng)用程序分類在顧客/服務(wù)器的通用框架中,對(duì)顧客和服務(wù)器的工作劃分有許多不同的實(shí)現(xiàn)方法。圖4-2針對(duì)數(shù)據(jù)庫(kù)應(yīng)用說明了可以以多種方式來分配處理過程,圖中概
7、括了數(shù)據(jù)庫(kù)應(yīng)用的一些主要選項(xiàng)。當(dāng)然也存在其它的劃分方法,并且對(duì)于其它不同類型的應(yīng)用選項(xiàng)也可能具有不同的特點(diǎn)。服務(wù)器(a)基于主機(jī)的處理顧客顧客(b) 基于服務(wù)器的處理(c) 合作處理服務(wù)器服務(wù)器(d) 基于顧客的處理圖4-2顧客/服務(wù)器應(yīng)用程序分類圖 4-2 描述了 4 種網(wǎng)絡(luò)服務(wù)類型,它們分別是:基于主機(jī)的處理: 基于主機(jī)的處理并不是真正的用戶普遍認(rèn)同的顧客 / 服務(wù)器計(jì)算。 而且,基于主機(jī)的處理是指?jìng)鹘y(tǒng)的大型機(jī)環(huán)境,實(shí)質(zhì)上所有的處理都是在一臺(tái)中心 主機(jī)上完成的。用戶接口通常是通過一臺(tái)啞終端,即使用戶在使用一臺(tái)微機(jī),用戶 終端也是局限于終端仿真器的角色?;诜?wù)器的處理:顧客 / 服務(wù)器配置
8、的最基本的一類,即顧客端主要負(fù)責(zé)提供圖 形化用戶界面,而實(shí)質(zhì)上所有的處理都是在服務(wù)器上完成的。這種配置是早期的顧 客/ 服務(wù)器模式,尤其是部門級(jí)系統(tǒng)的典型。在這種配置背后的基本原理是用戶工 作站最適合提供良好的用戶界面,并且數(shù)據(jù)庫(kù)和應(yīng)用程序很容易在中心系統(tǒng)上維 護(hù)?;陬櫩偷奶幚恚涸诹硪粋€(gè)極端,實(shí)際上所有應(yīng)用處理可以全部在顧客端完成。一 個(gè)例外是最適合在服務(wù)器上執(zhí)行的數(shù)據(jù)確認(rèn)例程和其它數(shù)據(jù)庫(kù)邏輯功能。一般地, 某些更復(fù)雜的數(shù)據(jù)庫(kù)邏輯功能都位于顧客端。 這種結(jié)構(gòu)可能是當(dāng)今使用最普遍的顧 客/ 服務(wù)器方式,使用戶能夠使用適合本地需要的應(yīng)用。合作處理:在合作處理配置方式中,應(yīng)用處理是以最優(yōu)化的方式來
9、執(zhí)行的,充分利 用了顧客和服務(wù)器兩方面的優(yōu)勢(shì)以及數(shù)據(jù)的分布性。 這樣一種配置在設(shè)置和維護(hù)方 面更加復(fù)雜,但從長(zhǎng)遠(yuǎn)看,這種配置類型比其它類型可以為用戶更好的服務(wù)質(zhì)量和 更高的網(wǎng)絡(luò)效率。圖 4-2c 和圖 4-2d 對(duì)應(yīng)的配置情況是在顧客端上有相當(dāng)大的一部分負(fù)載。這種所謂的 “胖顧客”( fat client )模型已經(jīng)被像 Powersoft 公司的 PowerBuilder 和 Gupta 公司的 SQL Windows 這樣的應(yīng)用程序開發(fā)工具所采用。 使用這些工具開發(fā)的應(yīng)用在范圍上是部門 級(jí)的,支持 25 到 150 個(gè)用戶。胖顧客的主要優(yōu)點(diǎn)是它充分利用了桌面功能,卸除了服務(wù) 器上的應(yīng)用處理
10、并使它們更加有效,不易發(fā)生瓶頸。然而,胖顧客策略也存在許多缺點(diǎn),隨著更多功能累加起來,快速地超出了桌面機(jī)器的 容量,迫使機(jī)器進(jìn)行升級(jí)。如果模型擴(kuò)充,超出了部門的界限,合并了很多用戶,則必須安 裝高性能局域網(wǎng)來支持瘦服務(wù)器和胖顧客之間大量的數(shù)據(jù)傳輸。 最后,維護(hù)、 升級(jí)或替換分 布于數(shù)十臺(tái)或百臺(tái)桌面機(jī)的應(yīng)用程序是非常困難的。圖 4-2b 代表了一種瘦顧客( thin client )的方式,這種方式更近似地模仿了傳統(tǒng)的以 主機(jī)為中心的方式, 常常是使應(yīng)用程序從大型機(jī)環(huán)境發(fā)展到分布式環(huán)境的移植途徑, 是目前 流行的 Internet 網(wǎng)絡(luò)環(huán)境下的應(yīng)用程序開發(fā)模式。4.1.3 三層顧客 / 服務(wù)器結(jié)
11、構(gòu)傳統(tǒng)的顧客 / 服務(wù)器結(jié)構(gòu)包括兩級(jí)(或稱兩層) :顧客層和服務(wù)器層。近年來,一種三 層結(jié)構(gòu)變得日益流行,如圖 4-3 所示。在這種結(jié)構(gòu)中,應(yīng)用軟件分布在三種類型的機(jī)器上: 用戶機(jī)器、 中間層服務(wù)器以及后端服務(wù)器。用戶機(jī)器是顧客, 在三層結(jié)構(gòu)中,它一般是一種 瘦型顧客。 中間層機(jī)器基本上是位于顧客和很多后端數(shù)據(jù)庫(kù)服務(wù)器之間的連接器。 中間層機(jī) 器能夠轉(zhuǎn)換協(xié)議, 從一種類型的數(shù)據(jù)庫(kù)系統(tǒng)映像為另一種。 另外, 中間層機(jī)器能夠融合來自 不同數(shù)據(jù)源的結(jié)果。 最后, 中間層機(jī)器也可以充當(dāng)桌面應(yīng)用程序和后端應(yīng)用程序之間的連接 器。在中間層服務(wù)器和后端服務(wù)器之間的交互也遵從顧客 / 服務(wù)器的模式。因此,中間
12、層服 務(wù)器同時(shí)充當(dāng)著顧客和服務(wù)器。圖4-3三層顧客/服務(wù)器結(jié)構(gòu)4.1.4 中間件顧客/服務(wù)器產(chǎn)品的開發(fā)和使用缺少標(biāo)準(zhǔn)化,使得實(shí)現(xiàn)集成的、多廠商的、企業(yè)范圍的 顧客/服務(wù)器配置變得困難,因?yàn)轭櫩?/服務(wù)器方式的大多數(shù)優(yōu)點(diǎn)與其模塊化以及將平臺(tái)和 應(yīng)用程序混合、協(xié)調(diào)起來提供商業(yè)解決辦法的能力緊密相連的,這種互操作問題必須得到很好的解決。為了獲得顧客/服務(wù)器的優(yōu)點(diǎn),開發(fā)者必須開發(fā)一組工具,為跨越所有平臺(tái)訪問系統(tǒng)資 源提供唯一的方法和形式。這使程序員能夠構(gòu)件這樣的應(yīng)用程序:在不同的PC機(jī)和工作站上所見所感相同,而且無論數(shù)據(jù)在什么位置都使用相同的方法來訪問數(shù)據(jù)。滿足這一要求的最普遍的方法是,在上層應(yīng)用程序
13、和下層通信軟件和操作系統(tǒng)之間使用 標(biāo)準(zhǔn)編程接口和協(xié)議。這種標(biāo)準(zhǔn)化的接口和協(xié)議稱為中間件(middleware )。具有了標(biāo)準(zhǔn)的編程接口,在不同的服務(wù)器類型和工作站類型上實(shí)現(xiàn)相同的應(yīng)用就很容易了。這對(duì)于用戶來說具有明顯的好處,而廠商也受到市場(chǎng)的驅(qū)動(dòng)來提供這樣的接口。主要原因是用戶購(gòu)買應(yīng)用程序而不是服務(wù)器;用戶將只選擇那些運(yùn)行了他們希望的應(yīng)用程序的服務(wù)器。需要標(biāo)準(zhǔn)化的協(xié)議將這些不同的服務(wù)器接口與需要訪問它們的顧客連接起來。目前已經(jīng)有很多中間件軟件包,從非常簡(jiǎn)單的到非常復(fù)雜的。它們所具有的共同特點(diǎn)是 隱藏不同網(wǎng)絡(luò)協(xié)議和操作系統(tǒng)的復(fù)雜性和不一致性。顧客和服務(wù)器廠商一般都提供了很多非常流行的中間件軟件包
14、供選擇,這樣,用戶可以決定一個(gè)特定的中間件策略,然后從各個(gè)廠商那里匯集裝置,來支持這個(gè)策略。圖4-4給出了在顧客/服務(wù)器結(jié)構(gòu)中中間件的作用。注意,中間件具有顧客端組件和服務(wù)器端組件兩部分,中間件的基本目的是使位于顧客端的應(yīng)用程序或用戶能夠訪問服務(wù)器上的各種服務(wù),同時(shí)不需考慮服務(wù)器之間的差別。對(duì)于特定的應(yīng)用領(lǐng)域,結(jié)構(gòu)化查詢語言(SQL )提供一種標(biāo)準(zhǔn)化的方式,由本地或遠(yuǎn)程的用戶或應(yīng)用程序訪問關(guān)系數(shù)據(jù)庫(kù)。然而關(guān)系數(shù)據(jù)庫(kù)廠商盡管支持SQL,但他們將自己專有的擴(kuò)展加到了 SQL中。這樣使廠商能夠讓眾多產(chǎn)品有所差別,但也產(chǎn)生了潛在的不兼容性。圖4-4在顧客/服務(wù)器結(jié)構(gòu)中中間件的作用4.1.5 文件cac
15、he的一致性當(dāng)使用文件服務(wù)器時(shí),文件I/O的性能相對(duì)于局部文件訪問具有顯著的下降,主要原因是網(wǎng)絡(luò)帶來的延遲。為了減少這種性能下降,系統(tǒng)可以使用文件高速緩沖器來保存最近訪 問的文件記錄。由于局部性原理,使用本地文件高速緩沖器可以減少必須進(jìn)行的遠(yuǎn)程服務(wù)器 訪問次數(shù)。圖4-5文件高速緩存機(jī)制圖4-5描述了一種典型的文件高速緩存機(jī)制,用于在網(wǎng)絡(luò)互連的工作站組上高速緩存文件。當(dāng)進(jìn)程要進(jìn)行文件訪問時(shí),請(qǐng)求首先提交到進(jìn)程所在的工作站的cache中,如果在那里未得到滿足,則該請(qǐng)求或者傳遞給本地磁盤,或者傳遞給文件服務(wù)器。 在服務(wù)器端,首先查詢服務(wù)器上的cache,如果沒有命中,則訪問文件服務(wù)器的磁盤。 雙重高
16、速緩存的方法 用于減少通信量和磁盤 I/O。當(dāng)cache中總能含有遠(yuǎn)程數(shù)據(jù)的精確副本時(shí),這些cache是一致的。Cache之間可能會(huì)變得不一致。這是因?yàn)檫h(yuǎn)程數(shù)據(jù)已經(jīng)改變,而相應(yīng)的已經(jīng)陳舊的本地cache副本并沒有被廢棄。當(dāng)一個(gè)顧客修改了也被其它顧客高速緩存了的文件時(shí),這種情況就會(huì)發(fā)生。這個(gè)問題實(shí)際上存在于兩個(gè)層次上,如果顧客采用了將任何變化立即寫回服務(wù)器的文件中的策略, 則任何具有文件相關(guān)部分的cache副本的其它顧客將具有陳舊的數(shù)據(jù)。如果顧客延遲了將變化寫回服務(wù)器,則問題就更糟了,因?yàn)榉?wù)器本身也只是擁有文件的舊版本,且將請(qǐng)求讀至服務(wù)器的新文件也可能擁有陳舊的數(shù)據(jù)。保持本地cache副本是遠(yuǎn)
17、程數(shù)據(jù)的最新變化的問題就是cache的一致性問題。解決cache 一致性的最簡(jiǎn)單的方法是使用文件上鎖技術(shù),以防止多個(gè)顧客對(duì)文件的同 時(shí)訪問。這在損害性能和靈活性的前提下保證了一致性。Sprite系統(tǒng)中的機(jī)制提供了更好的方法,任何數(shù)目的遠(yuǎn)程進(jìn)程可以打開一個(gè)文件,用于讀入和生成它們自己的顧客cache,但是當(dāng)一個(gè)針對(duì)服務(wù)器的打開文件請(qǐng)求要求寫入訪問而其它進(jìn)程都是為讀訪問而打開這個(gè) 文件的,則服務(wù)器要采取兩步行動(dòng):第一,它告知寫入進(jìn)程,盡管它保留了一個(gè)cache,但是必須在發(fā)生更新時(shí)立即寫回所有改變的塊。系統(tǒng)在一個(gè)時(shí)刻最多只能有一個(gè)這樣的顧客。 第二,服務(wù)器告知所有使文件打開的讀進(jìn)程,該文件已不再是
18、可緩存的了。服務(wù)員類型在本章所舉的各個(gè)例子中都必須指定進(jìn)程的類型(顧客/服務(wù)員)和協(xié)議的類型(面向連接/無連接),而對(duì)于服務(wù)員則還要進(jìn)一步指出是并發(fā)型服務(wù)員還是反復(fù)型服務(wù)員(通常 顧客并不在乎是和并發(fā)型服務(wù)員還是和反復(fù)型服務(wù)員通信)。這樣,就給出4種可能組合如表 4-1。表4-1服務(wù)員類型服務(wù)員類型反復(fù)型并發(fā)型面向連接不常用有代表性無連接有代表性不常用4.2標(biāo)準(zhǔn)In ternet 服務(wù)和常見的應(yīng)用4.2.1 標(biāo)準(zhǔn) In ternet 服務(wù)表4-2列出了 TCP/IP多數(shù)實(shí)現(xiàn)都提供的一些標(biāo)準(zhǔn)服務(wù)。表中的所有服務(wù)同時(shí)使用TCP和UDP提供,并且這兩個(gè)協(xié)議的端口號(hào)也相同。表4-2 標(biāo)準(zhǔn)TCP/IP
19、服務(wù)名字TCP 端口UDP 端口RFC說明Echo (回射)77862服務(wù)器返回顧客發(fā)送的數(shù)據(jù)Discard (丟棄)99863服務(wù)器丟棄顧客發(fā)送的數(shù)據(jù)Daytime (時(shí)間/日期)1313867服務(wù)器返回可讀的日期和時(shí)間Chargen (字符生成)1919864TCP服務(wù)器發(fā)送連續(xù)的字符流,直到顧客終 止連接。每當(dāng)顧客發(fā)送一個(gè)數(shù)據(jù)報(bào),UDP就返回一個(gè)包含隨機(jī)數(shù)量字符的數(shù)據(jù)報(bào)。time (時(shí)間)3737868服務(wù)器返回一個(gè)32位二進(jìn)制數(shù)值的時(shí)間。 這個(gè)數(shù)值表示從1900年1月1日子時(shí)(UTC) 以來所流逝的秒數(shù)。這些服務(wù)通常由 Unix系統(tǒng)中的inetd守護(hù)進(jìn)程提供。使用標(biāo)準(zhǔn)的telnet顧客
20、程序很容 易測(cè)試這些功能。這五個(gè)功能由inetd內(nèi)部處理的功能,對(duì)于TCP版本的echo、discard和chargen服務(wù)器由inetd派生出來后作為子進(jìn)程運(yùn)行,這是因?yàn)樗鼈兌家\(yùn)行到相應(yīng)的 顧客終止連接為止。另外兩個(gè)TCP服務(wù)器time和daytime并不需要派生,因?yàn)樗鼈兊姆?wù)實(shí)現(xiàn)起來非常簡(jiǎn)單(取得當(dāng)前的時(shí)間和日期,把它格式化后輸出,在關(guān)閉連接),因此它們由inetd直接處理。所有五個(gè)UDP服務(wù)的處理都不需要 fork調(diào)用,因?yàn)樗鼈冎痪鸵l(fā)它們的顧客數(shù)據(jù)報(bào)生成并回應(yīng)最多一個(gè)數(shù)據(jù)報(bào),因此它們是由inetd直接處理的。4.2.2 常見的In ternet 應(yīng)用表4-3總結(jié)了各種常見的In t
21、ernet應(yīng)用程序?qū)f(xié)議的使用情況。表4-3各種常見的Internet應(yīng)用程序?qū)f(xié)議的使用情況應(yīng)用程序IPICMPUDPTCPPing*Traceroute*OSPF (路由協(xié)議)*RIP (路由協(xié)議)*BGP (路由協(xié)議)*BOOTP (引導(dǎo)協(xié)議)*DHCP (引導(dǎo)協(xié)議)*NTP (時(shí)間協(xié)議)*TFTP (簡(jiǎn)單的FTP)*SNMP (網(wǎng)絡(luò)管理)*SMTP (電子郵件)*Telnet(虛擬終端)*FTP (文件傳輸)*HTTP (Web)*NNTP (網(wǎng)絡(luò)新聞)*DNS (域名系統(tǒng))*NFS (網(wǎng)絡(luò)文件系統(tǒng))*Sun RPC (遠(yuǎn)程過程調(diào)用)*表中,前兩個(gè)應(yīng)用程序Ping和Traceroute
22、 是診斷應(yīng)用程序,它們使用ICMP協(xié)議。Traceroute 構(gòu)造自己的UDP分組來發(fā)送,并讀ICMP的應(yīng)答。緊接著是三個(gè)比較流行的 路由協(xié)議,它們展示了路由協(xié)議使用的各種傳輸協(xié)議。OSPF采用原始套接口直接使用IP,而RIP使用UDP,BGB則使用 TCP。下面5個(gè)是基于UDP的應(yīng)用程序,接著 5個(gè)應(yīng)用程序使用 TCP,最后3個(gè)是同時(shí)使 用UDP和TCP的應(yīng)用程序。4.3 并發(fā)服務(wù)器4.3.1 套接口對(duì)一個(gè)TCP連接的套接口對(duì)(socket pair )是一個(gè)定義該連接的兩個(gè)端點(diǎn)的四元組:本 地IP地址、本地TCP端口號(hào)、遠(yuǎn)程IP地址和遠(yuǎn)程TCP端口號(hào)。套接口對(duì)唯一標(biāo)識(shí)一個(gè)互 連網(wǎng)上的TCP
23、連接。標(biāo)識(shí)每個(gè)端點(diǎn)的兩個(gè)值(IP地址和端口號(hào))通常稱為一個(gè)套接口??梢园烟捉涌趯?duì)的概念擴(kuò)展到UDP,即使UDP是面向無連接的。當(dāng)描述套接口函數(shù)(bi nd、connenct、getpeername 等)時(shí),注明它們?cè)谡f明套接口對(duì)中那個(gè)值, 例如bind 函數(shù)要求應(yīng)用程序說明本地 IP和本地端口,既可以是TCP套接口,也可以是UDP套接口。432并發(fā)服務(wù)器對(duì)于像時(shí)間/日期這樣簡(jiǎn)單的服務(wù)器,使用迭代服務(wù)器( iterative server )具有較好的 服務(wù)質(zhì)量;但是,當(dāng)顧客的請(qǐng)求需要長(zhǎng)時(shí)間服務(wù)時(shí),不可能讓一個(gè)服務(wù)器長(zhǎng)時(shí)間地為一個(gè)顧客服務(wù),為了提供網(wǎng)絡(luò)服務(wù)質(zhì)量,而是同時(shí)為多個(gè)顧客服務(wù)。Unix系
24、統(tǒng)下編寫一個(gè)并發(fā)應(yīng)用程序最簡(jiǎn)單的方法就是為每個(gè)顧客均fork 一個(gè)子進(jìn)程。下面代碼給出了一個(gè)典型的并發(fā)服務(wù)器程序框架。pid_t pid;int liste nfd,c onnfd;listenfd=Socket();/*Bind(listenfd,);Liste n( liste nfd, LISTENQ); For(;)Conn fd=Accept(liste nfd,If(pid=Fork()=0) Close(liste nfd); Doit(co nn fd); Close(c onn fd); Exit(0);Close(c onn fd);*/*/*/*/*/*并發(fā)服務(wù)器中主服務(wù)
25、器循環(huán)派生子進(jìn)程來處理每個(gè)新的連接。 程來處理顧客的請(qǐng)求。具體過程如圖4-6所示。create a socket*/liste n from the socket*/);create a child process*/child closes liste ning socket*/child termi nates*/pare ntcloses conn ected socket并發(fā)服務(wù)器讓派生的子進(jìn)請(qǐng)求(1)顧客(監(jiān)聽套接口)服務(wù)器Fork (2)服務(wù)器(子進(jìn)程)連接(3)(已連接套接口)圖4-6并發(fā)服務(wù)器讓子進(jìn)程處理顧客請(qǐng)求的服務(wù)圖中有一個(gè)服務(wù)器,它的IP地址為。服務(wù)器在它的眾所周知的端口
26、(例如21端口)上執(zhí)行被動(dòng)打開,并等待顧客的請(qǐng)求。這里使用符號(hào)指出服務(wù)器的套接口對(duì)。服務(wù)器在任意本地接口(第一個(gè)星號(hào)) 的端口 21上等待連接請(qǐng)求。遠(yuǎn)程 IP地址和遠(yuǎn)程端口沒有指定,用“*.* ”表示。這里的星號(hào)稱為通配(wildcard )符。如果運(yùn)行服務(wù)器的主機(jī)有多個(gè)IP地址,服務(wù)器可以說明它只接受到達(dá)某個(gè)特定本地接口的外來連接。這是指定一個(gè)接口或者任意接口的選擇。服務(wù)器不能指定多個(gè)地址的列表。通配的本地地址表示“任意”接口。此時(shí),必須區(qū)別服務(wù)器的監(jiān)聽套接口和已連接套接口。這里,已連接套接口使用和監(jiān)聽套接口相同的端口號(hào): 21。同時(shí),一旦建立連接,以連接的本地套接口的本地地址()隨即填入。
27、如果下一個(gè)顧客(假設(shè) IP地址為,端口號(hào)為1301 )隨即也提出了 服務(wù)請(qǐng)求,服務(wù)器就再派生第二個(gè)子進(jìn)程對(duì)它進(jìn)行服務(wù),這時(shí)建立連接的四元組為。服務(wù)器能夠區(qū)別這兩個(gè)連接:第一個(gè)連接的套接口對(duì)和第二個(gè)連接的套接口對(duì)是不同的。通過上面的例子可以看出,TCP無法僅僅通過查看目的端口來分離外來的分組。它必須查看套接口對(duì)的所有四個(gè)元素才能確定由哪個(gè)端點(diǎn)接收到達(dá)的分組。對(duì)于上面的例子,對(duì)于端口 21存在三個(gè)套接口,如果一個(gè)分組來自端口 1300,目的地為 端口 21,那么它就傳送給第一個(gè)子進(jìn)程;如果一個(gè)分組來自 端口 1301,目的地為 端口 21,那么它就傳送給第二個(gè) 子進(jìn)程;所有
28、其它的目的端口21的TCO分組則傳送給擁有監(jiān)聽套接口的初始服務(wù)器(父進(jìn)程)。緩沖區(qū)大小及其限制由于通信雙方及中間節(jié)點(diǎn)的配置不同,有些會(huì)影響應(yīng)用程序數(shù)據(jù)的傳輸。影響IP數(shù)據(jù)報(bào)大小的主要限制有:1. IPv4數(shù)據(jù)報(bào)的最大值為 65535字節(jié),包括IPv4的頭部,總長(zhǎng)度字段占16位。2. IPv6數(shù)據(jù)報(bào)的最大值為 65575字節(jié),包括40字節(jié)的IPv6頭部,有效負(fù)載長(zhǎng)度字段占16位。這里IPv6的有效負(fù)載長(zhǎng)度字段不含IPv6頭部,而IPv4的總長(zhǎng)度字段包含IPv4頭部。另外,IPv6有一個(gè)特大有效負(fù)載選項(xiàng),它把有效負(fù)載長(zhǎng)度字段擴(kuò)展到32位,但是這個(gè)選項(xiàng)要求 MTU超過65535的數(shù)據(jù)鏈路,這個(gè)選項(xiàng)是
29、為 主機(jī)到主機(jī)的內(nèi)部連接而設(shè)計(jì)的,例如HIPPI,它們沒有內(nèi)在的 MTU。3. 很多網(wǎng)絡(luò)有一個(gè)最大傳輸單元MTU,它由硬件規(guī)定。例如以太網(wǎng)的 MTU為1500字節(jié)。其它鏈路其 MTU可以配置。IPv4要求的最小 MTU是68字節(jié),IPv6要求 的最小MTU為576字節(jié)。4. 在兩臺(tái)主機(jī)間的路徑上的最小 MTU 稱為路徑 MTU 。1500 字節(jié)的以太網(wǎng) MTU 是 當(dāng)今常見的路徑 MTU 。路徑 MTU 在不同方向可以不相同,因?yàn)樵谝蛱鼐W(wǎng)中路由 是非對(duì)稱的。5. 當(dāng)一個(gè)數(shù)據(jù)報(bào)將從某個(gè)接口發(fā)出時(shí),如果它的大小超過相應(yīng)鏈路的 MTU ,IPv4 和 IPV6 都將執(zhí)行分片( fragmentati
30、on )操作。各片段到達(dá)目的地前不會(huì)被重組(reassembling )。IPV4主機(jī)對(duì)其產(chǎn)生的數(shù)據(jù)報(bào)執(zhí)行分片,IPV4路由器對(duì)其轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)也執(zhí)行分片。但是, IPv6 只在數(shù)據(jù)報(bào)產(chǎn)生的主機(jī)執(zhí)行分片; IPv6 路由器 對(duì)其轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)不進(jìn)行分片。事實(shí)上, IPv6 路由器可以執(zhí)行分片,但只對(duì)那些 由路由器產(chǎn)生的數(shù)據(jù)報(bào)而不是轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)。這時(shí)的路由器實(shí)際上作為主機(jī)運(yùn)行。 例如,大多數(shù)路由器支持 Telnet 協(xié)議,系統(tǒng)管理員就用它來配置路由器。由路由 器的 Telnet 服務(wù)器產(chǎn)生的 IP 數(shù)據(jù)報(bào)是由路由器產(chǎn)生的,而不是路由器轉(zhuǎn)發(fā)的。6. IPv4 頭部的 DF (“不分片”)位若被設(shè)置,那
31、么不管是發(fā)送主機(jī)還是轉(zhuǎn)發(fā)路由器都不能對(duì)本數(shù)據(jù)報(bào)分片。當(dāng)路由器接收到一個(gè)超過其外出鏈路MTU 大小且設(shè)置了DF 位的 IPv4 數(shù)據(jù)報(bào)時(shí),它將產(chǎn)生一個(gè) ICMP 的“ destination unreachable, fragmentation needed but DF bit set(目的地不可達(dá),需要分片但 DF 位已設(shè)置)”出錯(cuò)消息。由于 IPv6 路由器不執(zhí)行分片,因此 IPv6 數(shù)據(jù)報(bào)隱含設(shè)置了 DF 位。如果 IPv6 路 由器接收到一個(gè)超過其外出鏈路 MTU 大小的 IPv6 數(shù)據(jù)報(bào)年,它將產(chǎn)生一個(gè) ICMPv6 的“ packet too big (分組太大) ”的出錯(cuò)消息。I
32、Pv4 的 DF 位和 IPv6 的隱含 DF 位可用于路徑 MTU 的發(fā)現(xiàn)。 例如, 如果 TCP 使 用 IPv4 技術(shù),它發(fā)送的數(shù)據(jù)報(bào)都將設(shè)置 DF 位。如果某個(gè)中間路由器返回一個(gè) ICMP 的“ destination unreachable, fragmentation needed but DF bit set"錯(cuò)誤,TCP 就減少每個(gè)數(shù)據(jù)報(bào)的數(shù)據(jù)量并重傳。路徑 MTU 的發(fā)現(xiàn)對(duì) IPv4 是可選的,但 所有 IPv6 的實(shí)現(xiàn)都必須支持它。7. IPv4 和 IPv6 都定義了最小重組緩沖區(qū)大小: 任何 IPv4 和 IPv6 的實(shí)現(xiàn)都必須支持 的最小數(shù)據(jù)報(bào)大小。對(duì) IP
33、v4 和其值為 576 字節(jié),對(duì) IPv6 為 1500 字節(jié)。例如, 對(duì) IPv4 來說,如果不能確信給定的目的主機(jī)是否能接收 577 字節(jié)的數(shù)據(jù)報(bào)。所以 很多使用 UDP 的應(yīng)用程序( DNS 、RIP 、TFTP 、BOOTP 、SNMP )避免產(chǎn)生大 于 576 字節(jié)的數(shù)據(jù)報(bào)。8. TCP 有一個(gè) MSS (最大分片大?。?,用于向?qū)Ψ?TCP 通告在每個(gè)分片中能發(fā)送的 最大 TCP 數(shù)據(jù)量 , 使用 MSS 的目的是告訴對(duì)方其重組緩沖區(qū)的實(shí)際值 ,從而避免 分片。 MSS 經(jīng)常設(shè)置成 MTU 減去 IP 和 TCP 頭部的固定長(zhǎng)度。在以太網(wǎng)環(huán)境下 IPv4 的 MSS 為 1460
34、字節(jié),使用 IPv6 的 MSS 值為 1440 字節(jié)(兩者的 TCP 頭 部都為 20 字節(jié),而 IPv4 頭部是 20 字節(jié), IPv6 的頭部是 40 字節(jié))。在 TCP 的 MSS 選項(xiàng)中, MSS 值是一個(gè) 16 位字段,最大值是 65535 字節(jié)。這個(gè) 值適合 IPv4 ,因?yàn)?IPv4 數(shù)據(jù)報(bào)中的最大 TCP 數(shù)據(jù)量為 65495 字節(jié)(即 65535 減去 IPv4 頭部 20 字節(jié)和 TCP 頭部 20 字節(jié))。但是, IPv6 有特大有效負(fù)荷選項(xiàng), 因此需要使用另外的技術(shù)。首先,沒有特大有效負(fù)荷選項(xiàng)的IPv6 數(shù)據(jù)報(bào)中最大的TCP 數(shù)據(jù)量為 65515 字節(jié)(即 65535
35、 減去 TCP 頭部 20 字節(jié))。因此 65535 這 個(gè) MSS 值被認(rèn)為是“無限”的特殊值,它只在用到特大有效負(fù)荷選項(xiàng)時(shí)才有用, 而這種情況又要求 MTU 超過 65535 。如果 TCP 使用特大有效負(fù)荷選項(xiàng),并且接 收到的對(duì)方通告的 MSS 超過 65535 ,那么它所發(fā)送數(shù)據(jù)報(bào)的大小限制就是接口 MTU 。如果這個(gè)值太大(即路徑上某個(gè)鏈路的 MTU 比它?。敲绰窂?MTU 的 發(fā)現(xiàn)功能將確定這個(gè)最小值。434 TCP 發(fā)送圖4-7說明了應(yīng)用程序發(fā)送數(shù)據(jù)到TCP套接口的過程。MTU大小的IPv4或IPv6分組圖4-7應(yīng)用程序發(fā)送數(shù)據(jù)到 TCP套接口的過程每個(gè)TCP套接口都有一個(gè)發(fā)
36、送緩沖區(qū),用戶可以使用SO_SNDBUF 套接口選項(xiàng)來改變這個(gè)緩沖區(qū)的大小。 當(dāng)應(yīng)用程序調(diào)用 write時(shí),內(nèi)核從應(yīng)用進(jìn)程的緩沖區(qū)中拷貝所有數(shù)據(jù) 到套接口的發(fā)送緩沖區(qū)。 如果套接口的發(fā)送緩沖區(qū)不能存放應(yīng)用程序的所有數(shù)據(jù)(即應(yīng)用程序的緩沖區(qū)大于套接口發(fā)送緩沖區(qū),或者套接口發(fā)送緩沖區(qū)還有其它數(shù)據(jù)),應(yīng)用程序?qū)⒈粧炱穑ㄋ撸?,這里假設(shè)套接口是阻塞的(缺省設(shè)置)。內(nèi)核將不從 write系統(tǒng)調(diào)用返回,直到應(yīng)用進(jìn)程緩沖區(qū)中的所有數(shù)據(jù)都拷貝到套接口發(fā)送緩沖區(qū)。所以從寫一個(gè)TCP套接口的write調(diào)用成功返回僅表示可以重新使用應(yīng)用進(jìn)程的緩沖區(qū)。它并不能告訴用戶對(duì)方的 TCP或?qū)Ψ綉?yīng)用進(jìn)程已接收到數(shù)據(jù)。TCP取
37、出套接口發(fā)送緩沖區(qū)的數(shù)據(jù)并把它發(fā)送給對(duì)方TCP,其過程基于TCP數(shù)據(jù)傳送的所有規(guī)則。對(duì)方 TCP必須確認(rèn)收到的數(shù)據(jù),只有收到對(duì)方的 ACK,發(fā)送方TCP才能刪 除套接口發(fā)送緩沖區(qū)中已確認(rèn)的數(shù)據(jù)。 TCP必須保留數(shù)據(jù)拷貝直到對(duì)方確認(rèn)為止。TCP以MSS大小或者更小的塊發(fā)送數(shù)據(jù)給IP (它同時(shí)給每個(gè)數(shù)據(jù)塊填上TCP頭部以構(gòu)成分片),其中MSS是由對(duì)方通告的,當(dāng)對(duì)方未通告時(shí)使用 536這個(gè)值。IP給每個(gè)TCP 分片填上IP頭部以構(gòu)成數(shù)據(jù)報(bào),查找其目的IP地址的路由表項(xiàng)以確定外出接口,然后把數(shù)據(jù)報(bào)傳遞給相應(yīng)的數(shù)據(jù)鏈路。IP可能先將數(shù)據(jù)報(bào)分段, 再傳送給鏈路層。但如上所述,MSS 選項(xiàng)的目的是避免分片,
38、 而新的實(shí)現(xiàn)又使用路徑 MTU發(fā)現(xiàn)功能。每個(gè)鏈路有一個(gè)輸出隊(duì)列, 如果輸出隊(duì)列滿,則分組丟棄,并沿協(xié)議棧向上返回一個(gè)錯(cuò)誤。TCP將注意這個(gè)錯(cuò)誤,并在以后的某個(gè)時(shí)刻重傳這個(gè)分片,但應(yīng)用進(jìn)程不知道這些細(xì)節(jié)。4.3.5 UDP 發(fā)送圖4-8說明了應(yīng)用程序發(fā)送數(shù)據(jù)到UDP套接口的過程。應(yīng)用進(jìn)程緩沖區(qū)用戶進(jìn)程1F套接口發(fā)送緩沖區(qū)內(nèi)核1UDP數(shù)據(jù)報(bào)rMTU大小的IPv4或IPv6分組圖4-8應(yīng)用程序發(fā)送數(shù)據(jù)到 UDP套接口的過程在圖4-8中,套接口發(fā)送緩沖區(qū)用虛線框,因?yàn)樗⒉淮嬖凇DP套接口有發(fā)送緩沖區(qū)的大?。ㄓ脩艨梢允褂肧O_SNDBUF 套接口選項(xiàng)修改),但是它僅僅是發(fā)送(sendto)到套接口的
39、UDP數(shù)據(jù)報(bào)的上限。如果應(yīng)用程序發(fā)送一個(gè)大于套接口發(fā)送緩沖區(qū)的數(shù)據(jù)報(bào), 則返回EMSGSIZE 錯(cuò)誤。由于UDP是一種不可靠的服務(wù),它不必保存應(yīng)用程序的數(shù)據(jù)拷 貝,因此不需要一個(gè)真正的緩沖區(qū)。(應(yīng)用進(jìn)程的數(shù)據(jù)沿協(xié)議棧向下傳遞時(shí),以某種形式拷貝到內(nèi)核的緩沖區(qū),當(dāng)鏈路層把數(shù)據(jù)傳出后這個(gè)拷貝將丟棄。)UDP簡(jiǎn)單地填加它的8個(gè)字節(jié)的頭部以構(gòu)成數(shù)據(jù)報(bào)并把它傳遞給IP。IPv4或IPv6給它填加相應(yīng)的IP頭部,執(zhí)行路由操作確定外出接口,然后或者直接將數(shù)據(jù)報(bào)加入鏈路層輸 出隊(duì)列(如果適合于 MTU),或者分段后在把每個(gè)段加入數(shù)據(jù)鏈路層的輸出隊(duì)列。如果UDP應(yīng)用進(jìn)程發(fā)送一個(gè)大的數(shù)據(jù)報(bào)(例如 2000字節(jié)數(shù)據(jù)報(bào)
40、),它比TCP應(yīng)用進(jìn) 程更有可能分片,因?yàn)門CP會(huì)將應(yīng)用進(jìn)程數(shù)據(jù)分成 MSS大小的塊,但UDP卻沒有這個(gè)能 力。從寫UDP套接口的sendto調(diào)用成功返回表示數(shù)據(jù)報(bào)或所有片段已被加入鏈路層的輸 出隊(duì)列。如果輸出隊(duì)列沒有足夠的空間存放數(shù)據(jù)報(bào)或它的某個(gè)分片,UDP將返回應(yīng)用進(jìn)程ENOBUFS 錯(cuò)誤。這里需要注意的是,有些UDP的實(shí)現(xiàn)不返回這種錯(cuò)誤,這樣甚至數(shù)據(jù)報(bào)未經(jīng)發(fā)出就丟失的情況應(yīng)用進(jìn)程也不知道。4.4網(wǎng)絡(luò)服務(wù)員工作模式當(dāng)用戶開發(fā)一個(gè)服務(wù)器程序時(shí),有如下類型的進(jìn)程控制方法可供選擇:迭代服務(wù)器程序。這種方式主要用于簡(jiǎn)單的網(wǎng)絡(luò)服務(wù)。它的主要缺點(diǎn)是在當(dāng)前顧客 服務(wù)完成之前,新到達(dá)的顧客無法得到服務(wù)。并
41、發(fā)服務(wù)器程序, 它為每個(gè)顧客 fork 一個(gè)子進(jìn)程提供服務(wù), 這是 Unix 服務(wù)器程序 通常的做法。使用 select 調(diào)用在一個(gè)進(jìn)程內(nèi)同時(shí)服務(wù)多個(gè)顧客的 TCP 服務(wù)器程序。 使用線程替代進(jìn)程實(shí)現(xiàn)的并發(fā)服務(wù)器程序。本節(jié)中介紹兩種新的并發(fā)程序設(shè)計(jì)方法:預(yù)先派生子進(jìn)程( preforking )。服務(wù)器啟動(dòng)后就派生一組子進(jìn)程,形成一個(gè)子進(jìn) 程池。沒當(dāng)?shù)絹硪粋€(gè)顧客請(qǐng)求,就從進(jìn)程池內(nèi)選擇一個(gè)可用子進(jìn)程為它服務(wù)。 預(yù)先創(chuàng)建線程 ( prethreading )。服務(wù)器啟動(dòng)后就創(chuàng)建一組線程, 形成一個(gè)線程池。 每個(gè)顧客請(qǐng)求由池中的一個(gè)線程提供服務(wù)。4.4.1 TCP 迭代服務(wù)器程序迭代服務(wù)器總是在完全
42、處理了一個(gè)顧客的請(qǐng)求后, 才響應(yīng)下一個(gè)顧客的請(qǐng)求。 這種方式 主要用于簡(jiǎn)單的網(wǎng)絡(luò)服務(wù),下面程序給出了使用迭代方法實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的時(shí)間 / 日期服務(wù) 器程序。#include "unp.h"#include <time.h> intmain(int argc, char *argv) listenfd, connfd; servaddr; buffMAXLINE; ticks;intstruct sockaddr_in chartime_t listenfd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr
43、, sizeof(servaddr); servaddr.sin_family= AF_INET;= htonl(INADDR_ANY);servaddr.sin_port= htons(13);/* daytime server */Bind(listenfd, (SA *) &servaddr, sizeof(servaddr);Listen(listenfd, LISTENQ); for ( ; ; ) connfd = Accept(listenfd, (SA *) NULL, NULL); ticks = time(NULL);snprintf(buff, sizeof(bu
44、ff), "%.24srn", ctime(&ticks); Write(connfd, buff, strlen(buff);Close(connfd);從進(jìn)程控制的角度來看,迭代服務(wù)器是最快的,因?yàn)樗贿M(jìn)行進(jìn)程控制。4.4.2 TCP 并發(fā)服務(wù)器程序傳統(tǒng)上,并發(fā)服務(wù)器是調(diào)用 fork 派生一個(gè)子進(jìn)程來處理顧客的請(qǐng)求。這使得服務(wù)器可 在同一時(shí)間為多個(gè)顧客提供服務(wù)。 唯一的限制是操作系統(tǒng)對(duì)同一用戶可擁有的進(jìn)程數(shù)量的限 制。下面的程序例子是一個(gè)并發(fā)服務(wù)器的實(shí)現(xiàn)。 絕大多數(shù) TCP 服務(wù)器程序也是這樣編寫的。#include "unp.h"intma
45、in(int argc, char *argv)intlistenfd, connfd;pid_tchildpid;voidsig_chld(int), sig_int(int), web_child(int);socklen_tclilen, addrlen;struct sockaddr*cliaddr;if (argc = 2) listenfd = Tcp_listen(NULL, argv1, &addrlen);else if (argc = 3)listenfd = Tcp_listen(argv1, argv2, &addrlen); elseerr_quit(
46、"usage: serv01 <host> <port#>"); cliaddr = Malloc(addrlen);Signal(SIGCHLD, sig_chld);Signal(SIGINT, sig_int);for ( ; ; ) clilen = addrlen;if ( (connfd = accept(listenfd, cliaddr, &clilen) < 0) if (errno = EINTR)continue;/* back to for() */elseerr_sys("accept error&q
47、uot;); if ( (childpid = Fork() = 0) /* child process */ Close(listenfd);/* close listening socket */web_child(connfd);/* process the request */exit(0);Close(c onn fd);/* pare nt closes conn ected socket */* end serv01 */并發(fā)服務(wù)器的問題在于 fork子進(jìn)程時(shí)所消耗的 CPU時(shí)間。20世紀(jì)80年代后期,當(dāng) 一個(gè)服務(wù)器一天只需處理幾百、幾千個(gè)顧客請(qǐng)求時(shí), 這樣實(shí)現(xiàn)從性能上是能夠滿足
48、的。然而到了 Web時(shí)代,一個(gè)重負(fù)荷的 Web服務(wù)器一天的訪問數(shù)量以百萬計(jì)。這種情況下,就單 臺(tái)主機(jī)而言,對(duì)于最繁忙的站點(diǎn)往往運(yùn)行多臺(tái)主機(jī)來分?jǐn)傌?fù)載。改進(jìn)服務(wù)器性能的方法有以下幾種??梢圆捎妙A(yù)先派生子進(jìn)程技術(shù)來提高并發(fā)服務(wù)器的性能。預(yù)先派生子進(jìn)程服務(wù)器程序不再為每個(gè)顧客請(qǐng)求 fork 一個(gè)子進(jìn)程,而是在服務(wù)器啟動(dòng)時(shí)就預(yù)先派生一組子進(jìn)程,做好為 接入的顧客請(qǐng)求服務(wù)的準(zhǔn)備。圖4-9顯示了一個(gè)預(yù)先派生 N個(gè)子進(jìn)程的服務(wù)器正在為 2個(gè)顧客同時(shí)服務(wù)的情形。可用子進(jìn)程池圖4-9預(yù)先派生子進(jìn)程的并發(fā)服務(wù)器使用預(yù)先派生子進(jìn)程的描述代碼如下:#i nclude"un p.h"static i
49、ntn childre n;static pid_t*pids;intmain (i nt argc, char *argv)intliste nfd, i;sockle n_taddrle n;voidsign t(i nt);pid_tchild_make(i nt,in t,in t);if (argc = 3)listenfd = Tcp_listen(NULL, argv1, &addrlen);else if (argc = 4)listenfd = Tcp_listen(argv1, argv2, &addrlen);elseerr_quit("usag
50、e: serv02 <host> <port#> <#children>");nchildren = atoi(argvargc-1);pids = Calloc(nchildren, sizeof(pid_t);for (i = 0; i < nchildren; i+)pidsi = child_make(i, listenfd, addrlen); /* parent returns */Signal(SIGINT, sig_int);for ( ; ; )pause(); /* everything done by children
51、*/這種技術(shù)的優(yōu)點(diǎn)在于:不需要引入父進(jìn)程執(zhí)行 fork 的開銷,新的顧客請(qǐng)求就能得到服 務(wù)。而缺點(diǎn)在于:每次啟動(dòng)服務(wù)器時(shí),父進(jìn)程必須確定需要產(chǎn)生多少個(gè)子進(jìn)程。如果不考慮 再派生子進(jìn)程, 一旦所有子進(jìn)程都被顧客請(qǐng)求占用, 此時(shí)新到的請(qǐng)求將被暫時(shí)忽略, 直到有 一個(gè)子進(jìn)程可用。對(duì)于父進(jìn)程可以監(jiān)視可用子進(jìn)程數(shù), 一旦低于某個(gè)系統(tǒng)預(yù)先設(shè)定的閥值就再派生額外的 子進(jìn)程。同樣, 如果空閑子進(jìn)程數(shù)大于某個(gè)閥值, 則父進(jìn)程將終止部分新派生的子進(jìn)程。因 為過多的子進(jìn)程會(huì)占用系統(tǒng)的資源,從而導(dǎo)致系統(tǒng)性能下降。當(dāng)系統(tǒng)負(fù)載較輕時(shí), 傳統(tǒng)的并發(fā)服務(wù)器模型能夠很好地處理顧客的請(qǐng)求, 也就是每來一 個(gè)請(qǐng)求, 服務(wù)器就派生一
52、個(gè)子進(jìn)程為之服務(wù)。 它甚至可以和 inetd 結(jié)合使用, 由 inetd 負(fù)責(zé) 接收每個(gè)連接。對(duì)于重負(fù)載情況,例如 web 服務(wù)器,可以使用相關(guān)的技術(shù)增強(qiáng)服務(wù)器的處 理能力。4.4.3 4.4BSD 上的實(shí)現(xiàn)在源自 Berkeley 的內(nèi)核實(shí)現(xiàn)上, 父進(jìn)程在派生子進(jìn)程之前創(chuàng)建監(jiān)聽套接口, 而每次 fork 子進(jìn)程時(shí),各個(gè)子進(jìn)程復(fù)制父進(jìn)程的全部描述字。圖 4-10 描述了 proc 結(jié)構(gòu)(每個(gè)進(jìn)程一 個(gè))、監(jiān)聽描述字的單個(gè) file 結(jié)構(gòu)以及單個(gè) socket 結(jié)構(gòu)的關(guān)系。在 proc 結(jié)構(gòu)中,描述字只是某個(gè)數(shù)組的一個(gè)下標(biāo),用于引用一個(gè) file 結(jié)構(gòu)。而 fork 派生子進(jìn)程時(shí),子進(jìn)程復(fù)制描述
53、字的特性之一就是:子進(jìn)程中給定的描述字所引用的 file 結(jié)構(gòu)與父進(jìn)程中同一描述字所引用的 file 結(jié)構(gòu)一致。 每個(gè) file 結(jié)構(gòu)有一個(gè)訪問計(jì)數(shù), 它在文 件或者套接口打開時(shí)為 1 ,而每當(dāng)調(diào)用 fork 或者 dup 本描述字時(shí),它就增加 1。在具有 N 個(gè)子進(jìn)程的例子中, file 結(jié)構(gòu)的訪問計(jì)數(shù)為 N+1 (父進(jìn)程雖然從不調(diào)用 accept ,但它并未 關(guān)閉該監(jiān)聽描述字) 。當(dāng)程序啟動(dòng)后, N 個(gè)子進(jìn)程被派生,它們分別調(diào)用 accept 并由內(nèi)核置入睡眠狀態(tài)。當(dāng) 第一個(gè)顧客連接到來時(shí), N 個(gè)睡眠進(jìn)程均被喚醒。 這是由于這 N 個(gè)進(jìn)程共享一個(gè) socket 結(jié)構(gòu),導(dǎo)致它們睡眠在同一等
54、待通道( wait channel ),即socket結(jié)構(gòu)的so_timeo 成員上。 但是,雖然N個(gè)進(jìn)程同時(shí)喚醒,只有最先被調(diào)度的進(jìn)程才能獲得顧客連接,而其它N-1個(gè)進(jìn)程在執(zhí)行過程中,它們會(huì)發(fā)現(xiàn)隊(duì)列長(zhǎng)度為0 (連接已被取走),因此被再次投入睡眠。這通常被稱為驚群(thu ndering herd )問題,因?yàn)楸M管只有一個(gè)進(jìn)程可以獲得連接,但所有進(jìn)程都被喚醒。這樣雖然可以工作,但這種情況會(huì)導(dǎo)致系統(tǒng)性能的下降。為了避免驚群?jiǎn)栴}的發(fā)生,用戶不希望有額外子進(jìn)程空閑,某些Unix內(nèi)核有一個(gè)名字為 wakeup_one的函數(shù),對(duì)于等待某個(gè)事件的一群進(jìn)程,它只喚醒一個(gè)等待進(jìn)程,而不是所有進(jìn)程。但是 BSD
55、操作系統(tǒng)內(nèi)核沒有提供這個(gè)函數(shù)。procprocproc圖4-10 proc、file和socket結(jié)構(gòu)的關(guān)系4.5 守護(hù)進(jìn)程4.5.1 守護(hù)進(jìn)程的原理守護(hù)進(jìn)程(daemon )是在系統(tǒng)后臺(tái)運(yùn)行不受終端控制的進(jìn)程,只要系統(tǒng)沒有關(guān)機(jī)或者崩潰,守護(hù)進(jìn)程將在系統(tǒng)中不間斷地運(yùn)行。Unix系統(tǒng)中一般有很多守護(hù)進(jìn)程 (使用ps - ax命令可以看出)在后臺(tái)運(yùn)行(20到50個(gè)),執(zhí)行不同的系統(tǒng)任務(wù)。為了保證守護(hù)進(jìn)程正常地工作,必須使守護(hù)進(jìn)程和其它進(jìn)程運(yùn)行的環(huán)境隔離開,避免由于其它進(jìn)程的行為影響守護(hù)進(jìn)程的工作。守護(hù)進(jìn)程要脫離所有的終端的原因是因?yàn)槭刈o(hù)進(jìn)程可能是從終端上啟動(dòng)(與從初始化腳本中啟動(dòng)相反),在這之后這個(gè)終端可能執(zhí)行其它的任務(wù)。例如,如果在某個(gè)終端上啟動(dòng)了 一個(gè)守護(hù)進(jìn)程后從該終端上注銷,其它用戶又從該終端登錄,那么任何關(guān)于守護(hù)進(jìn)程的錯(cuò)誤信息不應(yīng)在后面用戶的終端會(huì)話過程中出現(xiàn)。同樣,由終端上的一些鍵(熱鍵)所產(chǎn)生的信號(hào)(中斷信號(hào)),不應(yīng)對(duì)以前從該終端上啟動(dòng)的任何守護(hù)進(jìn)程造成影響。雖然使服務(wù)員程序 在系統(tǒng)后臺(tái)運(yùn)行很容易,但是用戶還應(yīng)該使程序能自動(dòng)轉(zhuǎn)到后臺(tái)運(yùn)行并且脫離與終端的聯(lián) 系。啟動(dòng)守護(hù)進(jìn)程的方法主要有:1. 在系統(tǒng)啟動(dòng)時(shí)很多守護(hù)程序是由系統(tǒng)初始化腳本啟動(dòng)。這些腳本一般在/etc目錄或者以/etc/rc 開頭的目錄
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療照明銷售合同范例
- 供暖法律合同范例
- 2025年度物流園區(qū)后勤保障與運(yùn)營(yíng)管理合同
- 產(chǎn)品英文訂購(gòu)合同范本
- 中國(guó)針織襯衫行業(yè)市場(chǎng)深度分析及投資策略咨詢報(bào)告
- 倉(cāng)儲(chǔ)承包服務(wù)合同范本
- 低價(jià)漁具轉(zhuǎn)讓合同范例
- 公寓電腦租賃合同范本
- 農(nóng)機(jī)合同范本
- 仔豬購(gòu)買合同范本
- 數(shù)學(xué)-河南省三門峽市2024-2025學(xué)年高二上學(xué)期1月期末調(diào)研考試試題和答案
- 2025年春新人教版數(shù)學(xué)七年級(jí)下冊(cè)教學(xué)課件
- 《心臟血管的解剖》課件
- 心肺復(fù)蘇課件2024
- 2024-2030年中國(guó)并購(gòu)基金行業(yè)發(fā)展前景預(yù)測(cè)及投資策略研究報(bào)告
- 河道清淤安全培訓(xùn)課件
- 2024各科普通高中課程標(biāo)準(zhǔn)
- 7.3.1印度(第1課時(shí))七年級(jí)地理下冊(cè)(人教版)
- 教師培訓(xùn)校園安全
- 清華大學(xué)考生自述
- AS9100D人力資源管理程序(范本)
評(píng)論
0/150
提交評(píng)論