1.1引言
很多不同的廠家生產(chǎn)各種型號的計(jì)算機(jī)贩虾,它們運(yùn)行完全不同的操作系統(tǒng)催烘,但TCP/IP協(xié)議族允許它們互相進(jìn)行通信。這一點(diǎn)很讓人感到吃驚缎罢,因?yàn)樗淖饔靡堰h(yuǎn)遠(yuǎn)超出了起初的設(shè)想伊群。TCP/IP起源于60年代末美國政府資助的一個分組交換網(wǎng)絡(luò)研究項(xiàng)目,到90年代已發(fā)展成為計(jì)算機(jī)之間最常應(yīng)用的組網(wǎng)形式策精。它是一個真正的開放系統(tǒng)在岂,因?yàn)閰f(xié)議族的定義及其多種實(shí)現(xiàn)可以不用花錢或花很少的錢就可以公開地得到。它成為被稱作“全球互聯(lián)網(wǎng)”或“因特網(wǎng)(Internet)”的基礎(chǔ)蛮寂,該廣域網(wǎng)(WAN)已包含超過100萬臺遍布世界各地的計(jì)算機(jī)蔽午。
本章主要對TCP/IP協(xié)議族進(jìn)行概述,其目的是為本書其余章節(jié)提供充分的背景知識酬蹋。如果讀者要從歷史的角度了解有關(guān)TCP/IP的早期發(fā)展情況及老,請參考文獻(xiàn)[Lynch 1993]。
1.2:分層
網(wǎng)絡(luò)協(xié)議通常分不同層次進(jìn)行開發(fā)范抓,每一層分別負(fù)責(zé)不同的通信功能骄恶。一個協(xié)議族,比如TCP/IP匕垫,是一組不同層次上的多個協(xié)議的組合僧鲁。TCP/IP通常被認(rèn)為是一個四層協(xié)議系統(tǒng),如圖1-1所示。
每一層負(fù)責(zé)不同的功能:
1:鏈路層寞秃,有時也稱作數(shù)據(jù)鏈路層或網(wǎng)絡(luò)接口層斟叼,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動程序和計(jì)算機(jī)中對應(yīng)的網(wǎng)絡(luò)接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細(xì)節(jié)春寿。
2:網(wǎng)絡(luò)層朗涩,有時也稱作互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡(luò)中的活動绑改,例如分組的選路谢床。在TCP/IP協(xié)議族中,網(wǎng)絡(luò)層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議)厘线,ICMP協(xié)議(Internet互聯(lián)網(wǎng)控制報(bào)文協(xié)議)识腿,以及IGMP協(xié)議(Internet組管理協(xié)議)。
3:運(yùn)輸層主要為兩臺主機(jī)上的應(yīng)用程序提供端到端的通信造壮。在TCP/IP協(xié)議族中覆履,有兩個互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。
TCP為兩臺主機(jī)提供高可靠性的數(shù)據(jù)通信费薄。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組栖雾,設(shè)置發(fā)送最后確認(rèn)分組的超時時鐘等楞抡。由于運(yùn)輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)析藕。
而另一方面召廷,UDP則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報(bào)的分組從一臺主機(jī)發(fā)送到另一臺主機(jī)账胧,但并不保證該數(shù)據(jù)報(bào)能到達(dá)另一端竞慢。任何必需的可靠性必須由應(yīng)用層來提供。
這兩種運(yùn)輸層協(xié)議分別在不同的應(yīng)用程序中有不同的用途治泥,這一點(diǎn)將在后面看到筹煮。
4:應(yīng)用層負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)。幾乎各種不同的TCP/IP實(shí)現(xiàn)都會提供下面這些通用的應(yīng)用程序
?Telnet遠(yuǎn)程登錄居夹。
? FTP文件傳輸協(xié)議败潦。
? SMTP簡單郵件傳送協(xié)議。
? SNMP簡單網(wǎng)絡(luò)管理協(xié)議准脂。
另外還有許多其他應(yīng)用劫扒,在后面章節(jié)中將介紹其中的一部分。假設(shè)在一個局域網(wǎng)(LAN)如以太網(wǎng)中有兩臺主機(jī)狸膏,二者都運(yùn)行FTP協(xié)議沟饥,圖1-2列出了該過程所涉及到的所有協(xié)議。
這里,我們列舉了一個FTP客戶程序和另一個FTP服務(wù)器程序贤旷。大多數(shù)的網(wǎng)絡(luò)應(yīng)用程序都被設(shè)計(jì)成客戶—服務(wù)器模式广料。服務(wù)器為客戶提供某種服務(wù),在本例中就是訪問服務(wù)器所在主機(jī)上的文件遮晚。在遠(yuǎn)程登錄應(yīng)用程序Te lnet中性昭,為客戶提供的服務(wù)是登錄到服務(wù)器主機(jī)上。
在同一層上县遣,雙方都有對應(yīng)的一個或多個協(xié)議進(jìn)行通信糜颠。例如,某個協(xié)議允許TCP層進(jìn)行通信萧求,而另一個協(xié)議則允許兩個IP層進(jìn)行通信其兴。
在圖1-2的右邊,我們注意到應(yīng)用程序通常是一個用戶進(jìn)程夸政,而下三層則一般在(操作系統(tǒng))內(nèi)核中執(zhí)行元旬。盡管這不是必需的,但通常都是這樣處理的守问,例如UNIX操作系統(tǒng)匀归。
在圖1-2中,頂層與下三層之間還有另一個關(guān)鍵的不同之處耗帕。應(yīng)用層關(guān)心的是應(yīng)用程序的細(xì)節(jié)穆端,而不是數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸活動。下三層對應(yīng)用程序一無所知仿便,但它們要處理所有的通信細(xì)節(jié)体啰。
在圖1-2中列舉了四種不同層次上的協(xié)議。FTP是一種應(yīng)用層協(xié)議嗽仪,TCP是一種運(yùn)輸層協(xié)議荒勇,IP是一種網(wǎng)絡(luò)層協(xié)議,而以太網(wǎng)協(xié)議則應(yīng)用于鏈路層上闻坚。TCP/IP協(xié)議族是一組不同的協(xié)議組合在一起構(gòu)成的協(xié)議族沽翔。盡管通常稱該協(xié)議族為TCP/IP,但TCP和IP只是其中的兩種協(xié)議而已(該協(xié)議族的另一個名字是Internet協(xié)議族(Internet Protocol Suite))窿凤。
網(wǎng)絡(luò)接口層和應(yīng)用層的目的是很顯然的——前者處理有關(guān)通信媒介的細(xì)節(jié)(以太網(wǎng)搀擂、令牌環(huán)網(wǎng)等),而后者處理某個特定的用戶應(yīng)用程序(FTP卷玉、Telnet等)哨颂。但是,從表面上看相种,網(wǎng)絡(luò)層和運(yùn)輸層之間的區(qū)別不那么明顯威恼。為什么要把它們劃分成兩個不同的層次呢品姓?為了理解這一點(diǎn),我們必須把視野從單個網(wǎng)絡(luò)擴(kuò)展到一組網(wǎng)絡(luò)箫措。
在80年代腹备,網(wǎng)絡(luò)不斷增長的原因之一是大家都意識到只有一臺孤立的計(jì)算機(jī)構(gòu)成的“孤島”沒有太大意義,于是就把這些孤立的系統(tǒng)組在一起形成網(wǎng)絡(luò)斤蔓。隨著這樣的發(fā)展植酥,到了90年代,我們又逐漸認(rèn)識到這種由單個網(wǎng)絡(luò)構(gòu)成的新的更大的“島嶼”同樣沒有太大的意義弦牡。于是友驮,人們又把多個網(wǎng)絡(luò)連在一起形成一個網(wǎng)絡(luò)的網(wǎng)絡(luò),或稱作互連網(wǎng)(internet)驾锰。一個互連網(wǎng)就是一組通過相同協(xié)議族互連在一起的網(wǎng)絡(luò)卸留。
構(gòu)造互連網(wǎng)最簡單的方法是把兩個或多個網(wǎng)絡(luò)通過路由器進(jìn)行連接。它是一種特殊的用于網(wǎng)絡(luò)互連的硬件盒椭豫。路由器的好處是為不同類型的物理網(wǎng)絡(luò)提供連接:以太網(wǎng)耻瑟、令牌環(huán)網(wǎng)、點(diǎn)對點(diǎn)的鏈接和FDDI(光纖分布式數(shù)據(jù)接口)等等赏酥。
這些盒子也稱作IP路由器(IP Router)喳整,但我們這里使用路由器(Router)這個術(shù)語。從歷史上說裸扶,這些盒子稱作網(wǎng)關(guān)(gateway)框都,在很多TCP/IP文獻(xiàn)中都使用這個術(shù)語。現(xiàn)在網(wǎng)關(guān)這個術(shù)語只用來表示應(yīng)用層網(wǎng)關(guān):一個連接兩種不同協(xié)議族的進(jìn)程(例如姓言,TCP/IP和IBM的SNA),它為某個特定的應(yīng)用程序服務(wù)(常常是電子郵件或文件傳輸)蔗蹋。
圖1-3是一個包含兩個網(wǎng)絡(luò)的互連網(wǎng):一個以太網(wǎng)和一個令牌環(huán)網(wǎng)何荚,通過一個路由器互相連接。盡管這里是兩臺主機(jī)通過路由器進(jìn)行通信猪杭,實(shí)際上以太網(wǎng)中的任何主機(jī)都可以與令牌環(huán)網(wǎng)中的任何主機(jī)進(jìn)行通信餐塘。
在圖1-3中,我們可以劃分出端系統(tǒng)(End system)(兩邊的兩臺主機(jī))和中間系統(tǒng)(Intermediate system)(中間的路由器)皂吮。應(yīng)用層和運(yùn)輸層使用端到端(End-to-end)協(xié)議戒傻。在圖中,只有端系統(tǒng)需要這兩層協(xié)議蜂筹。但是需纳,網(wǎng)絡(luò)層提供的卻是逐跳(Hop-by-hop)協(xié)議,兩個端系統(tǒng)和每個中間系統(tǒng)都要使用它艺挪。
在TCP/IP協(xié)議族中不翩,網(wǎng)絡(luò)層IP提供的是一種不可靠的服務(wù)。也就是說,它只是盡可能快地把分組從源結(jié)點(diǎn)送到目的結(jié)點(diǎn)口蝠,但是并不提供任何可靠性保證器钟。而另一方面,TCP在不可靠的IP層上提供了一個可靠的運(yùn)輸層妙蔗。為了提供這種可靠的服務(wù)傲霸,TCP采用了超時重傳、發(fā)送和接收端到端的確認(rèn)分組等機(jī)制眉反。由此可見昙啄,運(yùn)輸層和網(wǎng)絡(luò)層分別負(fù)責(zé)不同的功能。
從定義上看禁漓,一個路由器具有兩個或多個網(wǎng)絡(luò)接口層(因?yàn)樗B接了兩個或多個網(wǎng)絡(luò))跟衅。任何具有多個接口的系統(tǒng)逢并,英文都稱作是多接口的(multihomed)尝盼。一個主機(jī)也可以有多個接口,但一般不稱作路由器,除非它的功能只是單純地把分組從一個接口傳送到另一個接口松逊。同樣秘狞,路由器并不一定指那種在互聯(lián)網(wǎng)中用來轉(zhuǎn)發(fā)分組的特殊硬件盒叭莫。大多數(shù)的TCP/IP實(shí)現(xiàn)也允許一個多接口主機(jī)來擔(dān)當(dāng)路由器的功能,但是主機(jī)為此必須進(jìn)行特殊的配置烁试。在這種情況下雇初,我們既可以稱該系統(tǒng)為主機(jī)(當(dāng)它運(yùn)行某一應(yīng)用程序時,如FTP或Telnet)减响,也可以稱之為路由器(當(dāng)它把分組從一個網(wǎng)絡(luò)轉(zhuǎn)發(fā)到另一個網(wǎng)絡(luò)時)靖诗。在不同的場合下使用不同的術(shù)語。
互聯(lián)網(wǎng)的目的之一是在應(yīng)用程序中隱藏所有的物理細(xì)節(jié)支示。雖然這一點(diǎn)在圖1-3由兩個網(wǎng)絡(luò)組成的互聯(lián)網(wǎng)中并不很明顯刊橘,但是應(yīng)用層不能關(guān)心(也不關(guān)心)一臺主機(jī)是在以太網(wǎng)上,而另一臺主機(jī)是在令牌環(huán)網(wǎng)上颂鸿,它們通過路由器進(jìn)行互連促绵。隨著增加不同類型的物理網(wǎng)絡(luò),可能會有20個路由器嘴纺,但應(yīng)用層仍然是一樣的败晴。物理細(xì)節(jié)的隱藏使得互聯(lián)網(wǎng)功能非常強(qiáng)大,也非常有用栽渴。
連接網(wǎng)絡(luò)的另一個途徑是使用網(wǎng)橋尖坤。網(wǎng)橋是在鏈路層上對網(wǎng)絡(luò)進(jìn)行互連,而路由器則是在網(wǎng)絡(luò)層上對網(wǎng)絡(luò)進(jìn)行互連闲擦。網(wǎng)橋使得多個局域網(wǎng)(LAN)組合在一起糖驴,這樣對上層來說就好像是一個局域網(wǎng)僚祷。
TCP/IP傾向于使用路由器而不是網(wǎng)橋來連接網(wǎng)絡(luò),因此我們將著重介紹路由器贮缕。文獻(xiàn)[Perlman 1992]的第12章對路由器和網(wǎng)橋進(jìn)行了比較辙谜。
1.3 TCP/IP的分層
在TCP/IP協(xié)議族中,有很多種協(xié)議感昼。圖1-4給出了本書將要討論的其他協(xié)議装哆。
TCP和UDP是兩種最為著名的運(yùn)輸層協(xié)議,二者都使用IP作為網(wǎng)絡(luò)層協(xié)議定嗓。
雖然TCP使用不可靠的IP服務(wù)蜕琴,但它卻提供一種可靠的運(yùn)輸層服務(wù)。本書第17~22章將詳細(xì)討論TCP的內(nèi)部操作細(xì)節(jié)宵溅。然后凌简,我們將介紹一些TCP的應(yīng)用,如第26章中的Telnet和Rlogin恃逻、第27章中的FTP以及第28章中的SMTP等雏搂。這些應(yīng)用通常都是用戶進(jìn)程。
UDP為應(yīng)用程序發(fā)送和接收數(shù)據(jù)報(bào)寇损。一個數(shù)據(jù)報(bào)是指從發(fā)送方傳輸?shù)浇邮辗降囊粋€信息單元(例如凸郑,發(fā)送方指定的一定字節(jié)數(shù)的信息)。但是與TCP不同的是矛市,UDP是不可靠的芙沥,它不能保證數(shù)據(jù)報(bào)能安全無誤地到達(dá)最終目的。本書第11章將討論UDP浊吏,然后在第14章(DNS:域名系統(tǒng))而昨,第15章(TFTP:簡單文件傳送協(xié)議),以及第16章(BOOTP:引導(dǎo)程序協(xié)議)介紹使用UDP的應(yīng)用程序找田。SNMP也使用了UDP協(xié)議歌憨,但是由于它還要處理許多其他的協(xié)議,因此本書把它留到第25章再進(jìn)行討論午阵。
IP是網(wǎng)絡(luò)層上的主要協(xié)議躺孝,同時被TCP和UDP使用享扔。TCP和UDP的每組數(shù)據(jù)都通過端系統(tǒng)和每個中間路由器中的IP層在互聯(lián)網(wǎng)中進(jìn)行傳輸底桂。在圖1-4中,我們給出了一個直接訪問IP的應(yīng)用程序惧眠。這是很少見的籽懦,但也是可能的(一些較老的選路協(xié)議就是以這種方式來實(shí)現(xiàn)的。當(dāng)然新的運(yùn)輸層協(xié)議也有可能使用這種方式)氛魁。第3章主要討論IP協(xié)議暮顺,但是為了使內(nèi)容更加有針對性厅篓,一些細(xì)節(jié)將留在后面的章節(jié)中進(jìn)行討論。第9章和第10章討論IP如何進(jìn)行選路捶码。
ICMP是IP協(xié)議的附屬協(xié)議羽氮。IP層用它來與其他主機(jī)或路由器交換錯誤報(bào)文和其他重要信息。第6章對ICMP的有關(guān)細(xì)節(jié)進(jìn)行討論惫恼。盡管ICMP主要被IP使用档押,但應(yīng)用程序也有可能訪問它。我們將分析兩個流行的診斷工具祈纯,Ping和Traceroute(第7章和第8章)令宿,它們都使用了ICMP。
IGMP是Internet組管理協(xié)議腕窥。它用來把一個UDP數(shù)據(jù)報(bào)多播到多個主機(jī)粒没。我們在第12章中描述廣播(把一個UDP數(shù)據(jù)報(bào)發(fā)送到某個指定網(wǎng)絡(luò)上的所有主機(jī))和多播的一般特性,然后在第13章中對IGMP協(xié)議本身進(jìn)行描述簇爆。
ARP(地址解析協(xié)議)和RARP(逆地址解析協(xié)議)是某些網(wǎng)絡(luò)接口(如以太網(wǎng)和令牌環(huán)網(wǎng))使用的特殊協(xié)議癞松,用來轉(zhuǎn)換IP層和網(wǎng)絡(luò)接口層使用的地址。我們分別在第4章和第5章對這兩種協(xié)議進(jìn)行分析和介紹冕碟。
1.4 互聯(lián)網(wǎng)的地址
互聯(lián)網(wǎng)上的每個接口必須有一個唯一的Internet地址(也稱作IP地址)拦惋。IP地址長32 bit。Internet地址并不采用平面形式的地址空間安寺,如1厕妖、2、3等挑庶。IP地址具有一定的結(jié)構(gòu)言秸,五類不同的互聯(lián)網(wǎng)地址格式如圖1-5所示。
這些 32 位的地址通常寫成四個十進(jìn)制的數(shù),其中每個整數(shù)對應(yīng)一個字節(jié)迎捺。這種表示方法稱作“點(diǎn)分十進(jìn)制表示法(Dotted decimal notation)”举畸。例如,作者的系統(tǒng)就是一個 B 類地址,它表示為: 140.252.13.33。
區(qū)分各類地址的最簡單方法是看它的第一個十進(jìn) 制整數(shù)凳枝。圖 1-6 列出了各類地址的起止范圍抄沮,其中第一個十進(jìn)制整數(shù)用加黑字體表示。
需要再次指出的是岖瑰,多接口主機(jī)具有多個IP地址叛买,其中每個接口都對應(yīng)一個IP地址。
由于互聯(lián)網(wǎng)上的每個接口必須有一個唯一的IP地址蹋订,因此必須要有一個管理機(jī)構(gòu)為接入互聯(lián)網(wǎng)的網(wǎng)絡(luò)分配IP地址率挣。這個管理機(jī)構(gòu)就是互聯(lián)網(wǎng)絡(luò)信息中心(Internet Network Information Centre),稱作InterNIC露戒。InterNIC只分配網(wǎng)絡(luò)號椒功。主機(jī)號的分配由系統(tǒng)管理員來負(fù)責(zé)捶箱。
Internet注冊服務(wù)(IP地址和DNS域名)過去由NIC來負(fù)責(zé),其網(wǎng)絡(luò)地址是nic.ddn.mil动漾。1993年4月1日丁屎,InterNIC成立。現(xiàn)在旱眯,NIC只負(fù)責(zé)處理國防數(shù)據(jù)網(wǎng)的注冊請求悦屏,所有其他的Internet用戶注冊請求均由InterNIC負(fù)責(zé)處理,其網(wǎng)址是:rs.internic.net键思。
事實(shí)上InterNIC由三部分組成:注冊服務(wù)(rs.internic.net)础爬,目錄和數(shù)據(jù)庫服務(wù)(ds.internic.net),以及信息服務(wù)(is.internic.net)吼鳞。
有三類IP地址:單播地址(目的為單個主機(jī))看蚜、廣播地址(目的端為給定網(wǎng)絡(luò)上的所有主機(jī))以及多播地址(目的端為同一組內(nèi)的所有主機(jī))。第12章和第13章將分別討論廣播和多播的更多細(xì)節(jié)赔桌。
在3.4節(jié)中供炎,我們在介紹IP選路以后將進(jìn)一步介紹子網(wǎng)的概念。圖3-9給出了幾個特殊的IP地址:主機(jī)號和網(wǎng)絡(luò)號為全0或全1疾党。
1.5 域名系統(tǒng)
盡管通過IP地址可以識別主機(jī)上的網(wǎng)絡(luò)接口音诫,進(jìn)而訪問主機(jī),但是人們最喜歡使用的還是主機(jī)名雪位。在TCP/IP領(lǐng)域中竭钝,域名系統(tǒng)(DNS)是一個分布的數(shù)據(jù)庫,由它來提供IP地址和主機(jī)名之間的映射信息雹洗。我們在第14章將詳細(xì)討論DNS香罐。
現(xiàn)在,我們必須理解时肿,任何應(yīng)用程序都可以調(diào)用一個標(biāo)準(zhǔn)的庫函數(shù)來查看給定名字的主機(jī)的IP地址庇茫。類似地,系統(tǒng)還提供一個逆函數(shù)—給定主機(jī)的IP地址螃成,查看它所對應(yīng)的主機(jī)名旦签。
大多數(shù)使用主機(jī)名作為參數(shù)的應(yīng)用程序也可以把IP地址作為參數(shù)。例如寸宏,在第4章中當(dāng)我們用Telnet進(jìn)行遠(yuǎn)程登錄時宁炫,既可以指定一個主機(jī)名,也可以指定一個IP地址击吱。
1.6 封裝
當(dāng)應(yīng)用程序用TCP傳送數(shù)據(jù)時淋淀,數(shù)據(jù)被送入?yún)f(xié)議棧中遥昧,然后逐個通過每一層直到被當(dāng)作一串比特流送入網(wǎng)絡(luò)覆醇。其中每一層對收到的數(shù)據(jù)都要增加一些首部信息(有時還要增加尾部信息)朵纷,該過程如圖1-7所示。TCP傳給IP的數(shù)據(jù)單元稱作TCP報(bào)文段或簡稱為TCP段(TCP segment)永脓。IP傳給網(wǎng)絡(luò)接口層的數(shù)據(jù)單元稱作IP數(shù)據(jù)報(bào)(IP datagram)袍辞。通過以太網(wǎng)傳輸?shù)谋忍亓鞣Q作幀(Frame)。
圖1-7中幀頭和幀尾下面所標(biāo)注的數(shù)字是典型以太網(wǎng)幀首部的字節(jié)長度常摧。在后面的章節(jié)中我們將詳細(xì)討論這些幀頭的具體含義搅吁。以太網(wǎng)數(shù)據(jù)幀的物理特性是其長度必須在46~1500字節(jié)之間。我們將在4.5節(jié)遇到最小長度的數(shù)據(jù)幀落午,在2.8節(jié)中遇到最大長度的數(shù)據(jù)幀谎懦。
所有的Internet標(biāo)準(zhǔn)和大多數(shù)有關(guān)TCP/IP的書都使用octet這個術(shù)語來表示字節(jié)。使用這個過分雕琢的術(shù)語是有歷史原因的溃斋,因?yàn)門CP/IP的很多工作都是在DEC-10系統(tǒng)上進(jìn)行的界拦,但是它并不使用8bit的字節(jié)。由于現(xiàn)在幾乎所有的計(jì)算機(jī)系統(tǒng)都采用8bit的字節(jié)梗劫,因此我們在本書中使用字節(jié)(byte)這個術(shù)語享甸。
更準(zhǔn)確地說,圖1-7中IP和網(wǎng)絡(luò)接口層之間傳送的數(shù)據(jù)單元應(yīng)該是分組(packet)梳侨。分組既可以是一個IP數(shù)據(jù)報(bào)蛉威,也可以是IP數(shù)據(jù)報(bào)的一個片(fragment)。我們將在11.5節(jié)討論IP數(shù)據(jù)報(bào)分片的詳細(xì)情況走哺。
UDP數(shù)據(jù)與TCP數(shù)據(jù)基本一致蚯嫌。唯一的不同是UDP傳給IP的信息單元稱作UDP數(shù)據(jù)報(bào)(UDP datagram),而且UDP的首部長為8字節(jié)丙躏。
回想1.3節(jié)中的圖1-4齐帚,由于TCP、UDP彼哼、ICMP和IGMP都要向IP傳送數(shù)據(jù)对妄,因此IP必須在生成的IP首部中加入某種標(biāo)識,以表明數(shù)據(jù)屬于哪一層敢朱。為此剪菱,IP在首部中存入一個長度為8bit的數(shù)值,稱作協(xié)議域拴签。1表示為ICMP協(xié)議孝常,2表示為IGMP協(xié)議,6表示為TCP協(xié)議蚓哩,17表示為UDP協(xié)議构灸。
類似地,許多應(yīng)用程序都可以使用TCP或UDP來傳送數(shù)據(jù)岸梨。運(yùn)輸層協(xié)議在生成報(bào)文首部時要存入一個應(yīng)用程序的標(biāo)識符喜颁。TCP和UDP都用一個16bit的端口號來表示不同的應(yīng)用程序稠氮。TCP和UDP把源端口號和目的端口號分別存入報(bào)文首部中。
網(wǎng)絡(luò)接口分別要發(fā)送和接收IP半开、ARP和RARP數(shù)據(jù)隔披,因此也必須在以太網(wǎng)的幀首部中加入某種形式的標(biāo)識,以指明生成數(shù)據(jù)的網(wǎng)絡(luò)層協(xié)議寂拆。為此奢米,以太網(wǎng)的幀首部也有一個16 bit的幀類型域。
1.7 分用
當(dāng)目的主機(jī)收到一個以太網(wǎng)數(shù)據(jù)幀時纠永,數(shù)據(jù)就開始從協(xié)議棧中由底向上升鬓长,同時去掉各層協(xié)議加上的報(bào)文首部。每層協(xié)議盒都要去檢查報(bào)文首部中的協(xié)議標(biāo)識尝江,以確定接收數(shù)據(jù)的上層協(xié)議痢士。這個過程稱作分用(Demultiplexing),圖1-8顯示了該過程是如何發(fā)生的茂装。
為協(xié)議ICMP和IGMP定位一直是一件很棘手的事情怠蹂。在圖1-4中,把它們與IP放在同一層上少态,那是因?yàn)槭聦?shí)上它們是IP的附屬協(xié)議城侧。但是在這里,我們又把它們放在IP層的上面彼妻,這是因?yàn)镮CMP和IGMP報(bào)文都被封裝在IP數(shù)據(jù)報(bào)中嫌佑。
對于ARP和RARP,我們也遇到類似的難題侨歉。在這里把它們放在以太網(wǎng)設(shè)備驅(qū)動程序的上方屋摇,這是因?yàn)樗鼈兒虸P數(shù)據(jù)報(bào)一樣,都有各自的以太網(wǎng)數(shù)據(jù)幀類型幽邓。但在圖2-4中炮温,我們又把ARP作為以太網(wǎng)設(shè)備驅(qū)動程序的一部分,放在IP層的下面牵舵,其原因在邏輯上是合理的柒啤。
這些分層協(xié)議盒并不都是完美的。
當(dāng)進(jìn)一步描述TCP的細(xì)節(jié)時畸颅,我們將看到協(xié)議確實(shí)是通過目的端口號担巩、源IP地址和源端口號進(jìn)行解包的。
1.8 客戶-服務(wù)器模型
大部分網(wǎng)絡(luò)應(yīng)用程序在編寫時都假設(shè)一端是客戶没炒,另一端是服務(wù)器涛癌,其目的是為了讓服務(wù)器為客戶提供一些特定的服務(wù)。
可以將這種服務(wù)分為兩種類型:重復(fù)型或并發(fā)型。重復(fù)型服務(wù)器通過以下步驟進(jìn)行交互:
I1.等待一個客戶請求的到來拳话。
I2.處理客戶請求先匪。
I3.發(fā)送響應(yīng)給發(fā)送請求的客戶。
I4.返回I1步假颇。
重復(fù)型服務(wù)器主要的問題發(fā)生在I2狀態(tài)。在這個時候骨稿,它不能為其他客戶機(jī)提供服務(wù)笨鸡。相應(yīng)地,并發(fā)型服務(wù)器采用以下步驟:
C1.等待一個客戶請求的到來坦冠。
C2.啟動一個新的服務(wù)器來處理這個客戶的請求形耗。在這期間可能生成一個新的進(jìn)程、任務(wù)或線程辙浑,并依賴底層操作系統(tǒng)的支持激涤。這個步驟如何進(jìn)行取決于操作系統(tǒng)。生成的新服務(wù)器對客戶的全部請求進(jìn)行處理判呕。處理結(jié)束后倦踢,終止這個新服務(wù)器。
C3.返回C1步侠草。
并發(fā)服務(wù)器的優(yōu)點(diǎn)在于它是利用生成其他服務(wù)器的方法來處理客戶的請求辱挥。也就是說,每個客戶都有它自己對應(yīng)的服務(wù)器边涕。如果操作系統(tǒng)允許多任務(wù)晤碘,那么就可以同時為多個客戶服務(wù)。
對服務(wù)器功蜓,而不是對客戶進(jìn)行分類的原因是因?yàn)閷τ谝粋€客戶來說园爷,它通常并不能夠辨別自己是與一個重復(fù)型服務(wù)器或并發(fā)型服務(wù)器進(jìn)行對話。
一般來說式撼,TCP服務(wù)器是并發(fā)的童社,而UDP服務(wù)器是重復(fù)的,但也存在一些例外著隆。我們將在11.12節(jié)對UDP對其服務(wù)器產(chǎn)生的影響進(jìn)行詳細(xì)討論叠洗,并在18.11節(jié)對TCP對其服務(wù)器的影響進(jìn)行討論。
1.9 端口號
前面已經(jīng)指出過旅东,TCP和UDP采用16 bit的端口號來識別應(yīng)用程序灭抑。那么這些端口號是如何選擇的呢?
服務(wù)器一般都是通過知名端口號來識別的抵代。例如腾节,對于每個TCP/IP實(shí)現(xiàn)來說,F(xiàn)TP服務(wù)器的TCP端口號都是21,每個Telnet服務(wù)器的TCP端口號都是23案腺,每個TFTP(簡單文件傳送協(xié)議)服務(wù)器的UDP端口號都是69庆冕。任何TCP/IP實(shí)現(xiàn)所提供的服務(wù)都用知名的1~1023之間的端口號。這些知名端口號由Internet號分配機(jī)構(gòu)(Internet Assigned Numbers Authority, IANA)來管理劈榨。
到1992年為止访递,知名端口號介于1~255之間。256~1023之間的端口號通常都是由Unix系統(tǒng)占用同辣,以提供一些特定的Unix服務(wù)—也就是說拷姿,提供一些只有Unix系統(tǒng)才有的、而其他操作系統(tǒng)可能不提供的服務(wù)『岛現(xiàn)在IANA管理1~1023之間所有的端口號响巢。
Internet擴(kuò)展服務(wù)與Unix特定服務(wù)之間的一個差別就是Telnet和Rlogin。它們二者都允許通過計(jì)算機(jī)網(wǎng)絡(luò)登錄到其他主機(jī)上棒妨。Telnet是采用端口號為23的TCP/IP標(biāo)準(zhǔn)且?guī)缀蹩梢栽谒胁僮飨到y(tǒng)上進(jìn)行實(shí)現(xiàn)踪古。相反,Rlogin最開始時只是為Unix系統(tǒng)設(shè)計(jì)的(盡管許多非Unix系統(tǒng)現(xiàn)在也提供該服務(wù))券腔,因此在80年代初伏穆,它的有名端口號為513。
客戶端通常對它所使用的端口號并不關(guān)心纷纫,只需保證該端口號在本機(jī)上是唯一的就可以了蜈出。客戶端口號又稱作臨時端口號(即存在時間很短暫)涛酗。這是因?yàn)樗ǔV皇窃谟脩暨\(yùn)行該客戶程序時才存在铡原,而服務(wù)器則只要主機(jī)開著的,其服務(wù)就運(yùn)行商叹。
大多數(shù)TCP/IP實(shí)現(xiàn)給臨時端口分配1024~5000之間的端口號燕刻。大于5000的端口號是為其他服務(wù)器預(yù)留的(Internet上并不常用的服務(wù))。我們可以在后面看見許多這樣的給臨時端口分配端口號的例子剖笙。
Solaris 2.2是一個很有名的例外卵洗。通常TCP和UDP的缺省臨時端口號從32768開始。
在E.4節(jié)中弥咪,我們將詳細(xì)描述系統(tǒng)管理員如何對配置選項(xiàng)進(jìn)行修改以改變這些缺省項(xiàng)过蹂。
大多數(shù)Unix系統(tǒng)的文件/etc/services都包含了人們熟知的端口號。為了找到Telnet服務(wù)器和域名系統(tǒng)的端口號聚至,可以運(yùn)行以下語句:
Unix系統(tǒng)有保留端口號的概念酷勺。只有具有超級用戶特權(quán)的進(jìn)程才允許給它自己分配一個保留端口號。
這些端口號介于1~1023之間扳躬,一些應(yīng)用程序(如有名的Rlogin脆诉,26.2節(jié))將它作為客戶與服務(wù)器之間身份認(rèn)證的一部分甚亭。
1.10 標(biāo)準(zhǔn)化過程
究竟是誰控制著TCP/IP協(xié)議族,又是誰在定義新的標(biāo)準(zhǔn)以及其他類似的事情击胜?事實(shí)上亏狰,有四個小組在負(fù)責(zé)Internet技術(shù)。
1:Internet協(xié)會(ISOC偶摔,Internet Society)是一個推動暇唾、支持和促進(jìn)Internet不斷增長和發(fā)展的專業(yè)組織,它把Internet作為全球研究通信的基礎(chǔ)設(shè)施辰斋。
2:Internet體系結(jié)構(gòu)委員會(IAB策州,Internet Architecture Board)是一個技術(shù)監(jiān)督和協(xié)調(diào)的機(jī)構(gòu)。它由國際上來自不同專業(yè)的15個志愿者組成亡呵,其職能是負(fù)責(zé)Internet標(biāo)準(zhǔn)的最后編輯和技術(shù)審核抽活。IAB隸屬于ISOC硫戈。
3:Internet工程專門小組(IETF锰什,Internet Engineering Task Force)是一個面向近期標(biāo)準(zhǔn)的組織,它分為9個領(lǐng)域(應(yīng)用丁逝、尋徑和尋址汁胆、安全等等)。IETF開發(fā)成為Internet標(biāo)準(zhǔn)的規(guī)范霜幼。為幫助IETF主席嫩码,又成立了Internet工程指導(dǎo)小組(IESG, Internet Engineering Steering Group)。
4:Internet研究專門小組(IRIF罪既,Internet Research Task Force)主要對長遠(yuǎn)的項(xiàng)目進(jìn)行研究铸题。
IRTF和IETF都隸屬于IAB。文獻(xiàn)[Crocker 1993]提供了關(guān)于Internet內(nèi)部標(biāo)準(zhǔn)化進(jìn)程更為詳細(xì)的信息琢感,同時還介紹了它的早期歷史丢间。
1.11 RFC
所有關(guān)于Internet的正式標(biāo)準(zhǔn)都以RFC(Request for Comment)文檔出版。另外驹针,大量的RFC并不是正式的標(biāo)準(zhǔn)烘挫,出版的目的只是為了提供信息。RFC的篇幅從1頁到200頁不等柬甥。每一項(xiàng)都用一個數(shù)字來標(biāo)識饮六,如RFC 1122,數(shù)字越大說明RFC的內(nèi)容越新苛蒲。
所有的RFC都可以通過電子郵件或用FTP從Internet上免費(fèi)獲取卤橄。如果發(fā)送下面這份電子郵件,就會收到一份獲取RFC的方法清單:
To: rfc-info@ISI.EDU
Subject: getting rfcs
help: ways_to_get_rfcs
最新的RFC索引總是搜索信息的起點(diǎn)臂外。這個索引列出了RFC被替換或局部更新的時間虽风。下面是一些重要的RFC文檔:
1:賦值RFC(Assigned Numbers RFC)列出了所有Internet協(xié)議中使用的數(shù)字和常數(shù)棒口。至本書出版時為止,最新RFC的編號是1340[Reynolds 和 Postel 1992]辜膝。所有著名的Internet端口號都列在這里无牵。當(dāng)這個RFC被更新時(通常每年至少更新一次),索引清單會列出RFC 1340被替換的時間厂抖。
2:Internet正式協(xié)議標(biāo)準(zhǔn)茎毁,目前是RFC 1600[Postel 1994]。這個RFC描述了各種Internet協(xié)議的標(biāo)準(zhǔn)化現(xiàn)狀忱辅。每種協(xié)議都處于下面幾種標(biāo)準(zhǔn)化狀態(tài)之一:標(biāo)準(zhǔn)七蜘、草案標(biāo)準(zhǔn)、提議標(biāo)準(zhǔn)墙懂、實(shí)驗(yàn)標(biāo)準(zhǔn)橡卤、信息標(biāo)準(zhǔn)和歷史標(biāo)準(zhǔn)。另外损搬,對每種協(xié)議都有一個要求的層次碧库、必需的、建議的巧勤、可選擇的嵌灰、限制使用的或者不推薦的。與賦值RFC一樣颅悉,這個RFC也定期更新沽瞭。請隨時查看最新版本。
3:主機(jī)需求RFC剩瓶,1122和1123[Braden 1989a, 1989b]驹溃。RFC 1122針對鏈路層、網(wǎng)絡(luò)層和運(yùn)輸層延曙;RFC 1123針對應(yīng)用層豌鹤。這兩個RFC對早期重要的RFC文檔作了大量的糾正和解釋。如果要查看有關(guān)協(xié)議更詳細(xì)的細(xì)節(jié)內(nèi)容搂鲫,它們通常是一個入口點(diǎn)傍药。它們列出了協(xié)議中關(guān)于“必須”、“應(yīng)該”魂仍、“可以”拐辽、“不應(yīng)該”或者“不能”等特性及其實(shí)現(xiàn)細(xì)節(jié)。文獻(xiàn)[Borman 1993b]提供了有關(guān)這兩個RFC的實(shí)用內(nèi)容擦酌。RFC 1127[Braden 1989c]對工作小組開發(fā)主機(jī)需求RFC過程中的討論內(nèi)容和結(jié)論進(jìn)行了非正式的總結(jié)俱诸。
4:路由器需求RFC,目前正式版是RFC 1009[Braden and Postel 1987]赊舶,但一個新版已接近完成[Almquist 1993]睁搭。它與主機(jī)需求RFC類似赶诊,但是只單獨(dú)描述了路由器的需求。
1.12 標(biāo)準(zhǔn)的簡單服務(wù)
有一些標(biāo)準(zhǔn)的簡單服務(wù)幾乎每種實(shí)現(xiàn)都要提供园骆。在本書中我們將使用其中的一些服務(wù)程序舔痪,而客戶程序通常選擇Telnet。圖1-9描述了這些服務(wù)锌唾。從該圖可以看出锄码,當(dāng)使用TCP和UDP提供相同的服務(wù)時,一般選擇相同的端口號晌涕。
如果仔細(xì)檢查這些標(biāo)準(zhǔn)的簡單服務(wù)以及其他標(biāo)準(zhǔn)的TCP/IP服務(wù)(如Telnet滋捶、FTP、SMTP等)的端口號時余黎,我們發(fā)現(xiàn)它們都是奇數(shù)重窟。這是有歷史原因的,因?yàn)檫@些端口號都是從NCP端口號派生出來的(NCP惧财,即網(wǎng)絡(luò)控制協(xié)議巡扇,是ARPANET的運(yùn)輸層協(xié)議,是TCP的前身)可缚。NCP是單工的霎迫,不是全雙工的斋枢,因此每個應(yīng)用程序需要兩個連接帘靡,需預(yù)留一對奇數(shù)和偶數(shù)端口號。當(dāng)TCP和UDP成為標(biāo)準(zhǔn)的運(yùn)輸層協(xié)議時瓤帚,每個應(yīng)用程序只需要一個端口號描姚,因此就使用了NCP中的奇數(shù)。
1.13 互聯(lián)網(wǎng)
在圖1-3中戈次,我們列舉了一個由兩個網(wǎng)絡(luò)組成的互聯(lián)網(wǎng)——一個以太網(wǎng)和一個令牌環(huán)網(wǎng)轩勘。在1.4節(jié)和1.9節(jié)中,我們討論了世界范圍內(nèi)的互聯(lián)網(wǎng)—Internet怯邪,以及集中分配IP地址的需要(InterNIC)绊寻,還討論了知名端口號(IANA)。internet這個詞第一個字母是否大寫決定了它具有不同的含義悬秉。
internet意思是用一個共同的協(xié)議族把多個網(wǎng)絡(luò)連接在一起澄步。而Internet指的是世界范圍內(nèi)通過TCP/IP互相通信的所有主機(jī)集合(超過100萬臺)。Internet是一個internet和泌,但internet不等于Internet村缸。
1.14 實(shí)現(xiàn)
既成事實(shí)標(biāo)準(zhǔn)的TCP/IP軟件實(shí)現(xiàn)來自于位于伯克利的加利福尼亞大學(xué)的計(jì)算機(jī)系統(tǒng)研究小組。從歷史上看武氓,軟件是隨同4.x BSD系統(tǒng)(Berkeley Software Distribution)的網(wǎng)絡(luò)版一起發(fā)布的梯皿。它的源代碼是許多其他實(shí)現(xiàn)的基礎(chǔ)仇箱。
圖1-10列舉了各種BSD版本發(fā)布的時間,并標(biāo)注了重要的TCP/IP特性东羹。列在左邊的BSD網(wǎng)絡(luò)版剂桥,其所有的網(wǎng)絡(luò)源代碼可以公開得到:包括協(xié)議本身以及許多應(yīng)用程序和工具(如Telnet和FTP)。
在本書中属提,我們將使用“伯克利派生系統(tǒng)”來指SunOS 4.x渊额、SVR4以及AIX 3.2等那些基于伯克利源代碼開發(fā)的系統(tǒng)。這些系統(tǒng)有很多共同之處垒拢,經(jīng)常包含相同的錯誤旬迹。
起初關(guān)于Internet的很多研究現(xiàn)在仍然在伯克利系統(tǒng)中應(yīng)用——新的擁塞控制算法(21.7節(jié))、多播(12.4節(jié))求类、“長肥管道”修改(24.3節(jié))以及其他類似的研究奔垦。
1.15 應(yīng)用編程接口
使用TCP/IP協(xié)議的應(yīng)用程序通常采用兩種應(yīng)用編程接口(API):socket和TLI(運(yùn)輸層接口:Transport Layer Interface)。前者有時稱作“Berkeley socket”尸疆,表明它是從伯克利版發(fā)展而來的椿猎。后者起初是由AT&T開發(fā)的,有時稱作XTI(X/Open運(yùn)輸層接口)寿弱,以承認(rèn)X/Open這個自己定義標(biāo)準(zhǔn)的國際計(jì)算機(jī)生產(chǎn)商所做的工作犯眠。XTI實(shí)際上是TLI的一個超集。
本書不是一本編程方面的書症革,但是偶爾會引用一些內(nèi)容來說明TCP/IP的特性筐咧,不管大多數(shù)的API(socket)是否提供它們。所有關(guān)于socket和TLI的編程細(xì)節(jié)請參閱文獻(xiàn)[Stevens 1990]噪矛。
1.16 測試網(wǎng)絡(luò)
圖1-11是本書中所有的例子運(yùn)行的測試網(wǎng)絡(luò)量蕊。為閱讀時參考方便,該圖還復(fù)制在本書扉頁前的插頁中艇挨。
在這個圖中(作者的子網(wǎng)),大多數(shù)的例子都運(yùn)行在下面四個系統(tǒng)中缩滨。圖中所有的IP地址屬于B類地址势就,網(wǎng)絡(luò)號為140.252。所有的主機(jī)名屬于.tuc.noao.edu這個域(noao代表National Optical Astronomy Observatories脉漏,tuc代表Tu cson)苞冯。例如,右下方的系統(tǒng)有一個完整的名字:svr4.tuc.noao.edu鸠删,其IP地址是:140.252.13.34抱完。每個方框上方的名稱是該主機(jī)運(yùn)行的操作系統(tǒng)。這一組系統(tǒng)和網(wǎng)絡(luò)上的主機(jī)及路由器運(yùn)行于不同的TCP/IP實(shí)現(xiàn)刃泡。
需要指出的是巧娱,noao.edu這個域中的網(wǎng)絡(luò)和主機(jī)要比圖1-11中的多得多碉怔。這里列出來的只是本書中將要用到的系統(tǒng)。
在3.4節(jié)中禁添,我們將描述這個網(wǎng)絡(luò)所用到的子網(wǎng)形式撮胧。在4.6節(jié)中將介紹sun與netb之間的撥號SLIP的有關(guān)細(xì)節(jié)。2.4節(jié)將詳細(xì)討論SLIP老翘。
1.17 小結(jié)
本章快速地瀏覽了TCP/IP協(xié)議族芹啥,介紹了在后面的章節(jié)中將要詳細(xì)討論的許多術(shù)語和協(xié)議。
TCP/IP協(xié)議族分為四層:鏈路層铺峭、網(wǎng)絡(luò)層墓怀、運(yùn)輸層和應(yīng)用層,每一層各有不同的責(zé)任卫键。在TCP/IP中傀履,網(wǎng)絡(luò)層和運(yùn)輸層之間的區(qū)別是最為關(guān)鍵的:網(wǎng)絡(luò)層(IP)提供點(diǎn)到點(diǎn)的服務(wù),而運(yùn)輸層(TCP和UDP)提供端到端的服務(wù)莉炉。
一個互聯(lián)網(wǎng)是網(wǎng)絡(luò)的網(wǎng)絡(luò)钓账。構(gòu)造互聯(lián)網(wǎng)的共同基石是路由器,它們在IP層把網(wǎng)絡(luò)連在一起絮宁。第一個字母大寫的Internet是指分布在世界各地的大型互聯(lián)網(wǎng)梆暮,其中包括1萬多個網(wǎng)絡(luò)和超過100萬臺主機(jī)。
在一個互聯(lián)網(wǎng)上绍昂,每個接口都用IP地址來標(biāo)識啦粹,盡管用戶習(xí)慣使用主機(jī)名而不是IP地址。域名系統(tǒng)為主機(jī)名和IP地址之間提供動態(tài)的映射治专。端口號用來標(biāo)識互相通信的應(yīng)用程序卖陵。服務(wù)器使用知名端口號遭顶,而客戶使用臨時設(shè)定的端口號张峰。