




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、網(wǎng)絡(luò)協(xié)議分析與實現(xiàn)習(xí)題解答參考思路第1章習(xí)題解答參考思路習(xí)題1:該題考查對異構(gòu)網(wǎng)絡(luò)互聯(lián)概念、異構(gòu)網(wǎng)絡(luò)涉及的問題以及解決方法的理解程度。其中涉及的問題包括地址問題、包格式轉(zhuǎn)換問題、路由問題等,其中1.1.3節(jié)還列舉了很多其他的問題。習(xí)題2:該題可參考教材中所講述的用戶A和用戶B的數(shù)據(jù)轉(zhuǎn)換和傳輸過程進(jìn)行解答。習(xí)題3:該題主要考查網(wǎng)上查找資料的能力。在/網(wǎng)站上可以查到所有的RFC信息。習(xí)題4:TCP/IP模型和OSI參考模型之間的層次對應(yīng)關(guān)系及各層協(xié)議參見教材中的圖1-5。習(xí)題5:該題主要考查動手能力,可以使用Wireshark(曾稱為Ethereal
2、)、Sniffer Portable等軟件進(jìn)行抓包,然后針對一些具體報文進(jìn)行分析。注意分析通信中的多路復(fù)用和多路分解過程,說出通信雙方的物理地址、IP地址和端口地址。習(xí)題6:該題主要考查閱讀代碼的能力,這部分代碼是對數(shù)據(jù)結(jié)構(gòu)課程中隊列操作的一個實現(xiàn)。該隊列是一個基于優(yōu)先級排序的隊列,主要的數(shù)據(jù)結(jié)構(gòu)是qinfo:structqinfo Boolq_valid;intq_type;/* mutex type*/intq_max;intq_count;intq_seen;intq_mutex;int*q_key;char*q_elt;具體操作如下:int enq(int q, void *elt,
3、int key);/*入隊列操作,根據(jù)key的大小插到隊列中的合適位置*/void * deq(int q);/*出隊列操作*/void * headq(int q);/*獲取隊列頭部元素*/void * seeq(int q);/*按順序取隊列元素*/int newq(unsigned size, unsigned mtype);/*分配一個新的隊列,并返回隊列的索引位置*/int freeq(int q);/*釋放隊列*/int lenq(int q);/*獲取隊列長度*/static int initq();/*初始化隊列*/43第2章習(xí)題解答參考思路習(xí)題1:該題主要考查對HDLC概念的
4、理解程度,答案參見2.1節(jié)。習(xí)題2:該題主要考查對SLIP、PPP之間的關(guān)系,PPP對SLIP的改進(jìn)以及PPPoE的概念的理解程度。SLIP和PPP可以在教材中找到參考資料,PPPoE可以到網(wǎng)上或RFC中查找參考資料。PPPoE全稱為Point to Point Protocol over Ethernet(以太網(wǎng)上的點對點協(xié)議),簡單地說,就是以太網(wǎng)和PPP結(jié)合后的協(xié)議,目前廣泛應(yīng)用在ADSL接入方式中。通過PPPoE技術(shù)和寬帶調(diào)制解調(diào)器(比如ADSL Modem)可以實現(xiàn)高速寬帶網(wǎng)的個人身份驗證訪問,為每個用戶創(chuàng)建虛擬撥號連接,這樣就可以高速連接入因特網(wǎng)。(1)PPP在SLIP的基礎(chǔ)上的改
5、進(jìn)之處 提供了校驗機制,可以對每一幀進(jìn)行檢查; 提供了IP地址的動態(tài)協(xié)商機制,使通信雙方能夠得知對方的IP地址; 在一條串行鏈路上提供了對多協(xié)議的支持; 提供了對TCP和IP數(shù)據(jù)報首部的壓縮機制。(2)PPPoE和PPP的關(guān)系PPP提供了一種標(biāo)準(zhǔn)的方式在點對點的鏈路上傳輸多種網(wǎng)絡(luò)層協(xié)議的數(shù)據(jù)報。它要求通信雙方之間是點到點的關(guān)系,由于不適用于廣播類型的以太網(wǎng)和另外一些多點訪問類型的網(wǎng)絡(luò),因此就產(chǎn)生了PPPoE。在實際應(yīng)用中,PPPoE利用以太網(wǎng)的工作機理,將ADSL Modem的10BASE-T接口與內(nèi)部以太網(wǎng)互聯(lián),在ADSL Modem中采用RFC1483的橋接封裝方式對終端發(fā)出的PPP報文進(jìn)
6、行LLC/SNAP封裝后,通過連結(jié)兩端的PVC在ADSL Modem與網(wǎng)絡(luò)側(cè)的寬帶接入服務(wù)器之間建立連接,實現(xiàn)PPP的動態(tài)接入。PPPoE接入利用在網(wǎng)絡(luò)側(cè)和ADSL Modem之間的一條PVC(永久虛擬電路)就可以完成以太網(wǎng)上多用戶的共同接入,實際組網(wǎng)方式簡單,實用方便,大大降低了網(wǎng)絡(luò)的復(fù)雜程度。PPPoE的實質(zhì)就是以太網(wǎng)和撥號網(wǎng)絡(luò)之間的一個中繼協(xié)議,它繼承了以太網(wǎng)的快速和PPP撥號的簡單、用戶驗證、IP分配等優(yōu)點。 (3)PPPoE的工作流程PPPoE提供了在廣播式網(wǎng)絡(luò)(如以太網(wǎng))中多臺主機連接到遠(yuǎn)端的訪問集中器上的一種標(biāo)準(zhǔn)。在這種網(wǎng)絡(luò)模型中,不難看出所有用戶的主機都需要能獨立地初始化自己的
7、PPP協(xié)議棧,而且通過PPP本身所具有的一些特點能在廣播式網(wǎng)絡(luò)上對用戶進(jìn)行計費和管理。為了能在廣播式網(wǎng)絡(luò)上建立、維持各主機與訪問集中器之間點對點的關(guān)系,需要每個主機與訪問集中器之間建立唯一的點到點的會話。PPPoE共包括兩個階段,即PPPoE的發(fā)現(xiàn)階段(PPPoE Discovery Stage)和PPPoE的會話階段(PPPoE Session Stage)。 發(fā)現(xiàn)階段:此階段用來建立連接,如下圖所示,當(dāng)一個用戶主機想開始一個PPPoE會話時,首先必須經(jīng)過發(fā)現(xiàn)階段以識別PPPoE Server的以太網(wǎng)MAC地址,并建立一個PPPoE會話標(biāo)識(Session ID)。如上圖所示,該階段的基本工
8、作流程由4個步驟組成。PADI:如果要建立一條PPPoE連接,首先PPPoE客戶端要以廣播的方式發(fā)送一個PADI(PPPoE Active Discovery Initiation)報文,PADI報文包括客戶端請求的服務(wù)。PADO:在PPPoE服務(wù)器(BRAS)收到一個PADI報文之后,它會判斷自己是否能夠提供服務(wù),如果能夠提供服務(wù),就會向客戶端發(fā)送PADO(PPPoE Active Discovery Offer)報文來進(jìn)行回應(yīng)。PADO報文包括PPPoE服務(wù)器名稱和與PADI報文中相同的服務(wù)名;如果PPPoE服務(wù)器不能為PADI提供服務(wù),則不允許用PADO報文應(yīng)答。PADR:由于PADI是
9、以廣播的形式發(fā)送出去的,PPPoE客戶端可能會收到不止一個PADO報文,它將審查所有接收到的PADO報文并根據(jù)其中的服務(wù)器名或所提供的服務(wù)選擇一個PPPoE服務(wù)器,同時向選中的服務(wù)器發(fā)送PADR(PPPoE Active Discovery Request)報文。PADR報文包括客戶端所請求的服務(wù)。PADS:當(dāng)PPPoE服務(wù)器收到客戶端發(fā)送的PADR報文時,它準(zhǔn)備開始一個PPPoE會話。它為PPPoE會話創(chuàng)建一個唯一的PPPoE會話標(biāo)識,并向客戶端發(fā)送PADS(PPPoE Active Discovery Session- confirmation)報文作為應(yīng)答。當(dāng)發(fā)現(xiàn)階段正常結(jié)束后,通信的兩
10、端都會獲得會話標(biāo)識和對方的MAC地址,它們一起唯一定義一個PPPoE會話。 會話階段:PPPoE進(jìn)入PPP會話階段后,客戶端和服務(wù)器將進(jìn)行標(biāo)準(zhǔn)的PPP協(xié)商,PPP協(xié)商通過后,數(shù)據(jù)通過PPP封裝發(fā)送。PPP報文作為PPPoE幀的凈荷被封裝在以太網(wǎng)幀內(nèi),發(fā)送到PPPoE鏈路的對端。會話標(biāo)識必須是發(fā)現(xiàn)階段確定的標(biāo)識,并且在會話過程中保持不變,MAC地址必須是對端的MAC地址。在會話階段的任意時刻,PPPoE服務(wù)器和客戶端都可向?qū)Ψ桨l(fā)送PADT(PPPoE Active Discovery Terminate)報文通知對方結(jié)束本會話。收到PADT以后,就不再允許使用該會話發(fā)送PPP流量了。在發(fā)送或接收
11、到PADT報文后,即使是常規(guī)的PPP結(jié)束報文也不允許發(fā)送。一般情況下,PPP通信雙方使用PPP報文自身來結(jié)束PPPoE會話,但在無法使用PPP時可以使用PADT來結(jié)束會話。(4)幀結(jié)構(gòu)及其應(yīng)用版本4位類型4位代碼8位會話標(biāo)識16位長度16位凈載荷發(fā)現(xiàn)階段承載一些標(biāo)記會話階段承載PPP報文PPPoE作為寬帶網(wǎng)接入的一種有效方法,不但可以防止IP被盜用,還有利于開展多服務(wù)、速率限制和按時按流量計費等多方面的應(yīng)用。習(xí)題3:該題主要考查對CSMA/CD和CSMA/CA協(xié)議,以及無線網(wǎng)絡(luò)中“隱藏站”問題的理解程度。習(xí)題4: XINU操作系統(tǒng)源代碼etherlance目錄下存放的是AMD 7990 Lan
12、ce以太網(wǎng)控制器驅(qū)動實現(xiàn)程序源代碼,其中ethdemux函數(shù)實現(xiàn)了該控制器接收到以太幀后所要進(jìn)行的多路分解操作。該函數(shù)首先進(jìn)行一些檢查,然后進(jìn)行數(shù)據(jù)幀的復(fù)制,并最終轉(zhuǎn)入ni_in()函數(shù),進(jìn)行網(wǎng)絡(luò)接口層的多路分解。/* ethdemux.c - ethdemux */#include #include #include /*- * ethmudex -選擇一個端口發(fā)送一個傳入的數(shù)據(jù)報(ETHER端或者其他) *-*/ /*首先檢查來自網(wǎng)絡(luò)的數(shù)據(jù)幀的正確性,然后申請緩沖區(qū)以存儲數(shù)據(jù)幀,最后將數(shù)據(jù)幀交由ni_in()函數(shù)處理*/int ethdemux(etptr, bn)struct etblk
13、 *etptr; /*以太網(wǎng)控制塊描述*/int bn;structbre*pbre;structle_md*pmd; /*消息描述符*/structotblk*otptr;structep*pep; /*以太網(wǎng)的幀結(jié)構(gòu)*/intnoth, readlen, errs, ifnum;char*dest;ifnum = etptr-etintf; /*端口號*/pbre = &etptr-etbrrbn;pmd = pbre-pmd;errs = pmd-lmd_flags & (RMD_FRAM|RMD_OFLO|RMD_CRC|RMD_BUFF);if ( errs != 0) if (er
14、rs & RMD_FRAM)kprintf(ethread: framing errorn);if (errs & RMD_OFLO)kprintf(ethread: buffer overflown);if (errs & RMD_CRC)kprintf(ethread: CRC errorn);if (errs & RMD_BUFF)kprintf(ethread: dont own next buffern);goto drop;readlen = pmd-lmd_mcnt; /*消息的長度(實際長度) */if (readlen (EP_DLEN+18) /*長度是否合法*/goto
15、drop;pep = (struct ep *)nbgetbuf(Npool); /*申請幀緩沖區(qū)*/if (pep = 0) /*申請失敗*/if (ifnum = 0 & ifnum ep_eh, pbre-buf, readlen-EP_CRC); /*將網(wǎng)卡緩沖區(qū)中的信息復(fù)制到幀緩沖區(qū)*/pmd-lmd_flags = LMD_OWN; /*將使用權(quán)還給以太網(wǎng)卡*/pbre-flags = 0; /*標(biāo)志位清零*/#ifNoth 0/*其他設(shè)備端口*/dest = (char *)pep-ep_dst;for (noth=0; nothetothnoth;if (otptr = 0 |
16、 !otptr-ot_valid)continue; if (blkequ(dest, otptr-ot_paddr, EP_ALEN) |blkequ(dest, otptr-ot_baddr, EP_ALEN)break;if (noth != Noth)ifnum = otptr-ot_intf;#endifif (ifnum ep_type = net2hs(pep-ep_type); /*將幀類型字節(jié)序轉(zhuǎn)換為本機字節(jié)序*/*ni_in函數(shù)可以根據(jù)幀類型來判斷多路分解*/ni_in(&nififnum, pep, readlen); /*調(diào)用ni_in函數(shù)來處理數(shù)據(jù)幀*/return
17、OK;drop:if (ifnum = 0 & ifnum lmd_flags = LMD_OWN; /*交還使用權(quán)*/pbre-flags = 0;return SYSERR; 流程圖如下:習(xí)題5:dot2ip()函數(shù)和ip2dot()函數(shù)實現(xiàn)了字符串形式的點分十進(jìn)制格式的IP地址與32位IP地址格式之間的相互轉(zhuǎn)換。/* dot2ip.c - dot2ip */#include #include #include /*- * dot2ip -將字符串形式的點分十進(jìn)制格式IP地址轉(zhuǎn)換為一個沒有小數(shù)點的IP地址 *- */ dot2ip(const char *pdot)/*參數(shù)pdot是一個指
18、向字符數(shù)組的指針,字符數(shù)組每個單元存儲IP地址的一個字節(jié): */IPaddrip; /*IPaddr是個無符號長整型*/unsigned char*p;/*定義一個指向字符數(shù)組的指針,但此指針并沒有指向真正的內(nèi)存空間*/inti;ip = 0;p = (unsigned char *)&ip; /*使字符數(shù)組指針p指向起始地址是&ip的內(nèi)存單元*/for (i=0; pdot & *pdot & iIP_ALEN; +i) /*如果pdot指針不為空,并且它所指向的內(nèi)容也不為空,而且iip的長度*/*p+ = atoi(pdot); /*將IP地址的一個字節(jié)保存到指針
19、p所指向的內(nèi)存單元中*/if (pdot = index(pdot, .)/*判斷pdot是否指向字符數(shù)組的最后一個單元,并且跳過.單元*/+pdot;elsebreak;return ip; /*返回存儲IP地址首單元的地址*/* ip2dot.c - ip2dot */#include #include #include /*- * ip2dot - 將一個沒有小數(shù)點的IP地址轉(zhuǎn)換為字符串形式的點分十進(jìn)制格式IP地址 *- */ char * ip2dot(char *pdot, IPaddr ip) /*pdot指向一個字符數(shù)組,用于存儲轉(zhuǎn)換后的IP地址;IP是沒有小數(shù)點的IP地址的首地
20、址*/char*pch = pdot;inti;sprintf(pch, %u, (char *)&ip)0 & 0xff); /*將IP地址第一個字節(jié)的值存入pch所指向的字符數(shù)組的第一個單元中*/pch += strlen(pch); /*pch跳過長度為strlen(pch)的內(nèi)存單元,即指向下一個單元*/for (i=1; iIP_ALEN; +i) sprintf(pch, .%u, (char *)&ip)i & 0xff);/*將.及IP地址的下一個字節(jié)保存到pch指向的單元*/pch += strlen(pch);/*pch跳過長度為strlen(pch)的內(nèi)存單元,即指向下一
21、個單元*/*pch = NULL; /*指針置空*/return pdot; /*返回指向字符串形式的點分十進(jìn)制格式IP地址的首地址*/習(xí)題6:Netmatch()函數(shù)用于判斷一個IP地址是否屬于某個網(wǎng)絡(luò),netnum()函數(shù)用于判斷一個IP地址的類別。這兩個函數(shù)都是采用C語言的位操作來完成的。/* netmatch.c - netmatch */#include #include #include /*- * netmatch 檢查目的IP地址是否在此網(wǎng)絡(luò)中 *- */ Bool netmatch(IPaddr dst, IPaddr net, IPaddr mask, Bool isloc
22、al)if (dst & mask) != (net & mask)/*IP地址跟子網(wǎng)掩碼進(jìn)行與運算的結(jié)果就是網(wǎng)絡(luò)號,以此來判斷dst在不在該網(wǎng)絡(luò)上*/return FALSE;/* * local srcs should only match unicast (單一傳播) addresses (host routes) */if (islocal) /*判斷是否來自于本地網(wǎng)絡(luò)*/if (isbrc(dst) | IP_CLASSD(dst)/如果dst是廣播地址或是組播地址*/return mask != ip_maskall; /*如果是來自于本地網(wǎng)絡(luò)并且是廣播地址或是組播地址,那么發(fā)送該
23、廣播幀的主機就不需要接收此廣播幀,于是將自己置成不匹配此網(wǎng)絡(luò),就不會再收到此廣播幀了*/return TRUE;/* netnum.c - netnum */#include #include #include /*- * netnum - 用來得到某個IP地址的網(wǎng)絡(luò)號 *- */ netnum(IPaddr ipa)IPaddrmask = 0; /*初始化為0*/if (IP_CLASSA(ipa) mask = hl2net(0xff000000); /*得到A類地址的子網(wǎng)掩碼*/if (IP_CLASSB(ipa) mask = hl2net(0xffff0000);
24、 /*得到B類地址的子網(wǎng)掩碼*/if (IP_CLASSC(ipa) mask = hl2net(0xffffff00); /*得到C類地址的子網(wǎng)掩碼*/return ipa & mask; /*得到網(wǎng)絡(luò)號,即網(wǎng)絡(luò)地址*/第3章習(xí)題解答參考思路習(xí)題1:本題主要考查對ARP軟件整體結(jié)構(gòu)的理解程度,并幫助學(xué)生梳理ARP軟件中函數(shù)之間的關(guān)系,從而更好地掌握ARP軟件中函數(shù)的功能和處理機制。詳細(xì)描述請參照3.3節(jié)。習(xí)題2:本題主要考查對ARP報文處理算法的理解程度,并幫助學(xué)生進(jìn)一步理解ARP報文處理算法。報文處理算法可以概括為三個部分:當(dāng)報文交付給arp
25、_in()函數(shù)時,該算法首先確認(rèn)該報文是否為合法報文及特征是否與接口相符;然后查詢ARP緩沖區(qū)表項,若不存在對應(yīng)表項且確認(rèn)該報文是發(fā)往本機,則直接創(chuàng)建新表項,再根據(jù)該報文對表項進(jìn)行修改操作;最后根據(jù)該ARP報文是否為ARP請求來決定下一步操作,構(gòu)造一個ARP應(yīng)答報文或清理該ARP報文。ARP報文處理算法的利弊分析如下:在正常操作下,這是一種很有效率的處理算法,簡單明了快捷。但是由算法分析可知,arp_in()函數(shù)“不計后果”地使用當(dāng)前處理的ARP報文中的創(chuàng)建新緩沖區(qū)或者修改已存在的緩沖表項,沒有使用任何保護(hù)手段或者措施。ARP攻擊者很容易利用這一缺陷,發(fā)送ARP欺騙報文。習(xí)題3:主機發(fā)送IP數(shù)
26、據(jù)報是通過調(diào)用netwrite()函數(shù)來實現(xiàn)的,因此分析netwrite()函數(shù)即可了解IP數(shù)據(jù)報的發(fā)送過程。詳細(xì)描述請參考3.5節(jié)。習(xí)題4:Arpalloc.c代碼如下:/*-* 在ARP緩沖區(qū)表中分配一個表項 * -*/struct arpentry *arpalloc()/*緩沖區(qū)表中所指的當(dāng)前表項,這里采用的是循環(huán)隊列的數(shù)據(jù)結(jié)構(gòu),故需要記錄當(dāng)前表項所處的位置*/static int aenext = 0;struct arpentry *pae; /*返回值*/inti;for (i=0; iae_state = AS_PENDING & pae-ae_queue = 0)arpdq(
27、pae);pae-ae_state = AS_PENDING;return pae;習(xí)題5:ARP攻擊原理:由習(xí)題2可知,ARP報文處理算法只檢查ARP報文格式的合法性,隨即直接根據(jù)該報文內(nèi)容修改ARP表項,這一處理方式為網(wǎng)絡(luò)攻擊者提供了“可乘之機”。ARP攻擊分為兩類:(1)ARP欺騙攻擊即通過偽造并發(fā)送ARP報文,修改被攻擊者ARP緩沖區(qū)表項以實現(xiàn)ARP欺騙,監(jiān)聽被攻擊者與其他網(wǎng)絡(luò)的通信;(2)ARP溢出攻擊即通過發(fā)送大量的ARP報文致使被攻擊主機的ARP表項存滿無效的表項,從而導(dǎo)致該主機與外界通信中斷。避免或阻止ARP攻擊可以通過改進(jìn)ARP自身(優(yōu)化報文處理算法)或借助動態(tài)防御系統(tǒng)(如專
28、用ARP防火墻等)來實現(xiàn)。第4章習(xí)題解答參考思路習(xí)題1:該題主要考查對IP軟件整體結(jié)構(gòu)的理解程度,旨在使學(xué)生能夠脫離教材根據(jù)自己的理解勾勒出軟件的構(gòu)架。注重用自己的語言描述各函數(shù)的主要功能,以及相互之間的調(diào)用關(guān)系。具體內(nèi)容參見4.3節(jié)。習(xí)題2:該題結(jié)合IP數(shù)據(jù)報結(jié)構(gòu),主要考查對C語言結(jié)構(gòu)體的掌握程度。struct ipcharip_verpri;charip_flowlab3;shortip_ploadlen;charip_proto;charip_ttl;charsrc16;chardst16;charip_data1;另外,可以參考LINUX或者FreeBSD相應(yīng)的實現(xiàn)程序。習(xí)題3:該題的
29、解答請從4.6.3節(jié)的內(nèi)容中進(jìn)行綜合提煉。習(xí)題4:該題主要考查對IP數(shù)據(jù)報首部個字段的理解程度。IP數(shù)據(jù)報轉(zhuǎn)發(fā)過程中,TTL會發(fā)生變化,這樣會導(dǎo)致檢驗和變化;如果IP數(shù)據(jù)報產(chǎn)生分片,則IP數(shù)據(jù)報長度字段、標(biāo)識字段、標(biāo)志字段、分片偏移字段也會發(fā)生變化;如果IP數(shù)據(jù)報首部存在分片,則首部長度字段有可能發(fā)生變化。習(xí)題5:該題需要注意,對于不同體系結(jié)構(gòu)的主機需要設(shè)計不同的轉(zhuǎn)換宏,這里僅提供16位轉(zhuǎn)換宏。#ifBYTE_ORDER = LITTLE_ENDIAN#definehs2net(x) (unsigned) (x)8) &0xff) | (x) & 0xff)8)#definenet2hs(x)
30、 hs2net(x)#endif#ifBYTE_ORDER = BIG_ENDIAN#define hs2net(x) (x)#define net2hs(x) (x)#endif習(xí)題6:XINU操作系統(tǒng)中環(huán)回接口的實現(xiàn)方案如下:我們從IP數(shù)據(jù)的流向圖理解環(huán)回接口的實現(xiàn),IP輸入隊列中的數(shù)據(jù)來源有兩種:一種是網(wǎng)絡(luò)中輸入的報文,一種是上層協(xié)議希望通過ipsend()函數(shù)發(fā)送的報文。這兩種報文經(jīng)過ipproc()函數(shù)處理后調(diào)用ipputp()函數(shù)發(fā)送,報文有兩個去向:一個是交付物理網(wǎng)絡(luò)接口發(fā)送,一個是通過環(huán)回接口交付上層協(xié)議。所以在IP層數(shù)據(jù)的流向有4種:第一種是13,內(nèi)部數(shù)據(jù)發(fā)送給內(nèi)部數(shù)據(jù);第二
31、種是23,將外部接收到的數(shù)據(jù)向上層協(xié)議發(fā)送;第三種是14,將來自上層協(xié)議的數(shù)據(jù)向外發(fā)送;第四種是24,只是將收到的數(shù)據(jù)轉(zhuǎn)發(fā)出去。當(dāng)ipputp()函數(shù)調(diào)用netwrite()函數(shù)發(fā)送一個報文時,若路由中提供的報文出接口為本地環(huán)回接口,則netwrite()函數(shù)會調(diào)用local_out()函數(shù)將IP數(shù)據(jù)報交付上層協(xié)議,即習(xí)題6圖示中的3。local_out()函數(shù)先是將IP數(shù)據(jù)報的字節(jié)序轉(zhuǎn)換為主機字節(jié)序,然后將收到的數(shù)據(jù)幀重組,再處理IP數(shù)據(jù)報的選項部分,最后根據(jù)協(xié)議字段將數(shù)據(jù)發(fā)送給UDP、ICMP、TCP等上層協(xié)議。如果協(xié)議字段有錯誤,就發(fā)送ICMP不可達(dá)報文。因此,local_out()函數(shù)
32、處理的是本機接收的數(shù)據(jù),這個數(shù)據(jù)有可能是自己產(chǎn)生的,也可能是網(wǎng)絡(luò)中收到的數(shù)據(jù)。習(xí)題7:選路和轉(zhuǎn)發(fā)的主要差異及三層轉(zhuǎn)發(fā)的實現(xiàn)方式如下:選路的原理:當(dāng)路由器收到一個需要它轉(zhuǎn)發(fā)的IP數(shù)據(jù)報時,它會根據(jù)數(shù)據(jù)報中的目的IP地址搜索路由表,找到相關(guān)的路由表項,并根據(jù)路由中的三元組將數(shù)據(jù)報從相關(guān)的出接口轉(zhuǎn)發(fā)。而路由表的維護(hù)是由專門的路由選擇協(xié)議來進(jìn)行的,IP層只需要在轉(zhuǎn)發(fā)數(shù)據(jù)時搜索路由表即可。轉(zhuǎn)發(fā)的原理:交換機接收到源主機發(fā)送的數(shù)據(jù)幀后,在MAC地址表中查找數(shù)據(jù)幀中的目的MAC地址。如果找到,就將該數(shù)據(jù)幀發(fā)送到相應(yīng)的端口;如果找不到,就向所有的端口發(fā)送。同時利用接收數(shù)據(jù)幀中的源MAC地址來建立MAC地址表。
33、選路和轉(zhuǎn)發(fā)的區(qū)別主要是,選路在IP層,根據(jù)目的IP地址找到出接口;轉(zhuǎn)發(fā)在數(shù)據(jù)鏈路層,根據(jù)MAC地址對數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)。另外,轉(zhuǎn)發(fā)表和路由表不同,轉(zhuǎn)發(fā)表中的一行包括從網(wǎng)絡(luò)號到發(fā)出接口的映射和一些MAC信息,而路由表是由路由選擇算法建立的一個表,它通常包含從網(wǎng)絡(luò)號到下一跳IP地址的映射,轉(zhuǎn)發(fā)表可以由特殊的硬件來實現(xiàn),而路由表很少這樣。為了實現(xiàn)三層交換技術(shù),交換機將維護(hù)一張至少包括“目的IP地址,下一跳MAC地址”在內(nèi)的硬件轉(zhuǎn)發(fā)表。當(dāng)交換機接收到數(shù)據(jù)時,根據(jù)報文中的“目的IP地址”查詢硬件轉(zhuǎn)發(fā)表,根據(jù)匹配結(jié)果進(jìn)行相應(yīng)的數(shù)據(jù)轉(zhuǎn)發(fā),并且采用硬件芯片或高速緩沖區(qū)支持,可以達(dá)到線速。在交換機剛啟動完畢時,交換機
34、就把設(shè)備的軟件路由表下載到ASIC芯片上。在需要進(jìn)行三層交換的報文到達(dá)交換機后,交換機首先會查詢最長匹配硬件轉(zhuǎn)發(fā)表,但由于MAC地址是未知的,無法同時下載,此時的硬件轉(zhuǎn)發(fā)表是無效的,所以無法進(jìn)行硬件數(shù)據(jù)轉(zhuǎn)發(fā)。因此,交換機將利用CPU對數(shù)據(jù)進(jìn)行軟件路由轉(zhuǎn)發(fā),交換機在數(shù)據(jù)轉(zhuǎn)發(fā)過程中獲取下一跳IP地址和數(shù)據(jù)轉(zhuǎn)發(fā)出口的MAC地址,然后會被自動下載到三層硬件轉(zhuǎn)發(fā)表,此時包含了下一跳IP地址和數(shù)據(jù)轉(zhuǎn)發(fā)出口MAC地址的硬件轉(zhuǎn)發(fā)表項才真正生效。在這之后,發(fā)往相同目的IP網(wǎng)段的報文到達(dá)交換機都可以直接通過最長匹配硬件轉(zhuǎn)發(fā)表進(jìn)行硬件轉(zhuǎn)發(fā),而其他網(wǎng)段的數(shù)據(jù)轉(zhuǎn)發(fā)則需要重復(fù)上述過程。習(xí)題8:匯編語言函數(shù)可參考net/c
35、ksum.s文件,C語言函數(shù)可參考ucpcksum.c或者tcpcksum.c實現(xiàn)程序。習(xí)題9:由于通常情況下,IP報文首部發(fā)生變化的字段主要是TTL。而檢驗和字段是伴隨TTL字段變化而變化的,因此根據(jù)RFC1624可以設(shè)計一種不需要重新計算檢驗和的修正方法。具體方法參見RFC1642.習(xí)題10:使用散列結(jié)構(gòu)并通過分離鏈接的方法處理散列沖突,在元素個數(shù)保持一定規(guī)模的情況下可以保證insert和search的時間復(fù)雜度為O(1)。但是隨著元素規(guī)模的擴大,insert和search的時間復(fù)雜度會逐漸脫離常數(shù)。同時,選擇散列函數(shù)時需要非常謹(jǐn)慎。對于元素關(guān)鍵字隨機化程度較高的情況,可采用二分搜索樹的實
36、現(xiàn)方式。這種方式可以保證search的時間復(fù)雜度為O(log n),但是對元素關(guān)鍵字隨機化程度的要求比較高。為了防止不平衡的二分搜索樹出現(xiàn),可采用AVL樹或者紅黑樹作為路由結(jié)構(gòu)。只是兩者在元素的insert操作時需要一些額外的時間。目前廣泛流行的路由表結(jié)構(gòu)是采用radix樹的構(gòu)造。它可以保證最壞情況下search的時間復(fù)雜度達(dá)到O(log n)。第5章習(xí)題解答參考思路習(xí)題1: 本題主要考查對ICMP軟件整體結(jié)構(gòu)的理解程度,幫助學(xué)生梳理ICMP軟件中函數(shù)之間的關(guān)系,從而更好地掌握ICMP軟件中函數(shù)的功能和處理機制。詳細(xì)描述請參照5.3節(jié)。習(xí)題2:(1)終點不可達(dá)報文:當(dāng)路由器不能為報文找到路由或
37、者主機不能交付報文時,丟棄該報文并發(fā)送該類型報文給源主機;(2)源點抑制報文:當(dāng)路由器或主機因擁塞而丟棄報文時,向源主機發(fā)送該類型報文;(3)超時報文:當(dāng)路由器收到TTL為零的報文或目的主機在規(guī)定的時間內(nèi)沒有收到所有的分片報文時,向源主機發(fā)送該類型報文;(4)參數(shù)錯誤報文:當(dāng)路由器或主機收到存在二義性或字段缺失的報文時,丟棄該報文并發(fā)送該類型報文;(5)改變路由報文:當(dāng)路由器收到本應(yīng)發(fā)往其他路由器的報文時,把該報文發(fā)送給正確的路由器,并發(fā)送該類型報文通知源主機更正路由,以幫助更新路由。ICMP的5種差錯報告報文結(jié)構(gòu)如下: (1)終點不可達(dá)報文 類型:3代碼:015檢驗和未使用(全0)收到的IP
38、數(shù)據(jù)報的一部分,包括IP數(shù)據(jù)報首部以及數(shù)據(jù)報數(shù)據(jù)的前8個字節(jié)(2)源點抑制報文 類型:4代碼:0檢驗和未使用(全0)收到的IP數(shù)據(jù)報的一部分,包括IP數(shù)據(jù)報首部以及數(shù)據(jù)報數(shù)據(jù)的前8個字節(jié)(3)超時報文 類型:11代碼:0或1檢驗和未使用(全0)收到的IP數(shù)據(jù)報的一部分,包括IP數(shù)據(jù)報首部以及數(shù)據(jù)報數(shù)據(jù)的前8個字節(jié)(4)參數(shù)錯誤報文類型:12代碼:0或1檢驗和指針未使用(全0)收到的IP數(shù)據(jù)報的一部分,包括IP數(shù)據(jù)報首部以及數(shù)據(jù)報數(shù)據(jù)的前8個字節(jié)(5)改變路由報文類型:5代碼:03檢驗和目標(biāo)路由器IP地址收到的IP數(shù)據(jù)報的一部分,包括IP數(shù)據(jù)報首部以及數(shù)據(jù)報數(shù)據(jù)的前8個字節(jié)習(xí)題3:本題主要考查對
39、PING程序?qū)崿F(xiàn)及與ICMP報文聯(lián)系的掌握程度,幫助學(xué)生更深入地了解ICMP報文的實現(xiàn)。詳細(xì)描述請參照5.6節(jié)。 習(xí)題4:icsetbuf.c文件的源代碼如下。/*-* icsetbuf - 為ICMP報文申請一個緩沖區(qū)* icsetbuf()函數(shù)為ICMP報文分配緩沖區(qū),設(shè)置了兩個變量,其中一個變量指出該報文是否是一個差錯報告報文(或是一個信息請求);而另一個指出這個報文的類型是否是對上一個請求做出的應(yīng)答。* 該函數(shù)很直觀,具體分四種情況:對絕大多數(shù)的應(yīng)答,icsetbuf()函數(shù)重新利用抵達(dá)的請求報文占用的緩沖區(qū)(即返回由入口參數(shù)pa1提供的地址);對于沒有具體實現(xiàn)的報文類型,icsetb
40、uf()函數(shù)釋放引起差錯的報文,返回SYSERR;對含有大量數(shù)據(jù)的ICMP報文,icsetbuf()函數(shù)為其分配一個大緩沖區(qū);對其他不能利用原緩沖區(qū)的報文,icsetbuf()函數(shù)為它們分配一個標(biāo)準(zhǔn)緩沖區(qū)。*-*/struct ep *icsetbuf(type, pa1, pisresp, piserr)inttype;char*pa1;/*舊的報文(如果有的話)*/Bool*pisresp,/*查詢報文*/*piserr;/*差錯報告報文*/Struct ep *pep; /*正在處理的以太網(wǎng)幀*/*pisresp = *piserr = FALSE;switch (type) case
41、ICT_REDIRECT:/*重定向報文*/pep = (struct ep *)getbufi(Npool);/* char *getbufi(poolid)申請小緩沖區(qū)*/if (pep = NULL)return(NULL);blkcopy(pep, pa1, MAXNETBUF);/* 函數(shù)原型為blkcopy(to, from, nbytes)*/pa1 = (char *)pep;*piserr = TRUE;break;case ICT_DESTUR:/*終點不可達(dá)報文*/case ICT_SRCQ: /*源點抑制報文*/case ICT_TIMEX: /*超時報文*/case
42、ICT_PARAMP: /*參數(shù)錯誤報文*/pep = (struct ep *)pa1;*piserr = TRUE;break;case ICT_ECHORP:/*ECHO應(yīng)答報文*/case ICT_INFORP:/*消息應(yīng)答報文*/case ICT_MASKRP:/ *ICMP掩碼應(yīng)答報文*/pep = (struct ep *)pa1;*pisresp = TRUE;break;case ICT_ECHORQ:/*ECHO請求報文*/case ICT_TIMERQ: /*時間戳請求報文*/case ICT_INFORQ: /*消息請求報文*/case ICT_MASKRQ: /*IC
43、MP掩碼請求報文*/pep = (struct ep *)getbufi(Net.lrgpool); /*申請大緩沖區(qū)*/if (pep = NULL)return(NULL);break;case ICT_TIMERP:/* 時間戳應(yīng)答報文 */* IcmpOutTimestampsReps+; */IcmpOutErrors-;/* Kludge:超時報文數(shù)加1 */freebuf(pa1);return(NULL);switch (type) /* 更新MIB 統(tǒng)計信息量*/case ICT_ECHORP:IcmpOutEchos+;break;case ICT_ECHORQ:IcmpO
44、utEchoReps+;break;case ICT_DESTUR:IcmpOutDestUnreachs+;break;case ICT_SRCQ:IcmpOutSrcQuenchs+;break;case ICT_REDIRECT:IcmpOutRedirects+;break;case ICT_TIMEX:IcmpOutTimeExcds+;break;case ICT_PARAMP:IcmpOutParmProbs+;break;case ICT_TIMERQ:IcmpOutTimestamps+;break;case ICT_TIMERP:IcmpOutTimestampReps+;
45、break;case ICT_MASKRQ:IcmpOutAddrMasks+;break;case ICT_MASKRP:IcmpOutAddrMaskReps+;break;return pep;char *getbufi(poolid)/*從預(yù)先設(shè)定的緩沖池申請緩沖區(qū),如果沒有可用的緩沖區(qū)則立即返回*/struct ep /* 以太幀結(jié)構(gòu)*/IPaddrep_nexthop; /* niput函數(shù)使用 */shortep_len; /*以太幀長度 */structeh ep_eh; /*以太幀首部 */charep_dataEP_DLEN;/*以太幀的數(shù)據(jù)部分*/;icsetdata.c
46、文件的源代碼如下。/* ECHOMAX必須是偶數(shù)*/#define ECHOMAX(pip) (MAXLRGBUF-IC_HLEN-IP_HLEN(pip)-EP_HLEN)/*MAXLRGBUF 最大緩沖區(qū)*/*IC_HLEN 8*/*IP_HLEN(pip) (pip-ip_verlen & 0xf)ip_data;inti, len;switch (type) case ICT_ECHORP: /*ECHO應(yīng)答報文*/len = pip-ip_len-IP_HLEN(pip)-IC_HLEN;/* 長度 = IP報文長度-IP首部長度-ICMP首部長度*/if (isodd(len)/*
47、 isodd()函數(shù):判斷其參數(shù)是不是奇數(shù),如果是奇數(shù)就返回TRUE,否則返回FASLE和錯誤值*/pic-ic_datalen = 0;/*ICMP數(shù)據(jù)區(qū)CRC校驗 */return len;case ICT_DESTUR:/*終點不可達(dá)報文*/case ICT_SRCQ: /*源點抑制報文*/case ICT_TIMEX: /*超時報文*/pic-ic_mbz = (long) 0; /*必須為0 */break;case ICT_REDIRECT:/*重定向報文*/blkcopy(pic-ic_gw, pa2, IP_ALEN); /* blkcopy(to, from, nbytes) 重定向到網(wǎng)關(guān)*/break;case ICT_PARAMP:/*參數(shù)錯誤報文*/len = (int)pa2;pic-ic_ptr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)莊餐廳租賃合同范例
- fob英文合同范例
- 2025屆高考數(shù)學(xué)大二輪復(fù)習(xí)層級二專題二三角函數(shù)及解三角形第2講三角恒等變換與解三角形教學(xué)案
- 農(nóng)村收購木材合同范例
- 農(nóng)業(yè)訂單生產(chǎn)合同范例
- 倉庫供貨合同范例
- 業(yè)主拍照物業(yè)合同范本
- 書驗收合同范例范例
- CEBPB基因調(diào)控絨山羊毛囊干細(xì)胞增殖及其與產(chǎn)絨性狀相關(guān)研究
- 基于SEER數(shù)據(jù)庫的脂肪肉瘤主要亞型患者的預(yù)后影響因素分析
- 第5.3課《國家的兒子》-2023-2024學(xué)年中職高一語文新教材同步教學(xué)講堂(高教版2023·基礎(chǔ)模塊上冊)
- 安全責(zé)任承諾書范本
- 四年級數(shù)學(xué)下冊 七 三角形、 平行四邊形和梯形 1 三角形的認(rèn)識課件 蘇教版 課件
- 武漢市城中村綜合改造掛牌出讓土地成本測算
- 員工請假管理制度-員工請假管理制度范文
- 帶小孩保姆合同協(xié)議書范本
- 初中趣味數(shù)學(xué)PPT課件
- MDI Jade 最完整教程(XRD分析)
- 畢業(yè)設(shè)計(論文)基于PLC的自動滅火器系統(tǒng)設(shè)計
- 畢業(yè)設(shè)計(論文)鋼包用耐火材料的設(shè)計及優(yōu)化
- 利用高爐煉鐵煙塵回收有色金屬新技術(shù)開發(fā)
評論
0/150
提交評論