TCPIP協(xié)議規(guī)范及UIP處理流程_第1頁(yè)
TCPIP協(xié)議規(guī)范及UIP處理流程_第2頁(yè)
TCPIP協(xié)議規(guī)范及UIP處理流程_第3頁(yè)
TCPIP協(xié)議規(guī)范及UIP處理流程_第4頁(yè)
TCPIP協(xié)議規(guī)范及UIP處理流程_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

H:\精品資料\建筑精品網(wǎng)原稿ok(刪除公文)\建筑精品網(wǎng)5未上傳百度目錄一、 簡(jiǎn)要?dú)v史 3二、 TCP/IP協(xié)議族 32.1. 簡(jiǎn)介 32.2. 編址 32.2.1 物理地址 32.2.2 邏輯地址 42.2.3 端口地址 52.3. 分層數(shù)據(jù)包介紹 52.3.1 以太網(wǎng)幀 52.3.2 ARP報(bào)文格式 62.3.3 IP數(shù)據(jù)報(bào)格式 62.3.4 ICMP報(bào)文格式 72.3.5 IGMP報(bào)文格式 92.3.6 UDP用戶(hù)數(shù)據(jù)報(bào)首部格式 92.3.7 TCP報(bào)文段格式 102.4. 分層協(xié)議講解 112.4.1 ARP和RARP 122.4.2 IP協(xié)議 132.4.3 ICMP協(xié)議 132.4.4 網(wǎng)際組管理協(xié)議(IGMP) 162.4.5 用戶(hù)數(shù)據(jù)報(bào)(UDP) 172.4.6 傳輸控制協(xié)議(TCP) 18三、 UIP處理流程 203.1. 簡(jiǎn)介 203.2. 層次結(jié)構(gòu) 203.2.1 實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)與UIP對(duì)接需要的7個(gè)接口程序,定義在uip.h: 213.2.2 應(yīng)用層要調(diào)用的函數(shù),包括一些宏定義與函數(shù),定義在uip.h: 243.2.3 UIP中所用到的主要結(jié)構(gòu)體 273.2.4 uip的初始化與配置函數(shù) 313.2.5 Uip的主程序循環(huán) 323.2.6 主要的處理函數(shù)uip_process() 343.2.7 再來(lái)分析UIP_UDP_SEND_CONN,主要處理UDP報(bào)文的發(fā)送: 373.2.8 接下來(lái),分析UIP_POLL_REQUEST 383.2.9 對(duì)定時(shí)器期滿(mǎn)的處理流程UIP_TIMER 403.2.10 對(duì)UIP_UDP_TIMER的處理流程 413.2.11 原始套接字和原始線程 41簡(jiǎn)要?dú)v史1973年,ARPANET核心組成員VintCerf和BobKahn發(fā)表了一篇里程碑論文,闡述了實(shí)現(xiàn)分組的端到端交付的協(xié)議。這篇關(guān)于傳輸控制協(xié)議(TCP)的論文包括:封裝、數(shù)據(jù)報(bào),以及網(wǎng)關(guān)的功能。后來(lái),TCP被劃分為兩個(gè)協(xié)議:傳輸控制協(xié)議(TCP)和網(wǎng)際互聯(lián)協(xié)議(IP)。IP處理數(shù)據(jù)報(bào)的路由選擇,而TCP負(fù)責(zé)高層的一些功能,如分段、重裝和差錯(cuò)檢測(cè)。這個(gè)用來(lái)進(jìn)行網(wǎng)際互聯(lián)的協(xié)議后來(lái)就被稱(chēng)為T(mén)CP/IP。TCP/IP協(xié)議族簡(jiǎn)介T(mén)CP/IP協(xié)議族由5層組成:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、運(yùn)輸層和應(yīng)用層。前四層與OSI模型的前四層相對(duì)應(yīng),提供物理標(biāo)準(zhǔn)、網(wǎng)絡(luò)接口、網(wǎng)際互聯(lián)、以及運(yùn)輸功能。而應(yīng)用層與OSI模型中最高的三層相對(duì)應(yīng)。TCP/IP協(xié)議族中的各層包含了一些相對(duì)獨(dú)立的協(xié)議。在物理層和數(shù)據(jù)鏈路層,TCP/IP并沒(méi)有定義任何協(xié)議。在網(wǎng)絡(luò)層TCP/IP支持網(wǎng)際互聯(lián)協(xié)議(IP),而IP又由四個(gè)支撐協(xié)議組成:ARP、RARP、ICMP和IGMP。在傳統(tǒng)上,TCP/IP協(xié)議族在運(yùn)輸層有兩個(gè)運(yùn)輸協(xié)議:TCP和UDP,然而現(xiàn)在已經(jīng)設(shè)計(jì)出一個(gè)新的運(yùn)輸層協(xié)議SCTP以滿(mǎn)足新的應(yīng)用的需要。IP是主機(jī)到主機(jī)的協(xié)議,即把分組從一個(gè)物理設(shè)備交付到另一個(gè)物理設(shè)備。UDP和TCP是運(yùn)輸機(jī)協(xié)議,負(fù)責(zé)把報(bào)文從一個(gè)進(jìn)程(運(yùn)行著的程序)交付到另一個(gè)進(jìn)程。編址使用TCP/IP協(xié)議的互聯(lián)網(wǎng)使用3個(gè)等級(jí)的地址:物理(鏈路)地址、邏輯(IP)地址以及端口地址。每一種地址屬于TCP/IP體系結(jié)構(gòu)中的特定層。物理地址物理地址也叫鏈路地址,是結(jié)點(diǎn)的地址,由它所在的局域網(wǎng)或廣域網(wǎng)定義。物理地址包含在數(shù)據(jù)鏈路層使用的幀中。以太網(wǎng)的地址是6字節(jié)(48位)長(zhǎng),一般見(jiàn)十六進(jìn)制記法,如:07:01:02:01:2C:4B。以太網(wǎng)的地址共3種:單播、多播和廣播。在單播地址中的第一個(gè)字節(jié)的最低位0;在多播地址中的第一個(gè)字節(jié)的最低位是1。廣播地址是48個(gè)1。邏輯地址因特網(wǎng)的邏輯地址是32位地址,能夠用來(lái)標(biāo)志連接在因特網(wǎng)上的每個(gè)主機(jī)。在因特網(wǎng)上沒(méi)有兩個(gè)主機(jī)有相同的IP地址。同樣,邏輯地址也能夠是單播地址、多播地址和廣播地址。Internet被各種路由器和網(wǎng)關(guān)設(shè)備分隔成很多網(wǎng)段,為了標(biāo)識(shí)不同的網(wǎng)段,需要把32位的IP地址劃分成網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩部分,網(wǎng)絡(luò)號(hào)相同的各主機(jī)位于同一網(wǎng)段,相互間能夠直接通信,網(wǎng)絡(luò)號(hào)不同的主機(jī)之間通信則需要經(jīng)過(guò)路由器轉(zhuǎn)發(fā)。把所有IP地址分為五類(lèi),如下圖1所示:圖2-SEQ圖表\*ARABIC1A類(lèi)

0.0.0.0到127.255.255.255

B類(lèi)

128.0.0.0到191.255.255.255

C類(lèi)

192.0.0.0到223.255.255.255

D類(lèi)

224.0.0.0到239.255.255.255

E類(lèi)

