第9章 應(yīng)用層在前八章我們已經(jīng)詳細(xì)地討論了計(jì)算機(jī)網(wǎng)絡(luò)是怎樣提供了完善的通信服務(wù),但是我們沒(méi)有討論這些通信服務(wù)是如何提供給應(yīng)用進(jìn)程來(lái)使用。本章就是討論各種應(yīng)用進(jìn)程通過(guò)什么樣的應(yīng)用層協(xié)議來(lái)使用網(wǎng)絡(luò)所提供的這些通信服務(wù)。 下面首先討論所有應(yīng)用協(xié)議都要使用的域名系統(tǒng)。在介紹了文件傳送協(xié)議和遠(yuǎn)程登錄協(xié)議后,就討論用戶最常用的因特網(wǎng)電子郵件。然后重點(diǎn)介紹萬(wàn)維網(wǎng)的工作原理及其主要協(xié)議。由于萬(wàn)維網(wǎng)的出現(xiàn)使因特網(wǎng)得到了飛速的發(fā)展,因此萬(wàn)維網(wǎng)在本章中占有大量的篇幅,同時(shí)也是本章的重點(diǎn)。對(duì)應(yīng)用層更深入的學(xué)習(xí)可參閱[COME00]、[COME97]、[TANF96]、[STAL00]及有關(guān)標(biāo)準(zhǔn)。 9.1 域名系統(tǒng)DNS9.1.1 域名系統(tǒng)概述許多應(yīng)用層軟件經(jīng)常直接使用域名系統(tǒng)DNS(Domain Name System),但計(jì)算機(jī)的用戶只是間接而不是直接使用域名系統(tǒng)。 用戶與因特網(wǎng)上某個(gè)主機(jī)通信時(shí),顯然不愿意使用很難記憶的長(zhǎng)達(dá)32位二進(jìn)制主機(jī)地址。即使是點(diǎn)分十進(jìn)制IP地址也并不太容易記憶。相反,大家愿意使用某種易于記憶的主機(jī)名字,早在ARPANET時(shí)代,整個(gè)網(wǎng)絡(luò)上只有數(shù)百臺(tái)計(jì)算機(jī)。那時(shí)使用一個(gè)叫做hosts的文化,列出所有主機(jī)名字和相應(yīng)的IP地址。只要用戶輸入一個(gè)主機(jī)名字,計(jì)算機(jī)就可很快地將這個(gè)主機(jī)名字轉(zhuǎn)換成機(jī)器能夠識(shí)別的二進(jìn)制IP地址。 雖然從理論上講,可以只使用一個(gè)域名服務(wù)器,使它裝入因特網(wǎng)上所有的主機(jī)名,并回答所有對(duì)IP地址的查詢,然而這種做法并不可取。因?yàn)殡S著因特網(wǎng)規(guī)模的擴(kuò)大,這樣的域名服務(wù)器肯定會(huì)因超負(fù)荷而無(wú)法正常工作,而且一旦域名服務(wù)器出現(xiàn)故障,整個(gè)因特網(wǎng)就會(huì)癱瘓。1983年因特網(wǎng)開始采用層次結(jié)構(gòu)的命名樹作為主機(jī)的名字,并使用分布式的域名系統(tǒng)DNS[RFC 1034.1035]。 因特網(wǎng)的域名系統(tǒng)DNS是一個(gè)聯(lián)機(jī)分布式數(shù)據(jù)體系統(tǒng),并采用客戶服務(wù)器方式。這樣即使單個(gè)域名服務(wù)器出了故障,DNS系統(tǒng)仍能正常運(yùn)行。DNS使大多數(shù)名字都在本地映射,僅少數(shù)映射需要在因特網(wǎng)上通信,使得系統(tǒng)是高效的。 名字到域名的映射是由若干個(gè)域名服務(wù)器程序組成的。域名服務(wù)器程序在專門的結(jié)點(diǎn)上運(yùn)行,而人們也常把運(yùn)行該程序的機(jī)器稱為域名服務(wù)器。 當(dāng)某一個(gè)應(yīng)用進(jìn)程需要將主機(jī)名映射為IP地址時(shí),該應(yīng)用進(jìn)程就成為域名系統(tǒng)DNS有一個(gè)客戶,并將待轉(zhuǎn)換的域名放在DNS請(qǐng)求報(bào)文中,以UDP數(shù)據(jù)報(bào)方式發(fā)給本地域名服務(wù)器(使用UDP是為了減少開銷)。本地的域名服務(wù)器在查找域名后,將對(duì)應(yīng)的IP地址放在回答報(bào)文中返回。應(yīng)用進(jìn)程獲得目的主機(jī)的IP地址后即可進(jìn)行通信。 若域名服務(wù)器不能回答該請(qǐng)求,則此域名服務(wù)器就暫時(shí)成為DNS中的另一個(gè)客戶,直到找到能回答該請(qǐng)求的域名服務(wù)器為止。這種查找過(guò)程后面還要進(jìn)一步討論。 9.1.2 因特網(wǎng)的域名結(jié)構(gòu)早期的因特網(wǎng)使用了非等級(jí)的名字空間,其優(yōu)點(diǎn)是名字簡(jiǎn)短、但當(dāng)因特網(wǎng)上的用戶數(shù)急劇增加時(shí),用非等級(jí)的名字空間來(lái)管理一個(gè)很大的而且是經(jīng)常變化的名字集合是非常困難的。因此因特網(wǎng)后來(lái)就采用了層次樹狀結(jié)構(gòu)的命名方法,就像全球郵政系統(tǒng)和電話系統(tǒng)那樣,采用這種命名方法,任何一個(gè)連接在因特網(wǎng)上的主機(jī)或路由器,都人一個(gè)惟一的層次結(jié)構(gòu)的名字,即域名(domain name),這里,“域”(domain)是名字空間中一個(gè)可被管理的劃分,域還可以繼續(xù)劃分為子域,如二級(jí)域、三級(jí)域等等。 域名的結(jié)構(gòu)由若干個(gè)分量組成,各分量之間用點(diǎn)(請(qǐng)注意,是英文小數(shù)點(diǎn)的點(diǎn),這個(gè)點(diǎn)的位置在這個(gè)字符的正中央,而不是偏在左邊)隔開: ….三級(jí)域名.二級(jí)域名.頂級(jí)域名 各分量分別代表不同級(jí)別的域名。每一級(jí)的域名都由英文字母和數(shù)字組成(不超過(guò)63個(gè)字符,并且不區(qū)分大小寫字母),級(jí)別最低的域名寫在最左邊,而級(jí)別最高的頂級(jí)域名則寫在最右邊。完整的域名不超過(guò)255個(gè)字符。域名系統(tǒng)既不規(guī)定—個(gè)域名需要包含多少個(gè)下級(jí)域名,也不規(guī)定每一級(jí)的域名代表什么意思,各級(jí)域名由其上一級(jí)的域名管理機(jī)構(gòu)管理,而最高的頂級(jí)城名則由因特網(wǎng)的有關(guān)機(jī)構(gòu)管理。用這種方法可使每一個(gè)名字都是唯一的,并且也容易設(shè)計(jì)出一種查找域名的機(jī)制。需要注意的是,域名只是個(gè)邏輯概念,并不反映出計(jì)算機(jī)所在的物理地點(diǎn)。 因特網(wǎng)的域名的管理機(jī)構(gòu)經(jīng)過(guò)了多次變化。最初由因特網(wǎng)網(wǎng)絡(luò)信息中心INTERNIC負(fù)責(zé)。后來(lái)改成由因特網(wǎng)國(guó)際特別委員會(huì)IAHC(Internet International Ad Hoc Committee)負(fù)責(zé),但是IAHC于1997年5月1日解散。現(xiàn)由新成立的gTLD-MoU負(fù)責(zé)。gTLD-MoU即generic Top Level Domain Memorandum of Understanding的縮寫,可譯為通用頂級(jí)域名協(xié)定備忘錄。參加gTLD-MoU活動(dòng)的,除因特網(wǎng)的有關(guān)單位外,如IALA(Internet Assigned Number Authority),ISOC(Internet SOCiety),IAB(Internet Architecture Board)等。 現(xiàn)在頂級(jí)域名TLD(Top Level Domain)有三類: (1)國(guó)家項(xiàng)級(jí)域名nTDL:采用ISO 3166的規(guī)定。如:cn表示中國(guó),us表示美國(guó),uk表示英國(guó),等等。 (2)國(guó)際頂級(jí)域名iTDL:采用int。國(guó)際性的組織可在int下注冊(cè)。 (3)通用頂級(jí)域名gTDL:根據(jù)[RFCl59l]規(guī)定,最早的頂級(jí)域名共六個(gè),即: com表示公司企業(yè),net表示網(wǎng)絡(luò)服務(wù)機(jī)構(gòu),org表示非贏利性組織,edu表示教育機(jī)構(gòu),gov表示政府部門(美國(guó)專用),mil表示軍事部門(美國(guó)專用)。 由于最初的ARPANET是美國(guó)人建造的這一歷史原因,在通用頂級(jí)域名中的政府和軍事部門的兩個(gè)域名都是美國(guó)專用。另外,雖然在美國(guó)的機(jī)構(gòu)可在注冊(cè)在其國(guó)家頂級(jí)域名us下,但他們卻常注冊(cè)在通用頂級(jí)域名下。一些人誤認(rèn)為:“凡注冊(cè)在通用頂級(jí)域名下的機(jī)構(gòu)都在美國(guó)。”但這種看法顯然不正確。 由于因特網(wǎng)上用戶的急劇增加,現(xiàn)在又新增加了七個(gè)通用頂級(jí)域名,即: Firm表示公司企業(yè),shop表示銷售公司和企業(yè)(這個(gè)域名曾經(jīng)是store),web表示突出萬(wàn)維網(wǎng)活動(dòng)的單位,arts表示突出文化、娛樂(lè)活動(dòng)的單位,rec表示突出消遣、娛樂(lè)活動(dòng)的單位,info表示提供信息服務(wù)的單位,nom表示個(gè)人。 在國(guó)家頂級(jí)域名下注冊(cè)的二級(jí)域名均由該國(guó)家自行確定。我國(guó)則將二級(jí)域名劃分為“類別域名”和“行政區(qū)域名”兩大類。其中“類別域名”六個(gè),分別為:ac表示科研機(jī)構(gòu);com表示工、商、金融等企業(yè),edu表示教育機(jī)構(gòu);gov表示政府部門;net表示互聯(lián)網(wǎng)絡(luò)、接入網(wǎng)絡(luò)的信息中心(NIC)和運(yùn)行中心(NOC);org表示各種非盈利性的組織。“行政區(qū)域名”34個(gè),適用于我國(guó)的各省、自治區(qū)、直轄市。例如:bj為北京市;sh為上海市;js為江蘇省等等。在我國(guó),在二級(jí)域名edu下申請(qǐng)注冊(cè)三級(jí)域名則由中國(guó)教育和科研計(jì)算機(jī)網(wǎng)網(wǎng)絡(luò)中心負(fù)責(zé)。在一級(jí)域edu之外的其他二級(jí)域名下申請(qǐng)注冊(cè)三級(jí)域名的,則應(yīng)向中國(guó)互聯(lián)網(wǎng)網(wǎng)絡(luò)信息中心CNNIC申請(qǐng)。關(guān)于我國(guó)的互連網(wǎng)絡(luò)發(fā)展情況以及各種規(guī)定,均可在CNNIC的網(wǎng)址上找到。 圖9-1是因特網(wǎng)名字空間的結(jié)構(gòu),它實(shí)際上是一個(gè)倒過(guò)來(lái)的樹,樹根在最上面而沒(méi)有名字。樹根下面—級(jí)的結(jié)點(diǎn)就是最高—級(jí)的頂級(jí)域結(jié)點(diǎn)。各頂級(jí)域結(jié)點(diǎn)下面的是二級(jí)域結(jié)點(diǎn)。最下面的葉結(jié)點(diǎn)就是單臺(tái)計(jì)算機(jī)。圖9-1列舉了一些域名作為例子。凡是在頂級(jí)域名com下注冊(cè)的單位都獲得了一個(gè)二級(jí)域名。例如圖中的例子有:中央電視臺(tái)以及IBM、惠普、摩托羅拉等公司。在頂級(jí)域名cn(中國(guó))下的二級(jí)域名的例子是:四個(gè)行政區(qū)域名香港、江蘇省、上海市、北京市以及我國(guó)規(guī)定的六個(gè)類別域名。這些二級(jí)地名由我國(guó)自行規(guī)定,凡在其中的某一個(gè)二級(jí)域名下注冊(cè)的單位就可以獲得一個(gè)三級(jí)域名,圖中給出的在edu下面的三級(jí)域名有:清華大學(xué)、北京大學(xué)、復(fù)旦大學(xué)、上海交通大學(xué)、東南大學(xué)等等。一旦某個(gè)單位擁有了一個(gè)域名,它就可以自己決定是否要進(jìn)一步劃分其下屬的子域,并且不必將這些子域的劃分情況報(bào)告上級(jí)機(jī)構(gòu)。圖中畫出了在頂級(jí)域名com下的中央電視臺(tái)自己劃分的三級(jí)域名mail。在清華大學(xué)下的四級(jí)域名的例子是:mail,csnetl,ep等。域名樹的樹葉就是單臺(tái)計(jì)算機(jī)的名字,它不能再繼續(xù)住下劃分子域了。
圖9-1 因特網(wǎng)的名字空間 應(yīng)當(dāng)注意,雖然中央電視臺(tái)和清華大學(xué)都各有一臺(tái)計(jì)算機(jī)取名為mail,但它們的域名并不一樣。因?yàn)榍罢呤莔ail.cctv.com,可后者是mail.。因此,即使世界上還有很多的計(jì)算機(jī)取名為mail,但是它們?cè)谝蛱鼐W(wǎng)的域名卻都必須是惟一的。 這里還要強(qiáng)調(diào)指出,因特網(wǎng)的名字空間是按照機(jī)構(gòu)的組織來(lái)劃分的,與物理的網(wǎng)絡(luò)無(wú)關(guān),與IP地址中的“子網(wǎng)”也沒(méi)有關(guān)系。 9.1.3 用域名服務(wù)器進(jìn)行域名轉(zhuǎn)換每一個(gè)域名服務(wù)器不但能夠進(jìn)行一些域名到IP地址的轉(zhuǎn)換(在TCP/IP的文檔中,這種地址轉(zhuǎn)換常稱為地址解析),而且還必須具有連向其他域名服務(wù)器的信息。當(dāng)自己不能進(jìn)行域名到IP地址的轉(zhuǎn)換時(shí),就能夠知道到什么地方去找別的域名服務(wù)器。 因特網(wǎng)上的域名服務(wù)器系統(tǒng)也是按照域名的層次來(lái)安排的。每—個(gè)域名服務(wù)器都只對(duì)域名體系中的一部分進(jìn)行管轄?,F(xiàn)在共有以下三種不同類型的域名服務(wù)器: (1)本地域名服務(wù)器(local name server):每一個(gè)因特網(wǎng)服務(wù)提供者ISP,或一個(gè)大學(xué),甚至一個(gè)大學(xué)里的系,都可以擁有—個(gè)本地域名服務(wù)器,它有時(shí)也稱為默認(rèn)域名服務(wù)器。當(dāng)—個(gè)主機(jī)發(fā)出DNS查詢報(bào)文時(shí),這個(gè)查詢報(bào)文就首先被送往該主機(jī)的本地域名服務(wù)器。當(dāng)PC機(jī)使用windows 9x時(shí),打開“控制面板”,選擇“網(wǎng)絡(luò)”,選樣“配置”中的“TCP/IP”,再選擇“屬性”,就可看見(jiàn)“DNS配置”一項(xiàng),其中的DNS服務(wù)器就是這里所說(shuō)的本地域名服務(wù)器。本地域名服務(wù)器離用戶較近,一般不超過(guò)幾個(gè)路由器的距離。當(dāng)所要查詢的主機(jī)也屬于同—個(gè)本地ISP時(shí),該本地域名服務(wù)器立即就能將所查詢的主機(jī)名轉(zhuǎn)換為它的IP地址,而不需要再去詢問(wèn)其他的域名服務(wù)器。 (2)根域名服務(wù)器(root name server):目前在因特網(wǎng)上有十幾個(gè)根域名服務(wù)器,大部分都在北美。當(dāng)一個(gè)本地域名服務(wù)器不能立即回答某個(gè)主機(jī)的查詢時(shí)(因?yàn)樗鼪](méi)有保存被查詢主機(jī)的信息),該本地域名服務(wù)器就以DNS客戶的身份向某一個(gè)根域名服務(wù)器查詢。若根域名服務(wù)器有被查詢主機(jī)的信息就發(fā)送DNS問(wèn)答報(bào)文給本地域名服務(wù)器,然后本地域名服務(wù)器再回答發(fā)起查詢的主機(jī)。但當(dāng)根域名服務(wù)器沒(méi)有被查詢主機(jī)的信息時(shí),它就一定知道某個(gè)保存有被查詢主機(jī)名字映射的授權(quán)域名服務(wù)器的IP地址(見(jiàn)下一段)。通常根域服務(wù)器用來(lái)管理頂級(jí)域(如.com)。硍域名服務(wù)器并不直接對(duì)頂級(jí)域下面所屬的所有的域名進(jìn)行轉(zhuǎn)換,但它一定能夠找到下面的所有—級(jí)域名的域名服務(wù)器。
圖9-2 域名管轄區(qū)的劃分舉例 (3)授權(quán)域名服務(wù)器(authoritative name server):每一個(gè)主機(jī)必須在授權(quán)域名服務(wù)器處注冊(cè)登記。通常,一個(gè)主機(jī)的授權(quán)域名服務(wù)器就是它的本地ISP的一個(gè)域名服務(wù)器。實(shí)際上,為了更加可靠地工作,一個(gè)主機(jī)最好有至少兩個(gè)授權(quán)域名服務(wù)器。許多域名服務(wù)器同時(shí)充當(dāng)本地域名服務(wù)器和授權(quán)域名服務(wù)器。授權(quán)域名服務(wù)器總是能夠?qū)⑵涔茌牭闹鳈C(jī)名轉(zhuǎn)換為該主機(jī)的IP地址。 因特網(wǎng)允許各個(gè)單位根據(jù)本單價(jià)的其體情況將本單位的域名劃分為若干個(gè)域名服務(wù)器管轄區(qū)(zone),而一般就在各管轄區(qū)中設(shè)置相應(yīng)的授權(quán)域名服務(wù)器,例如,圖9-2中的abc公司有下屬部門x和y,而部門x下面又分三個(gè)分部門u,v和w,而y下面還有其下屬的部門t。圖9-2是管轄區(qū)的劃分舉例。可以看出,管轄區(qū)是“域”的子集。 圖9-3表示查詢IP地址的過(guò)程。假定域名為m.xyz.com的主機(jī)想知道另一個(gè)域名為t.y.abc.com的主機(jī)的IP地址。于是向其本地域名服務(wù)器dns.xvz.com查詢。由于查詢不到,就向根域名服務(wù)器dns.com查詢。根據(jù)被查詢的域名中的“abc.com”再向授權(quán)域名服務(wù)器dns.abc.com發(fā)送查詢報(bào)文,最后再向授權(quán)域名服務(wù)器dns.y.abc.com查詢,以上的查詢過(guò)程見(jiàn)圖中的①一②一②一④的順序。得到結(jié)果后,按照?qǐng)D中的⑤一⑥一⑦一⑧的順序?qū)⒒卮饒?bào)文傳送給本地域名服務(wù)器dns.xyz.com??偣惨褂?個(gè)UDP報(bào)文。這種查詢方法叫做遞歸查詢。
為了減輕根域名服務(wù)器的負(fù)擔(dān),根域名服務(wù)器在收到圖9-3中的查詢②后,可以直接將下屬的授權(quán)域名服務(wù)器dns.abc.com的IP地址返回給本地域名服務(wù)器dns.xyx.com,然后讓本地域名服務(wù)器直接向授權(quán)域名服務(wù)器dns.abc.com進(jìn)行查詢。以后的過(guò)程如圖9-4所示。這就是遞歸與迭代相結(jié)合的查詢方法??梢钥闯觯瑢?duì)根域名服務(wù)器來(lái)說(shuō),負(fù)擔(dān)減輕了一半。 使用名字的高速緩存可優(yōu)化查詢的開銷。每個(gè)域名服務(wù)器都維護(hù)一個(gè)高速緩存,存放最近到過(guò)的名字映射信息以及從何處獲得此的記錄,當(dāng)客戶請(qǐng)求域名服務(wù)器轉(zhuǎn)換名字時(shí),域名服務(wù)器首先按標(biāo)準(zhǔn)過(guò)程檢查它是否被授權(quán)管理該名字,若未被授權(quán),則查看自己的高速緩存,檢查該名字是否最近被轉(zhuǎn)換過(guò)。域名服務(wù)器向客戶報(bào)告緩存中有關(guān)名字與地址的綁定(binding)信息,并標(biāo)志為非授權(quán)綁定,以及給出獲得此綁定的服務(wù)器S的域名。本地服務(wù)器同時(shí)也將服務(wù)器S與IP地址的綁定告知客戶。因此,客戶可很快收到回答,但有可能信息已是過(guò)時(shí)的了。如果強(qiáng)調(diào)高效,客戶對(duì)選擇接受非授權(quán)的回答信息并繼續(xù)進(jìn)行查詢。如果強(qiáng)調(diào)準(zhǔn)確性,客戶可與授權(quán)服務(wù)器聯(lián)系,并檢驗(yàn)名字與地址間的綁定是否仍有效。 由于名字到地址的綁定并不經(jīng)常改變,高速緩存可在域名系統(tǒng)中很好地運(yùn)作。為保持高速緩存中的內(nèi)容正確,域名服務(wù)器應(yīng)為每項(xiàng)內(nèi)容計(jì)時(shí)并處理超過(guò)合理時(shí)間的項(xiàng)(例如,每個(gè)項(xiàng)目只存放兩天)。當(dāng)域名服務(wù)器已從緩存中刪去某項(xiàng)后又被請(qǐng)求查詢?cè)擁?xiàng)信息,就必須重新到授權(quán)管理該項(xiàng)的服務(wù)器獲取綁定信息。當(dāng)授權(quán)服務(wù)器回答一個(gè)請(qǐng)求時(shí),在響應(yīng)中都 有指明綁定有效存在的時(shí)間值。增加此時(shí)間值可減少網(wǎng)絡(luò)開銷,而減少此時(shí)間值可提高域名轉(zhuǎn)換的準(zhǔn)確性。 不但在本地域名服務(wù)器中很需要高速緩存,在主機(jī)中也很需要。許多主機(jī)在啟動(dòng)時(shí)從本地域名服務(wù)器下載名字和地址的全部數(shù)據(jù)庫(kù),維護(hù)存放自己最近使用的域名的高速緩存,并且只是從緩存中找不到名字時(shí)才使用域名服務(wù)器。維護(hù)本地域名服務(wù)器數(shù)據(jù)庫(kù)的主機(jī)自然應(yīng)該定期地檢查域名服務(wù)器以獲取新的映射信息。由于域名改動(dòng)并不頻繁,大多數(shù)網(wǎng)點(diǎn)不需花太多精力就能維護(hù)數(shù)據(jù)庫(kù)的一致性。 在每個(gè)主機(jī)中保留一個(gè)本地域名服務(wù)器數(shù)據(jù)庫(kù)的副本,或使本地主機(jī)上的域名轉(zhuǎn)換特別快。這也意味著萬(wàn)一本地服務(wù)器出故障,本地網(wǎng)點(diǎn)也有—定的保護(hù)措施。此外,它減輕了域名服務(wù)器的計(jì)算負(fù)擔(dān),使得服務(wù)器可為更多機(jī)器提供名字。 9.2 文件傳送協(xié)議FTP9.2.1 概述文件傳送協(xié)議FTP(File Transfer Protocol)是因特網(wǎng)上使用得最廣泛的文件傳送協(xié)議。FTP提供交互式的訪問(wèn),允許客戶指明文件的類則與格式(如指明是否使用ACSII碼),并允外文件具有存取權(quán)限(如訪問(wèn)文件必須經(jīng)過(guò)授權(quán)和輸入有效口令)。FTP屏蔽了各計(jì)處機(jī)系統(tǒng)的細(xì)節(jié).因而適合于在異構(gòu)網(wǎng)絡(luò)中任意計(jì)算機(jī)之間傳送文件[RFC 959,1635]。 在因特網(wǎng)發(fā)展為早期階段,用FTP傳送文件約占整個(gè)因特網(wǎng)的通信量的三分之一,而由電子郵件和域名系統(tǒng)所產(chǎn)生的通信量還要小于FTP所產(chǎn)生的通信量。只是到了1995年,WWW的通信量才首次超過(guò)了FTP。 本節(jié)介紹基于TCP的FTP和基于UDP的TFTP,它們都是文件共享協(xié)議中的一大類,即復(fù)制整個(gè)文件,其特點(diǎn)是:若要存取一個(gè)文件,就必須先獲得本地的文件副本,若要修改文件,這只能對(duì)文件的副本進(jìn)行修改,然后再將修改后的文件副本傳回到原結(jié)點(diǎn)。 文件共享協(xié)議中的另一大類是聯(lián)機(jī)訪問(wèn)(on-line access)。聯(lián)機(jī)訪問(wèn)意味著允許多個(gè)程序同時(shí)對(duì)一個(gè)文件進(jìn)行存取。和數(shù)據(jù)庫(kù)系統(tǒng)不同之處是用戶不需要調(diào)用一個(gè)特殊的客戶進(jìn)程,而是由操作系統(tǒng)提供對(duì)遠(yuǎn)地共享文件進(jìn)行訪問(wèn)的服務(wù),就如同對(duì)本地文件的訪問(wèn)—樣。這就使得用戶可使用遠(yuǎn)地文件作為輸入和輸出來(lái)運(yùn)行任何應(yīng)用程序,而操作系統(tǒng)中的文件系統(tǒng)則提供對(duì)共享文化的透明存取。透明存取的優(yōu)點(diǎn)是:將原來(lái)用于處理本地文件的應(yīng)用程序用來(lái)處理遠(yuǎn)地文件時(shí),不需要對(duì)該應(yīng)用程序作明顯的改動(dòng)。屬于文件共享協(xié)議的有網(wǎng)絡(luò)文件系統(tǒng)NFS(Network File System),將在9.2.3節(jié)中進(jìn)行簡(jiǎn)單介紹。 9.2.2 FTP的主要工作原理網(wǎng)絡(luò)環(huán)境中的一項(xiàng)基本應(yīng)用就是將文件從一臺(tái)計(jì)算機(jī)中復(fù)制到另一臺(tái)可能相距很遠(yuǎn)的計(jì)算機(jī)中。初看起來(lái),在兩個(gè)主機(jī)之間傳送文件是很簡(jiǎn)單的事情,其實(shí)這往往是很困難的。因?yàn)楸姸嗟挠?jì)算機(jī)廠商研制出的文件系統(tǒng)多達(dá)數(shù)百種、且差別很大。經(jīng)常遇到下述一些問(wèn)題: (1)計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的格式不同; (2)文件的目錄結(jié)構(gòu)和文件命名的規(guī)定不同; (3)對(duì)于相同的文件存取功能,操作系統(tǒng)使用的命令不同; (4)訪問(wèn)控制方法不同。 文件傳送協(xié)議FTP只提供文件傳送的—些基本的服務(wù),它使用TCP可靠的運(yùn)輸服務(wù)。FTP的主要功能是減少或消除在不同操作系統(tǒng)下處理文件的不兼容性。 FTP使用客戶服務(wù)器方式。一個(gè)FTP服務(wù)器進(jìn)程可同時(shí)為多個(gè)客戶進(jìn)程提供服務(wù)。FTP的服務(wù)器進(jìn)程由兩大部分組成:一個(gè)主進(jìn)程,負(fù)責(zé)接受新的請(qǐng)求;另外有若干個(gè)從屬進(jìn)程,負(fù)責(zé)處理單個(gè)請(qǐng)求。 主進(jìn)程的工作步驟如下: (1)打開熟知端口(端口號(hào)為21),使客戶進(jìn)程能夠連接上。 (2)等待客戶進(jìn)程發(fā)出連接請(qǐng)求。 (3)啟動(dòng)從屬進(jìn)程來(lái)處理客戶進(jìn)程發(fā)來(lái)的請(qǐng)求。從屬進(jìn)程對(duì)客戶進(jìn)程的請(qǐng)求處理完華后即終止,但從屬進(jìn)程在運(yùn)行期間根據(jù)需要還可能創(chuàng)建其他一些子進(jìn)程。 (4)回到等待狀態(tài),繼續(xù)接受其他客戶進(jìn)程發(fā)來(lái)的請(qǐng)求。主進(jìn)程與從屬進(jìn)程的處理是并發(fā)地進(jìn)行的。 PTP的工作情況如圖9-5所示。圖中的客戶端和服務(wù)器端各有兩個(gè)運(yùn)行的從屬進(jìn)程:控制進(jìn)程和數(shù)據(jù)傳送進(jìn)程。為簡(jiǎn)單起見(jiàn),服務(wù)器中的主進(jìn)程沒(méi)有畫上。
圖9-5 FTP使用兩個(gè)連接
在進(jìn)行文件傳輸時(shí),F(xiàn)TP的客戶和服務(wù)器之間要建立兩個(gè)連接:“控制連接”和“數(shù)據(jù)連接”。圖中的控制進(jìn)程就是上述的“從屬進(jìn)程”。在創(chuàng)建該進(jìn)程時(shí),控制連接隨之創(chuàng)建并連接到控制進(jìn)程上??刂七B接在整個(gè)會(huì)話期間一直保持打開,F(xiàn)TP客戶所發(fā)出的傳送請(qǐng)求通過(guò)控制連接發(fā)送給控制進(jìn)程,但控制連接并不用來(lái)傳送文件,實(shí)際用于傳輸文件的是“數(shù)據(jù)連接”。控制進(jìn)程在接收到FTP客發(fā)送來(lái)的文件傳輸請(qǐng)求后就創(chuàng)建一個(gè)“數(shù)據(jù)傳送進(jìn)程”和一個(gè)“數(shù)據(jù)連接”,并將數(shù)據(jù)連接連接到“數(shù)據(jù)傳送進(jìn)程”,數(shù)據(jù)傳送進(jìn)程實(shí)際完成文件的傳送。在傳送完畢后關(guān)閉“數(shù)據(jù)傳送連接”并結(jié)束運(yùn)行。 在圖9-5中,控制連接的箭頭是從客戶指向服務(wù)器,表示客戶發(fā)起控制連接。但數(shù)據(jù)連接則按相反的方向形成,即服務(wù)器發(fā)起數(shù)據(jù)連接。這時(shí)FTP服務(wù)器作為客戶,而FTP客戶則作為服務(wù)器。
當(dāng)客戶進(jìn)程向服務(wù)器進(jìn)程發(fā)出建立連接請(qǐng)求時(shí),要尋找連接服務(wù)器進(jìn)程的熟知端口(21),同時(shí)還要告訴服務(wù)器進(jìn)程自己的另—個(gè)端口號(hào)碼,用于建立數(shù)據(jù)傳送連接。接著,服務(wù)器進(jìn)程用自己傳送數(shù)據(jù)的熟知端口(20)與客戶進(jìn)程所提供的端口號(hào)碼建立數(shù)據(jù)傳送連接。由于FTP使用了兩個(gè)不同的端口號(hào),所以數(shù)據(jù)連接與控制連接不會(huì)發(fā)生混亂。 使用兩個(gè)獨(dú)立的連接的主要好處是使協(xié)議更加簡(jiǎn)單和更容易實(shí)現(xiàn),同時(shí)在傳輸文件時(shí)還可以利用控制連接(例如,客戶發(fā)送請(qǐng)求終止傳輸)。
9.2.3 簡(jiǎn)單文件傳送協(xié)議TFTP和網(wǎng)絡(luò)文件系統(tǒng)NFSTCP/IP協(xié)議族種還有—個(gè)簡(jiǎn)單文件傳送協(xié)議TFTP(Trivial File Transfer Protocol),它是個(gè)很小且易于實(shí)現(xiàn)的文件傳送協(xié)議[RFCl350,783]。雖然TFTP也使用客戶服務(wù)器方式,但它使用UDP數(shù)據(jù)報(bào),因此TFTP要有自己的差錯(cuò)改正措施。TFTP只支持文件傳輸,而不支持交互,且沒(méi)有一個(gè)龐大的命令集。TFTP沒(méi)有列目錄的功能,也不能對(duì)用戶進(jìn)行身份鑒別。 TFTP的主要優(yōu)點(diǎn)有兩個(gè)。第一,TFTP可用于UDP環(huán)境。例如,當(dāng)需要將程序或文件同時(shí)向許多機(jī)器下載時(shí)就往往需要使用TFTPC第二,TFTP代碼所占的內(nèi)存較小。這對(duì)較小的計(jì)算機(jī)或某些特殊用途的設(shè)備是很重要的。這些設(shè)備不需要硬盤,只需要固化了TFTP、UDP和IP的小容量只讀存儲(chǔ)器即可。當(dāng)接通電源后,設(shè)備執(zhí)行只讀存儲(chǔ)器中的代碼,在網(wǎng)絡(luò)廣播一個(gè)TFTP請(qǐng)求。網(wǎng)絡(luò)上的TFTP服務(wù)器就發(fā)送響應(yīng),其中包括可執(zhí)行二進(jìn)制程序設(shè)備收到此文件后將其放入內(nèi)存,然后開始運(yùn)行程序。這種方式增加了靈活性,也減少了開銷。 TFTP的主要特點(diǎn)是: (1)每次傳送的數(shù)據(jù)PDU中有512字節(jié)的數(shù)據(jù),但最后一次可不足512字節(jié); (2)數(shù)據(jù)PDU也稱為文件塊(block),每個(gè)塊按序編號(hào),從1開始; (3)支持ASCII碼或二進(jìn)制傳送; (4)可對(duì)文件進(jìn)行讀或?qū)懀? (5)使用很簡(jiǎn)單的首部。 TFTP的工作很像停止等待協(xié)議,發(fā)送完—個(gè)文件塊后就等待對(duì)方的確認(rèn),確認(rèn)時(shí)應(yīng)指明所確認(rèn)的塊編號(hào)。發(fā)送數(shù)據(jù)后在規(guī)定時(shí)間內(nèi)收不到確認(rèn)就要重發(fā)數(shù)據(jù)PDU。發(fā)送確認(rèn)PDU的—方若在規(guī)定時(shí)間內(nèi)收不到下一個(gè)文件塊,也要重發(fā)確認(rèn)PDU。這樣就可保證文件的傳送不致因某—個(gè)數(shù)據(jù)報(bào)的丟失而告失敗。 TCP/IP協(xié)議族中的另一個(gè)文件傳送協(xié)議就是網(wǎng)絡(luò)文件系統(tǒng)NFS。NFS最初是在UNIX操作系統(tǒng)環(huán)境下實(shí)現(xiàn)文件和目錄的共享。NFS可使本地計(jì)算機(jī)共享遠(yuǎn)地的資源,就像這些資源在本地—樣。由于NFS原先是SUN公司在TCP/IP網(wǎng)絡(luò)上創(chuàng)建的,因此目前NFS主要應(yīng)用在TCP/IP網(wǎng)絡(luò)上。然而現(xiàn)在NFS也可在OS/2、MS windows、NetWare等操作系統(tǒng)上運(yùn)行。關(guān)于NFS的標(biāo)準(zhǔn)可參考[RFC l094]。 FTP并非對(duì)所有的數(shù)據(jù)傳輸都是最佳的。例如,計(jì)算機(jī)A上運(yùn)行的應(yīng)用程序要在遠(yuǎn)地計(jì)算機(jī)B的—個(gè)很大的文件末尾添加—行信息。若使用FTP,則應(yīng)先將此文件從計(jì)算機(jī)B傳送到計(jì)算機(jī)A。添加上這一行信息后,再用FTP將此文件傳送到計(jì)算機(jī)B。來(lái)回傳送這樣大的文件很費(fèi)時(shí)間。但這種傳送是不必要的,因?yàn)橛?jì)算機(jī)A并沒(méi)有使用該文件的內(nèi)容。 網(wǎng)絡(luò)文件系統(tǒng)NFS則采用另一種思路。NFS允許應(yīng)用進(jìn)程打開一個(gè)遠(yuǎn)地文件,并能在該文件的某一個(gè)特定的位置上開始讀寫數(shù)據(jù)。這樣,NFS可使用戶只復(fù)制—個(gè)大文件中的一個(gè)很小的片段,而不需要復(fù)制整個(gè)大文件。對(duì)于上述例子,計(jì)算機(jī)A中的NFS客戶軟件,將要添加的數(shù)據(jù)和在文件后面寫數(shù)據(jù)的請(qǐng)求一起發(fā)送到遠(yuǎn)地的計(jì)算機(jī)B中的NFS服務(wù)器。NFS服務(wù)器更新文件后返回應(yīng)答信息。在網(wǎng)絡(luò)上傳送的只是少量的修改數(shù)據(jù)。 實(shí)際上,在計(jì)算機(jī)B上的文件可以被多個(gè)客戶存取。NFS允許客戶對(duì)文件進(jìn)行加鎖。當(dāng)一個(gè)客戶完成修改后就對(duì)文件解鎖,從而使其他客戶能夠進(jìn)行存取。 NFS的界面與FTP的不同。從用戶的觀點(diǎn)看,NFS幾乎是不可見(jiàn)的,它被集成在操作系統(tǒng)的文件系統(tǒng)中,用普通的系統(tǒng)調(diào)用即可訪問(wèn)NFS文件。通過(guò)對(duì)NFS的配置,可使計(jì)算機(jī)的文件系統(tǒng)創(chuàng)建一個(gè)特殊的目錄與遠(yuǎn)地計(jì)算機(jī)相關(guān)聯(lián),所有在該目錄中的文件都被認(rèn)為是遠(yuǎn)程文件。每當(dāng)一個(gè)應(yīng)用程序請(qǐng)求—個(gè)文件操作時(shí),計(jì)算機(jī)的文件系統(tǒng)根據(jù)被操作文件所在目錄就知道應(yīng)將此請(qǐng)求傳遞給本地文件系統(tǒng)或NFS客戶軟件。若屬于后一種情況,則NFS客戶軟件就利用網(wǎng)絡(luò)對(duì)遠(yuǎn)地計(jì)算機(jī)文件系統(tǒng)進(jìn)行操作,因此,只要安裝和配置了NFS,計(jì)算機(jī)的文件系統(tǒng)就包含了相當(dāng)于遠(yuǎn)地文件系統(tǒng)的目錄。顯然,這種方案是相當(dāng)靈活的,因?yàn)閼?yīng)用程序所執(zhí)行標(biāo)準(zhǔn)的文件操作使得任何—個(gè)應(yīng)用程序都可使用遠(yuǎn)地文件。 9.3 遠(yuǎn)程登錄TELNET遠(yuǎn)程登錄TELNET是一個(gè)簡(jiǎn)單的遠(yuǎn)程終端協(xié)議,用戶用TELNET就可在其所在地通過(guò)TCP連接注冊(cè)(即登錄)到遠(yuǎn)地的另—個(gè)主機(jī)上(使用主機(jī)名或IP地址)。TELNET能將用戶的擊鍵傳到遠(yuǎn)地主機(jī),同時(shí)也能將遠(yuǎn)地主機(jī)的輸出通過(guò)TCP連接返回到用戶屏幕,這種服務(wù)是透明的,因?yàn)橛脩舾杏X(jué)到好像鍵盤和顯示器是直接連到遠(yuǎn)地主機(jī)上。 雖然TELNET并不復(fù)雜,但以前卻應(yīng)用得很廣。現(xiàn)在由于PC機(jī)的功能越來(lái)越強(qiáng),用戶就較少使用TELNET了。TELNET也使用客戶服務(wù)器方式,在本地系統(tǒng)運(yùn)行TELNET客戶進(jìn)程,而在遠(yuǎn)地主機(jī)則運(yùn)行TELNET服務(wù)器進(jìn)程。和FTP的情況相似,服務(wù)器中的主進(jìn)程等待新的請(qǐng)求,并產(chǎn)生從屬進(jìn)程來(lái)處理每一個(gè)連接。 TELNET能夠適應(yīng)許多計(jì)算機(jī)和操作系統(tǒng)的差異。例如,對(duì)于文本中一行的結(jié)束,有的系統(tǒng)使用ASCII碼的回車(CR),有的系統(tǒng)使用換行(LF),還有的系統(tǒng)使用兩個(gè)字符,回車一換行(CR-LF)。又如,許多系統(tǒng)在中斷—個(gè)程序時(shí)使用Control+C(^C),但也有系統(tǒng)使用ESCAPE鍵。為了適應(yīng)這種差異,TELNET定義了數(shù)據(jù)和命令應(yīng)怎樣通過(guò)因特網(wǎng)[RFC 854]。這些定義就是所謂的網(wǎng)絡(luò)虛擬終端NVT(Network Virtual Terminal)。圖9-6說(shuō)明了NVT的意義。客戶軟件將用戶的擊鍵和命令轉(zhuǎn)換成NVT格式并送交服務(wù)器。服務(wù)器軟件將收到的數(shù)據(jù)和命令,從NVT格式轉(zhuǎn)換成服務(wù)器端所需的格式。向用戶返回?cái)?shù)據(jù)時(shí),服務(wù)器將自己的格式轉(zhuǎn)換為NVT格式,本地客戶再?gòu)腘VT格式轉(zhuǎn)換到本地系統(tǒng)所需的格式。
圖9-6 TELNET 使用網(wǎng)絡(luò)虛擬終端 NVT 格式
NVT的格式定義很簡(jiǎn)單,所有的通信都使用8 bit的字節(jié)。在運(yùn)轉(zhuǎn)時(shí),NVT使用7位ASCII碼傳送數(shù)據(jù),而當(dāng)高位置1時(shí)用作控制命令。ASCII碼共有95個(gè)可打印字符(如:字母、數(shù)字、標(biāo)點(diǎn)符號(hào))和33個(gè)控制字符。所有可打印字符在NVT中的意義和在ASCIIH碼中一樣。但NVT只使用了ASCII碼的控制字符中的幾個(gè),如NUL,BEL,BS,HT,LE,VF,EF和CR等。此外,NVT還定義了兩字段的CR-LF為標(biāo)準(zhǔn)的行結(jié)束控制符。當(dāng)用戶鍵入ENTER或RETURN時(shí),TELNET的客戶就將其轉(zhuǎn)換為CR-LF再進(jìn)行傳輸,而TELNET服務(wù)器要將CR-LF轉(zhuǎn)換為遠(yuǎn)地機(jī)器的行結(jié)束字符。 雖然TELNET的NVT的功能非常簡(jiǎn)單,但TELNET定義了自己的一些控制命令。通過(guò)TELNET的選項(xiàng)協(xié)商(Option Negotiation),TELNLT客戶和TELNET服務(wù)器還可商定使用更多的終端功能。關(guān)于這此內(nèi)容這里就不再討論了。 9.4 電子郵件9.4.1 概述電子郵件(e-mail)是因特網(wǎng)上使用得最多的和最受用戶歡迎的一種應(yīng)用。電子郵件將郵件發(fā)送到ISP的郵件服務(wù)器,并放入其中的收信人郵箱(mail-box)中,收信人可隨時(shí)上網(wǎng)到ISP的郵件服務(wù)器進(jìn)行讀取。正因上述的性質(zhì)相當(dāng)于利用因特網(wǎng)為用戶設(shè)立了存放郵件的信箱,因此e-mail有時(shí)也稱為“電子信箱”。電子郵件不僅使用方便,而是還具有傳遞迅速和費(fèi)用低廉的優(yōu)點(diǎn)?,F(xiàn)在電子郵件不僅可傳送文字信息,而且還可附上聲音和圖像。 最初的電子郵件系統(tǒng)的功能很簡(jiǎn)單,郵件無(wú)標(biāo)準(zhǔn)的內(nèi)部結(jié)構(gòu)格式,計(jì)算機(jī)很難對(duì)郵件進(jìn)行處理;用戶接口也不好;用戶將郵件編輯完畢后必須退出郵件編輯程序,再調(diào)用文件傳送程序方能傳送已編輯好的郵件。但經(jīng)過(guò)人們的努力,在1982年就制定出ARPANET上的電子郵件標(biāo)椎:簡(jiǎn)單郵件傳送協(xié)議SMTP(Simple Mail Transfer Protocol)[RFC 82l]和因特網(wǎng)文本報(bào)文格式[RFC 822],它們己成為因特網(wǎng)的事實(shí)上的標(biāo)準(zhǔn)。兩年以后,CCITT制定了報(bào)文處理系統(tǒng)MHS的標(biāo)準(zhǔn),即X.400建議書。以后OSI又在此基礎(chǔ)上制定了一個(gè)面向報(bào)文的電文交換系統(tǒng)MOTIF(Message Oriented Text Interchange System)的標(biāo)準(zhǔn)。在1988年,CCIIT參照MOTIF修改了X.400G.X.400是一個(gè)功能很強(qiáng)的電子郵件標(biāo)準(zhǔn)。 由于因特網(wǎng)的SMTP只能傳送可打印的ASCII碼郵件,因此在1993年又制定了新的電于郵件標(biāo)準(zhǔn)[RFCl521,1522],即“通用因特網(wǎng)郵件擴(kuò)充”MIME(Multipurpose Internet Mail Extension),MIME在其郵件首部中說(shuō)明了郵件的數(shù)據(jù)類型(如文本、聲音、圖像、視像等)。MIME郵件可同時(shí)傳送多種類型的數(shù)據(jù)。這在多媒體通信環(huán)境下是非常有用的。 經(jīng)過(guò)10年的競(jìng)爭(zhēng),全世界都已廣泛地使用了因特網(wǎng)的電子郵件系統(tǒng),而X.400卻基本上銷聲匿跡了。X.400的失敗是由于過(guò)于復(fù)雜使其難于實(shí)現(xiàn),因此本書不再討論X.400。 一個(gè)電子郵件系統(tǒng)應(yīng)具有圖9-7所示的3個(gè)主要組成部件,這就是用戶代理、郵件服務(wù)器,以及電子郵件使用的協(xié)議,如SMTP和P0P3(或IMAP)等。在圖9-7中只畫出了POP3。 用戶代理UA(user Agent)就是用戶的電子郵件系統(tǒng)的接口,在大多數(shù)情況下它就是在用戶PC機(jī)中運(yùn)行的程序。用戶代理使用戶能夠通過(guò)一個(gè)很友好的接口(目前主要是用窗口界面)來(lái)發(fā)送和接收郵件?,F(xiàn)在可供大家選擇的用戶代理有很多種。例如,微軟公司的Outlook Express和我國(guó)張小龍制作的Fox mail,都是很受歡迎的電子郵件用戶代理。
圖9-7 電子郵件的最主要的組成構(gòu)件
用戶代理至少應(yīng)當(dāng)具有以下3個(gè)功能: 撰寫。給用戶提供很方便地編輯信件的環(huán)境。例如,應(yīng)讓用戶能創(chuàng)建便于使用的通訊錄(有常用的人名和地址,回信時(shí)不僅能很方便地從來(lái)信中提取出對(duì)方地址,并自動(dòng)地將此地址寫入到郵件中合適的位置,而且還能方便地對(duì)來(lái)信提出的問(wèn)題進(jìn)行答復(fù)(系統(tǒng)自動(dòng)將來(lái)信復(fù)制一份在用戶撰寫回信的窗口中,因而用戶不需要再輸入來(lái)信中的問(wèn)題)。 顯示。能方便地在計(jì)算機(jī)屏幕上顯示出來(lái)信(包括來(lái)信附上的聲音和圖像)。 處理。處理包括發(fā)送郵件和接收郵件。收信人應(yīng)能根據(jù)情況按不同方式對(duì)來(lái)信進(jìn)行處理。伊如,閱讀后刪除、存盤、打印、轉(zhuǎn)發(fā)等,以及自建目錄對(duì)來(lái)信進(jìn)行分類保存。有時(shí)還可在讀取信件之前先查看一下是郵件的發(fā)信人和長(zhǎng)度等,對(duì)于不愿收的信件可直接在郵箱中刪除。 郵件服務(wù)器是電子郵件系統(tǒng)的核心構(gòu)件,因持網(wǎng)上所有的ISP都 有郵件服務(wù)器。郵件服務(wù)器的功能是發(fā)送和接收郵件,同時(shí)還要向發(fā)信人報(bào)告郵件傳送的情況(已交付、被拒絕、丟失等)。郵件服務(wù)器按照客戶服務(wù)器方式工作。郵件服務(wù)器需要使用兩個(gè)不同的協(xié)議。一個(gè)協(xié)議用于發(fā)送郵件,即SMTP協(xié)議,而另一個(gè)協(xié)議用于接收郵件,即郵局協(xié)議POP(Post Office Protocol)。 當(dāng)郵件服務(wù)器向另一個(gè)郵件服務(wù)器發(fā)送郵件時(shí),這個(gè)郵件服務(wù)器就作為SMTP客戶。當(dāng)郵件服務(wù)器從另一個(gè)郵件服務(wù)器接收郵件時(shí),這個(gè)郵件服務(wù)器就作為SMTP服務(wù)器。 下面就是一封電子郵件的發(fā)送和接收過(guò)程(結(jié)合圖9-8來(lái)看)。 (1)發(fā)信人調(diào)用用戶代理來(lái)編輯要發(fā)送的郵件。用戶代理用SMTP將郵件傳送給發(fā)送端郵件服務(wù)器。 (2)發(fā)送端郵件服務(wù)器將郵件放入郵件緩存隊(duì)列中,等待發(fā)送。 (3)運(yùn)行在發(fā)送端郵件服務(wù)器的SMTP客戶進(jìn)程,發(fā)現(xiàn)在郵件緩存中有待發(fā)送的郵件,就向運(yùn)行在接收端郵件服務(wù)器的SMTP服務(wù)器進(jìn)程發(fā)起TCP連接的建立。 (4)當(dāng)TCP連接建立后,SMTP客戶進(jìn)程開始向遠(yuǎn)程的SMTP服務(wù)器進(jìn)程發(fā)送郵件。如果有多個(gè)郵件在郵件緩存中,則SMTP客戶一一將它們發(fā)送到遠(yuǎn)程的SMTP服務(wù)器。當(dāng)所有的待發(fā)送郵件發(fā)完了,SMTP就關(guān)閉所建立的TCP連接。 (5)運(yùn)行在接收端郵件服務(wù)器中的SMTP服務(wù)器進(jìn)程收到郵件后,將郵件放入收件人的用戶郵箱中,等待收信人在他方便時(shí)進(jìn)行讀取。 (6)收信人在打算收信時(shí),調(diào)用用戶代理,使用POP3(或IMAP)協(xié)議將自己的郵件從接收端郵件服務(wù)器的用戶郵件中取回(如果郵箱中有來(lái)信的話)。 細(xì)心的讀者可能會(huì)想到這樣的問(wèn)題,即:如果讓圖9-8中的郵件服務(wù)器程序就在發(fā)送方和接收方的PC機(jī)中運(yùn)行,那么是否就可以將兩個(gè)用戶端的用戶代理程序省略呢? 答案是“不行”。這是因?yàn)椴⒎撬械挠?jì)算機(jī)都能運(yùn)行郵件服務(wù)器程序,有些計(jì)算機(jī)可能沒(méi)有足夠的存儲(chǔ)器來(lái)運(yùn)行允許程序在后臺(tái)運(yùn)行的操作系統(tǒng),或是可能沒(méi)有足夠的CPU能力來(lái)運(yùn)行郵件服務(wù)器程序。更重要的是,郵件服務(wù)器程序必須不間斷地運(yùn)行,每天24小時(shí)都必須不間斷地連接在因特網(wǎng)上,否則就可能使很多外面發(fā)來(lái)的郵件丟失。這樣看來(lái),讓用戶的PC機(jī)運(yùn)行郵件服務(wù)器程序顯然是很不現(xiàn)實(shí)的(一般用戶在不使用PC機(jī)時(shí)將機(jī)器關(guān)閉)。讓來(lái)信暫時(shí)存儲(chǔ)在ISP的郵件服務(wù)器中,而當(dāng)用戶方便時(shí)就從郵件服務(wù)器的用戶信箱中讀取來(lái)信,這是一種比較合適的做法。 電子郵件由信封(envelope)和內(nèi)容(content)兩部分組成。電子郵件的傳輸程序根據(jù)郵件信封上的信息來(lái)傳送郵件。用戶在自己的郵箱中讀取郵件時(shí)才能見(jiàn)到郵件的內(nèi)容。 在郵件的信封上,最重要的就是收信人的地址。TCP/IP體系的電子郵件系統(tǒng)規(guī)定電子郵件地址(e-mail address)的格式如下 收信人郵箱名@郵箱所在主機(jī)的域名 (9-1) 在(9-1)式中,符號(hào)“@”讀作“at”,表示“在”的意思。收信人郵箱名又簡(jiǎn)稱為用戶名(user name),是收信人自己定義的字符串標(biāo)識(shí)符。但應(yīng)注意,標(biāo)識(shí)收信人郵箱名的字符串在郵箱所在計(jì)算機(jī)中必須是惟—的,電子郵件的用戶一般采用容易記憶的字符串,不宜使用難于記憶的字符串作為郵箱名,這只會(huì)給自己和別人增加麻煩。例如,本書編者的電子郵件地址為: Xiexr@publicl.ptt.js.cn 郵箱所在的主機(jī)的域名是publicl.ptt.js.cn,這就是中國(guó)的電信的ISP(用163撥號(hào))在南京市的主機(jī)域名,這個(gè)域名在整個(gè)因特網(wǎng)的范圍內(nèi)必須是惟一的。當(dāng)作者到這個(gè)ISP申請(qǐng)電子郵件賬號(hào)時(shí),必須保證xiexr這個(gè)用戶名在該ISP的范圍內(nèi)是惟一的,若已經(jīng)有其他的用戶選用了這個(gè)用戶名,那么后來(lái)的登記者就只能選用另一個(gè)用戶名。 由于一個(gè)主機(jī)的域名在因特網(wǎng)上是惟—的,而每一個(gè)郵箱名在該主機(jī)中也是惟—的,因此在因特網(wǎng)上的每一個(gè)人的電子郵件地址都是惟一的。這一點(diǎn)對(duì)保證電子郵件能夠在整個(gè)因特網(wǎng)范圍內(nèi)的準(zhǔn)確交付是十分重要的。 我們還應(yīng)注意到,在發(fā)送電了郵件時(shí),郵件服務(wù)器只使用電子郵件地址中的后一部分,即目的主機(jī)的域名。只有在郵件到達(dá)目的主機(jī)后,目的主機(jī)的郵件服務(wù)器才根據(jù)電子郵件地址中的前一部分(即收信人郵箱名),將郵件存放在收件人的郵箱中。 9.4.2 簡(jiǎn)單郵件傳送協(xié)議SMTP下面只介紹SMTP的—些主要特點(diǎn)。 使用SMTP時(shí),收信人可以是和發(fā)信人連接在同一個(gè)本地網(wǎng)絡(luò)上的用戶,也可以是因特網(wǎng)上其他網(wǎng)絡(luò)的用戶,或者是與因特網(wǎng)相連但不是TCP/IP網(wǎng)絡(luò)上的用戶。 SMTP沒(méi)有規(guī)定發(fā)信人應(yīng)如何將郵件提交給SMTP,以及SMTP應(yīng)如何將郵件投遞給收信人。至于郵件內(nèi)部的格式,郵件如何存儲(chǔ),以及郵件系統(tǒng)應(yīng)以多快的速度來(lái)發(fā)送郵件,SMTP也都未做出規(guī)定。SMTP所規(guī)定的就是在兩個(gè)相互通信的SMTP進(jìn)程之間應(yīng)如何交換信息、由于SMTP使用客戶服務(wù)器方式,因此負(fù)責(zé)發(fā)送郵件的SMTP進(jìn)程就是SMTP客戶,而負(fù)責(zé)接收郵件的SMTP進(jìn)程就是SMTP服務(wù)器。 SMTP規(guī)定了14條命令和21種響應(yīng)信息。每條命令用 4個(gè)字母組成,而每一種響應(yīng)信息一般只有—行信息,由一個(gè)3位數(shù)字的代碼開始,后面附上(也可不附上)很簡(jiǎn)單的文字說(shuō)明。下面通過(guò)在SMTP通信的3個(gè)階段介紹幾個(gè)最主要的命令和應(yīng)答信息。 1. 連接建立 發(fā)信人先將要發(fā)送的郵件送到郵件緩存。SMTP客戶每隔一定時(shí)間(例如30分鐘)對(duì)郵件緩存掃描一次。如發(fā)現(xiàn)有郵件,就使用SMTP的熟知端口號(hào)碼(25)與目的主機(jī)的SMTP服務(wù)器建立TCP連接。在連接建立后,SMTP服務(wù)器要發(fā)出“220 Service ready”。然用SMTP客戶向SMTP服務(wù)器發(fā)送HELO命令,附上發(fā)送方的主機(jī)名。SMTP服務(wù)器若有能力接收郵件,則回答:“250 OK”,表示已準(zhǔn)備好接收。若SMTP服務(wù)器不可用,則回答“421 Service not available”。 如在一定時(shí)間內(nèi)(例如,3天)發(fā)送不了郵件,則將郵件退還發(fā)信人。 這里要強(qiáng)調(diào)指出,上面所說(shuō)的連接并不是在發(fā)信人和收件人之間建立的。連接是在發(fā)送主機(jī)的SMTP客戶和接收主機(jī)的SMTP服務(wù)器之間建立的。發(fā)信人和收信人都可以在其主機(jī)上做自己的工作,而SMTP客戶和SMTP服務(wù)器都在后臺(tái)工作。 SMTP不使用中間的郵件服務(wù)器。不管發(fā)送端和接收端的郵件服務(wù)器相隔有多遠(yuǎn),不管在郵件的傳送過(guò)程中要經(jīng)過(guò)多少個(gè)路由器,TCP連接總是在發(fā)送端和接收端這兩個(gè)郵件服務(wù)器之間直接建立。當(dāng)接收端郵件服務(wù)器出故障而不能工作時(shí).發(fā)送端郵件服務(wù)器只能等待—段時(shí)間后再嘗試和該郵件服務(wù)器建立TCP連接,而不能先找一個(gè)中間的郵件服務(wù)器建立TCP連接。 郵件的傳送從MAIL命令開始。MAIL命令后面有發(fā)信人的地址:如:MAIL FROM:<xiexr@pulicl.ptt.js.cn>。若SMTP服務(wù)器已準(zhǔn)備好接收郵件,則回答“250 OK”,否則,返回一個(gè)代碼,指出原因:如:451(處理時(shí)出錯(cuò)),452(存儲(chǔ)空間不夠),500(命令無(wú)法識(shí)別)等。 下面跟著—個(gè)或多個(gè)RCPT命令,取決于相同—個(gè)郵件發(fā)送給—個(gè)或多個(gè)收信人,其格式為RCPT TO:<收信人地址>。每發(fā)送一個(gè)命令都應(yīng)當(dāng)有相應(yīng)的信息從SMTP服務(wù)器遲回,如:“250 OK”,表示指明的郵箱在接收端的系統(tǒng)中。或“550 No such user here”,即不存此郵箱。 RCPT命令的作用就是:先弄清接收端系統(tǒng)是否已經(jīng)做好了接收郵件的準(zhǔn)備,然后才發(fā)送郵件。這樣做是為了避免浪費(fèi)通信資源,不致發(fā)送了很長(zhǎng)的郵件以后才知道是因地址出錯(cuò)而白白浪費(fèi)了許多通信資源。 再下面就是DATA命令,表示要開始傳送郵件的內(nèi)容了。SMTP服務(wù)器返回的消息是:“354 Start mail input; end with <CRLF>.<CRLF>”。這里<CRLF>是“回車換行”的意思。若不能接收郵件,則返回421(服務(wù)器不可用)。500(命令無(wú)法識(shí)別)等。接著SMTP客戶就發(fā)送郵件的內(nèi)容。發(fā)送完畢后,再發(fā)送<CRLF>.<CRLF>(兩個(gè)回車換行中間用一個(gè)點(diǎn)隔開)表示郵件內(nèi)容結(jié)束。實(shí)際上在服務(wù)器端看到的可打印字符只是一個(gè)英文的句點(diǎn)。若郵件收到了,則 SMTP服務(wù)器返回信息“250 0K”,或返回差錯(cuò)代碼。 雖然SMTP使用了TCP連接試圖使郵件的傳送可靠,但它并不能保證不丟失郵件。沒(méi)有端到端的確認(rèn)返回到收信人處,差錯(cuò)指示也不保證能傳送到收信人處.然而基于SMTP的電子郵件通常都被認(rèn)為是可靠的。 3.連接釋放 郵件發(fā)送完畢后,SMTP客戶應(yīng)發(fā)送QUIT命令。SMTP服務(wù)器返回的信息是“221(服務(wù)關(guān)閉)”,表示SMTP同意釋放TCP連接。郵件傳送的全部過(guò)程即結(jié)束。 這里再?gòu)?qiáng)調(diào)一下,上述的SMTP客戶與服務(wù)器交互的過(guò)程都被電子郵件系統(tǒng)的用戶代理屏蔽了,使用電子郵件的用戶是看不見(jiàn)這些過(guò)程的。 9.4.3 電子郵件的信息格式—個(gè)電子郵件分為信封和內(nèi)容兩大部分。[RFC 822]只規(guī)定了郵件內(nèi)容中的首部,(head)格式,而對(duì)郵件的主體(body)部分則讓用戶自由撰寫,用戶寫好首部后,郵件系統(tǒng)自動(dòng)地將信封所需的信息提取出來(lái)并寫在信封上,而用戶不需要填寫電子郵件信封上的信息。 郵件內(nèi)容首部包括—些關(guān)鍵字,后面加上冒號(hào)。最重要的關(guān)鍵字是:To和Subject。 “To:”后面填入一個(gè)或多個(gè)收信人的電子郵件地址。在電子郵件軟件中,用戶將經(jīng)常通信的對(duì)象姓名和電子郵件地址寫到地址簿(address book)中。當(dāng)撰寫郵件時(shí),只需打開地址簿,點(diǎn)擊收信人名字,收信人的電子郵件地址就會(huì)自動(dòng)地填入到合適的位置上。 “Subject”是郵件的主題。它反映了郵件的主要內(nèi)容。主題便于用戶查找郵件。 郵件首都還有一項(xiàng)是抄送“Cc:”這兩個(gè)字符來(lái)自“Carbon copy”意思是留下一個(gè)“復(fù)寫副本”。這是借用舊的名詞,表示應(yīng)給某某人發(fā)送一個(gè)郵件副本。 有些郵件系統(tǒng)允許用戶使用關(guān)鍵字Bcc(Blind carbon copy)來(lái)實(shí)現(xiàn)盲復(fù)寫副本。這是使發(fā)信人能將郵件的副本送給某人,但不希望此事為收信人知道。Bcc又稱為暗送。 首部關(guān)鍵字還有“From”和“Date”,表示發(fā)送人的電子郵件地址和發(fā)信日期。這兩項(xiàng)—般都由郵件系統(tǒng)自動(dòng)填入。 另一個(gè)關(guān)鍵字是“Reply-To”即對(duì)方回信所用的地址。這個(gè)地址可以與發(fā)信人發(fā)信時(shí)所用的地址不同。這一項(xiàng)是事先設(shè)置好的,不需要在每次寫信時(shí)都進(jìn)行設(shè)置。 9.4.4 郵件讀取協(xié)議POP3和IMAP現(xiàn)在常用的郵件讀取協(xié)議有兩個(gè),即郵局協(xié)議第二個(gè)版本POP3和因特網(wǎng)報(bào)文存取協(xié)議IMAP(Internet Message Access Protocol)。現(xiàn)分別討論如下。 郵局協(xié)議POP是個(gè)非常簡(jiǎn)單、但功能也有限的郵件讀取協(xié)議。郵局協(xié)議POP最初公布于1984年[RFC 918]。經(jīng)過(guò)幾次的更新,現(xiàn)在使用的是它的第二個(gè)版本POP3[RFC1939]。POP3己成為因特網(wǎng)的標(biāo)準(zhǔn)。大多數(shù)的ISP都支持POPC POP也使用客戶服務(wù)器的工作方式。在接收郵件的用戶的PC機(jī)中必須運(yùn)行POP客戶程序,而在其ISP的郵件服務(wù)器中則運(yùn)行POP服務(wù)器程序,當(dāng)然,這個(gè)ISP的郵件服務(wù)器還必須運(yùn)行SMTP服務(wù)器程序,以便接收發(fā)送方郵件服務(wù)器的SMTP客戶程序發(fā)來(lái)的郵件。這些請(qǐng)參閱圖9-8。POP服務(wù)器只有在用戶輸入鑒別信息(用戶名和口令)后才允許對(duì)郵箱進(jìn)行讀取。應(yīng)當(dāng)注意的是,郵件服務(wù)器只能傳輸電子郵件,但POP服務(wù)器還能向用戶提供郵箱內(nèi)容的信息。 對(duì)依靠撥號(hào)連接的用戶來(lái)說(shuō),POP協(xié)議是使用得最普遍的。當(dāng)用戶撥號(hào)上網(wǎng)連接成功后,就可以運(yùn)行POP客戶程序,與ISP郵件服務(wù)器的POP服務(wù)器程序建立TCP連接(POP客戶和POP服務(wù)器之間要交互—些命令與響應(yīng),但對(duì)收信人來(lái)說(shuō)都是透明的),然且就可以接收電子郵件了。 下面介紹另一種郵件軟件因特網(wǎng)報(bào)文存取協(xié)議IMAPCIMAP和POP都按客戶服務(wù)器方式工作,但它們有很大的差別。現(xiàn)在較新的是版本4,即IMAP4[RFC 2060]。 對(duì)于POP,從網(wǎng)上收到的郵件是根據(jù)收信人的郵件地址交付給目的ISP郵件服務(wù)器,而收信人用PC機(jī)不定期地連接到這個(gè)郵件服務(wù)器以便將發(fā)送給他的郵件下載到其PC機(jī)上。此后,所有對(duì)郵件的處理都在用戶的PC機(jī)上進(jìn)行,因此POP服務(wù)器上一個(gè)具有存儲(chǔ)轉(zhuǎn)發(fā)功能的中間服務(wù)器。一旦郵件交付給用戶的PC機(jī),POP服務(wù)器就不再保存這些郵件(當(dāng)然用戶也可以通過(guò)事先的設(shè)置,使POP服務(wù)器在收信人讀取郵件后仍保留此郵件。但一般都不這樣做,因?yàn)檫@樣會(huì)很快地使用戶在郵件服務(wù)器的郵箱裝滿,因而無(wú)法再接收新的郵件)。用戶在取回郵件并中斷與POP服務(wù)器的連接后,可在自己的PC機(jī)上慢慢處理收到的郵件。因此POP實(shí)際上是一個(gè)脫機(jī)協(xié)議。 在使用IMAP時(shí),所有收到的郵件同樣是先送到ISP的郵件服務(wù)器的IMAP服務(wù)器。而在用戶的PC機(jī)上運(yùn)行IMAP客戶程序,然后與ISP的郵件服務(wù)器上的IMAP服務(wù)器程序建立TCP連接。用戶在自己的PC機(jī)上就可以操縱ISP的郵件服務(wù)器的郵箱,就像在本地操縱一樣,因此IMAP是個(gè)聯(lián)機(jī)協(xié)議。當(dāng)用戶PC機(jī)上的IMAP客戶程序打開IMAP服務(wù)器的郵箱時(shí),用戶就可看到郵件的首部。若用戶需要打開某個(gè)郵件,則該郵件才傳到用戶的計(jì)算機(jī)上。用戶可以根據(jù)需要為自己的郵箱創(chuàng)建便于分類管理的層次式的郵箱文件夾,并且能夠?qū)⒋娣诺泥]件從某一個(gè)文件夾中移動(dòng)到另一個(gè)文件夾中。用戶也可按某種條件對(duì)郵件進(jìn)行查找。在用戶未發(fā)出刪除郵件的命令之前,IMAP服務(wù)器郵箱中的郵件一直保存著。這樣就省去了用戶PC機(jī)硬盤上的大量石存儲(chǔ)空間。 IMAP最大的好處就是用戶可以在不同的地方使用不同的計(jì)算機(jī)(例如,使用辦公室的計(jì)算機(jī)、或家中的計(jì)算機(jī),或在外地使用筆計(jì)本電腦)隨時(shí)閱讀和處理自己的郵件(但每次必須上網(wǎng)才能閱讀郵件)。如果使用POP3,那么用戶出差時(shí)使用筆記本電腦就不可能再次閱讀曾經(jīng)在辦公室的臺(tái)式PC機(jī)上已經(jīng)讀取過(guò)的信件(除非你經(jīng)常使用復(fù)制技術(shù)使幾個(gè)地方的計(jì)算機(jī)都存放所有己經(jīng)讀取過(guò)的郵件,但這是很麻煩的事)。因?yàn)樵谑褂肞OP3的ISP的服務(wù)器上不保存已讀取過(guò)的信件。 IMAP還允許收信人只記取郵件中的某一個(gè)部分。例如,收到一個(gè)帶有視頻附件(此文件可能很大)的郵件,用戶使用的是無(wú)線上網(wǎng),信道的傳輸速率很低。為了節(jié)省時(shí)間,可以先下載郵件的正文部分,待以后有時(shí)間再讀取或下載這個(gè)很長(zhǎng)的附件。IMAP的缺點(diǎn)是如果用戶沒(méi)有將郵件復(fù)制到自己的PC機(jī)上,則郵件一直存放在IMAP服務(wù)器上。因此用戶需要經(jīng)常與IMAP服務(wù)器建立連接(因而許多用戶要考慮到所花費(fèi)的上網(wǎng)費(fèi)問(wèn)題)。 注意不要將郵件讀取協(xié)議POP和IMAP與郵件傳送協(xié)議SMTP弄混。發(fā)信人的用戶代理向源郵件服務(wù)器發(fā)送郵件。以及源郵件服務(wù)器向目的郵件服務(wù)器發(fā)送郵件,都是使用SMTP協(xié)議。而POP和IMAP則是用戶從目的郵件服務(wù)器上讀取郵件所使用的協(xié)議。9.4.5 通用因特網(wǎng)郵件擴(kuò)充MIME1.MIME概述 前面所述的電腦附件協(xié)議SMTP具有以下一些缺點(diǎn)。 (1)SMTP不能傳送可執(zhí)行文件或其他的二進(jìn)制對(duì)象。人們?cè)噲D將二進(jìn)制文件轉(zhuǎn)換為SMTP使用的ASCII文本,例如流行的UNIX Uuencode/Uudecode方案,但這些均未形成正式標(biāo)準(zhǔn)或事實(shí)上的標(biāo)準(zhǔn)。 (2)SMTP限于傳送7位的ASCII碼,許多其他非英語(yǔ)國(guó)家的文字(如中文、俄文、甚至帶重音符號(hào)的法文或德文都無(wú)法傳送,即使在SMTP網(wǎng)關(guān)將EBCDIC碼轉(zhuǎn)換為ASCII碼時(shí)也會(huì)遇到一些麻煩。 (3)SMTP服務(wù)器會(huì)拒絕超過(guò)一定長(zhǎng)度的郵件。 (4)某些SMTP的實(shí)現(xiàn)并沒(méi)有完全按照[RFC 821]的SMTP標(biāo)準(zhǔn),常見(jiàn)問(wèn)題如下: ·回車、換行的刪除和增加; ·超過(guò)76個(gè)字符時(shí)的處理,截?cái)嗷蜃詣?dòng)動(dòng)換行; ·后面多余空格的刪除; ·將制表符tab轉(zhuǎn)換為若干個(gè)空格。 MIME沒(méi)有改動(dòng)SMTP或取代它。MIME的意圖是繼續(xù)使用目前的[RFC 822]格式,但增加了郵件主體的結(jié)構(gòu),并定義了傳送非ASCII碼的編碼規(guī)則。MIME郵件可在現(xiàn)有的電子郵件程序和協(xié)議中傳送。MIME主要包括以下3部分內(nèi)存(RFCl52l,1522]: ·5個(gè)新的郵件首部字段,它們可包含在[RPC 822]首部中,這些字段提供了有關(guān)郵件主體的信息。 ·定義了許多郵件內(nèi)容的格式,對(duì)多媒體電子郵件的表示方法進(jìn)行了標(biāo)準(zhǔn)化。 ·定義了傳送編碼,可對(duì)任何內(nèi)容格式進(jìn)行轉(zhuǎn)換,而不會(huì)被郵件系統(tǒng)改變。 為適應(yīng)于任意數(shù)據(jù)類型和表示,每個(gè)MIME報(bào)文包含告知收件人數(shù)據(jù)類型和使用編碼的信息。MIME將增加的信息加入到[RFC 822]郵件首部中,下面是MIME增加的5個(gè)新的郵件首部名稱及其意義(有的可以是選項(xiàng))。 (1)MIME-Version:標(biāo)識(shí)MIME的版本?,F(xiàn)在的版本號(hào)是1.0.若無(wú)此行,則為英文文本。 (2)Content-Description:這是可讀字符串,說(shuō)明該郵件是什么,和郵件主題差不多。 (3)Content-Id:郵件的惟一標(biāo)識(shí)符。 (4)Content-Transfer-Encoding:在傳送時(shí)郵件的主體是如何編碼的。 (5)Content-Type:說(shuō)明郵件的性質(zhì)。 上述的前3頂?shù)囊馑己芮宄?,因此只?duì)上述的后兩項(xiàng)進(jìn)行介紹。 2.內(nèi)容傳送編碼 下面介紹幾種常用的內(nèi)容傳送編碼Content-Transfer-Encoding。 最簡(jiǎn)單的編碼使用7 bit或8 bit(即7位或8位ASCII碼),而每行不能超過(guò)1000個(gè)字符,例如漢字。這種編碼方式的要點(diǎn)就是對(duì)于可打印的ASCII碼,除等號(hào)“=”外,都不改變。等號(hào)“=”以及編碼超過(guò)127的ASCII碼的編碼方法是:先將每個(gè)字節(jié)的二進(jìn)制代碼用兩個(gè)十六進(jìn)制數(shù)字表示,然后在前面再加一個(gè)“=”,例如,漢字的“系統(tǒng)”的二進(jìn)制編碼是:10111111 101O0101 10111100 10100011,其十六進(jìn)制數(shù)字表示為:CFB5CDB3,用Quoted-printable編碼表示為: =CF=B5=CD=B3。而等號(hào)“=”的二進(jìn)制代碼為00111101,即十六進(jìn)制的3D,因此符號(hào)“=”的quoted-printable編碼為“=3D”。 對(duì)于任意的二進(jìn)制文件,可用base64編碼(有人稱為ASCII armor)。這種編碼方法是先將24 bit的代碼劃分為4個(gè)6 bit組。6 bit組的二進(jìn)制代碼共有64種不同的值,從0到63.用A表示0,用B表示1,等等。26個(gè)大寫字母排列完畢后,接下去再排26個(gè)小寫字母,再后面是10個(gè)數(shù)字,最后用“+”表示62,而用“/”表示63。再用兩個(gè)連在一起的等號(hào)“==”和一個(gè)等號(hào)“=”分別表示最后一組的代碼只有8或16比特,回車和換行都忽略,它們可在任何地方插入,作為basee64編碼的例子,假設(shè)有二進(jìn)制代碼,共24 bit:0100l00l0011000101111001。先劃分為4個(gè)6 bit組,即010010010011000101111001。對(duì)應(yīng)的base64編碼為:STE5 3.內(nèi)容類型 MIME標(biāo)準(zhǔn)則定Content-Type說(shuō)明必須含有兩個(gè)標(biāo)識(shí)符,即內(nèi)容類型(type)和子類型(subtype),中間用“/”分開。 標(biāo)準(zhǔn)定義了7個(gè)基本內(nèi)容類型和15種子類型。除了標(biāo)準(zhǔn)類型和子類型外,MIME允許發(fā)信人和收信人定義專用的內(nèi)容類型,但為避免可能出現(xiàn)名字沖突,標(biāo)準(zhǔn)要求為專用的內(nèi)容類型選擇的名字要以字符串“X-”開始。MIME的內(nèi)容類型中的 Multipart是很有用的,因?yàn)樗灌]件增加了相當(dāng)大的靈活性。標(biāo)準(zhǔn)為Multipart定義了四種可能的子類型,每個(gè)子類型都提供重要功能。 (1)mixed子類型允許單個(gè)報(bào)文含有多個(gè)相互獨(dú)立的子報(bào)文,每個(gè)子報(bào)文可有自己的類型和編碼。Mixed子類型報(bào)文使用戶能夠在單個(gè)報(bào)文中附上文本、圖形和聲音,或者用額外數(shù)據(jù)段發(fā)送一個(gè)備忘錄,類似商業(yè)信箋含有的附件。在mixed后面還要用到—個(gè)關(guān)鍵字,即Boundary=,此關(guān)鍵字定義了分隔報(bào)文各部分所用的字符串(由郵件系統(tǒng)定義),只要在郵件的內(nèi)容中不會(huì)出現(xiàn)這樣的字符串即可。當(dāng)某一行以兩個(gè)連字符“——”開始,后面緊跟上述的字符串,就表示下面開始了另一個(gè)子報(bào)文。 (2)alternative類型允許單個(gè)報(bào)文含有同一數(shù)據(jù)的多種表示。當(dāng)給多個(gè)使用不同硬件和軟件系統(tǒng)的收信人發(fā)送備忘錄時(shí),這種類型的Multipart報(bào)文很有用。例如,用戶可同時(shí)用普通的ASCII文本和格式化的形式發(fā)送文本,從而允許擁有圖形功能計(jì)算機(jī)的用戶在察看圖形時(shí)選擇格式化的形式。 (3)parallel子類型允許單個(gè)報(bào)文含有可同時(shí)顯示的各個(gè)子部分(如,圖像和聲音子部分必須—起播放)。 (4)digest子類型允許單個(gè)報(bào)文含有一組其他報(bào)文(如,從討論中收集電子郵件報(bào)文)。 下面顯示了一個(gè)MIME郵件,它包含有一個(gè)簡(jiǎn)單解釋的文本和含有非文本信息的照片。郵件中第—部分的注解說(shuō)明第二部分含有—張照片。 From:xiexr@publicl.ptt.js.cn To:xyz@public.bta.net.cn MIME-Version:1.0 Content-Type:Multipart/mixed; boundary=qwertyuiop ――qwertyuiop XYZ 你要的圖片在此郵件中,收到后請(qǐng)回答。 謝希仁 ――qwertyuiop Content-Type:Image/gif Content-Transfer-Encoding:base64 …Data for image(圖像的數(shù)據(jù))… ――qwertyuiop 上面的最后一行表示boundary的字符串后面的兩個(gè)連字符表示整個(gè)Multipart的結(jié)束。 9.5 萬(wàn)維網(wǎng)WWW9.5.1 概述萬(wàn)維網(wǎng)WWW(world Wide Web)并非某種特殊的計(jì)算機(jī)網(wǎng)絡(luò)。萬(wàn)維網(wǎng)是一個(gè)大規(guī)模的、聯(lián)機(jī)式的信息儲(chǔ)藏所,英文簡(jiǎn)稱為Web。萬(wàn)維網(wǎng)用鏈接的方法能非常方便地從因特網(wǎng)上的一個(gè)站點(diǎn)訪問(wèn)另一個(gè)站點(diǎn)(也就是所謂的“鏈接到另一個(gè)站點(diǎn)”),從而主動(dòng)地按需獲取豐富的信息。圖9-9說(shuō)明了萬(wàn)維網(wǎng)提供分布式服務(wù)的特點(diǎn)。圖9-9畫出了5個(gè)萬(wàn)維網(wǎng)上的站點(diǎn),它們可以相隔數(shù)千公里,但都必須連接在因特網(wǎng)上。每—個(gè)萬(wàn)維網(wǎng)站點(diǎn)都 存放了很多文檔。在這些文檔中可能會(huì)有一些地方的文字是用特殊方式顯示的(例如用不同的顏色,或添加了下劃線,在圖9-9中這些地方用黑色矩形表示),而當(dāng)我們將鼠標(biāo)移動(dòng)到這些地方時(shí),鼠標(biāo)的箭頭就變成了一只手的形狀,這就表明這些地方有一個(gè)鏈接(這種鏈接由于能夠連接到聲音和圖像文檔,有時(shí)也稱之為超鏈),如果我們?cè)谶@樣的地方點(diǎn)擊鼠標(biāo),就可以從這個(gè)文檔鏈接到另—個(gè)文檔(可能相隔很遠(yuǎn))。經(jīng)過(guò)一定的時(shí)延(幾秒鐘、幾分鐘甚至更長(zhǎng),取決于所鏈接的文檔的大小),在我們的屏幕上就能將遠(yuǎn)方傳送過(guò)來(lái)的文檔顯示出來(lái)。例如,站點(diǎn)A的某個(gè)文檔中有兩個(gè)地方可以鏈接到其破除迷信的站點(diǎn)。當(dāng)我們點(diǎn)擊該文檔中靠下面的一個(gè)鏈接時(shí),就可以鏈接到站點(diǎn)B的某個(gè)文檔,站點(diǎn)B的文檔也有兩個(gè)地方有鏈接。當(dāng)我們點(diǎn)擊靠上面的一個(gè)鏈接時(shí),就鏈接到站點(diǎn)D的一個(gè)文檔。當(dāng)我們點(diǎn)擊站點(diǎn)B的文檔的靠下面的一個(gè)鏈接時(shí),就鏈接到站點(diǎn)E,但E的文檔沒(méi)有可鏈接的地方。這就表示從該文檔已無(wú)法再繼續(xù)鏈接到其他的站點(diǎn)。
圖9-9 萬(wàn)維網(wǎng)提供分布式服務(wù)
正是由于萬(wàn)維網(wǎng)的出現(xiàn),使因特網(wǎng)從僅由少數(shù)計(jì)算機(jī)專家使用變?yōu)槠胀ò傩找材芾玫男畔①Y源。萬(wàn)維網(wǎng)的出現(xiàn)使網(wǎng)站數(shù)按指數(shù)規(guī)律增長(zhǎng)。據(jù)統(tǒng)計(jì),在1998年,萬(wàn)維網(wǎng)的通信量已超過(guò)整個(gè)因特網(wǎng)的通信量的75%。因此,萬(wàn)維網(wǎng)的出現(xiàn)是因特網(wǎng)發(fā)展中的一個(gè)非常重要的里程碑。 理解萬(wàn)維網(wǎng)最好的方法就是自己上因特網(wǎng)操作,本章不介紹萬(wàn)維網(wǎng)的具體操作步驟。而是著重討論萬(wàn)維網(wǎng)的基本概念和原理。 萬(wàn)維網(wǎng)出現(xiàn)于1989年3月。1993年2月,第一個(gè)圖形界面的瀏覽器(browser)開發(fā)成功,名字叫做Mosaic。1995年著名的Netscape Navigator瀏覽器上市。目前使用得最多的瀏覽器是微軟公司的Internet Explorer。 萬(wàn)維網(wǎng)是—個(gè)分布式的超媒體(hypermedia)系統(tǒng),它是超文本(hypertext)系統(tǒng)的擴(kuò)充。一個(gè)超文本由多個(gè)信息源鏈接成,而這些信息源的數(shù)目實(shí)際上是不受限制的。利用一個(gè)鏈接可使用戶找到世界上接在因特網(wǎng)上的任何一個(gè)超文本系統(tǒng),而這又可繼續(xù)鏈接下去。超文本是萬(wàn)維網(wǎng)的基礎(chǔ)。 超媒體與超文本的區(qū)別是文檔內(nèi)容不同,超文本文檔僅包含文本信息,而超媒體文檔則 包含其他表示方式的信息,如圖形、圖像、聲音、動(dòng)畫甚至活動(dòng)視頻圖像。 萬(wàn)維網(wǎng)將大量信息分布在整個(gè)因特網(wǎng)上。每臺(tái)計(jì)算機(jī)上的文檔都獨(dú)立進(jìn)行管理。對(duì)這些文檔的增加、修改、刪除或重新命名都不需要(實(shí)際上也不可能)通知其他結(jié)點(diǎn)。這樣,萬(wàn)維網(wǎng)文檔之間的鏈接就經(jīng)常會(huì)出現(xiàn)一些麻煩。例如,計(jì)算機(jī)A上的文檔X本來(lái)包含了一個(gè)指向計(jì)算機(jī)B的文檔Y的鏈接。若計(jì)算機(jī)B的管理員在某日刪除了Y(B并不需要為此發(fā)出通告),那么計(jì)算機(jī)A的上述鏈接顯然就失效了。 萬(wàn)維網(wǎng)以客戶服務(wù)器方式工作。上面所說(shuō)的瀏覽器就是在用戶計(jì)算機(jī)上的萬(wàn)維網(wǎng)客戶程序。萬(wàn)維網(wǎng)文檔所駐留的計(jì)算機(jī)則運(yùn)行服務(wù)器程序,因此這個(gè)計(jì)算機(jī)也稱為萬(wàn)維網(wǎng)服務(wù)器。客戶程序向服務(wù)器程序發(fā)出請(qǐng)求,服務(wù)器程序向客戶程序返回客戶所要的萬(wàn)維網(wǎng)文檔。在一個(gè)客戶程序主窗口上顯示出的萬(wàn)維網(wǎng)文檔稱為頁(yè)面(page)。 從以上所述可以看出,萬(wàn)維網(wǎng)必須解決以下幾個(gè)問(wèn)題: (1)怎樣標(biāo)識(shí)分布在整個(gè)因特網(wǎng)中的萬(wàn)維網(wǎng)文檔? (2)用什么樣的協(xié)議來(lái)實(shí)現(xiàn)萬(wàn)維網(wǎng)上各種鏈接的鏈接? (3)怎樣使不同作者創(chuàng)作不同風(fēng)格的萬(wàn)維網(wǎng)文檔都能在因特網(wǎng)上的各種計(jì)算機(jī)上顯示出來(lái),同時(shí)使用戶清楚地知道在什么地方存放著鏈接? (4)怎樣使用戶很方便地找到所需要的信息 為了解次第一個(gè)問(wèn)題,萬(wàn)維網(wǎng)使用統(tǒng)一資源定位符URL(Uniform Resource Locator)來(lái)標(biāo)識(shí)萬(wàn)維網(wǎng)上的各種文檔,并使每一個(gè)文檔在整個(gè)因特網(wǎng)的范圍內(nèi)具有惟一的標(biāo)識(shí)符URL。為了解決上述的第二個(gè)問(wèn)題。就要使萬(wàn)維網(wǎng)客戶程序與萬(wàn)維網(wǎng)服務(wù)器程序之間的交互遵守嚴(yán)格的協(xié)似,這就是超文本傳送協(xié)議HTTP(HyperText Transfer Protocol)。HTTP是一個(gè)應(yīng)用層協(xié)議,它使用TCP連接進(jìn)行可靠的傳送。為了解決上述的第三個(gè)問(wèn)題,萬(wàn)維網(wǎng)使用超文本標(biāo)記語(yǔ)言HTML(HyperText Markup Language),使得萬(wàn)維網(wǎng)頁(yè)面的設(shè)計(jì)者可以很方便的用一個(gè)鏈接從本頁(yè)面的某處鏈接到因特網(wǎng)上的任何一個(gè)萬(wàn)維網(wǎng)頁(yè)面,并且能夠在自己的計(jì)算機(jī)屏幕上將這些頁(yè)面顯示出來(lái)。最后,為了在萬(wàn)維網(wǎng)上方便地查找信息,用戶可使用各種的搜索工具。 下面我們將進(jìn)一步討論萬(wàn)維網(wǎng)的幾個(gè)重要概念,如URL、HTTP和HTML等。 9.5.2 統(tǒng)一資源定位符URL在[RFC 1738]和[RFC 1308]中,對(duì)URL是這樣定義的: “統(tǒng)一資源定位符URL是對(duì)能從因特網(wǎng)上得到的資源的位置和訪問(wèn)方法的一種簡(jiǎn)潔的表示。URL給資源的位置提供了一種抽象的識(shí)別方法,并用這種方法給資源定位。只要能夠?qū)Y源定位,系統(tǒng)就可對(duì)資源進(jìn)行各種操作,如存取、更新、替換和查找其屬性。” 上述的“資源”是指在因特網(wǎng)上可以被訪問(wèn)的任何對(duì)象。包括文件目錄、文件、文檔、圖像、聲音等,以及與因特網(wǎng)相連的任何形式的數(shù)據(jù)。“資源”還包括電子郵件的地址和USENET新聞組,或USENET新聞組中的報(bào)文。 URL相當(dāng)于一個(gè)文件名在網(wǎng)絡(luò)范圍的擴(kuò)展。因此URL是與因特網(wǎng)相連的機(jī)器上的任何可訪問(wèn)對(duì)象的一個(gè)指針。由于對(duì)不同對(duì)象的訪問(wèn)方式不同(如通過(guò)WWW,F(xiàn)TP等),所以URL還指出讀取某個(gè)對(duì)象時(shí)所使用訪問(wèn)方式。這樣,URL的一般形式如下(即由以冒號(hào)隔開的兩大部分組成,并且在URL中的字符對(duì)大寫或小寫沒(méi)有要求)。 <URL的訪問(wèn)方式>//<主機(jī)><端口>/<路徑> (9-2) 在式(9-2)冒號(hào)左邊的<URL的訪問(wèn)方式>中,最常用的有三種,即ftp(文件傳送協(xié)議FTP),http(超文本傳送協(xié)議HTTP)和news(USENET新聞)。 (9-2)式冒號(hào)的右邊部分,<主機(jī)>一項(xiàng)是必須的。而<端口>和<路徑>則有時(shí)可省略。 下面我們將簡(jiǎn)單介紹使用得較多的前兩種URL。 2 使用FTP的URL 對(duì)于使用FTP訪問(wèn)的站點(diǎn)的URL的最簡(jiǎn)單的形式是下面的例子: ftp://rtfm.mit.edu 這里rtfm.mit.edu就是在麻省理工學(xué)院MIT的匿名服務(wù)器rtfm的因特網(wǎng)域名。如果不使用域名而是把該服務(wù)器的點(diǎn)分十進(jìn)制的IP地址寫在兩個(gè)斜線后面出是可以的。假定我們要直接訪問(wèn)上面的服務(wù)器中在白錄pub下的個(gè)文件abc.txt,那么該文件的URL就是: ftp://refm.mit.edu/pub/abc.txt 而該目錄pub的URL是: ftp://rtfm.mit.edu/pub/ 某些FTP服務(wù)器要求用戶要提供用戶名和口令,那么這時(shí)就要在<host>項(xiàng)之前填入用戶名和口令。FPT的默認(rèn)端口號(hào)是21,一般可省略。但有時(shí)也可使用另外的端口號(hào)。 FTP已使用了超過(guò)20年。世界上已有很多FTP服務(wù)器使廣大用戶能利用它下載所需的各種文件。萬(wàn)維網(wǎng)的出現(xiàn)并沒(méi)有想取消FTP,而是要使FTP用起來(lái)更加方便(FTP的用戶界面不太友好,不易使用)。當(dāng)然,或許以后FTP也可能會(huì)消失,這是出為HTTP服務(wù)器可以做FTP所能做的一切工作。 3.使用FTP的URL 對(duì)于萬(wàn)維網(wǎng)的網(wǎng)點(diǎn)的訪問(wèn)要使用HTTP協(xié)議。HTTP的URL的一般形式是: http://<主機(jī)>:<端口>/<路徑> HTTP的默認(rèn)端口號(hào)是80,通??墒÷浴H粼偈÷晕募?lt;路徑>項(xiàng),則URL就指到因特網(wǎng)上的某個(gè)主頁(yè)(home page)。主頁(yè)的概念很重要,它可以是以下幾種情況之一?!獋€(gè)www或Gopher服務(wù)器的最高級(jí)別的頁(yè)面。某—個(gè)組織或部門的一個(gè)定制的頁(yè)面或目錄。從這樣的頁(yè)面可鏈接到因特網(wǎng)上的與本組織或部門有關(guān)的其他站點(diǎn)。 ·由某一個(gè)人自己設(shè)計(jì)的描述他本人情況的WWW頁(yè)面。 例如,要查清華大學(xué)的信息,就可先進(jìn)入到清華大學(xué)的主頁(yè),其URL為: http://www. 這里省略了默認(rèn)的端口號(hào)80。我們從清華大學(xué)的主頁(yè)入手,就可以通過(guò)許多不同的鏈接找到所要查找的各種有關(guān)清華大學(xué)的信息。 更復(fù)雜一些的路徑是指向?qū)哟谓Y(jié)構(gòu)的從屬頁(yè)面。例如: http://www.:100/netsalon 是清華大學(xué)的“網(wǎng)上學(xué)術(shù)沙龍”的頁(yè)面。注意,上面的URL在主機(jī)的后面使用了端口號(hào)100。一個(gè)HHP URL也可以是直接指向可從該www頁(yè)面得到的一個(gè)文件。例如: http://www./docs/kjc/gjsys.html 是清華大學(xué)的WWW主機(jī)中的目錄/docs/kjc/下的一個(gè)有關(guān)“國(guó)家實(shí)驗(yàn)室”的文件gsys.html。此文件的后綴為.html表示這是一個(gè)用超文本標(biāo)記語(yǔ)言HTML寫出的文件。 雖然URL里面的字母不分大小寫,但有的頁(yè)面為了讀者看起來(lái)方便,故意使用了一些大寫字母,實(shí)際上這對(duì)使用Windows的PC用戶是沒(méi)有關(guān)系的(但要注意,對(duì)于UNIX操作系統(tǒng)應(yīng)特別小心大寫和小寫)。 用戶使用URL并非僅僅能夠訪問(wèn)萬(wàn)維網(wǎng)的頁(yè)面,而且從還能夠通過(guò)URL使用其他的因特網(wǎng)應(yīng)用程序,如PTP、Gopher、TELNET、電子郵件以及新聞組等。更重要的是,用戶在使用這些應(yīng)用程序時(shí),只使用一個(gè)程序,即瀏覽器。這顯然是非常方便的。 為了使超文本的鏈接能夠高效率地完成,需要用FTP協(xié)議來(lái)傳送一切必須的信息。從層次的角度看,HTP是面向事務(wù)的(transaction-oriented)應(yīng)用層協(xié)議,它是萬(wàn)維網(wǎng)上能夠可靠地交換文件(包括文本、聲音、圖像等各種多媒體文件)的重要基礎(chǔ)。 每個(gè)萬(wàn)維網(wǎng)網(wǎng)點(diǎn)都有一服務(wù)器進(jìn)程,它不斷地監(jiān)聽TCP的端口80,以便發(fā)現(xiàn)是否有瀏覽器(即客戶進(jìn)程)向它發(fā)出連接建立請(qǐng)求。一旦監(jiān)聽到連接建立請(qǐng)求并建立了TCP連接之后,瀏覽器就向服務(wù)器發(fā)出瀏覽某個(gè)頁(yè)面的請(qǐng)求,服務(wù)器接著就返回所請(qǐng)求的頁(yè)面作為響應(yīng)。最后,TCP連接就被釋放了。在瀏覽器和服務(wù)器之間的請(qǐng)求和響應(yīng)的文互,必須按照規(guī)定的格式和遵循—定的規(guī)則。這些格式和規(guī)則就是超文本傳送協(xié)議HTTP。 HTTP規(guī)定在HTTP客戶與HTTP服務(wù)器之間的每次交互都由一個(gè)ASCII碼串構(gòu)成的請(qǐng)求和一個(gè)“類MIME(即[RFC 822]MME-like)”的響應(yīng)組成。雖然大家都使用TCP連接進(jìn)行傳送,但標(biāo)準(zhǔn)并沒(méi)有這樣明確規(guī)定。 用戶瀏覽頁(yè)面的方法有兩種。一種方法是在瀏覽器的Location中鍵入所要找的頁(yè)面的URL。另一種方法是在某一個(gè)頁(yè)面中用鼠標(biāo)點(diǎn)擊一個(gè)可選部分,這時(shí)瀏覽器自動(dòng)在因特網(wǎng)上找到所要鏈接的頁(yè)面。 假定圖9-11用戶用鼠標(biāo)點(diǎn)擊了屏幕上的一個(gè)可選部分。他使用的鏈接指向了另一個(gè)頁(yè)面,其URL是http://www./Protocol/HTTP-NG/Activity.html。下面具體地說(shuō)明在用戶點(diǎn)擊鼠標(biāo)后所發(fā)生的幾個(gè)事件。
圖9-11萬(wàn)維網(wǎng)的工作過(guò)程
(1)瀏覽器分析鏈接指向頁(yè)面的URL。 (2)瀏覽器向DNS請(qǐng)求解析www.的IP地址。 (3)DNS解析出服務(wù)器的IP地址為18.23.0.23。 (4)瀏覽器與服務(wù)器建方TCP連接(在18.23.0.23使用端口80)。 (5)瀏覽器發(fā)出取文件命令:GET/Protocol/HTTP-NG/Activity.html。 (6)www.服務(wù)器給出響應(yīng),將文件Activity.html發(fā)送給瀏覽器。 (7)TCP連接釋放。 (8)瀏覽器顯示文件Activity.tml中的所有文本。 許多瀏覽器在下載文件時(shí),往往只下載其中的文本部分。這樣可使下載的速度加快。文件中原來(lái)嵌入圖像或聲音的地方只用—個(gè)小圖標(biāo)來(lái)顯示。用戶若要下載這些圖像或聲音,可用鼠標(biāo)再分別點(diǎn)擊這些圖標(biāo)。每點(diǎn)擊一次鼠標(biāo),就重復(fù)執(zhí)行一次類似于上面的8個(gè)步驟。也就是先建水TCP連接,再使用TCP連接傳送命令和傳送文件,最后釋放TCP連接。雖然這許多少步驟看來(lái)繁瑣,但這樣做實(shí)現(xiàn)起來(lái)卻較為容易。 HTTP是一個(gè)面向事務(wù)的客戶服務(wù)器協(xié)議。雖然HTTP使用了TCP,但HTTP協(xié)議是無(wú)狀態(tài)的(stateless)。也就是說(shuō),每一個(gè)事務(wù)都是獨(dú)立地進(jìn)行處理。當(dāng)一個(gè)個(gè)事務(wù)開始時(shí),就在萬(wàn)維網(wǎng)客戶與萬(wàn)維服務(wù)器之間產(chǎn)生一個(gè)TCP連接,而當(dāng)事務(wù)結(jié)束時(shí)就釋放這個(gè)TCP連接。HTTP的無(wú)狀態(tài)特性很適合它的典型應(yīng)用。用戶在使用萬(wàn)維網(wǎng)時(shí),往往要讀取一系列的網(wǎng)頁(yè),而這些網(wǎng)頁(yè)又可能分布在許多相距很遠(yuǎn)的服務(wù)器上,將HTTP協(xié)議做成無(wú)狀態(tài)的,可使讀取網(wǎng)頁(yè)信息完成得較迅速。HTTP協(xié)議本身也是無(wú)連接的,雖然它使用了面向連接的TCP向上提供的服務(wù)。 在許多情況下,用戶的PC機(jī)并不是一直連接在因特網(wǎng)上,而是通過(guò)撥號(hào)方式經(jīng)過(guò)因特網(wǎng)服務(wù)提供者ISP再連接到因特網(wǎng)上的。在這種情況下,用戶先要使用PPP協(xié)議與ISP接通,待ISP分配給用戶一個(gè)臨時(shí)的IP地址后,用戶才能使用WWW瀏覽器。 從HTTP來(lái)看,上述的萬(wàn)維網(wǎng)瀏覽器就是一個(gè)HTTP客戶,而萬(wàn)維網(wǎng)服務(wù)器等待HTTP請(qǐng)求的進(jìn)程常稱為HTTP daemon,有的文獻(xiàn)將它縮寫為HTTPD。HTTP daemon在收到HTTP客戶的請(qǐng)求后,經(jīng)過(guò)—些必要的處理,將所需的文件返回給HTTP客戶。 HTTP仍在不斷地發(fā)展。現(xiàn)在較新的版本是1999年公布的HTTP/1.1[RFC 2616],它已成為因特網(wǎng)標(biāo)準(zhǔn),其文本長(zhǎng)達(dá)176頁(yè)。而新的下一代HTTP(HTTP-NG)則正在研究之中。 HTTP規(guī)范所定義的最簡(jiǎn)單的操作就是在用戶代理(user agent)與起點(diǎn)服務(wù)器(origin server)直接連立了一個(gè)TCP連接。用戶代理就是在一個(gè)端用戶的計(jì)算機(jī)上運(yùn)行的萬(wàn)維網(wǎng)瀏覽器程序。起點(diǎn)服務(wù)器就是用戶想獲取的資源所駐留的服務(wù)器??蛻粝劝l(fā)起TCP連接。在和服務(wù)器建了TCP連接后就發(fā)送HTTP請(qǐng)求。這個(gè)請(qǐng)求包括一個(gè)特定的命令(指出使用什么方法)、一個(gè)URL和一個(gè)“類MIME”報(bào)文,它包括一些請(qǐng)求參數(shù)、客戶的信息,或一些附加的內(nèi)容信息。 當(dāng)服務(wù)器收到請(qǐng)求后.就試圖完成所請(qǐng)求的動(dòng)作,接著就返回HTTP響應(yīng)。響應(yīng)包括狀態(tài)信息、成功或出錯(cuò)信息,一個(gè)類MIME報(bào)文,它包括有關(guān)服務(wù)器的信息、有關(guān)響應(yīng)自身的信息,或其他的一些信息。接著就釋放TCP連接。 用戶代理與起點(diǎn)服務(wù)器之間也可以有多段TCP連接,這些連接經(jīng)過(guò)一個(gè)或多個(gè)中間系統(tǒng)。每一個(gè)中間系統(tǒng)起著中繼的作用:將請(qǐng)求傳送到服務(wù)器,再將響應(yīng)傳送到客戶。 2. 萬(wàn)維網(wǎng)高速緩存 萬(wàn)維網(wǎng)高速緩存(Web cache)是一種網(wǎng)絡(luò)實(shí)體,它能代表瀏覽器發(fā)出HTTP請(qǐng)求,因此萬(wàn)維網(wǎng)高速緩存又稱為代理服務(wù)器(proxy server)。萬(wàn)維網(wǎng)高速緩存將最近的一些請(qǐng)求和響應(yīng)暫存在本地磁盤中。當(dāng)與暫存的請(qǐng)求一樣的新請(qǐng)求到達(dá)時(shí),萬(wàn)維網(wǎng)高速緩存就將暫存的響應(yīng)發(fā)送出去,而不需要按URL的地址再去訪問(wèn)該資源。萬(wàn)維網(wǎng)高速緩行可在客戶或服務(wù)器端工作,也可在中間系統(tǒng)上工作。下面我們用例子說(shuō)明它的作用。 設(shè)圖9-11中的校園網(wǎng)有許多人用PC機(jī)的瀏覽器訪問(wèn)因特網(wǎng)上很多的服務(wù)器。校園網(wǎng)的路由器R1用2 M bit/s專線連接到因特網(wǎng)上的路由器R2。先假定不使用萬(wàn)維網(wǎng)的高速緩存,現(xiàn)在估算一下訪問(wèn)因特網(wǎng)上的服務(wù)器的時(shí)延。 若校園網(wǎng)使用10 M bit/s以太網(wǎng),平均每秒產(chǎn)生20個(gè)請(qǐng)求,每個(gè)請(qǐng)求得到的返回信息平均為100 Kbit,則校園網(wǎng)以太網(wǎng)上的通信強(qiáng)度為0.2,因而以太網(wǎng)上的時(shí)延很小,一般僅幾十毫秒。在因特網(wǎng)內(nèi),從路由器R2轉(zhuǎn)發(fā)HTTP請(qǐng)求報(bào)文到含有響應(yīng)信息的數(shù)據(jù)報(bào)傳送到R2所需的時(shí)間,在正常情況下為2秒左右(這就是所謂的“因特網(wǎng)網(wǎng)時(shí)延”)。再觀察一下兩個(gè)路由器之間的鏈路上的時(shí)延。簡(jiǎn)單的計(jì)算可得出在2 M bit/s鏈路上的通信量強(qiáng)度為1。這表明在這樣的鏈路上的時(shí)延已增長(zhǎng)到非常大的數(shù)值,例如長(zhǎng)達(dá)幾分鐘以上,用戶顯然無(wú)法忍受這樣大的時(shí)延。 將兩個(gè)路由器之間的專線增大到10 M bit/s就能解決這一瓶頸問(wèn)題,但這些增加數(shù)倍租用線路的費(fèi)用,因此最好采用其他更加經(jīng)濟(jì)的方法,即在校園網(wǎng)增加一個(gè)萬(wàn)維網(wǎng)高速緩存(這不算太貴)。這時(shí),校園網(wǎng)內(nèi)種瀏覽器訪問(wèn)因特網(wǎng)上的服務(wù)器的過(guò)程如下所述。 (1)瀏覽器訪問(wèn)因特網(wǎng)的服務(wù)器時(shí),要先與校園網(wǎng)的高速緩存建立TCP連接,并向高速緩存發(fā)出HTTP請(qǐng)求報(bào)文,如圖9-11所示的。 (2)高速緩存若已經(jīng)存放了所請(qǐng)求的對(duì)象,則將此對(duì)象放入HTTP響應(yīng)報(bào)文中返回給瀏覽器。 (3)否則,高速緩存就代表發(fā)出請(qǐng)求的瀏覽器,與因特網(wǎng)上的起點(diǎn)服務(wù)器建立TCP連接,如圖9-11所示的②.并發(fā)送HTTP請(qǐng)求報(bào)文。 (4)起點(diǎn)服務(wù)器將所請(qǐng)求的對(duì)象放任HTTP響應(yīng)報(bào)文中返回給校園網(wǎng)的高速緩存。 (5)高速緩存收到此對(duì)象后,先復(fù)制在其本地存儲(chǔ)器中,然后再將所請(qǐng)求的對(duì)象放在HTTP響應(yīng)報(bào)文中,通過(guò)已建立的TCP連接,如圖9-11所示的①,返回給瀏覽器。 我們注意到高速緩存有時(shí)是作為服務(wù)器(當(dāng)接受瀏覽器的HTTP請(qǐng)求時(shí)),但有時(shí)卻作為客戶(當(dāng)向因特網(wǎng)上的起點(diǎn)服務(wù)器發(fā)送HTTP請(qǐng)求時(shí))。 假定高速緩存的命中率①為0.4,那就表明有40%的HTTP請(qǐng)求可以由高速緩存來(lái)響應(yīng)(通過(guò)10 M bit/s局域網(wǎng)),而60%的HTTP請(qǐng)求仍需經(jīng)過(guò)2 Mbit/s的鏈路連接到因特網(wǎng)。這樣,2 M bit/s鏈路的通信量強(qiáng)度就從1下降到0.6(一般通信量強(qiáng)度小于0.8就可接受),因而在此鏈路上的時(shí)延就大大降低,例如,只有幾十毫秒??梢钥闯?,在使用高速緩存的情況下,2 M bit/s鏈路已不再成為訪問(wèn)因特網(wǎng)服務(wù)器的瓶頸。這時(shí)的平均訪問(wèn)時(shí)延是0.4×(幾十毫秒)+0. 6×(2秒+幾十毫秒),已經(jīng)小于因特網(wǎng)時(shí)延(2秒)了。 3.HTTP的報(bào)文結(jié)構(gòu) HITP有兩類報(bào)文:從客戶到服務(wù)器的請(qǐng)求報(bào)文和從服務(wù)器到客戶的響應(yīng)報(bào)文。典型的HTTP請(qǐng)求報(bào)文如下: GET /dirABC/docu1.html HTTP/1.1 {這是請(qǐng)求行} Connection: close {此行和以下行都是首行} User-agent: Mozilla/4.0 Accept: text/html, image/gif, image/jpeg Accept-language: en {此處有一空行} 在請(qǐng)求行中的第一個(gè)字段是“方法”(method)。“方法”是面向?qū)ο蠹夹g(shù)中使用的專門名詞,也就是對(duì)所請(qǐng)求的對(duì)象進(jìn)行的操作,因此這些方法實(shí)際上就是—些命令。此處填入的方法是GET,它是關(guān)鍵字,必須用大寫。GET表示請(qǐng)求讀取一個(gè)萬(wàn)維網(wǎng)的頁(yè)面,這是最常用的一個(gè)方法。其他常用的方法還有HEAD(請(qǐng)求讀取的不是整個(gè)頁(yè)面而只是其首部)和POTT(請(qǐng)求接受所附加的實(shí)體,如將一個(gè)記錄附加到一個(gè)數(shù)據(jù)庫(kù)中)。請(qǐng)求行的第二個(gè)字段是所要鏈接到的對(duì)象的URL。由于在建立TCP連接時(shí)已經(jīng)有了主機(jī)名,因此這里只寫上主機(jī)中的文件名(包括路徑)。第三個(gè)字段說(shuō)明是HTTP的1.1版本。 以下就是首都行。“Connection: close”表示瀏覽器希望服務(wù)器在傳送完所請(qǐng)求的對(duì)象后即并閉TCP連接(還有一種可選擇的情況是暫不關(guān)閉TCP連接,繼續(xù)讀取其他對(duì)象)。下一行是說(shuō)明瀏覽器的類型。“Mozilla/4.0”是Netscape瀏覽器4.0版。再下面兩行是瀏覽器告訴服務(wù)器它準(zhǔn)備接收什么和使用的語(yǔ)言是英文(en)。使用GET時(shí),首部行后面沒(méi)有最后的實(shí)體主體。 當(dāng)用戶在網(wǎng)上填寫表單(form)時(shí),要用到POST方法。這時(shí),用戶鍵入的信息就要填寫在最后的實(shí)體主體中,和前面的請(qǐng)求行、首部行一起發(fā)送給HTTP服務(wù)器。 典型的HTTP響應(yīng)報(bào)文如下: HTTP/1.1 200 OK {這中狀態(tài)行} Connection: close {此行開始的6行是首部行} Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (UNIX) Last-Modified: Mon, 22 Jun 1998 09:23:24 GMT Connect-Length: 8765 {文件長(zhǎng)度的字節(jié)數(shù)} Connect-Type: text/html {此處有一空行} DATA DATA DATA DATA DATA…… ?。麖倪@里開始是所請(qǐng)求的文件} 狀態(tài)行中的200是狀態(tài)碼,0K是短語(yǔ),表示一切正常。 狀態(tài)碼共有41種,常用的有下述幾種。 30l(Moved Permanently,網(wǎng)站已轉(zhuǎn)移,新的URL指明在響應(yīng)報(bào)文首部Location的后面)。 400(Bad Request,服務(wù)器無(wú)法理解請(qǐng)求報(bào)文)。 404(Not Found,服務(wù)器上沒(méi)有所請(qǐng)求的對(duì)象)。 505(HTTP Version Not Supported。服務(wù)器不支持請(qǐng)求的HTTP的協(xié)議版本)。 首部中個(gè)的“Connection: close”表示服務(wù)器在傳送完所請(qǐng)求的對(duì)象后即關(guān)閉TCP連接。“Date:”是服務(wù)器返回所請(qǐng)求的對(duì)象的日期和格林尼治時(shí)間。其余的都很清楚,不需要再進(jìn)行解釋。9.5.3 超文本標(biāo)記語(yǔ)言HTML萬(wàn)維網(wǎng)要使因特網(wǎng)上任何一臺(tái)計(jì)算機(jī)都能顯示出任何一個(gè)萬(wàn)維網(wǎng)服務(wù)器上的頁(yè)面、就必須解決頁(yè)面制作的標(biāo)準(zhǔn)化問(wèn)題。超文本標(biāo)記語(yǔ)言HTML就是一種制作萬(wàn)維網(wǎng)頁(yè)面的標(biāo)淮語(yǔ)言,它消除了不同計(jì)算機(jī)之間信息交流的障礙。 超文本標(biāo)記語(yǔ)言HTML(HyperText Markup language)中的Markup的意思就是“設(shè)置標(biāo)記”。因此HTML也常譯為起文本置標(biāo)語(yǔ)言。這就像在出版行業(yè),編輯經(jīng)常要在文檔上寫上各種標(biāo)準(zhǔn)化的記號(hào),指明在何處應(yīng)使用何種字體等等。因此也有人將HTML譯為超文本排版語(yǔ)言。 IS0早在1986年就已制定了—個(gè)標(biāo)準(zhǔn)IS0 8879,即SGML(Standard Generalized Markup Language)。這是一個(gè)描述標(biāo)記語(yǔ)言的標(biāo)準(zhǔn)。但SGML過(guò)分復(fù)雜使它很不適合于簡(jiǎn)單快捷的web出版。這就導(dǎo)致HTML問(wèn)世。HIML是—種特定的SGML文檔類型。由于HTML非常易于掌握且實(shí)施簡(jiǎn)單,因此它很快就成為萬(wàn)維網(wǎng)的重要基礎(chǔ)[RFC 1866]。官方的HTML標(biāo)準(zhǔn)由W3C(即WWW Consortium)負(fù)責(zé)制定.現(xiàn)在最新的版本是HTML4.0。更新的版本正在研究之中。 HTML定義了許多用于排版的命令,即“標(biāo)簽”(tag)。例如,<I>表示后面開始用斜體字排版,而</I>則表示斜體字排版到此結(jié)束。HTML就將各種標(biāo)簽嵌入到萬(wàn)維網(wǎng)的頁(yè)面中。這樣就構(gòu)成了所謂的HTML文檔。HTML文檔是一種可以用任何文本編輯器(例如,Windows的記事本Notepad)創(chuàng)建的ASCIIH碼文件,但應(yīng)注意,僅當(dāng)HTML文檔是以.html或htm為后綴時(shí),瀏覽器才對(duì)這樣的HTML文檔的各種標(biāo)簽進(jìn)行解釋。如果HTML文檔改換以.txt為其后綴,則HTML解釋程序就不對(duì)標(biāo)簽進(jìn)行解釋,而瀏覽器只能看見(jiàn)原來(lái)的文本文件。 當(dāng)瀏覽器從服務(wù)器讀取某個(gè)頁(yè)面的HTML文檔后,就按照HTML文檔中的各種標(biāo)簽,根據(jù)瀏覽器所使用的顯示器的尺寸和分辨率大小、重新進(jìn)行排版并恢復(fù)出所讀取的頁(yè)面?,F(xiàn)有的些字處理軟件都不具有像HTML這樣的功能。 目前已開發(fā)出了很好的制作萬(wàn)維網(wǎng)頁(yè)面的軟件工具,使我們能夠像使用Word字處理器那樣地很方便地制作各種頁(yè)面。然而學(xué)習(xí)一些HTML的基本概念仍是必要的。這是因?yàn)樵趯?duì)已有的萬(wàn)維網(wǎng)頁(yè)面進(jìn)行修改時(shí),往往要查看其源代碼,即需查看其HIML文檔。真接在HTML文檔上對(duì)頁(yè)面進(jìn)行修改,有時(shí)是很必要的。 建議每一個(gè)讀者使用一下瀏覽器上的編輯器來(lái)編寫—個(gè)很簡(jiǎn)單的頁(yè)面。然后仔細(xì)觀察瀏覽器顯示的頁(yè)面和相應(yīng)的HTML文檔的關(guān)系,同時(shí)也和編輯器上顯示的內(nèi)容進(jìn)行對(duì)比。這樣做可能是學(xué)習(xí)HTML最好的方法。 2.HTML的格式與標(biāo)簽 元素(element)是HTML文檔結(jié)構(gòu)的基本組成部分。一個(gè)HTML文檔本身就是—個(gè)元素。每個(gè)HTML文檔由兩個(gè)主要元素組成:首部(head)和主體(body),主體緊接在首都的后面。首都包含文檔的標(biāo)題(title),以及系統(tǒng)用來(lái)標(biāo)識(shí)文檔的一些其他信息。標(biāo)題相當(dāng)于文件名。用戶可使用標(biāo)題來(lái)搜索頁(yè)面和管理文檔。文檔的主體是HTML文檔的最主要的部分。文檔所包含的主要信息都在主體中。當(dāng)瀏覽器工作時(shí),在瀏覽器的最上面的標(biāo)題欄顯示出文檔的標(biāo)題,而在瀏覽器最大的主窗口顯示的就是文檔的主體。 主體部分常由若干更小的元素組成,如段落(paragraph)、表格(table)利列表(list)等。 HIML用一對(duì)標(biāo)簽(即一個(gè)開始標(biāo)簽和一個(gè)結(jié)束標(biāo)簽)或幾對(duì)標(biāo)簽來(lái)標(biāo)識(shí)一個(gè)元素。開始標(biāo)簽由一個(gè)小于字符“<”、—個(gè)標(biāo)簽名和一個(gè)大于字符“>”組成。結(jié)束標(biāo)簽和開始標(biāo)簽的區(qū)別只是在小于字符的后面加上—個(gè)斜線字符“/”,雖然標(biāo)簽名并不區(qū)分大寫和小寫(例如,<TITLE>和<title>或<TiTle>是等效的)但習(xí)慣上很多人愿意用大寫字符表示一個(gè)標(biāo)答名。有一些標(biāo)簽可以將約束標(biāo)簽省略。 并非所有的瀏覽器都支持所有的HTML標(biāo)簽。若某一個(gè)瀏覽器不支持某一個(gè)HTML標(biāo)簽,則瀏覽器將忽略此標(biāo)簽,但在一對(duì)不能識(shí)別的標(biāo)簽之間的文本仍然會(huì)被顯示出來(lái)。 這里需要指出,與瀏覽器顯示HTML文檔時(shí),連續(xù)的空格、回車和換行都被當(dāng)成是—個(gè)空格。瀏覽器在顯示文本時(shí),會(huì)根據(jù)顯示器的尺寸在適當(dāng)?shù)牡胤阶詣?dòng)換行,而和HTML文檔的—個(gè)段落里面的換行(如上面例子中在“雖然很”后面的換行)沒(méi)有關(guān)系。 題頭(heading)是在主體中的標(biāo)題,共分為6級(jí),1級(jí)最高,6級(jí)最低。級(jí)別越高的題頭所用的字也越大(編輯器自動(dòng)設(shè)置題頭子體的大小)。題頭標(biāo)簽<Hn>中的n表示題頭的級(jí)別。在有的標(biāo)簽名后面還可加上屬性,如:ALIGN=center(居中),ALIGN=right(右對(duì)齊),默認(rèn)的屬性是左對(duì)齊ALIGN=left。 在HTML中有3個(gè)字符具有特殊的意義,即:<(表示一個(gè)標(biāo)簽的開始),>(表示一個(gè)標(biāo)簽的結(jié)束),和&(表示轉(zhuǎn)義序列的開始)。因此,當(dāng)這3個(gè)字符在文件中出現(xiàn)時(shí),在HTML文檔中就要將其轉(zhuǎn)換為轉(zhuǎn)義序列(escape sequence)。每個(gè)轉(zhuǎn)義序列都以字符“&”開始。以分號(hào)“;”結(jié)束。這3個(gè)字符“<”、“>”和“&”所對(duì)應(yīng)的轉(zhuǎn)義序列分別為下面引號(hào)中的字符序列:“&lt:”、“&gt;”和“&amp;”。這樣,在瀏覽器中就可以顯示各種非ASCII碼了。例如,字符 是一個(gè)版權(quán)符號(hào),在HTML文檔就用“&copy:“來(lái)表示。順便指出,在轉(zhuǎn)義序列中的字符是分大小寫的。 表9-2給出一些常用的HTML標(biāo)簽以及簡(jiǎn)要的說(shuō)明。 最前面的7個(gè)標(biāo)簽不需要再進(jìn)行解釋。標(biāo)簽<UL>表示無(wú)序列表(Unordered List),在列表中的每一個(gè)項(xiàng)目都不編號(hào),而是在項(xiàng)目前面出現(xiàn)一個(gè)圓點(diǎn)。標(biāo)簽<OL>則表示編號(hào)列表(Ordered List),列表中的項(xiàng)目都按順序編號(hào)。無(wú)論是無(wú)序列表還是編號(hào)列表,都可以嵌套使用。標(biāo)簽<MENU>,是使列中的項(xiàng)目前面既沒(méi)有圓點(diǎn),也沒(méi)有編號(hào),因此在屏幕上更加簡(jiǎn)潔。若瀏覽器不支持<MENU>標(biāo)簽,則在每個(gè)項(xiàng)目前仍然使用園點(diǎn)。再后面的3個(gè)標(biāo)簽意思部很清楚,不用解釋。 當(dāng)有的文本的版面已經(jīng)過(guò)精心的排版而瀏覽器在進(jìn)行顯示時(shí)可能含有改變版面的格式時(shí),就要進(jìn)行已排版文本的設(shè)置。標(biāo)簽<PRE>表示己排版(PREformatted)。 HTML允許在萬(wàn)維網(wǎng)頁(yè)面中插入圖像。一個(gè)頁(yè)面本身帶有的圖像稱為內(nèi)含圖像(inline image)。標(biāo)簽<IMG>即表明在當(dāng)前位置裝入一個(gè)內(nèi)含圖像(IMaGe),其來(lái)源(SouRCe)是文件…。HTML標(biāo)準(zhǔn)并沒(méi)有規(guī)定該圖像的格式。實(shí)際上,大多數(shù)瀏覽器都支持GIF和JPEG文件。從理論上講,用戶可以設(shè)計(jì)一個(gè)瀏覽器,使它能夠支持多種格式的圖像文件。但按照這種瀏覽器創(chuàng)作出的萬(wàn)維網(wǎng)頁(yè)面,很可能使別人的瀏覽器什么也看不見(jiàn)。這里的原因就是很多種格式的圖像占據(jù)的存儲(chǔ)空間太大,因而這種圖像在因特網(wǎng)傳送時(shí)就很浪費(fèi)時(shí)間。例如,一幅位圖文件(.bmp)可能要占用500~700 KB的存儲(chǔ)空間。但若將此圖像改存為經(jīng)壓縮的.gif格式則可能只有十幾個(gè)KB,大大減少了存儲(chǔ)空間。 在插入圖像時(shí),在標(biāo)簽<IMG>中還可使用—些參數(shù)。例如,參數(shù)ALIGN給圖像定位,并將與圖像一起出現(xiàn)的文字放在合適的地方(與圖像的頂部、或中部、或底部對(duì)齊)。參數(shù)HEIGHT和WIDTH是指明圖像裝入時(shí)在屏幕上顯示時(shí)的大小,—般用像素(pixel)的數(shù)目表示。如<IMG SRC=portrait.gif HEIGHT=100 WIDTH=65>,表示裝入一個(gè)文件名為portrait.gif的圖像,其高度和寬度分別為100個(gè)像素和65個(gè)像素。 HTML還可插入表格(table)。這就要使用標(biāo)簽<TABLE>。與此標(biāo)簽配合使用的還有如:<CAPTION>(表格的標(biāo)題),<TR>(表格的行),<TH>或<TD>(表格每格中應(yīng)填入的數(shù)據(jù))等等,這里不再詳細(xì)介紹。 表9-2中最后一項(xiàng)是最重要的一個(gè)標(biāo)簽,我們?cè)?.5.5節(jié)專門討論關(guān)于鏈接的問(wèn)題。 9.5.4 萬(wàn)維網(wǎng)中的鏈接1.鏈接到其他網(wǎng)點(diǎn)上的頁(yè)面 沒(méi)有鏈接就沒(méi)有萬(wàn)維網(wǎng)。在前面的圖9-9中我們已經(jīng)給出了鏈接的初步概念。現(xiàn)在我們要比較詳細(xì)地介紹HTNL關(guān)于鏈接的一些規(guī)定。 每個(gè)鏈接有一個(gè)起點(diǎn)和結(jié)點(diǎn)。鏈接的起點(diǎn)說(shuō)明在萬(wàn)維網(wǎng)頁(yè)面中的什么地方可引出—個(gè)鏈接。在一個(gè)頁(yè)面中,鏈接的起點(diǎn)可以是一個(gè)字,幾個(gè)字或一幅圖,甚于是一段文字。在瀏覽器所顯示的頁(yè)面上,鏈接的起點(diǎn)是很容易識(shí)別的。對(duì)于以文字作為鏈接的起點(diǎn),這些文字往往用不同的顏色顯示(例如,一般的文字用黑色字時(shí),鏈接起點(diǎn)往往使用藍(lán)色字),甚至還加上下劃線(一般由瀏覽器來(lái)設(shè)置)。當(dāng)我們將鼠標(biāo)移動(dòng)到一個(gè)鏈接的起點(diǎn)時(shí),表示鼠標(biāo)位置的箭頭就變成了一只手。這時(shí)只要點(diǎn)擊鼠標(biāo),這個(gè)鏈接就被激活。 定義一個(gè)鏈接的標(biāo)簽是<A>。字符A表示錨(Anchor)。建立—個(gè)鏈接時(shí)好像拋出—個(gè)錨,并將這個(gè)錨扎到鏈接的終點(diǎn)。 HTML規(guī)定,在HTML文檔中定義一個(gè)鏈接的語(yǔ)法是: <A HREF=”’…”>X</A> 這里一定要弄清鏈接的起點(diǎn)和終點(diǎn)。 鏈接的起點(diǎn)就是(9-3)式中的X,它可以是—個(gè)或多個(gè)字符。 鏈接的終點(diǎn)則放在(9-3)式中的HREF“…”的引號(hào)中,引號(hào)中的“…”就是鏈接終點(diǎn)的統(tǒng)一資源定位符URL。“HREF”與前面的字符“A”之間應(yīng)有—個(gè)空格。H代表超文本,而REF代表REFerence,是“訪問(wèn)”或“引用”的意思。 例如,我們有一個(gè)頁(yè)面的文檔中的某一行提到清華大學(xué),但沒(méi)有詳細(xì)介紹。這時(shí)就可以將該行中“清華大學(xué)”這4個(gè)字作為一個(gè)鏈接的起點(diǎn)。在瀏覽時(shí)只要將鼠標(biāo)的位置放在這個(gè)鏈接起點(diǎn),點(diǎn)擊一下,就可以進(jìn)入到清華大學(xué)的主頁(yè)并了解清華大學(xué)的詳細(xì)情況。有關(guān)這個(gè)鏈按的HTML文檔就是: <A HREF=http://www.>清華大學(xué)</A> 2.鏈接到一個(gè)本地文件 上面的例子是鏈接的終點(diǎn)是其他網(wǎng)點(diǎn)上的頁(yè)面。這種鏈接方式叫做遠(yuǎn)程鏈接。要外多情況下,鏈接可以指向自己的計(jì)算機(jī)中的某—個(gè)文件。這叫做本地鏈接。 在進(jìn)行本地鏈接時(shí),在HREF的后面不需要寫很長(zhǎng)的、完整的URL(包括具有完整目錄路徑的文件名)。這是因?yàn)樵谑褂肬RL時(shí)可進(jìn)行許多的簡(jiǎn)化如下所述。 當(dāng)協(xié)議(http://)被省略時(shí),就認(rèn)為與當(dāng)前頁(yè)面的協(xié)議相同。 當(dāng)主機(jī)域名被省略時(shí),就認(rèn)為是當(dāng)前的主機(jī)域名。 當(dāng)目錄路徑被省略時(shí),就認(rèn)為是目錄。(對(duì)于遠(yuǎn)程鏈接,就認(rèn)為是主機(jī)的默認(rèn)根目錄。) 當(dāng)文件名被省略時(shí),就認(rèn)為是當(dāng)前文件。(對(duì)于遠(yuǎn)程鏈接,就認(rèn)為是對(duì)方服務(wù)器上默認(rèn)的文件名,通常是一個(gè)名為index.html的文件。) 使用這種簡(jiǎn)化的方法,在HREF=的后面使用了相對(duì)路徑名。相反,使用完整的URL找—個(gè)文件是使用絕對(duì)路徑名。 使用相對(duì)路徑名的好處不僅是可以少鍵入—些字符,而且也便于目錄的改動(dòng)。例如,在某一級(jí)目錄下創(chuàng)建了許多可互相鏈接的文檔。若需要改動(dòng)一下目錄結(jié)構(gòu)并將此目錄移至另一個(gè)目錄下,那么以前創(chuàng)建的使用絕對(duì)路徑名的鏈接全都要改動(dòng),否則就鏈接不了(當(dāng)下載許多相互鏈接的文檔后,若改變其文檔目錄,就常常發(fā)生這種鏈接不上的情況)。但若使用相對(duì)路行名,則原來(lái)的鏈接關(guān)系可以不必去改動(dòng)。 HTML還支持讀取其他結(jié)點(diǎn)的聲音或視像文件。這時(shí)應(yīng)將(9-3)式中要讀取的文件名寫為后綴為.wav,.mpeg或.mov的文件名即可。 3.鏈接到本文件中的某個(gè)地方 假定有個(gè)很長(zhǎng)的文件(后綴為.html)在瀏覽器中顯示。當(dāng)查找某些內(nèi)容時(shí),往往要利用窗口邊上的滾動(dòng)條在幾千行的信息中反復(fù)來(lái)回查找。這顯然很不方便。比較好的辦法是在文件的一開始放入一個(gè)詳細(xì)目錄。目錄中的每—節(jié)都一個(gè)鏈接的起點(diǎn)。只要用鼠標(biāo)點(diǎn)擊目錄中某—節(jié)的鏈接起點(diǎn),就能立即將所要找的那一節(jié)顯示在屏幕的最上方。 這種情況和前面所討論的不同之處就是鏈接的終點(diǎn)不同,困為現(xiàn)在鏈接的終點(diǎn)不是—個(gè)統(tǒng)一資源定位符URL,而是一個(gè)文件中指明的特定地方(例如某個(gè)段落的開始行)。為了標(biāo)識(shí)這個(gè)鏈接的終點(diǎn),HTML將這種鏈接的終點(diǎn)稱為命名錨(named anchor),因?yàn)殒溄拥慕K點(diǎn)像一個(gè)錨扎到這里來(lái)。但在一個(gè)文件中可能會(huì)有很多的鏈接終點(diǎn)。為了區(qū)分這些鏈接終點(diǎn)。就必須給每一個(gè)鏈接終點(diǎn)命名。 在設(shè)置一個(gè)遠(yuǎn)程鏈接時(shí),由于遠(yuǎn)程文檔的URL已經(jīng)知道了,因此按照(9-3)式就可將鏈接設(shè)置好。但要設(shè)置一個(gè)本文件的鏈接時(shí),就必須在要鏈接到本文件中的某個(gè)特定地方,先定義一個(gè)命名錨。HTML規(guī)定一個(gè)命名錨的定義語(yǔ)法如下: <A NAME=“…”>Y</A> (9-4) 這里的Y就是被指明為出鏈接終點(diǎn)的一個(gè)或多個(gè)字符,而NAME=的后面引號(hào)中的“…”寫入我們給命名錨取的名字。例如,對(duì)于圖9-12的例子中,鏈接的終點(diǎn)在字符abc的前面,而命名錨的名字取為Destination,因此(9-4)式就變?yōu)椋? <A NAME=“Destination”>abc</A> (9-5) HTML規(guī)定鏈接到一個(gè)命名錨的HTML文檔的語(yǔ)法是: <A HREF=“#…”>X</A> (9-6) (9-6)式中在字符#后面的省略號(hào)“…”就是命名錨的名字,而X是鏈接的起點(diǎn)。例如,當(dāng)上述鏈接的起點(diǎn)選為文檔中的X時(shí),在鏈接起點(diǎn)對(duì)應(yīng)的HTML語(yǔ)句就是: <A HREF=“#Destination”>X</A> (9-7) 不難看山,(9-7)式和(9-5)式的作用是不同的。(9-7)式定義了一個(gè)本文件中的鏈接的起點(diǎn)和終點(diǎn)的命名錨,而(9-5)式是在鏈接的終點(diǎn)定義命名錨的名字。 命名錨也可插入到本地的其他HTML文件中(但在其他網(wǎng)點(diǎn)中的別人的文件中插入自己設(shè)置的命名錨是不允許的),這時(shí)應(yīng)在(9-5)中的字符“#”前加上該文件的名字。 4.瀏覽器的結(jié)構(gòu) 瀏覽器的結(jié)構(gòu)要比服務(wù)器的結(jié)構(gòu)復(fù)雜得多。服務(wù)器只是重復(fù)地執(zhí)行—個(gè)簡(jiǎn)單的任務(wù):等待瀏覽器打開—個(gè)鏈接。按照瀏覽器發(fā)來(lái)的請(qǐng)求向?yàn)g覽器發(fā)送頁(yè)面,關(guān)閉連接,并等待瀏覽器(也可能是另外的瀏覽器)的下一個(gè)請(qǐng)求。但瀏覽器卻包含若干個(gè)人型軟件組件,它們協(xié)同在一起工作。圖9-13是一個(gè)瀏覽器的主要組成部分。
圖9-13 瀏覽器的結(jié)構(gòu)
從圖9-13可看出,一個(gè)瀏覽器有一組客戶、一組解釋程序,以及管理這些客戶和解釋程序的控制程序??刂瞥绦蚴瞧渲械暮诵牟考忉屖髽?biāo)的點(diǎn)擊和鍵盤的輸入,并調(diào)用有關(guān)的組件來(lái)執(zhí)行用戶指定的操作。例如,當(dāng)用戶用鼠標(biāo)點(diǎn)擊下一個(gè)鏈接的起點(diǎn)時(shí),控制程序就調(diào)用一個(gè)客戶從所需文檔所在的遠(yuǎn)地服務(wù)器上取回該文檔,并調(diào)用解釋程序向用戶顯示該文檔。 HTML解釋程序是必不可少的,而其他解釋程序則是可選的。HTML解釋程序的輸入就是符合HTML語(yǔ)法的文檔。解釋程序?qū)TML規(guī)格轉(zhuǎn)換為適合用戶顯示硬件的命令來(lái)處理版面的細(xì)節(jié)。例如,當(dāng)遇到一個(gè)強(qiáng)制換行標(biāo)簽<BR>,解釋程序就輸出一個(gè)新的行。 HTML解釋程序?qū)?yè)面中所有的可選項(xiàng)(即所有鏈接的起點(diǎn))都保存有其位置信息、當(dāng)用戶的鼠標(biāo)點(diǎn)擊某個(gè)選項(xiàng)時(shí)。瀏覽器就根據(jù)當(dāng)前光標(biāo)位置和存儲(chǔ)的位置信息來(lái)決定哪個(gè)選項(xiàng)被用戶選中。 前面已經(jīng)講過(guò),瀏覽器的任務(wù)不僅是瀏覽。許多瀏覽器還包含一個(gè)FTP客戶,用來(lái)獲取文件傳送服務(wù)。一些瀏覽器也包含一個(gè)電子郵件客戶,使瀏覽器能夠發(fā)送和接收電子郵件。現(xiàn)在的瀏覽器都設(shè)計(jì)得很好。它使用戶看不見(jiàn)許多細(xì)節(jié)。用戶也并不知道他執(zhí)行了一個(gè)可選客戶,如FTP客戶,或SMTP客戶。 在瀏覽器中還設(shè)有一個(gè)緩存。瀏覽器將它取回的每一個(gè)頁(yè)面幅本都放入本地磁盤的緩存中。當(dāng)用戶用鼠標(biāo)點(diǎn)擊某個(gè)選項(xiàng)時(shí),瀏覽器首先檢查磁盤的緩存。若緩存中保存了該項(xiàng),那么瀏覽器就直接從緩存中得到該項(xiàng)副本而不必從網(wǎng)絡(luò)來(lái)獲取。在這種情況下就可明顯地改善瀏覽器的運(yùn)行特性。對(duì)于網(wǎng)絡(luò)連接較為緩慢的用戶,這種緩存就顯得更加重要。因?yàn)閺木W(wǎng)絡(luò)上取回一個(gè)很大的文件所需的時(shí)間將大大超過(guò)從本地磁盤直接讀取的時(shí)間。 然而使用緩存也帶來(lái)了一些問(wèn)題。首先,緩存要占用磁盤大量的空間。其次,瀏覽器性能的改善只有在用戶再次查看緩存中的頁(yè)面時(shí)才有幫助。實(shí)際上,用戶在進(jìn)行瀏覽時(shí),一般會(huì)及時(shí)將有保存價(jià)值的頁(yè)面存儲(chǔ)下來(lái)(只需點(diǎn)擊幾下鼠標(biāo)即可)。因此緩存中保存的大部分今后不再查看的文件并不會(huì)改善瀏覽器的性能。相反,由于瀏覽器要耗費(fèi)時(shí)間來(lái)將這些文件白白地存儲(chǔ)在磁盤上,這反而降低了瀏覽器的效率。 為了改善瀏覽器的特性,許多瀏覽器允許用戶調(diào)整緩存策略。例如,用戶可設(shè)置緩存的時(shí)間限制,并在此時(shí)間限制到期后在緩存中刪除這些文件。 關(guān)于瀏覽器還有一些內(nèi)容本書不再詳細(xì)進(jìn)行討論了。這些內(nèi)容簡(jiǎn)述如下。 (1)動(dòng)態(tài)文檔(dynamic document):動(dòng)態(tài)文檔的內(nèi)容是在瀏覽器訪問(wèn)萬(wàn)維網(wǎng)服務(wù)器時(shí)才由就用程序動(dòng)態(tài)創(chuàng)建。由于對(duì)瀏覽器每次請(qǐng)求的響應(yīng)都是臨時(shí)生成的,因此用戶通過(guò)動(dòng)態(tài)文檔所看到的內(nèi)容可根據(jù)需要不斷變化。例如,動(dòng)態(tài)文檔可用來(lái)報(bào)告股市行情、天氣預(yù)報(bào)或民航售票情況等內(nèi)容,動(dòng)態(tài)文檔和靜態(tài)文檔(static document)不同。靜態(tài)文檔是指該文檔的內(nèi)容不會(huì)改變。由于這種文檔的內(nèi)容不會(huì)改變,因此用戶對(duì)靜態(tài)文檔的每次讀取所得到的返回結(jié)果都是相同的。 (2)活動(dòng)文檔(active document):活動(dòng)文檔將所有的工作都轉(zhuǎn)移給瀏覽器。每當(dāng)瀏覽器請(qǐng)求—個(gè)活動(dòng)文檔時(shí),服務(wù)器就返回一段程序,使它在瀏覽器運(yùn)行。由美國(guó)Sun公司開發(fā)的Java語(yǔ)言是—項(xiàng)用于創(chuàng)建和運(yùn)行活動(dòng)文檔的技術(shù)。在Java技術(shù)中使用了一個(gè)新的名詞“小應(yīng)用程序”(applet)來(lái)描述活動(dòng)文檔程序。當(dāng)用戶從萬(wàn)維網(wǎng)服務(wù)器下載一個(gè)嵌入了Java小應(yīng)用程序的HTML文檔后,用戶可在瀏覽器的顯示屏幕上點(diǎn)擊某個(gè)圖像,然后就可看到動(dòng)畫的效果,或是在某個(gè)下拉式菜單中點(diǎn)擊某個(gè)項(xiàng)目,然后就可看到根據(jù)用戶鍵入的數(shù)據(jù)所得到的計(jì)算結(jié)果。 (3)搜索引擎(search engine):是萬(wàn)維網(wǎng)上的檢索系統(tǒng)。用戶使用搜索引擎可在萬(wàn)維網(wǎng)上查找信息(當(dāng)不知道信息所在網(wǎng)點(diǎn)時(shí))。現(xiàn)在萬(wàn)維網(wǎng)上已有許多著名的搜索引擎。這些搜索引擎中的Yahoo(請(qǐng)注意:發(fā)音時(shí)重音在第一個(gè)音節(jié)而不是后面的音節(jié)L)最為出名,其網(wǎng)址為: http://www.yahoo.com。 9.6 動(dòng)態(tài)主機(jī)配置協(xié)議DHCP動(dòng)態(tài)主機(jī)配置協(xié)議DHCP(Dynamic Host Configuration Protocol)提供了—種稱為即插即用連網(wǎng)(plug-and-play-networking)的機(jī)制[RFC 2131]。這種機(jī)制允許一臺(tái)計(jì)算機(jī)加入新的網(wǎng)絡(luò)和獲取IP地址而不用手工參與。 DHCP對(duì)運(yùn)行客戶軟件和服務(wù)器軟件的計(jì)算機(jī)都適用。當(dāng)運(yùn)行客戶軟件的計(jì)算機(jī)移至一個(gè)新的網(wǎng)絡(luò)時(shí),就可使用DHCP獲取其配置信息而不需要手工干預(yù)。DHCP給運(yùn)行服務(wù)器軟件而位置固定的計(jì)算機(jī)指派一個(gè)永久地址,當(dāng)這計(jì)算機(jī)重新啟動(dòng)時(shí)其地址不變。 DHCP使用客戶服務(wù)器方式。當(dāng)一臺(tái)計(jì)算機(jī)啟動(dòng)時(shí)就廣播一個(gè)DHCP請(qǐng)求報(bào)文。DHCP服務(wù)器收到請(qǐng)求報(bào)文后返回一個(gè)DHCP回答報(bào)文。DHCP服務(wù)據(jù)先在其數(shù)據(jù)庫(kù)中查找該計(jì)算機(jī)的配置信息。若找到,則返回找到的信息。若找不到,則從服務(wù)器的按需分配的地址庫(kù)中取一個(gè)地址分配給該計(jì)算機(jī)。 DHCP很適合于經(jīng)常移動(dòng)位置的計(jì)算機(jī)。當(dāng)計(jì)算機(jī)使用Windows 9x操作系統(tǒng)時(shí),點(diǎn)擊“控制面板”的“網(wǎng)絡(luò)”圖標(biāo)就可以添加TCP/IP協(xié)議。然后點(diǎn)擊“屬件”按鈕,在“IP地址”這一項(xiàng)下面有兩種方法可供選擇:一種是“自動(dòng)獲得一個(gè)IP地址”,另一種是“指定IP地址”。若選樣前一種,就是表示使用DHCP協(xié)議自動(dòng)獲得IP地址。 有的書將DHCP放在網(wǎng)絡(luò)層和IP協(xié)議—起討論,這是考慮到DHCP給主機(jī)分配的臨時(shí)IP地址是屬于網(wǎng)絡(luò)層的內(nèi)容。但是,由于DHCP報(bào)文使用UDP用戶數(shù)據(jù)報(bào)傳送UDP再使用IP傳送),因此DHCP在協(xié)議棧中的位置應(yīng)當(dāng)是在應(yīng)用層。DHCP服務(wù)器使用的熟知端口號(hào)是67,而DHCP客戶使用的熟知端口號(hào)是68。 習(xí) 題1.什么是應(yīng)用進(jìn)程 應(yīng)用進(jìn)程的用戶的應(yīng)用程序有何關(guān)系 2.因特網(wǎng)的域名結(jié)構(gòu)是怎樣的 它與目前的電話網(wǎng)的號(hào)碼結(jié)構(gòu)有何異同之處 3.什么是域名系統(tǒng)中的根域名服務(wù)器和授權(quán)域名服務(wù)器 授權(quán)域名服務(wù)器與管轄區(qū)有何關(guān)系? 4.舉例說(shuō)明域名轉(zhuǎn)換的過(guò)程。域名服務(wù)器中的高速緩存的作用是什么 5.文件傳送協(xié)議FTP的主要工作過(guò)程是怎樣的 主進(jìn)程和從屬進(jìn)程各起什么作用? 6.簡(jiǎn)單文件傳送協(xié)議TFTP與FTP的主要區(qū)別是什么?用在什么場(chǎng)合? 7.試述網(wǎng)絡(luò)文件系統(tǒng)NFS的主要特點(diǎn)。 8.遠(yuǎn)程登錄TELNET的主要特點(diǎn)是什么 什么叫做虛擬終端NVT 9.試述電子郵件的最主要的組成部件。能否不使用用戶代理 10.電子郵件的信封和內(nèi)容在郵件的傳送過(guò)程中起什么作用 和用戶的關(guān)系如何 11.電子郵件的地址格式是怎樣的?請(qǐng)說(shuō)明各部分的意思。 12.試簡(jiǎn)述SMTP通信的過(guò)程。 13.試述郵局協(xié)議POP的工作過(guò)程。LMAP與POP有何區(qū)別? 14.MIME與SMTP相比有何優(yōu)點(diǎn) 什么是quoted-printable編碼和base64編碼 15.一個(gè)二進(jìn)制文件共3072字節(jié)長(zhǎng)。若使用base64編碼,并且每發(fā)送完80字節(jié)就插入一個(gè)回車符CR和一個(gè)換行符LF,問(wèn)一共發(fā)送了多少個(gè)字節(jié)? 16.解釋以下名詞,各英文縮寫詞的原文是什么? WWW、URL、HTTP、HTML、瀏覽器、超文本、超媒體、鏈接、命名錨、頁(yè)面、搜索引擎。 17.假定一個(gè)鏈接從一個(gè)萬(wàn)維網(wǎng)文檔鏈接到另一個(gè)萬(wàn)維網(wǎng)文檔時(shí),由于萬(wàn)維網(wǎng)文檔上出現(xiàn)了差錯(cuò)而使得鏈接指向一個(gè)無(wú)效的計(jì)算機(jī)名字。這時(shí)瀏覽器將向用戶報(bào)告什么信息 18.當(dāng)使用鼠標(biāo)點(diǎn)取—個(gè)萬(wàn)維網(wǎng)文檔時(shí),若該文檔除了有文本外,還有一個(gè)本地.gif圖像和兩個(gè)遠(yuǎn)地.gif圖像。試問(wèn);需要使用哪個(gè)應(yīng)用程序,以及需要建立幾次UDP連接和幾次TCP連接 19.你所使用的瀏覽器的高速緩存有多大?請(qǐng)進(jìn)行一個(gè)實(shí)驗(yàn):訪問(wèn)幾個(gè)萬(wàn)維網(wǎng)文檔,然后將你的計(jì)算機(jī)與網(wǎng)絡(luò)斷開,最后再回到你剛才訪問(wèn)過(guò)的文檔。你的瀏覽器的高速緩行能夠存放多少個(gè)頁(yè)面 20.試創(chuàng)建—個(gè)萬(wàn)維網(wǎng)頁(yè)面,它有一個(gè)標(biāo)題(title)。然后觀察瀏覽器如何使用此標(biāo)題。 21.用你的瀏覽器讀取—個(gè)簡(jiǎn)單的萬(wàn)維網(wǎng)頁(yè)面.然后利用瀏覽器菜單上的選項(xiàng)查看該頁(yè)面的源程序。和本書介紹的HTML的部分格式與標(biāo)簽進(jìn)行對(duì)比,看是否能夠看懂。 22.定義一個(gè)鏈接可以使用公式(9-3)或公式(9-6)。這兩個(gè)公式只差一點(diǎn)(相差一個(gè)字符“#”)。請(qǐng)指出其區(qū)別。 23.在瀏覽器中應(yīng)當(dāng)有若干個(gè)可選解釋程序。試給出一些可選解釋程序的名稱。 24.一個(gè)萬(wàn)維網(wǎng)網(wǎng)點(diǎn)有1000萬(wàn)個(gè)頁(yè)面,平均每個(gè)頁(yè)面有10個(gè)鏈接。讀取一個(gè)頁(yè)面平均要100 ms。問(wèn)要檢索整個(gè)網(wǎng)點(diǎn)平均所需的最少時(shí)間是多少 |
|
來(lái)自: Frank_Chia > 《網(wǎng)絡(luò)》