240.0.0.0到247.255.255.255在分類(lèi)編址的A類(lèi)、B類(lèi)、C類(lèi)地址中,IP地址可劃分為net-id(網(wǎng)絡(luò)標(biāo)識(shí))和host-id(主機(jī)標(biāo)識(shí))。對(duì)于A類(lèi)地址,1字節(jié)定義net-id而3字節(jié)定義host-id。對(duì)于B類(lèi)地址,2字節(jié)定義net-id,2字節(jié)定義host-id。對(duì)于C類(lèi)地址,3字節(jié)定義net-id而1字節(jié)定義host-id。D類(lèi)地址和E類(lèi)地址不劃分net-id和host-id。網(wǎng)絡(luò)地址是一個(gè)地址塊的第一個(gè)地址,向因特網(wǎng)的其余部分定義這個(gè)網(wǎng)絡(luò)。路由器就是根據(jù)網(wǎng)絡(luò)地址來(lái)選擇分組的路由。若給出網(wǎng)絡(luò)地址,我們就能夠找出這個(gè)地址的類(lèi)別、地址塊以及這個(gè)地址塊的地址范圍。這種劃分方案有很大的局限性,它對(duì)網(wǎng)絡(luò)的劃分是flat的而不是層級(jí)結(jié)構(gòu)(hierarchical)的。Internet上的每個(gè)路由器都必須掌握所有網(wǎng)絡(luò)的信息,隨著大量C類(lèi)網(wǎng)絡(luò)的出現(xiàn),路由器需要檢索的路由表越來(lái)越龐大,負(fù)擔(dān)越來(lái)越重。于是提出了新的劃分方案,稱(chēng)為CIDR(ClasslessInterdomainRouting)。網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的劃分需要用一個(gè)額外的子網(wǎng)掩碼(subnetmask)來(lái)表示,而不能由IP地址本身的數(shù)值決定,也就是說(shuō),網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的劃分與這個(gè)IP地址是A類(lèi)、B類(lèi)還是C類(lèi)無(wú)關(guān),因此稱(chēng)為Classless的。這樣,多個(gè)子網(wǎng)就能夠匯總(summarize)成一個(gè)Internet上的網(wǎng)絡(luò)。IP地址與子網(wǎng)掩碼做與運(yùn)算能夠得到網(wǎng)絡(luò)號(hào),主機(jī)號(hào)從全0到全1就是子網(wǎng)的地址范圍。IP地址和子網(wǎng)掩碼還有一種更簡(jiǎn)潔的表示方法,例如140.252.20.68/24,表示IP地址為140.252.20.68,子網(wǎng)掩碼的高24位是1,也就是255.255.255.0。目的地址為255.255.255.255,表示本網(wǎng)絡(luò)內(nèi)部廣播,路由器不轉(zhuǎn)發(fā)這樣的廣播數(shù)據(jù)包。目的地址的主機(jī)號(hào)為全1,表示廣播至某個(gè)網(wǎng)絡(luò)的所有主機(jī),例如目的地址192.168.10.255表示廣播至192.168.10.0網(wǎng)絡(luò)(假設(shè)子網(wǎng)掩碼為255.255.255.0)。端口地址計(jì)算機(jī)是多進(jìn)程設(shè)備,即能夠在同一時(shí)間運(yùn)行多個(gè)進(jìn)程。因特網(wǎng)通信的最終目的是使一個(gè)進(jìn)程能夠和另一個(gè)進(jìn)程通信。為了能夠同時(shí)發(fā)生這些事情,需要有一種方法對(duì)不同的進(jìn)程打上標(biāo)號(hào),就是說(shuō)這些進(jìn)程需要地址。在TCP/IP體系結(jié)構(gòu)中,給一個(gè)進(jìn)程指派的標(biāo)號(hào)叫做端口地址。TCP/IP中的端口地址是16位長(zhǎng),一般見(jiàn)10進(jìn)制數(shù)表示。分層數(shù)據(jù)包介紹以太網(wǎng)幀圖2-SEQ圖表\*ARABIC2目的地址(DA)DA字段有6字節(jié),是下一站的物理地址(也叫MAC地址)。源地址(SA)SA字段有6字節(jié),是前一站的物理地址。類(lèi)型類(lèi)型字段有三種值,分別對(duì)應(yīng)IP、ARP、RARP。數(shù)據(jù)攜帶從上層協(xié)議封裝起來(lái)的數(shù)據(jù)。它的最小長(zhǎng)度是46字節(jié),最大長(zhǎng)度是1500字節(jié)。ARP、RARP的數(shù)據(jù)包長(zhǎng)度不夠46字節(jié),要在后面補(bǔ)填充位。最大值1500稱(chēng)為以太網(wǎng)的最大傳輸單元(MTU),如果一個(gè)數(shù)據(jù)包從以太網(wǎng)路由到鏈路上,數(shù)據(jù)包的長(zhǎng)度大于鏈路的MTU了,則需要對(duì)數(shù)據(jù)包進(jìn)行分片CRC差錯(cuò)檢測(cè)信息,4字節(jié)。ARP報(bào)文格式圖2-SEQ圖表\*ARABIC3如上圖3所示,ARP分組的格式如下:硬件類(lèi)型16位字段,用來(lái)定義運(yùn)行ARP的鏈路層網(wǎng)絡(luò)的類(lèi)型。以太網(wǎng)是類(lèi)型1。協(xié)議類(lèi)型16位字段,指要轉(zhuǎn)換的地址類(lèi)型。0x0800位IP地址。硬件長(zhǎng)度8位字段,定義以字節(jié)為單位的物理地址長(zhǎng)度。對(duì)以太網(wǎng)這個(gè)值為6。協(xié)議長(zhǎng)度8位字段,定義以字節(jié)為單位的邏輯地址長(zhǎng)度。對(duì)IPv4協(xié)議這個(gè)值是4。操作16位字段,定義分組的類(lèi)型。為1表示ARP請(qǐng)求,為2表示ARP應(yīng)答。發(fā)送端硬件地址可變長(zhǎng)度字段,定義發(fā)送端的物理地址。發(fā)送端協(xié)議地址定義發(fā)送端的邏輯地址。目標(biāo)硬件地址定義目標(biāo)的物理地址。對(duì)于ARP請(qǐng)求報(bào)文,這個(gè)字段是全0,因?yàn)榘l(fā)送端不知道目標(biāo)的物理地址。目標(biāo)協(xié)議地址定義目標(biāo)的邏輯(如,IP)地址。IP數(shù)據(jù)報(bào)格式圖2-4如上圖4所示,IP數(shù)據(jù)報(bào)的結(jié)構(gòu)包括:版本(VER)這個(gè)4位字段定義IP協(xié)議的版本。首部長(zhǎng)度(HLEN)這個(gè)4位字段定義IP首部總長(zhǎng)度,以4字節(jié)為單位計(jì)算。當(dāng)沒(méi)有選項(xiàng)時(shí),首部長(zhǎng)度是20字節(jié),這個(gè)字段的值是5(5*4=20)。當(dāng)選項(xiàng)字段位最大值時(shí),這個(gè)字段的值是15(15*4=60)。服務(wù)類(lèi)型(DS)TOS位是4位子字段,共有5種不同的服務(wù)類(lèi)型??傞L(zhǎng)度這個(gè)16位字段定義了以字節(jié)計(jì)的數(shù)據(jù)報(bào)總長(zhǎng)度(首部加上數(shù)據(jù))。要找出上層傳來(lái)的數(shù)據(jù)長(zhǎng)度,能夠從總長(zhǎng)度減去首部長(zhǎng)度??傞L(zhǎng)度字段是16位,因此IP數(shù)據(jù)報(bào)的長(zhǎng)度限制是65535(216-1)字節(jié)。標(biāo)識(shí)(Identification)這個(gè)16位字段與源IP地址一起唯一地定義這個(gè)數(shù)據(jù)報(bào)。IP協(xié)議使用一個(gè)計(jì)數(shù)器來(lái)標(biāo)志數(shù)據(jù)報(bào),當(dāng)IP協(xié)議發(fā)送數(shù)據(jù)時(shí),就把這個(gè)計(jì)數(shù)器的當(dāng)前值復(fù)制到標(biāo)識(shí)字段中,并加1。當(dāng)數(shù)據(jù)報(bào)被分片時(shí),標(biāo)識(shí)字段的值就復(fù)制到所有的分片中。換言之,所有的分片具有相同的標(biāo)識(shí)號(hào),即原始數(shù)據(jù)報(bào)的標(biāo)識(shí)號(hào)。在終點(diǎn)重裝數(shù)據(jù)報(bào)時(shí),終點(diǎn)就知道所有具有相同標(biāo)識(shí)號(hào)的分片必須組裝成一個(gè)數(shù)據(jù)報(bào)。標(biāo)志(Flags)3位字段。第一位保留。第二位為不分片位,為1表示不對(duì)數(shù)據(jù)報(bào)進(jìn)行分片;為0表示在需要時(shí)對(duì)數(shù)據(jù)報(bào)進(jìn)行分片。第三位為分片位,為1表示這個(gè)數(shù)據(jù)報(bào)不是最后的分片,在其后還有分片;為0表示這個(gè)數(shù)據(jù)報(bào)是最后的分片。分片偏移(FragmentOffset)這個(gè)13位字段表示該分片在整個(gè)數(shù)據(jù)報(bào)中的相對(duì)位置,以8字節(jié)為度量單位。生存時(shí)間(TTL)用來(lái)控制數(shù)據(jù)報(bào)所經(jīng)過(guò)的最大路由跳數(shù),這個(gè)生存時(shí)間的單位不是秒,而是跳(hop)。協(xié)議這個(gè)8位字段定義使用IP層服務(wù)的高層協(xié)議。如:TCP、UDP、ICMP和IGMP等。檢驗(yàn)和IP分組中的檢驗(yàn)和只在首部而不在數(shù)據(jù)部分進(jìn)行。因?yàn)?所有將數(shù)據(jù)封裝在IP數(shù)據(jù)報(bào)中的高層協(xié)議,都有覆蓋整個(gè)分組的檢驗(yàn)和;其次,,每經(jīng)過(guò)一個(gè)路由器,IP數(shù)據(jù)報(bào)的首部就要改變一次,但數(shù)據(jù)部分不變。因此檢驗(yàn)和只對(duì)發(fā)生變化的部分進(jìn)行檢驗(yàn)。源地址這個(gè)32位字段定義源點(diǎn)的IP地址。在IP數(shù)據(jù)報(bào)從源主機(jī)發(fā)送到目的主機(jī)的時(shí)間內(nèi),這個(gè)字段必須保持不變。目的地址這個(gè)32位字段定義了終點(diǎn)的IP地址。在IP數(shù)據(jù)報(bào)從源主機(jī)發(fā)送到目的主機(jī)的時(shí)間內(nèi),這個(gè)字段必須保持不變。ICMP報(bào)文格式類(lèi)型8位字段,定義ICMP報(bào)文的類(lèi)型。ICMP報(bào)文的類(lèi)型有:終點(diǎn)不可達(dá)、源點(diǎn)抑制、超時(shí)、參數(shù)問(wèn)題、改變路由、回送請(qǐng)求或回答、時(shí)間戳請(qǐng)求或回答、地址掩碼請(qǐng)求或回答、路由器詢(xún)問(wèn)和通告。代碼8位字段,指明了發(fā)送這個(gè)特定報(bào)文類(lèi)型的原因。檢驗(yàn)和(icmpchksum)16位字段。在ICMP中,檢驗(yàn)和的計(jì)算覆蓋了整個(gè)報(bào)文(首部和數(shù)據(jù))。ICMP回送請(qǐng)求或回答報(bào)文頭格式如下圖5所示:圖2-5ICMP終點(diǎn)不可達(dá)報(bào)文頭格式如下圖6所示:圖2-6ICMP超時(shí)報(bào)文頭格式如下圖7所示:圖2-7IGMP報(bào)文格式圖2-8類(lèi)型8位字段,定義了查詢(xún)、成員關(guān)系報(bào)告、退出報(bào)告三種報(bào)文類(lèi)型,類(lèi)型值分別為0x11、0x16、0x17。最大響應(yīng)時(shí)間8位字段,定義了查詢(xún)必須在多長(zhǎng)時(shí)間內(nèi)回答。它的值以十分之一秒位單位。在查詢(xún)報(bào)文中這個(gè)值不是零,但在其它兩種報(bào)文中則置為零。檢驗(yàn)和16位字段,檢驗(yàn)和在8字節(jié)的報(bào)文上計(jì)算。組地址在一般查詢(xún)報(bào)文中這個(gè)字段的值為0,在特殊查詢(xún)報(bào)文、成員關(guān)系報(bào)告報(bào)文以及退出報(bào)告報(bào)文中定義groupid(組多播地址)。UDP用戶(hù)數(shù)據(jù)報(bào)首部格式圖2-9UDP數(shù)據(jù)報(bào)格式如上圖9所示。用戶(hù)數(shù)據(jù)報(bào)有8個(gè)字節(jié)的固定首部。源端口號(hào)16位字段,定義源主機(jī)上運(yùn)行的進(jìn)程所使用的端口號(hào)。目的端口號(hào)16位字段,定義目的主機(jī)上運(yùn)行的進(jìn)程使用的端口號(hào)。長(zhǎng)度16位字段,定義了用戶(hù)數(shù)據(jù)報(bào)的總長(zhǎng)度,首部加上數(shù)據(jù)。檢驗(yàn)和16位字段,UDP的檢驗(yàn)和包括三部分:偽首部、UDP首部以及從應(yīng)用層來(lái)的數(shù)據(jù)。位首部是IP分組的首部的一部分,包括:源IP地址、目的IP地址、8位協(xié)議和16位UDP總長(zhǎng)度。位首部能夠保證在IP首部受到損傷時(shí),用戶(hù)數(shù)據(jù)報(bào)能夠交付到正確的主機(jī)。協(xié)議字段的加入,能夠確保這個(gè)分組是屬于UDP而不是屬于TCP。TCP報(bào)文段格式圖2-10如上圖10所示,TCP報(bào)文段的結(jié)構(gòu)包括:源端口地址這個(gè)16位字段定義發(fā)送報(bào)文段的應(yīng)用程序端口號(hào)。目的端口地址這個(gè)16位字段定義了接收該報(bào)文段的應(yīng)用程序端口號(hào)。序號(hào)這個(gè)32位字段定義了指派給本報(bào)文段第一個(gè)數(shù)據(jù)字節(jié)的一個(gè)號(hào)。為了保證連通性,要發(fā)送的每一個(gè)字節(jié)都要編號(hào)。序號(hào)告訴終點(diǎn),這個(gè)序列中的哪一個(gè)字節(jié)是報(bào)文段中的第一個(gè)字節(jié)。在連接建立時(shí),每一方使用隨機(jī)數(shù)產(chǎn)生器產(chǎn)生初始序號(hào)(ISN)。確認(rèn)號(hào)32位字段,定義了報(bào)文段接收端期望從對(duì)方接收的下一個(gè)序號(hào)。如果報(bào)文段的接收端成功地發(fā)送了對(duì)方發(fā)來(lái)的序號(hào)x,它就把確認(rèn)號(hào)定義為x+1。首部長(zhǎng)度(tcpoffset)4位字段,指出TCP首部共有多少個(gè)4字節(jié)字。即TCP數(shù)據(jù)在IP數(shù)據(jù)中的偏移大小。同IP首部長(zhǎng)度,能夠在5至15之間。保留位該6位字段留待今后使用??刂?標(biāo)志位該字段定義了6種不同的控制位或標(biāo)志,在同一時(shí)間可設(shè)置一位或多位標(biāo)志。表2-1控制字段各標(biāo)志說(shuō)明(從高位到低位)標(biāo)志說(shuō)明URG緊急指針字段值有效ACK確認(rèn)字段值有效PSH推送數(shù)據(jù)RST連接必須復(fù)位SYN在連接建立時(shí)對(duì)序號(hào)進(jìn)行同步FIN終止連接窗口值該字段定義接收方必須維持的窗口值(以字節(jié)為單位)。注意,該字段是16位長(zhǎng),因此窗口值的最大長(zhǎng)度為65535字節(jié)。這個(gè)值由接收端來(lái)確定,發(fā)送端必須服從接收端的決定。檢驗(yàn)和這個(gè)16位字段包含檢驗(yàn)和,TCP使用檢驗(yàn)和是強(qiáng)制性的。緊急指針當(dāng)緊急標(biāo)志位置位時(shí),這個(gè)16位字段才有效,這時(shí)的報(bào)文段中包括緊急數(shù)據(jù)。緊急指針定義了一個(gè)數(shù),把這個(gè)數(shù)加到序號(hào)上就得出報(bào)文段數(shù)據(jù)部分中最后一個(gè)緊急字節(jié)。選項(xiàng)包括無(wú)操作(NOP)、最大報(bào)文段長(zhǎng)度(MSS)、窗口擴(kuò)大因子、時(shí)間戳等。分層協(xié)議講解總的來(lái)說(shuō),TCP/IP協(xié)議的多路選擇過(guò)程能夠表示為下圖2-11:圖2-11ARP和RARP地址解析協(xié)議ARP在任何時(shí)候,當(dāng)主機(jī)或路由器有數(shù)據(jù)報(bào)要發(fā)送給另一個(gè)主機(jī)或路由器時(shí),它必須有接收端的邏輯(IP)地址??墒荌P數(shù)據(jù)報(bào)必須封裝成幀才能經(jīng)過(guò)物理網(wǎng)絡(luò)。這就表示,發(fā)送端必須有接收端的物理地址,因此需要有從邏輯地址到物理地址的映射。地址解析協(xié)議(ARP)用來(lái)把IP地址與其物理地址聯(lián)系起來(lái)。任何時(shí)候當(dāng)主機(jī)或路由器需要找出這個(gè)網(wǎng)絡(luò)上的另一個(gè)主機(jī)或路由器的物理地址時(shí),它就發(fā)送ARP查詢(xún)分組。這個(gè)分組包括發(fā)送端的物理地址和IP地址,以及接收端的IP地址。因?yàn)榘l(fā)送端不知道接收端的物理地址,查詢(xún)就在網(wǎng)絡(luò)上廣播。例如,數(shù)據(jù)包要發(fā)送給IP地址為192.168.0.1的主機(jī),過(guò)程如下:源主機(jī)發(fā)出ARP請(qǐng)求,詢(xún)問(wèn)”IP地址是192.168.0.1的主機(jī)的硬件地址是多少”,并將這個(gè)請(qǐng)求廣播到本地網(wǎng)段(以太網(wǎng)幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機(jī)接收到廣播的ARP請(qǐng)求,發(fā)現(xiàn)其中的IP地址與本機(jī)相符,則發(fā)送一個(gè)ARP應(yīng)答數(shù)據(jù)包給源主機(jī),將自己的硬件地址填寫(xiě)在應(yīng)答包中。ARP報(bào)文格式如前所述。ARP軟件包由5個(gè)構(gòu)件組成:高速緩存表:每臺(tái)主機(jī)都維護(hù)一個(gè)ARP高速緩存表,由于高速緩存表的空間非常有限,因此緩存表中的表項(xiàng)有過(guò)期時(shí)間(一般為20分鐘),如果20分鐘內(nèi)沒(méi)有再次使用某個(gè)表項(xiàng),則該表項(xiàng)失效,下次還要發(fā)ARP請(qǐng)求來(lái)獲得目的主機(jī)的硬件地址。隊(duì)列:隊(duì)列用來(lái)在ARP試圖解析硬件地址時(shí)保留IP分組。輸出模塊把未解析的分組發(fā)送到相應(yīng)的隊(duì)列,輸入模塊從一個(gè)隊(duì)列中拿走一個(gè)分組,并連同解析出的物理地址一同發(fā)送給數(shù)據(jù)鏈路層來(lái)傳輸。輸出模塊:輸出模塊從IP軟件等待IP分組。輸出模塊檢查高速緩存表,尋找是否有某個(gè)項(xiàng)目對(duì)應(yīng)于這個(gè)分組的目的IP地址。這個(gè)IP分組的目的IP地址必須與這個(gè)項(xiàng)目的協(xié)議地址相匹配。輸入模塊:輸入模塊一直等待,直到有ARP分組到達(dá)。檢查高速緩存表,尋找對(duì)應(yīng)這個(gè)ARP分組的項(xiàng)目。輸入模塊設(shè)置這個(gè)項(xiàng)目的超時(shí)時(shí)間TIME-OUT。若隊(duì)列為空,則從相應(yīng)隊(duì)列中把分組一個(gè)接一個(gè)地取出,連同其硬件地址一起交給數(shù)據(jù)鏈路層來(lái)處理。高速緩存控制模塊:負(fù)責(zé)維護(hù)高速緩存表,它周期性地逐項(xiàng)檢查高速緩存表,判斷有哪些項(xiàng)目到期,哪些隊(duì)列需要撤銷(xiāo)。逆地址解析協(xié)議RARP當(dāng)一個(gè)主機(jī)知道自己的物理地址時(shí),RARP可用來(lái)找出其邏輯地址。每一個(gè)主機(jī)或路由器都被指派一個(gè)或多個(gè)邏輯地址,這些地址與機(jī)器的物理地址無(wú)關(guān)。要?jiǎng)?chuàng)立IP數(shù)據(jù)報(bào),主機(jī)或路由器要知道它自己的IP地址。能夠使用RARP協(xié)議從物理地址得到邏輯地址。知道物理地址后,先創(chuàng)立RARP請(qǐng)求,并在本地網(wǎng)絡(luò)上廣播。在本地網(wǎng)絡(luò)上的另一個(gè)機(jī)器知道所有的IP地址,它就用RARP回答來(lái)響應(yīng)。請(qǐng)求的機(jī)器必須運(yùn)行RARP客戶(hù)程序;而響應(yīng)的機(jī)器必須運(yùn)行RARP服務(wù)器程序。IP協(xié)議IP數(shù)據(jù)報(bào)的格式如前所述。IP是不可靠的無(wú)連接協(xié)議,負(fù)責(zé)源點(diǎn)到終點(diǎn)的交付。在IP層的分組叫做數(shù)據(jù)報(bào)。數(shù)據(jù)鏈路層有自己的幀格式,在這個(gè)格式中有一個(gè)字段是”數(shù)據(jù)字段最大長(zhǎng)度”。當(dāng)數(shù)據(jù)報(bào)封裝成幀時(shí),數(shù)據(jù)報(bào)的總長(zhǎng)度必須小于這個(gè)數(shù)據(jù)字段最大長(zhǎng)度(MTU)。對(duì)數(shù)據(jù)報(bào)進(jìn)行分割,叫做分片。源站一般不對(duì)IP分組進(jìn)行分片。運(yùn)輸層會(huì)進(jìn)行分片工作,把數(shù)據(jù)劃分成IP和在使用的數(shù)據(jù)鏈路層都可能接納的大小。數(shù)據(jù)報(bào)在到達(dá)終點(diǎn)之前能夠經(jīng)過(guò)多次分片,能夠被源主機(jī)或在其路徑上任何路由器進(jìn)行分片。然而數(shù)據(jù)報(bào)的重組卻只能在目的主機(jī)上進(jìn)行。在IP分組中的檢驗(yàn)和只在首部而不在數(shù)據(jù)部分心進(jìn)行。因?yàn)?首先所有將數(shù)據(jù)封裝在IP數(shù)據(jù)報(bào)中的高層協(xié)議,都有覆蓋整個(gè)分組的檢驗(yàn)和;其次,每經(jīng)過(guò)一個(gè)路由器,IP數(shù)據(jù)報(bào)的首部就要改變一次,但數(shù)據(jù)部分不變。因此檢驗(yàn)和只對(duì)發(fā)生變化的部分進(jìn)行檢驗(yàn)。IP軟件包包括8個(gè)構(gòu)件:首部添加模塊、處理模塊、轉(zhuǎn)發(fā)模塊、分片模塊、重裝模塊、路由表、MTU表以及重裝表,還有輸入和輸出隊(duì)列。首部添加模塊,從高層協(xié)議接收數(shù)據(jù)(連同其IP地址),添加IP首部后,把數(shù)據(jù)封裝成IP數(shù)據(jù)報(bào)。處理模塊,從一個(gè)接口或從首部添加模塊接收數(shù)據(jù)報(bào),首先檢查數(shù)據(jù)報(bào)是否為回環(huán)地址,還是這個(gè)分組已到達(dá)最后終點(diǎn)。輸入隊(duì)列把從數(shù)據(jù)鏈路層或從高層協(xié)議發(fā)來(lái)的數(shù)據(jù)存放起來(lái)。輸出隊(duì)列把要發(fā)送到數(shù)據(jù)鏈路層或高層協(xié)議的數(shù)據(jù)報(bào)存放起來(lái),處理模塊從中取出數(shù)據(jù)報(bào),分片和重裝模塊則把這個(gè)數(shù)據(jù)報(bào)加入輸出隊(duì)列中。路由表是在轉(zhuǎn)發(fā)模塊中使用的,用來(lái)確定分組的下一跳地址。分片模塊從轉(zhuǎn)發(fā)模塊接收IP數(shù)據(jù)報(bào)。轉(zhuǎn)發(fā)模塊給出IP數(shù)據(jù)報(bào)、下一站的IP地址。以及發(fā)送這個(gè)數(shù)據(jù)報(bào)所必須經(jīng)過(guò)的接口號(hào)。分片模塊使用MTU表以便找出對(duì)于特定接口的最大傳送單元MTU。若數(shù)據(jù)報(bào)的長(zhǎng)度大于MTU,則分片模塊對(duì)數(shù)據(jù)報(bào)進(jìn)行分片,為每一個(gè)分片添加首部,并把它們發(fā)送到ARP軟件包進(jìn)行地址解析和交付。重裝模塊從處理模塊接收已到達(dá)最終目的地的數(shù)據(jù)報(bào)分片。重裝模塊將未分片的數(shù)據(jù)報(bào)看成是屬于僅有一個(gè)分片的數(shù)據(jù)報(bào)。使用重裝表找出一個(gè)分片是屬于哪一個(gè)數(shù)據(jù)報(bào),將屬于同一個(gè)數(shù)據(jù)報(bào)的各分片進(jìn)行排序,并在所有分片到達(dá)時(shí)把它們重新組裝成一個(gè)數(shù)據(jù)報(bào)。ICMP協(xié)議IP協(xié)議沒(méi)有差錯(cuò)報(bào)告或差錯(cuò)糾正機(jī)制和管理查詢(xún)機(jī)制。網(wǎng)際控制報(bào)文協(xié)議(ICMP)就是為了補(bǔ)償這兩個(gè)缺點(diǎn)而設(shè)計(jì)的。它是配合IP協(xié)議使用的。ICMP本身是網(wǎng)絡(luò)層協(xié)議,可是它的報(bào)文不是如設(shè)想的那樣直接傳送給數(shù)據(jù)鏈路層,而是首先要封裝成IP數(shù)據(jù)報(bào),再傳送給下一層。在IP數(shù)據(jù)報(bào)中的協(xié)議字段值是1就表示其IP數(shù)據(jù)是ICMP報(bào)文。ICMP報(bào)文類(lèi)型如下表2-2所示:表2-2ICMP報(bào)文類(lèi)型ICMP報(bào)文分為兩大類(lèi):差錯(cuò)報(bào)告報(bào)文和查詢(xún)報(bào)文。報(bào)文格式如前所述。差錯(cuò)報(bào)告報(bào)文差錯(cuò)報(bào)告報(bào)文報(bào)告當(dāng)路由器或主機(jī)在處理IP數(shù)據(jù)報(bào)時(shí)可能遇到的一些問(wèn)題。ICMP不能糾錯(cuò),只能報(bào)告差錯(cuò),差錯(cuò)糾正留給高層協(xié)議去做。ICMP總是使用源IP地址把差錯(cuò)報(bào)文發(fā)送給數(shù)據(jù)報(bào)的源點(diǎn)。一共有5種差錯(cuò)可處理:終點(diǎn)不可達(dá)、源點(diǎn)抑制、超時(shí)、參數(shù)問(wèn)題以及改變路由。終點(diǎn)不可達(dá)報(bào)文當(dāng)路由器不能夠給數(shù)據(jù)報(bào)找到路由或主機(jī)不能夠交付數(shù)據(jù)報(bào)時(shí),就丟棄這個(gè)數(shù)據(jù)報(bào),然后這個(gè)路由器或主機(jī)就向發(fā)出這個(gè)數(shù)據(jù)報(bào)的源主機(jī)發(fā)回終點(diǎn)不可達(dá)報(bào)文。源點(diǎn)抑制ICMP的源點(diǎn)抑制報(bào)文就是為了給IP增加一種流量控制而設(shè)計(jì)的。當(dāng)路由器或主機(jī)因擁塞而丟棄數(shù)據(jù)報(bào)時(shí),它就向數(shù)據(jù)報(bào)的發(fā)送端發(fā)送源點(diǎn)抑制報(bào)文。目的有二:第一,通知源點(diǎn),數(shù)據(jù)報(bào)已被丟棄。第二,它警告源點(diǎn),在路徑中的某處出現(xiàn)了擁塞,因而源點(diǎn)需放慢發(fā)送過(guò)程。注意,必須為每一個(gè)丟棄的數(shù)據(jù)報(bào)向源點(diǎn)發(fā)送源點(diǎn)抑制報(bào)文。超時(shí)超時(shí)有兩種情況:第一,當(dāng)路由器接收到生存時(shí)間字段值為零的數(shù)據(jù)報(bào)時(shí),就丟棄這個(gè)數(shù)據(jù)報(bào),并向源點(diǎn)發(fā)送超時(shí)報(bào)文;第二,當(dāng)最后的終點(diǎn)在規(guī)定時(shí)間內(nèi)沒(méi)有收到所有的分片時(shí),就丟棄已收到的分片,并向源點(diǎn)發(fā)送超時(shí)報(bào)文。參數(shù)問(wèn)題如果路由器或主機(jī)在數(shù)據(jù)報(bào)的首部中發(fā)現(xiàn)任何二義性,或在數(shù)據(jù)報(bào)的某個(gè)字段中缺少了某個(gè)值,就丟棄這個(gè)數(shù)據(jù)報(bào),并發(fā)送參數(shù)問(wèn)題報(bào)文。改變路由路由器的路由選擇是動(dòng)態(tài)的,而主機(jī)為了提高效率,一般使用靜態(tài)路由選擇。當(dāng)主機(jī)開(kāi)始連網(wǎng)工作時(shí),其路由表中的項(xiàng)目數(shù)很有限。它一般只知道默認(rèn)路由器這一個(gè)路由器的IP地址,因此主機(jī)有可能會(huì)把某個(gè)數(shù)據(jù)報(bào)發(fā)送給一個(gè)錯(cuò)誤的路由器。此時(shí),收到這個(gè)數(shù)據(jù)報(bào)的路由器會(huì)把數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)給正確的路由器,并向主機(jī)發(fā)送改變路由報(bào)文,以更新主機(jī)中的路由表。查詢(xún)報(bào)文查詢(xún)報(bào)文都是成對(duì)出現(xiàn)的。在這種類(lèi)型的ICMP報(bào)文中,一個(gè)結(jié)點(diǎn)發(fā)送報(bào)文,然后由目的結(jié)點(diǎn)用特定的格式進(jìn)行回答?;厮驼?qǐng)求和回答報(bào)文為診斷目的而設(shè)計(jì)的。主機(jī)或路由器能夠發(fā)送回送請(qǐng)求報(bào)文給另一個(gè)主機(jī)或路由器。收到回送請(qǐng)求報(bào)文的主機(jī)或路由器產(chǎn)生回送回答報(bào)文,并將其返回給原來(lái)的發(fā)送者?;厮驼?qǐng)求和回答報(bào)文可用來(lái)確定是否在IP這級(jí)能夠通信。還可由主機(jī)使用,以檢查另一個(gè)主機(jī)是否可達(dá)。在用戶(hù)級(jí),調(diào)用分組因特網(wǎng)搜尋器(ping)命令可做到這點(diǎn)。時(shí)間戳請(qǐng)求和回答兩個(gè)機(jī)器可使用時(shí)間戳請(qǐng)求和回答來(lái)確定IP數(shù)據(jù)報(bào)在這兩個(gè)機(jī)器之間來(lái)往所需的往返時(shí)間。地址掩碼請(qǐng)求和回答主機(jī)經(jīng)過(guò)向局域網(wǎng)上的路由器發(fā)送地址掩碼請(qǐng)求報(bào)文來(lái)獲得自己的掩碼。若主機(jī)知道這個(gè)路由器的地址,則直接將請(qǐng)求發(fā)送給該路由器,若主機(jī)不知道,則廣播這個(gè)請(qǐng)求報(bào)文。路由器收到地址掩碼請(qǐng)求報(bào)文,就以地址掩碼回答報(bào)文進(jìn)行響應(yīng),向主機(jī)提供所需的掩碼。路由詢(xún)問(wèn)和通告主機(jī)若想把數(shù)據(jù)發(fā)送給另一個(gè)網(wǎng)絡(luò)上的主機(jī),就需要知道連接到該網(wǎng)絡(luò)上的路由器的地址。另外,這個(gè)主機(jī)還需要知道這些路由器是否正常工作。就能夠通告路由詢(xún)問(wèn)和通告報(bào)文。主機(jī)把路由器詢(xún)問(wèn)報(bào)文進(jìn)行廣播,收到詢(xún)問(wèn)的路由器就使用路由通告報(bào)文廣播其路由選擇信息。路由器發(fā)送通告報(bào)文時(shí),不但通告自己的存在,而且通告了它所知道的所有在這個(gè)網(wǎng)絡(luò)上的路由器。在ICMP中,檢驗(yàn)和的計(jì)算覆蓋了整個(gè)報(bào)文(首部和數(shù)據(jù))。網(wǎng)際組管理協(xié)議(IGMP)網(wǎng)際組管理協(xié)議(IGMP)是與多播有關(guān)的一個(gè)必要的但不是充分的協(xié)議。IGMP并不是多播路由選擇協(xié)議,而是個(gè)管理組成員關(guān)系的協(xié)議。每當(dāng)主機(jī)需要加入或離開(kāi)某個(gè)特定的多播群組時(shí),該協(xié)議允許該主機(jī)去通知鄰近的路由器。該協(xié)議只用在主機(jī)與路由器之間的網(wǎng)絡(luò)上。而且,協(xié)議只把計(jì)算機(jī)(不是應(yīng)用進(jìn)程)定義為群組成員。如果在一個(gè)給定計(jì)算機(jī)上有多個(gè)進(jìn)程要加入到一個(gè)多播群組,計(jì)算機(jī)必須要把接收到的每個(gè)數(shù)據(jù)報(bào)復(fù)制多個(gè)副本給每個(gè)進(jìn)程。只有當(dāng)最后一個(gè)進(jìn)程離開(kāi)群組時(shí),計(jì)算機(jī)才利用IGMP通知本地的路由器,表明它不再是群組的成員了。IGMPv2有3種報(bào)文類(lèi)型:查詢(xún)、成員關(guān)系報(bào)告和退出報(bào)告。IGMP可分為兩個(gè)階段:第一階段:當(dāng)某個(gè)主機(jī)加入新的多播組時(shí),該主機(jī)應(yīng)向組播組的多播地址發(fā)送一個(gè)IGMP報(bào)文,聲明自己要成為該組的成員。本地的多播路由器收到IGMP報(bào)文后,將組成員關(guān)系轉(zhuǎn)發(fā)給因特網(wǎng)上的其它多播路由器。第二階段:因?yàn)榻M成員關(guān)系是動(dòng)態(tài)的,因此本地多播路由器要周期性地探詢(xún)本地局域網(wǎng)上的主機(jī),以便知道這些主機(jī)是否還連續(xù)是組的成員。只要對(duì)某個(gè)組有一個(gè)主機(jī)響應(yīng),那么多播路由器就認(rèn)為這個(gè)組是活躍的。但一個(gè)組在經(jīng)過(guò)多次的探詢(xún)后依然沒(méi)有一個(gè)主機(jī)響應(yīng),則多播路由器就認(rèn)為本網(wǎng)絡(luò)上的主機(jī)已經(jīng)都離開(kāi)這個(gè)組了因此就不再將該組的成員關(guān)系轉(zhuǎn)發(fā)給其它的多播路由器。IGMP報(bào)文格式如前所述。IGMP協(xié)議的優(yōu)點(diǎn):主機(jī)和多播路由器的所有通信使用IP多播,只要有可能,攜帶IGMP報(bào)文的數(shù)據(jù)報(bào)都使用硬件多播來(lái)傳送。多播路由器在探詢(xún)組成員關(guān)系時(shí),只需要對(duì)所有多播組只發(fā)一個(gè)查詢(xún),而不是對(duì)每一個(gè)組發(fā)送一個(gè)查詢(xún),默認(rèn)125S一次。用戶(hù)數(shù)據(jù)報(bào)(UDP)UDP數(shù)據(jù)報(bào)的格式如前所述。UDP位于應(yīng)用層和IP層之間,作為應(yīng)用程序和網(wǎng)絡(luò)操作的中介物。IP是負(fù)責(zé)在計(jì)算機(jī)級(jí)的通信(主機(jī)到主機(jī)的通信),作為網(wǎng)絡(luò)層協(xié)議,IP只能把報(bào)文交付給目的主機(jī)??墒?這是一種不完整的交付。這個(gè)報(bào)文還必須送交到正確的進(jìn)程。UDP就是負(fù)責(zé)把報(bào)文交付給適當(dāng)?shù)倪M(jìn)程。完成進(jìn)程到進(jìn)程的通信最常見(jiàn)的方法是經(jīng)過(guò)客戶(hù)-服務(wù)器范例。在本地主機(jī)上叫做客戶(hù)的進(jìn)程主動(dòng)發(fā)起請(qǐng)求,遠(yuǎn)程主機(jī)上叫做服務(wù)器的進(jìn)程被動(dòng)地等待、接收和應(yīng)答請(qǐng)求??蛻?hù)端的IP地址和端口號(hào)唯一標(biāo)識(shí)了該主機(jī)上的客戶(hù)端進(jìn)程,服務(wù)器的IP地址和端口號(hào)唯一標(biāo)識(shí)了該主機(jī)上的服務(wù)端進(jìn)。由于客戶(hù)端是主動(dòng)發(fā)起請(qǐng)求的一方,它必須知道服務(wù)器的IP地址和服務(wù)進(jìn)程的端口號(hào),因此,一些常見(jiàn)的網(wǎng)絡(luò)協(xié)議有默認(rèn)的服務(wù)器端口。TCP/IP協(xié)議族中,端口號(hào)是在0~65535之間的整數(shù)。ICANN把端口號(hào)劃分為3個(gè)范圍:熟知端口號(hào)、注冊(cè)端口號(hào)和動(dòng)態(tài)(或?qū)S?端口號(hào)。熟知端口范圍從0~1023;注冊(cè)端口范圍從1024~49151;動(dòng)態(tài)端口范圍從49152~65535.已知UDP需要兩個(gè)標(biāo)識(shí)符,即IP地址和端口號(hào),各用在一端以建立一條連接。一個(gè)IP地址和一個(gè)端口號(hào)合起來(lái)叫做套接字地址。這些信息是IP首部和UDP首部的一部分。UDP提供物連接服務(wù),即UDP發(fā)出的每一個(gè)用戶(hù)數(shù)據(jù)報(bào)都是獨(dú)立的數(shù)據(jù)報(bào),每一個(gè)用戶(hù)數(shù)據(jù)報(bào)能夠走不同的路徑到達(dá)目的進(jìn)行。UDP缺少流量控制和差錯(cuò)控制。要從一個(gè)進(jìn)程把報(bào)文發(fā)送到另一個(gè)進(jìn)程,UDP協(xié)議就要把報(bào)文進(jìn)行封裝和拆裝。封裝當(dāng)進(jìn)程有報(bào)文要經(jīng)過(guò)UDP發(fā)送時(shí),它就把這個(gè)報(bào)文連同一對(duì)套接字地址以及數(shù)據(jù)的長(zhǎng)度傳遞給UDP,加上UDP首部后,UDP把用戶(hù)數(shù)據(jù)報(bào)連同套接字地址一起傳遞給IP。IP加上自己的首部,在協(xié)議字段使用值17,指出該數(shù)據(jù)是從UDP協(xié)議來(lái)的。再將IP數(shù)據(jù)報(bào)傳遞給數(shù)據(jù)鏈路層,數(shù)據(jù)鏈路層收到IP數(shù)據(jù)報(bào)后,再加上自己的首部傳遞給物理層。物理層將這些位編碼為電信號(hào)或光信號(hào),把它發(fā)送到遠(yuǎn)程機(jī)器。拆裝報(bào)文到達(dá)目的主機(jī)時(shí),物理層對(duì)信號(hào)解碼,將它變?yōu)槲?傳遞給數(shù)據(jù)鏈路層。數(shù)據(jù)鏈路層使用這個(gè)首部(和尾部)檢查數(shù)據(jù)。若無(wú)差錯(cuò),則去掉首部和尾部,并把數(shù)據(jù)報(bào)傳遞給IP。IP軟件進(jìn)行檢查,若無(wú)差錯(cuò),就剝?nèi)ナ撞?把用戶(hù)數(shù)據(jù)報(bào)連同發(fā)送端和接收端的IP地址一起傳遞給UDP。UDP使用檢驗(yàn)和對(duì)整個(gè)用戶(hù)數(shù)據(jù)報(bào)進(jìn)行檢查。若無(wú)差錯(cuò)則剝?nèi)ナ撞?把應(yīng)用數(shù)據(jù)傳遞給接收進(jìn)程。在需要回答收到的報(bào)文時(shí),應(yīng)把發(fā)送端的套接字地址一起傳遞給接收進(jìn)程。UDP軟件包共包括5個(gè)構(gòu)件:一個(gè)控制塊表、若干個(gè)輸入隊(duì)列、一個(gè)控制塊模塊、一個(gè)輸入模塊和一個(gè)輸出模塊。在UDP中,隊(duì)列是與端口相關(guān)聯(lián)在一起的。這里的實(shí)現(xiàn)只創(chuàng)立與每一個(gè)進(jìn)程相關(guān)聯(lián)的輸入隊(duì)列,而不創(chuàng)立輸出隊(duì)列??刂茐K表UDP控制塊表來(lái)記錄打開(kāi)的端口。表中的每一個(gè)項(xiàng)目有最小的4個(gè)字段:狀態(tài)(FREE或IN-USE)、進(jìn)程ID、端口號(hào)以及相應(yīng)的隊(duì)列號(hào)。輸入隊(duì)列使用了一組輸入隊(duì)列,每一個(gè)對(duì)應(yīng)于一個(gè)進(jìn)程??刂茐K模塊負(fù)責(zé)管理控制塊表。當(dāng)進(jìn)程啟動(dòng)時(shí),它就從操作系統(tǒng)請(qǐng)求得到一個(gè)端口號(hào)。操作系統(tǒng)把熟知端口號(hào)指派給服務(wù)器,而把短暫端口號(hào)指派給客戶(hù)。進(jìn)程把進(jìn)程ID和端口號(hào)傳遞給控制塊模塊,以便在表中為這個(gè)進(jìn)程創(chuàng)立一個(gè)項(xiàng)目。這個(gè)模塊不創(chuàng)立隊(duì)列。隊(duì)列數(shù)字段值為零。輸入模塊輸入模塊從IP接收用戶(hù)數(shù)據(jù)報(bào)。它查找控制塊表,查找具有和這個(gè)用戶(hù)數(shù)據(jù)報(bào)同樣端口號(hào)的項(xiàng)目。若找到這樣的項(xiàng)目,模塊就利用這項(xiàng)目中的信息把這個(gè)數(shù)據(jù)放入隊(duì)列。若未找到這樣的項(xiàng)目,它就產(chǎn)生ICMP”端口不可達(dá)”報(bào)文,并丟棄這個(gè)項(xiàng)目。輸出模塊負(fù)責(zé)創(chuàng)立和發(fā)送用戶(hù)數(shù)據(jù)報(bào)。傳輸控制協(xié)議(TCP)TCP叫做面向連接的、可靠的運(yùn)輸協(xié)議。它提供進(jìn)程到進(jìn)程、全雙工和面向連接的服務(wù)。TCP使用滑動(dòng)窗口機(jī)制實(shí)現(xiàn)流量控制,來(lái)避免接收端因數(shù)據(jù)過(guò)多而過(guò)載;使用差錯(cuò)控制來(lái)提供可靠的服務(wù)。兩個(gè)設(shè)備之間使用TCP軟件傳送的數(shù)據(jù)單元叫做報(bào)文段,它有20~60字節(jié)的首部,首部后面是來(lái)自應(yīng)用程序的數(shù)據(jù)。首部結(jié)構(gòu)如前所述。TCP連接TCP的連接一般包括3個(gè)階段:連接建立、數(shù)據(jù)傳送和連接終止。連接建立需要三向握手:客戶(hù)發(fā)送第一個(gè)報(bào)文段,SYN報(bào)文段,在這個(gè)報(bào)文段中只有SYN標(biāo)志位置1.這個(gè)報(bào)文段的作用是使序號(hào)同步。SYN報(bào)文段是控制報(bào)文段,不攜帶任何數(shù)據(jù),可是消耗一個(gè)序號(hào)。當(dāng)數(shù)據(jù)傳送開(kāi)始時(shí),每發(fā)送一個(gè)字節(jié),序號(hào)應(yīng)該加1.在接收端能夠根據(jù)序號(hào)排出數(shù)據(jù)包的正確順序,也能夠發(fā)現(xiàn)丟包的情況。服務(wù)器發(fā)送第二個(gè)報(bào)文段,SYN+ACK報(bào)文段,有兩個(gè)標(biāo)志位置1(SYN和ACK)。服務(wù)器使用這個(gè)報(bào)文段同步初始序號(hào),以便從服務(wù)器向客戶(hù)發(fā)送字節(jié)。使用ACK確認(rèn)已從客戶(hù)端收到了SYN報(bào)文段,確認(rèn)號(hào)為客戶(hù)端發(fā)送SYN報(bào)文段序號(hào)值加1.客戶(hù)發(fā)送第三個(gè)報(bào)文ACK,確認(rèn)號(hào)為服務(wù)器發(fā)送報(bào)文段的序號(hào)值加1。該報(bào)文段的序號(hào)與SYN報(bào)文段使用的序號(hào)一樣。ACK報(bào)文段如果不攜帶數(shù)據(jù)就不消耗序號(hào)。連接建立后,數(shù)據(jù)開(kāi)始雙向傳送:在數(shù)據(jù)傳輸過(guò)程中,ACK和確認(rèn)序號(hào)是非常重要的,應(yīng)用程序交給TCP協(xié)議發(fā)送的數(shù)據(jù)會(huì)暫存在TCP層的發(fā)送緩沖區(qū)中,發(fā)出數(shù)據(jù)包給對(duì)方之后,只有收到對(duì)方應(yīng)答的ACK段才知道該數(shù)據(jù)包確實(shí)發(fā)到了對(duì)方,能夠從發(fā)送緩沖區(qū)中釋放掉了,如果因?yàn)榫W(wǎng)絡(luò)故障丟失了數(shù)據(jù)包或者丟失了對(duì)方發(fā)回的ACK段,經(jīng)過(guò)等待超時(shí)后TCP協(xié)議自動(dòng)將發(fā)送緩沖區(qū)中的數(shù)據(jù)包重發(fā)。以上情況只描述了最簡(jiǎn)單的一問(wèn)一答的情景,事實(shí)上TCP協(xié)議為應(yīng)用層提供了全雙工(full-duplex)的服務(wù),雙方都能夠主動(dòng)甚至同時(shí)給對(duì)方發(fā)送數(shù)據(jù)。如果通訊過(guò)程只能采用一問(wèn)一答的方式,收和發(fā)兩個(gè)方向不能同時(shí)傳輸,在同一時(shí)間只允許一個(gè)方向的數(shù)據(jù)傳輸,則稱(chēng)為'''半雙工(half-duplex)''',假設(shè)某種面向連接的協(xié)議是半雙工的,則只需要一套序號(hào)就夠了,不需要通訊雙方各自維護(hù)一套序號(hào)了。參加交換數(shù)據(jù)的雙方中的任何一方都能夠關(guān)閉連接,連接終止的四向握手:在正常情況下,客戶(hù)機(jī)TCP接收到客戶(hù)進(jìn)程發(fā)來(lái)的關(guān)閉命令后,就發(fā)送第一個(gè)報(bào)文段——把FIN位置1。如果FIN報(bào)文段不攜帶數(shù)據(jù),它消耗一個(gè)序號(hào)。同時(shí)更改狀態(tài)為FIN_WAIT_1,關(guān)閉應(yīng)用程序進(jìn)程。服務(wù)器TCP在收到這個(gè)FIN報(bào)文段后,向自己對(duì)應(yīng)的進(jìn)程發(fā)送一個(gè)文件結(jié)束符EOF,同時(shí)更改狀態(tài)為CLOSE_WAIT,并發(fā)送第二個(gè)報(bào)文段——ACK,以證實(shí)從客戶(hù)端收到了FIN報(bào)文段。如果不攜帶數(shù)據(jù),客戶(hù)端接到ACK后狀態(tài)更改為FIN_WAIT_2。服務(wù)器關(guān)閉應(yīng)用程序進(jìn)程,更改狀態(tài)為L(zhǎng)AST_ACK。并發(fā)送第三個(gè)報(bào)文段——FIN,若不攜帶數(shù)據(jù),FIN消耗一個(gè)序號(hào)??蛻?hù)TCP接收到FIN后,更改狀態(tài)為T(mén)IME-WAIT,同時(shí)發(fā)送最后一個(gè)報(bào)文段——ACK,證實(shí)從TCP服務(wù)器收到了一個(gè)FIN報(bào)文段,該報(bào)文段的確認(rèn)號(hào)等于從服務(wù)器發(fā)送的FIN報(bào)文段的序號(hào)加1。除上述的情況外,建立連接時(shí),客戶(hù)端和服務(wù)器端能夠同時(shí)打開(kāi);關(guān)閉連接時(shí),能夠同時(shí)關(guān)閉或者進(jìn)行三向握手。TCP的狀態(tài)機(jī)轉(zhuǎn)換圖如下所示:圖2-12TCP的各種狀態(tài)如下表2所示:表2-3TCP的各種狀態(tài)狀態(tài)說(shuō)明CLOSED沒(méi)有連接LISTEN收到了被動(dòng)打開(kāi),等待SYNSYN-SENT已發(fā)送SYN;等待ACKSYN-RCVD已發(fā)送SYN+ACK;等待ACKESTABLISHED連接已建立;數(shù)據(jù)傳送在進(jìn)行FIN-WAIT-1第一個(gè)FIN已發(fā)送;等待ACKFIN-WAIT-2對(duì)第一個(gè)FIN的ACK已收到;等待第二個(gè)FINCLOSE-WAIT收到第一個(gè)FIN,已發(fā)送ACK;等待應(yīng)用程序關(guān)閉TIME-WAIT收到第二個(gè)FIN,已發(fā)送ACK;等待2MSL超時(shí)LAST-ACK已發(fā)送第二個(gè)FIN;等待ACKCLOSING雙方都已決定同時(shí)關(guān)閉流量控制:如果發(fā)送端發(fā)送的速度較快,接收端接收到數(shù)據(jù)后處理的速度較慢,而接收緩沖區(qū)的大小是固定的,就會(huì)丟失數(shù)據(jù)。TCP協(xié)議經(jīng)過(guò)'''滑動(dòng)窗口(SlidingWindow)'''機(jī)制解決這一問(wèn)題。TCP在接收緩存上定義一個(gè)窗口,TCP發(fā)送數(shù)據(jù)的多少由滑動(dòng)窗口協(xié)議定義。為了完成流量控制,TCP使用滑動(dòng)窗口協(xié)議。兩個(gè)主機(jī)為向外通信(發(fā)送數(shù)據(jù))各使用一個(gè)窗口,這個(gè)接收窗口覆蓋了緩存的一部分。這個(gè)窗口有兩個(gè)沿:一個(gè)在左邊,另一個(gè)在右邊。這個(gè)窗口叫做滑動(dòng)窗口,因?yàn)樽笱睾陀已囟寄軌蚧瑒?dòng)。窗口能夠展開(kāi)、合攏或縮回,這三種活動(dòng)受接收端而不是發(fā)送端的控制(取決與網(wǎng)絡(luò)上的擁塞狀態(tài)),發(fā)送端必須聽(tīng)從接收端的命令。一般,窗口縮回必須避免。TCP的滑動(dòng)窗口是面向字節(jié)的,窗口大小取決于接收窗口(rwnd)和擁塞窗口(cwnd)中的較小值。接收端在一段時(shí)間內(nèi)不愿意從發(fā)送端接收任何數(shù)據(jù)時(shí),能夠發(fā)送rwnd為0的報(bào)文段來(lái)暫時(shí)關(guān)閉窗口,此時(shí)發(fā)送端窗口大小并非真正地縮回,而是暫停發(fā)送數(shù)據(jù),直到一個(gè)新的通告收到為止。差錯(cuò)控制:差錯(cuò)控制由檢驗(yàn)和、確認(rèn)和超時(shí)來(lái)處理。受損傷的和重復(fù)的報(bào)文段要重傳,重復(fù)的報(bào)文段要丟棄。數(shù)據(jù)可能不按序到達(dá),接收端TCP把它們暫時(shí)存儲(chǔ)下來(lái),但TCP保證交付給進(jìn)程的報(bào)文段都是按序的。重傳發(fā)生在:當(dāng)重傳超時(shí)(RTO)計(jì)時(shí)器時(shí)間到,或已到達(dá)3個(gè)重復(fù)的ACK報(bào)文段。TCP使用擁塞機(jī)制來(lái)避免和檢測(cè)網(wǎng)絡(luò)中的擁塞。在擁塞控制中使用曼開(kāi)始(指數(shù)增大)、擁塞避免(加法增大)和擁塞檢測(cè)(乘法減小)等策略。TCP在運(yùn)行中使用4個(gè)計(jì)時(shí)器(重傳計(jì)時(shí)器、持久計(jì)時(shí)器、?;钣?jì)時(shí)器和時(shí)間等待計(jì)時(shí)器)。UIP處理流程簡(jiǎn)介uIP協(xié)議棧去掉了完整的TCP/IP中不常見(jiàn)的功能,簡(jiǎn)化了通訊流程,但保留了網(wǎng)絡(luò)通信必須使用的協(xié)議,設(shè)計(jì)重點(diǎn)放在了ARP/IP/ICMP/UDP/TCP這些網(wǎng)絡(luò)層和傳輸層協(xié)議上,保證了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。由于uIP協(xié)議棧專(zhuān)門(mén)為嵌入式系統(tǒng)而設(shè)計(jì),它具有如下的優(yōu)點(diǎn):代碼非常少,其協(xié)議棧代碼不到6K;占用的內(nèi)存數(shù)非常少,RAM占用僅幾百字節(jié);其硬件處理層、協(xié)議棧層和應(yīng)用層共用一個(gè)全局緩存區(qū),不存在數(shù)據(jù)的拷貝,且發(fā)送和接收都是依靠這個(gè)緩存區(qū),極大的節(jié)省空間和時(shí)間。支持多個(gè)主動(dòng)連接和被動(dòng)連接并發(fā);通用性強(qiáng),移植起來(lái)基本不用修改就能夠經(jīng)過(guò);對(duì)數(shù)據(jù)的處理采用輪循機(jī)制,不需要操作系統(tǒng)的支持。層次結(jié)構(gòu)uIP相當(dāng)于一個(gè)代碼庫(kù),經(jīng)過(guò)一系列的函數(shù)實(shí)現(xiàn)與底層硬件和高層應(yīng)用程序的通訊,對(duì)于整個(gè)系統(tǒng)來(lái)說(shuō)它內(nèi)部的協(xié)議組是透明的,從而增加了協(xié)議的通用性。uIP協(xié)議棧與系統(tǒng)底層和高層應(yīng)用之間的關(guān)系如圖11所示:應(yīng)用程序應(yīng)用程序UIP網(wǎng)卡驅(qū)動(dòng)系統(tǒng)定時(shí)器應(yīng)用層UIP協(xié)議棧硬件驅(qū)動(dòng)圖3-1實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)與UIP對(duì)接需要的7個(gè)接口程序,定義在uip.h:#defineuip_input()uip_process(UIP_DATA)#defineuip_periodic(conn)do{uip_conn=&uip_conns[conn];\uip_process(UIP_TIMER);}while(0)#defineuip_conn_active(conn)(uip_conns[conn].tcpstateflags!=UIP_CLOSED)#defineuip_periodic_conn(conn)do{uip_conn=conn;\uip_process(UIP_TIMER);}while(0)#defineuip_poll_conn(conn)do{uip_conn=conn;\uip_process(UIP_POLL_REQUEST);}while(0)#defineuip_udp_periodic(conn)do{uip_udp_conn=&uip_udp_conns[conn];\uip_process(UIP_UDP_TIMER);}while(0)#defineuip_udp_periodic_conn(conn)do{uip_udp_conn=conn;\uip_process(UIP_UDP_TIMER);}while(0)還有一個(gè)變量,在接口中要用到:u8_tuip_buf[UIP_BUFSIZE+2];對(duì)以上接口進(jìn)行詳細(xì)介紹:#defineuip_input()處理輸入數(shù)據(jù)包。當(dāng)設(shè)備從網(wǎng)絡(luò)上接收到數(shù)據(jù)包時(shí)調(diào)用此函數(shù)。在調(diào)用此函數(shù)之前,應(yīng)將接收到的數(shù)據(jù)包內(nèi)容存入uip_buf緩沖區(qū),并將其長(zhǎng)度賦給uip_len.以太網(wǎng)內(nèi)使用的uip需要用到ARP協(xié)議,因此在調(diào)用此函數(shù)之前先調(diào)用uip的ARP代碼。此函數(shù)返回時(shí),如果系統(tǒng)有數(shù)據(jù)要輸出,會(huì)直接將數(shù)據(jù)存入uip_buf,并將其長(zhǎng)度值賦給uip_len。如果沒(méi)有數(shù)據(jù)要發(fā)送,則uip_len值為0.使用舉例如下:uip_len=tapdev_read(uip_buf);if(uip_len>0){if(BUF->type==htons(UIP_ETHTYPE_IP)){ uip_arp_ipin(); uip_input(); if(uip_len>0){ uip_arp_out(); tapdev_send(uip_buf,uip_len); }}elseif(BUF->type==htons(UIP_ETHTYPE_ARP)){uip_arp_arpin(); if(uip_len>0){ tapdev_send(uip_buf,uip_len); }}}#defineuip_periodic(conn)周期性的處理一個(gè)連接,需用到該連接的連接號(hào),conn為將要輪詢(xún)的連接號(hào)。該函數(shù)對(duì)一個(gè)uip的TCP連接進(jìn)行一些必要的周期性處理(如定時(shí)器、輪詢(xún)等),它應(yīng)該在周期性u(píng)ip定時(shí)器期滿(mǎn)消息到來(lái)時(shí)被調(diào)用。每一個(gè)連接都應(yīng)該調(diào)用該函數(shù),不論連接是否打開(kāi)。該函數(shù)返回時(shí),若緩沖區(qū)內(nèi)有需要被發(fā)送出去的數(shù)據(jù)包等待處理,就將uip_len的值置為大于零的數(shù)。以太網(wǎng)內(nèi)使用的uip需要用到ARP協(xié)議,因此在調(diào)用驅(qū)動(dòng)程序之前先調(diào)用uip的ARP代碼uip_arp_out(),再調(diào)用設(shè)備驅(qū)動(dòng)程序?qū)?shù)據(jù)包發(fā)送出去。使用舉例如下:for(uint32_ti=0;i<UIP_CONNS;i++){ uip_periodic(i);if(uip_len>0){uip_arp_out();tapdev_send(uip_buf,uip_len);}}#defineuip_conn_active(conn)#defineuip_periodic_conn(conn)對(duì)一個(gè)連接進(jìn)行周期性處理,需用到指向該連接結(jié)構(gòu)體的指針。該函數(shù)與uip_periodic執(zhí)行的操作是相同的,不同之處在于傳入的參數(shù)是一個(gè)指向uip_conn結(jié)構(gòu)體的指針。此函數(shù)可用于對(duì)某個(gè)連接強(qiáng)制進(jìn)行周期性處理。#defineuip_poll_conn(conn)請(qǐng)求對(duì)特定連接進(jìn)行輪詢(xún)。該函數(shù)功能與uip_periodic()相同,可是不執(zhí)行任何定時(shí)器處理。經(jīng)過(guò)輪詢(xún)從應(yīng)用程序得到新數(shù)據(jù)。#defineuip_udp_periodic(conn)周期性處理連接號(hào)指定的連接。此函數(shù)基本上與uip_periodic()相同,區(qū)別在于這里處理的是UDP連接。其調(diào)用方式也與uip_periodic()類(lèi)似:for(i=0;i<UIP_UDP_CONNS;i++){uip_udp_periodic(i);if(uip_len>0){uip_arp_out();tapdev_send();}}#defineuip_udp_periodic_conn(conn)周期性處理一個(gè)UDP連接,需用到指向該連接結(jié)構(gòu)體的指針。此函數(shù)功能與uip_periodic_conn()相同,只是用來(lái)處理的是UDP連接。u8_tuip_buf[UIP_BUFSIZE+2];uip數(shù)據(jù)包緩沖區(qū),長(zhǎng)度固定。Uip_buf數(shù)組用于存放接收、發(fā)送的數(shù)據(jù)包。設(shè)備驅(qū)動(dòng)程序應(yīng)將接收到的數(shù)據(jù)放入緩沖區(qū)。發(fā)送數(shù)據(jù)時(shí),設(shè)備驅(qū)動(dòng)程序從緩沖區(qū)中讀取鏈路層的首部和TCP/IP首部。鏈路層頭的大小在UIP_LLH_LEN中定義。注:應(yīng)用程序數(shù)據(jù)無(wú)需放入這個(gè)緩沖區(qū)中,而是需要設(shè)備驅(qū)動(dòng)程序從uip_appdata指針?biāo)傅牡胤阶x取數(shù)據(jù)。u16_tuip_len;全局變量,uip_buf緩沖區(qū)中數(shù)據(jù)包的長(zhǎng)度。當(dāng)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)調(diào)用uip輸入函數(shù)時(shí),uip_len要被設(shè)為傳入數(shù)據(jù)包的大小。當(dāng)發(fā)送數(shù)據(jù)包時(shí),設(shè)備驅(qū)動(dòng)程序經(jīng)過(guò)這個(gè)變量來(lái)確定要發(fā)送的數(shù)據(jù)包的大小。應(yīng)用層要調(diào)用的函數(shù),包括一些宏定義與函數(shù),定義在uip.h:宏定義:#defineuip_outstanding(conn)((conn)->len)#defineuip_datalen()uip_len#defineuip_urgdatalen()uip_urglen#defineuip_close()(uip_flags=UIP_CLOSE)#defineuip_abort()(uip_flags=UIP_ABORT)#defineuip_stop()(uip_conn->tcpstateflags|=UIP_STOPPED)#defineuip_stopped(conn)((conn)->tcpstateflags&UIP_STOPPED)#defineuip_restart()do{uip_flags|=UIP_NEWDATA;\uip_conn->tcpstateflags&=~UIP_STOPPED;\}while(0)#defineuip_udpconnection()(uip_conn==NULL)#defineuip_newdata()(uip_flags&UIP_NEWDATA)#defineuip_acked()(uip_flags&UIP_ACKDATA)#defineuip_connected()(uip_flags&UIP_CONNECTED)#defineuip_closed()(uip_flags&UIP_CLOSE)#defineuip_aborted()(uip_flags&UIP_ABORT)#defineuip_timedout()(uip_flags&UIP_TIMEDOUT)#defineuip_rexmit()(uip_flags&UIP_REXMIT)#defineuip_poll()(uip_flags&UIP_POLL)#defineuip_initialmss()(uip_conn->initialmss)#defineuip_mss()(uip_conn->mss)#defineuip_udp_remove(conn)(conn)->lport=0#defineuip_udp_bind(conn,port)(conn)->lport=port#defineuip_udp_send(len)uip_send((char*)uip_appdata,len)函數(shù):voiduip_listen(u16_tport);voiduip_unlisten(u16_tport);structuip_conn*uip_connect(uip_ipaddr_t*ripaddr,u16_tport);voiduip_send(constvoid*data,intlen);structuip_udp_conn*uip_udp_new(uip_ipaddr_t*ripaddr,u16_trport);對(duì)以上函數(shù)進(jìn)行詳細(xì)介紹:#defineuip_outstanding(conn)檢查一個(gè)連接是否有特殊的(例如,未答復(fù)的)數(shù)據(jù)。conn為指向該連接結(jié)構(gòu)體的指針。#defineuip_datalen()uip_appdata緩沖區(qū)中,當(dāng)前可用的傳入數(shù)據(jù)的長(zhǎng)度。必須先調(diào)用uip_data()查明是否有當(dāng)前可用的傳入數(shù)據(jù)。#defineuip_urgdatalen()所有到達(dá)連接的緩沖區(qū)外的(緊急數(shù)據(jù))數(shù)據(jù)長(zhǎng)度。要使用此宏,應(yīng)配置UIP_URGDATA宏為真。#defineuip_close()此函數(shù)會(huì)以一種謹(jǐn)慎的方式關(guān)閉當(dāng)前連接。#defineuip_abort()中止(重置)當(dāng)前連接,多用于出現(xiàn)錯(cuò)誤導(dǎo)致無(wú)法使用uip_close()的場(chǎng)合。#defineuip_stop()告訴發(fā)送主機(jī)停止發(fā)送數(shù)據(jù)。該函數(shù)會(huì)關(guān)閉接收者的窗口,以停止從當(dāng)前連接接收數(shù)據(jù)。#defineuip_stopped(conn)找出當(dāng)前連接先前是否已經(jīng)被uip_stop()停止了。#defineuip_restart()如果連接先前被uip_stop()停止了,該函數(shù)會(huì)重啟連接。接收者的窗口會(huì)被重新打開(kāi),并從當(dāng)前連接開(kāi)始接收數(shù)據(jù)。#defineuip_udpconnection()檢查當(dāng)前連接是否是一個(gè)UDP連接。#defineuip_newdata()如果uip_appdata指針?biāo)钢幱行碌膽?yīng)用數(shù)據(jù),就得到一個(gè)非零值。數(shù)據(jù)的大小可經(jīng)過(guò)uip_len得到。#defineuip_acked()若先前發(fā)送的數(shù)據(jù)得到了遠(yuǎn)程主機(jī)的確認(rèn)信息,就得到一個(gè)非零值。這表示應(yīng)用程序能夠發(fā)送新數(shù)據(jù)了。#defineuip_connected()如果當(dāng)前與遠(yuǎn)程主機(jī)的連接建立,則得到一個(gè)非零值。這包括兩種情形:連接被主動(dòng)打開(kāi)(uip_connect()),或者被動(dòng)打開(kāi)(uip_listen())。#defineuip_closed()如果連接被遠(yuǎn)程主機(jī)關(guān)閉,則返回一個(gè)非零值。這時(shí)應(yīng)用程序會(huì)做一些必要的清理工作。#defineuip_aborted()如果連接被遠(yuǎn)程主機(jī)中止(重置),則返回一個(gè)非零值。#defineuip_timedout()如果當(dāng)前連接是因?yàn)槎啻沃貍鞫瑫r(shí)中止,則返回一個(gè)非零值。#defineuip_rexmit()如果先前發(fā)送的數(shù)據(jù)在網(wǎng)絡(luò)中丟失,應(yīng)用程序需重傳時(shí),返回一個(gè)非零值。應(yīng)用程序需調(diào)用uip_send()函數(shù)來(lái)重傳與上一次所發(fā)送的完全一致的數(shù)據(jù)。#defineuip_poll()解決連接是否由uip輪詢(xún)的問(wèn)題。如果應(yīng)用程序被調(diào)用的原因是當(dāng)前連接因空閑太久而被uip輪詢(xún),則返回一個(gè)非零值。該輪詢(xún)事件能夠被用來(lái)發(fā)送數(shù)據(jù),而無(wú)需等待遠(yuǎn)程主機(jī)發(fā)送數(shù)據(jù)。#defineuip_initialmss()獲得當(dāng)前連接的初始最大報(bào)文段長(zhǎng)度(MSS)。#defineuip_mss()獲得當(dāng)前連接所能發(fā)送的最大報(bào)文段長(zhǎng)度。該長(zhǎng)度是由接收者的窗口大小和連接的MSS計(jì)算出來(lái)的。#defineuip_udp_remove(conn)移除一個(gè)UDP連接。conn指向該連接的uip_udp_conn結(jié)構(gòu)體。#defineuip_udp_bind(conn,port)綁定一個(gè)UDP連接到本地端口。conn指向該連接的uip_udp_conn結(jié)構(gòu)體,port為本地端口號(hào),以網(wǎng)絡(luò)字節(jié)序。#defineuip_udp_send(len)在當(dāng)前連接上發(fā)送長(zhǎng)度為len的UDP數(shù)據(jù)包。該函數(shù)只有在答復(fù)一個(gè)UDP事件(輪詢(xún)或有新數(shù)據(jù))時(shí)才可被調(diào)用。數(shù)據(jù)必須提前放入uip_buf緩沖區(qū)中uip_appdata指針指向的地方。voiduip_listen(u16_tport);開(kāi)始監(jiān)聽(tīng)指定的端口。由于port應(yīng)該為網(wǎng)絡(luò)字節(jié)序,因此需要用到轉(zhuǎn)換函數(shù)HTONS()或者h(yuǎn)tons()。voiduip_unlisten(u16_tport);停止監(jiān)聽(tīng)指定端口。structuip_conn*uip_connect(uip_ipaddr_t*ripaddr,u16_tport);使用TCP協(xié)議連接到遠(yuǎn)程主機(jī)。此函數(shù)用來(lái)與特定主機(jī)上的特定端口建立新的連接,它分配一個(gè)新的連接標(biāo)識(shí)符,并將連接的狀態(tài)轉(zhuǎn)為SYN_SENT,將重傳計(jì)時(shí)器設(shè)置為0.當(dāng)該連接下次被周期性處理時(shí),將會(huì)發(fā)送一個(gè)TCP的SYN報(bào)文段。這個(gè)過(guò)程一般在uip_connet()被調(diào)用后0.5秒后完成。該函數(shù)只有在主動(dòng)打開(kāi)配置項(xiàng)UIP_ACTIVE_OPEN被置1時(shí)可用。ripaddr為遠(yuǎn)程主機(jī)的IP地址,port為網(wǎng)絡(luò)字節(jié)序的端口號(hào)。該函數(shù)返回一個(gè)指向新連接的uip連接標(biāo)識(shí)符的指針,當(dāng)沒(méi)有連接能被分配時(shí)返回NULL。voiduip_send(constvoid*data,intlen);在當(dāng)前連接上發(fā)送數(shù)據(jù)。該函數(shù)用來(lái)發(fā)送單個(gè)TCP數(shù)據(jù)報(bào)文段,只有為了事件處理而被uip調(diào)用的應(yīng)用程序,才能發(fā)送數(shù)據(jù)。該函數(shù)能夠發(fā)送的數(shù)據(jù)大小是由TCP所允許的最大數(shù)據(jù)量來(lái)決定的。uip會(huì)自動(dòng)的分割數(shù)據(jù),以保證發(fā)送出去的數(shù)據(jù)量是合適的。能夠經(jīng)過(guò)uip_mss()來(lái)查詢(xún)uip實(shí)際將要發(fā)送的數(shù)據(jù)量。該函數(shù)不保證發(fā)送的數(shù)據(jù)能到達(dá)目的地,如果數(shù)據(jù)在網(wǎng)絡(luò)中丟失,uip_rexmit()事件將被置位。應(yīng)用程序會(huì)被調(diào)用,并經(jīng)過(guò)該函數(shù)來(lái)重新發(fā)送數(shù)據(jù)。structuip_udp_conn*uip_udp_new(uip_ipaddr_t*ripaddr,u16_trport);建立一個(gè)新的UDP連接。該函數(shù)會(huì)自動(dòng)為新連接分配一個(gè)不用的端口,可是在調(diào)用該函數(shù)之后,還能夠經(jīng)過(guò)uip_udp_bind()還重新選擇一個(gè)端口。ripaddr為遠(yuǎn)程主機(jī)(服務(wù)器)的IP地址,rport為遠(yuǎn)程主機(jī)網(wǎng)絡(luò)字節(jié)序的端口號(hào)。該函數(shù)返回新連接的uip_udp_conn結(jié)構(gòu)體指針,或者當(dāng)沒(méi)有連接能夠分配時(shí)返回NULL。UIP中所用到的主要結(jié)構(gòu)體Structuip_conn{//TCP連接uip_ipaddr_tripaddr;/**<TheIPaddressoftheremotehost.*/u16_tlport;/**<ThelocalTCPport,innetworkbyteorder.*/u16_trport;/**<ThelocalremoteTCPport,innetworkbyteorder.*/u8_trcv_nxt[4];/**<Thesequencenumberthatweexpecttoreceivenext.*/u8_tsnd_nxt[4];/**<Thesequencenumberthatwaslastsentbyus.*/u16_tlen;/**<Lengthofthedatathatwaspreviouslysent.*/u16_tmss;/**<Currentmaximumsegmentsizefortheconnection.*/u16_tinitialmss;/**<Initialmaximumsegmentsizefortheconnection.*/u8_tsa;/**<Retransmissiontime-outcalculationstatevariable.*/u8_tsv;/**<Retransmissiontime-outcalculationstatevariable.*/u8_trto;/**<Retransmissiontime-out.*/u8_ttcpstateflags;/**<TCPstateandflags.*/u8_ttimer;/**<Theretransmissiontimer.*/u8_tnrtx;/**<Thenumberofretransmissionsforthelastsegmentsent.*//**Theapplicationstate.*/uip_tcp_appstate_tappstate;};structuip_udp_conn{//UDP連接uip_ipaddr_tripaddr;/**<TheIPaddressoftheremotepeer.*/u16_tlport;/**<Thelocalportnumberinnetworkbyteorder.*/u16_trport;/**<Theremoteportnumberinnetworkbyteorder.*/u8_tttl;/**<Defaulttime-to-live.*//**Theapplicationstate.*/uip_udp_appstate_tappstate;};structuip_stats{//統(tǒng)計(jì)信息結(jié)構(gòu)體struct{uip_stats_tdrop;/**<NumberofdroppedpacketsattheIPlayer.*/uip_stats_trecv;/**<NumberofreceivedpacketsattheIPlayer.*/uip_stats_tsent;/**<NumberofsentpacketsattheIPlayer.*/uip_stats_tvhlerr;/**<NumberofpacketsdroppedduetowrongIPversionorheaderlength.*/uip_stats_thblenerr;/**<NumberofpacketsdroppedduetowrongIPlength,highbyte.*/uip_stats_t

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論