網絡協議分析習題解答參考思路._第1頁
網絡協議分析習題解答參考思路._第2頁
網絡協議分析習題解答參考思路._第3頁
網絡協議分析習題解答參考思路._第4頁
網絡協議分析習題解答參考思路._第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、網絡協議分析與實現習題解答參考思路第1章習題解答參考思路習題1:該題考查對異構網絡互聯概念、異構網絡涉及的問題以及解決方法的理解程度。其中涉及的問題包括地址問題、包格式轉換問題、路由問題等,其中1.1.3節(jié)還列舉了很多其他的問題。習題2:該題可參考教材中所講述的用戶A和用戶B的數據轉換和傳輸過程進行解答。習題3:該題主要考查網上查找資料的能力。在/網站上可以查到所有的RFC信息。習題4:TCP/IP模型和OSI參考模型之間的層次對應關系及各層協議參見教材中的圖1-5。習題5:該題主要考查動手能力,可以使用Wireshark(曾稱為Ethereal

2、)、Sniffer Portable等軟件進行抓包,然后針對一些具體報文進行分析。注意分析通信中的多路復用和多路分解過程,說出通信雙方的物理地址、IP地址和端口地址。習題6:該題主要考查閱讀代碼的能力,這部分代碼是對數據結構課程中隊列操作的一個實現。該隊列是一個基于優(yō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);/*入隊列操作,根據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章習題解答參考思路習題1:該題主要考查對HDLC概念的

4、理解程度,答案參見2.1節(jié)。習題2:該題主要考查對SLIP、PPP之間的關系,PPP對SLIP的改進以及PPPoE的概念的理解程度。SLIP和PPP可以在教材中找到參考資料,PPPoE可以到網上或RFC中查找參考資料。PPPoE全稱為Point to Point Protocol over Ethernet(以太網上的點對點協議),簡單地說,就是以太網和PPP結合后的協議,目前廣泛應用在ADSL接入方式中。通過PPPoE技術和寬帶調制解調器(比如ADSL Modem)可以實現高速寬帶網的個人身份驗證訪問,為每個用戶創(chuàng)建虛擬撥號連接,這樣就可以高速連接入因特網。(1)PPP在SLIP的基礎上的改

5、進之處 提供了校驗機制,可以對每一幀進行檢查; 提供了IP地址的動態(tài)協商機制,使通信雙方能夠得知對方的IP地址; 在一條串行鏈路上提供了對多協議的支持; 提供了對TCP和IP數據報首部的壓縮機制。(2)PPPoE和PPP的關系PPP提供了一種標準的方式在點對點的鏈路上傳輸多種網絡層協議的數據報。它要求通信雙方之間是點到點的關系,由于不適用于廣播類型的以太網和另外一些多點訪問類型的網絡,因此就產生了PPPoE。在實際應用中,PPPoE利用以太網的工作機理,將ADSL Modem的10BASE-T接口與內部以太網互聯,在ADSL Modem中采用RFC1483的橋接封裝方式對終端發(fā)出的PPP報文進

6、行LLC/SNAP封裝后,通過連結兩端的PVC在ADSL Modem與網絡側的寬帶接入服務器之間建立連接,實現PPP的動態(tài)接入。PPPoE接入利用在網絡側和ADSL Modem之間的一條PVC(永久虛擬電路)就可以完成以太網上多用戶的共同接入,實際組網方式簡單,實用方便,大大降低了網絡的復雜程度。PPPoE的實質就是以太網和撥號網絡之間的一個中繼協議,它繼承了以太網的快速和PPP撥號的簡單、用戶驗證、IP分配等優(yōu)點。 (3)PPPoE的工作流程PPPoE提供了在廣播式網絡(如以太網)中多臺主機連接到遠端的訪問集中器上的一種標準。在這種網絡模型中,不難看出所有用戶的主機都需要能獨立地初始化自己的

7、PPP協議棧,而且通過PPP本身所具有的一些特點能在廣播式網絡上對用戶進行計費和管理。為了能在廣播式網絡上建立、維持各主機與訪問集中器之間點對點的關系,需要每個主機與訪問集中器之間建立唯一的點到點的會話。PPPoE共包括兩個階段,即PPPoE的發(fā)現階段(PPPoE Discovery Stage)和PPPoE的會話階段(PPPoE Session Stage)。 發(fā)現階段:此階段用來建立連接,如下圖所示,當一個用戶主機想開始一個PPPoE會話時,首先必須經過發(fā)現階段以識別PPPoE Server的以太網MAC地址,并建立一個PPPoE會話標識(Session ID)。如上圖所示,該階段的基本工

8、作流程由4個步驟組成。PADI:如果要建立一條PPPoE連接,首先PPPoE客戶端要以廣播的方式發(fā)送一個PADI(PPPoE Active Discovery Initiation)報文,PADI報文包括客戶端請求的服務。PADO:在PPPoE服務器(BRAS)收到一個PADI報文之后,它會判斷自己是否能夠提供服務,如果能夠提供服務,就會向客戶端發(fā)送PADO(PPPoE Active Discovery Offer)報文來進行回應。PADO報文包括PPPoE服務器名稱和與PADI報文中相同的服務名;如果PPPoE服務器不能為PADI提供服務,則不允許用PADO報文應答。PADR:由于PADI是

9、以廣播的形式發(fā)送出去的,PPPoE客戶端可能會收到不止一個PADO報文,它將審查所有接收到的PADO報文并根據其中的服務器名或所提供的服務選擇一個PPPoE服務器,同時向選中的服務器發(fā)送PADR(PPPoE Active Discovery Request)報文。PADR報文包括客戶端所請求的服務。PADS:當PPPoE服務器收到客戶端發(fā)送的PADR報文時,它準備開始一個PPPoE會話。它為PPPoE會話創(chuàng)建一個唯一的PPPoE會話標識,并向客戶端發(fā)送PADS(PPPoE Active Discovery Session- confirmation)報文作為應答。當發(fā)現階段正常結束后,通信的兩

10、端都會獲得會話標識和對方的MAC地址,它們一起唯一定義一個PPPoE會話。 會話階段:PPPoE進入PPP會話階段后,客戶端和服務器將進行標準的PPP協商,PPP協商通過后,數據通過PPP封裝發(fā)送。PPP報文作為PPPoE幀的凈荷被封裝在以太網幀內,發(fā)送到PPPoE鏈路的對端。會話標識必須是發(fā)現階段確定的標識,并且在會話過程中保持不變,MAC地址必須是對端的MAC地址。在會話階段的任意時刻,PPPoE服務器和客戶端都可向對方發(fā)送PADT(PPPoE Active Discovery Terminate)報文通知對方結束本會話。收到PADT以后,就不再允許使用該會話發(fā)送PPP流量了。在發(fā)送或接收

11、到PADT報文后,即使是常規(guī)的PPP結束報文也不允許發(fā)送。一般情況下,PPP通信雙方使用PPP報文自身來結束PPPoE會話,但在無法使用PPP時可以使用PADT來結束會話。(4)幀結構及其應用版本4位類型4位代碼8位會話標識16位長度16位凈載荷發(fā)現階段承載一些標記會話階段承載PPP報文PPPoE作為寬帶網接入的一種有效方法,不但可以防止IP被盜用,還有利于開展多服務、速率限制和按時按流量計費等多方面的應用。習題3:該題主要考查對CSMA/CD和CSMA/CA協議,以及無線網絡中“隱藏站”問題的理解程度。習題4: XINU操作系統(tǒng)源代碼etherlance目錄下存放的是AMD 7990 Lan

12、ce以太網控制器驅動實現程序源代碼,其中ethdemux函數實現了該控制器接收到以太幀后所要進行的多路分解操作。該函數首先進行一些檢查,然后進行數據幀的復制,并最終轉入ni_in()函數,進行網絡接口層的多路分解。/* ethdemux.c - ethdemux */#include #include #include /*- * ethmudex -選擇一個端口發(fā)送一個傳入的數據報(ETHER端或者其他) *-*/ /*首先檢查來自網絡的數據幀的正確性,然后申請緩沖區(qū)以存儲數據幀,最后將數據幀交由ni_in()函數處理*/int ethdemux(etptr, bn)struct etblk

13、 *etptr; /*以太網控制塊描述*/int bn;structbre*pbre;structle_md*pmd; /*消息描述符*/structotblk*otptr;structep*pep; /*以太網的幀結構*/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); /*將網卡緩沖區(qū)中的信息復制到幀緩沖區(qū)*/pmd-lmd_flags = LMD_OWN; /*將使用權還給以太網卡*/pbre-flags = 0; /*標志位清零*/#ifNoth 0/*其他設備端口*/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é)序轉換為本機字節(jié)序*/*ni_in函數可以根據幀類型來判斷多路分解*/ni_in(&nififnum, pep, readlen); /*調用ni_in函數來處理數據幀*/return

17、OK;drop:if (ifnum = 0 & ifnum lmd_flags = LMD_OWN; /*交還使用權*/pbre-flags = 0;return SYSERR; 流程圖如下:習題5:dot2ip()函數和ip2dot()函數實現了字符串形式的點分十進制格式的IP地址與32位IP地址格式之間的相互轉換。/* dot2ip.c - dot2ip */#include #include #include /*- * dot2ip -將字符串形式的點分十進制格式IP地址轉換為一個沒有小數點的IP地址 *- */ dot2ip(const char *pdot)/*參數pdot是一個指

18、向字符數組的指針,字符數組每個單元存儲IP地址的一個字節(jié): */IPaddrip; /*IPaddr是個無符號長整型*/unsigned char*p;/*定義一個指向字符數組的指針,但此指針并沒有指向真正的內存空間*/inti;ip = 0;p = (unsigned char *)&ip; /*使字符數組指針p指向起始地址是&ip的內存單元*/for (i=0; pdot & *pdot & iIP_ALEN; +i) /*如果pdot指針不為空,并且它所指向的內容也不為空,而且iip的長度*/*p+ = atoi(pdot); /*將IP地址的一個字節(jié)保存到指針

19、p所指向的內存單元中*/if (pdot = index(pdot, .)/*判斷pdot是否指向字符數組的最后一個單元,并且跳過.單元*/+pdot;elsebreak;return ip; /*返回存儲IP地址首單元的地址*/* ip2dot.c - ip2dot */#include #include #include /*- * ip2dot - 將一個沒有小數點的IP地址轉換為字符串形式的點分十進制格式IP地址 *- */ char * ip2dot(char *pdot, IPaddr ip) /*pdot指向一個字符數組,用于存儲轉換后的IP地址;IP是沒有小數點的IP地址的首地

20、址*/char*pch = pdot;inti;sprintf(pch, %u, (char *)&ip)0 & 0xff); /*將IP地址第一個字節(jié)的值存入pch所指向的字符數組的第一個單元中*/pch += strlen(pch); /*pch跳過長度為strlen(pch)的內存單元,即指向下一個單元*/for (i=1; iIP_ALEN; +i) sprintf(pch, .%u, (char *)&ip)i & 0xff);/*將.及IP地址的下一個字節(jié)保存到pch指向的單元*/pch += strlen(pch);/*pch跳過長度為strlen(pch)的內存單元,即指向下一

21、個單元*/*pch = NULL; /*指針置空*/return pdot; /*返回指向字符串形式的點分十進制格式IP地址的首地址*/習題6:Netmatch()函數用于判斷一個IP地址是否屬于某個網絡,netnum()函數用于判斷一個IP地址的類別。這兩個函數都是采用C語言的位操作來完成的。/* netmatch.c - netmatch */#include #include #include /*- * netmatch 檢查目的IP地址是否在此網絡中 *- */ Bool netmatch(IPaddr dst, IPaddr net, IPaddr mask, Bool isloc

22、al)if (dst & mask) != (net & mask)/*IP地址跟子網掩碼進行與運算的結果就是網絡號,以此來判斷dst在不在該網絡上*/return FALSE;/* * local srcs should only match unicast (單一傳播) addresses (host routes) */if (islocal) /*判斷是否來自于本地網絡*/if (isbrc(dst) | IP_CLASSD(dst)/如果dst是廣播地址或是組播地址*/return mask != ip_maskall; /*如果是來自于本地網絡并且是廣播地址或是組播地址,那么發(fā)送該

23、廣播幀的主機就不需要接收此廣播幀,于是將自己置成不匹配此網絡,就不會再收到此廣播幀了*/return TRUE;/* netnum.c - netnum */#include #include #include /*- * netnum - 用來得到某個IP地址的網絡號 *- */ netnum(IPaddr ipa)IPaddrmask = 0; /*初始化為0*/if (IP_CLASSA(ipa) mask = hl2net(0xff000000); /*得到A類地址的子網掩碼*/if (IP_CLASSB(ipa) mask = hl2net(0xffff0000);

24、 /*得到B類地址的子網掩碼*/if (IP_CLASSC(ipa) mask = hl2net(0xffffff00); /*得到C類地址的子網掩碼*/return ipa & mask; /*得到網絡號,即網絡地址*/第3章習題解答參考思路習題1:本題主要考查對ARP軟件整體結構的理解程度,并幫助學生梳理ARP軟件中函數之間的關系,從而更好地掌握ARP軟件中函數的功能和處理機制。詳細描述請參照3.3節(jié)。習題2:本題主要考查對ARP報文處理算法的理解程度,并幫助學生進一步理解ARP報文處理算法。報文處理算法可以概括為三個部分:當報文交付給arp

25、_in()函數時,該算法首先確認該報文是否為合法報文及特征是否與接口相符;然后查詢ARP緩沖區(qū)表項,若不存在對應表項且確認該報文是發(fā)往本機,則直接創(chuàng)建新表項,再根據該報文對表項進行修改操作;最后根據該ARP報文是否為ARP請求來決定下一步操作,構造一個ARP應答報文或清理該ARP報文。ARP報文處理算法的利弊分析如下:在正常操作下,這是一種很有效率的處理算法,簡單明了快捷。但是由算法分析可知,arp_in()函數“不計后果”地使用當前處理的ARP報文中的創(chuàng)建新緩沖區(qū)或者修改已存在的緩沖表項,沒有使用任何保護手段或者措施。ARP攻擊者很容易利用這一缺陷,發(fā)送ARP欺騙報文。習題3:主機發(fā)送IP數

26、據報是通過調用netwrite()函數來實現的,因此分析netwrite()函數即可了解IP數據報的發(fā)送過程。詳細描述請參考3.5節(jié)。習題4:Arpalloc.c代碼如下:/*-* 在ARP緩沖區(qū)表中分配一個表項 * -*/struct arpentry *arpalloc()/*緩沖區(qū)表中所指的當前表項,這里采用的是循環(huán)隊列的數據結構,故需要記錄當前表項所處的位置*/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;習題5:ARP攻擊原理:由習題2可知,ARP報文處理算法只檢查ARP報文格式的合法性,隨即直接根據該報文內容修改ARP表項,這一處理方式為網絡攻擊者提供了“可乘之機”。ARP攻擊分為兩類:(1)ARP欺騙攻擊即通過偽造并發(fā)送ARP報文,修改被攻擊者ARP緩沖區(qū)表項以實現ARP欺騙,監(jiān)聽被攻擊者與其他網絡的通信;(2)ARP溢出攻擊即通過發(fā)送大量的ARP報文致使被攻擊主機的ARP表項存滿無效的表項,從而導致該主機與外界通信中斷。避免或阻止ARP攻擊可以通過改進ARP自身(優(yōu)化報文處理算法)或借助動態(tài)防御系統(tǒng)(如專

28、用ARP防火墻等)來實現。第4章習題解答參考思路習題1:該題主要考查對IP軟件整體結構的理解程度,旨在使學生能夠脫離教材根據自己的理解勾勒出軟件的構架。注重用自己的語言描述各函數的主要功能,以及相互之間的調用關系。具體內容參見4.3節(jié)。習題2:該題結合IP數據報結構,主要考查對C語言結構體的掌握程度。struct ipcharip_verpri;charip_flowlab3;shortip_ploadlen;charip_proto;charip_ttl;charsrc16;chardst16;charip_data1;另外,可以參考LINUX或者FreeBSD相應的實現程序。習題3:該題的

29、解答請從4.6.3節(jié)的內容中進行綜合提煉。習題4:該題主要考查對IP數據報首部個字段的理解程度。IP數據報轉發(fā)過程中,TTL會發(fā)生變化,這樣會導致檢驗和變化;如果IP數據報產生分片,則IP數據報長度字段、標識字段、標志字段、分片偏移字段也會發(fā)生變化;如果IP數據報首部存在分片,則首部長度字段有可能發(fā)生變化。習題5:該題需要注意,對于不同體系結構的主機需要設計不同的轉換宏,這里僅提供16位轉換宏。#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習題6:XINU操作系統(tǒng)中環(huán)回接口的實現方案如下:我們從IP數據的流向圖理解環(huán)回接口的實現,IP輸入隊列中的數據來源有兩種:一種是網絡中輸入的報文,一種是上層協議希望通過ipsend()函數發(fā)送的報文。這兩種報文經過ipproc()函數處理后調用ipputp()函數發(fā)送,報文有兩個去向:一個是交付物理網絡接口發(fā)送,一個是通過環(huán)回接口交付上層協議。所以在IP層數據的流向有4種:第一種是13,內部數據發(fā)送給內部數據;第二

31、種是23,將外部接收到的數據向上層協議發(fā)送;第三種是14,將來自上層協議的數據向外發(fā)送;第四種是24,只是將收到的數據轉發(fā)出去。當ipputp()函數調用netwrite()函數發(fā)送一個報文時,若路由中提供的報文出接口為本地環(huán)回接口,則netwrite()函數會調用local_out()函數將IP數據報交付上層協議,即習題6圖示中的3。local_out()函數先是將IP數據報的字節(jié)序轉換為主機字節(jié)序,然后將收到的數據幀重組,再處理IP數據報的選項部分,最后根據協議字段將數據發(fā)送給UDP、ICMP、TCP等上層協議。如果協議字段有錯誤,就發(fā)送ICMP不可達報文。因此,local_out()函數

32、處理的是本機接收的數據,這個數據有可能是自己產生的,也可能是網絡中收到的數據。習題7:選路和轉發(fā)的主要差異及三層轉發(fā)的實現方式如下:選路的原理:當路由器收到一個需要它轉發(fā)的IP數據報時,它會根據數據報中的目的IP地址搜索路由表,找到相關的路由表項,并根據路由中的三元組將數據報從相關的出接口轉發(fā)。而路由表的維護是由專門的路由選擇協議來進行的,IP層只需要在轉發(fā)數據時搜索路由表即可。轉發(fā)的原理:交換機接收到源主機發(fā)送的數據幀后,在MAC地址表中查找數據幀中的目的MAC地址。如果找到,就將該數據幀發(fā)送到相應的端口;如果找不到,就向所有的端口發(fā)送。同時利用接收數據幀中的源MAC地址來建立MAC地址表。

33、選路和轉發(fā)的區(qū)別主要是,選路在IP層,根據目的IP地址找到出接口;轉發(fā)在數據鏈路層,根據MAC地址對數據進行轉發(fā)。另外,轉發(fā)表和路由表不同,轉發(fā)表中的一行包括從網絡號到發(fā)出接口的映射和一些MAC信息,而路由表是由路由選擇算法建立的一個表,它通常包含從網絡號到下一跳IP地址的映射,轉發(fā)表可以由特殊的硬件來實現,而路由表很少這樣。為了實現三層交換技術,交換機將維護一張至少包括“目的IP地址,下一跳MAC地址”在內的硬件轉發(fā)表。當交換機接收到數據時,根據報文中的“目的IP地址”查詢硬件轉發(fā)表,根據匹配結果進行相應的數據轉發(fā),并且采用硬件芯片或高速緩沖區(qū)支持,可以達到線速。在交換機剛啟動完畢時,交換機

34、就把設備的軟件路由表下載到ASIC芯片上。在需要進行三層交換的報文到達交換機后,交換機首先會查詢最長匹配硬件轉發(fā)表,但由于MAC地址是未知的,無法同時下載,此時的硬件轉發(fā)表是無效的,所以無法進行硬件數據轉發(fā)。因此,交換機將利用CPU對數據進行軟件路由轉發(fā),交換機在數據轉發(fā)過程中獲取下一跳IP地址和數據轉發(fā)出口的MAC地址,然后會被自動下載到三層硬件轉發(fā)表,此時包含了下一跳IP地址和數據轉發(fā)出口MAC地址的硬件轉發(fā)表項才真正生效。在這之后,發(fā)往相同目的IP網段的報文到達交換機都可以直接通過最長匹配硬件轉發(fā)表進行硬件轉發(fā),而其他網段的數據轉發(fā)則需要重復上述過程。習題8:匯編語言函數可參考net/c

35、ksum.s文件,C語言函數可參考ucpcksum.c或者tcpcksum.c實現程序。習題9:由于通常情況下,IP報文首部發(fā)生變化的字段主要是TTL。而檢驗和字段是伴隨TTL字段變化而變化的,因此根據RFC1624可以設計一種不需要重新計算檢驗和的修正方法。具體方法參見RFC1642.習題10:使用散列結構并通過分離鏈接的方法處理散列沖突,在元素個數保持一定規(guī)模的情況下可以保證insert和search的時間復雜度為O(1)。但是隨著元素規(guī)模的擴大,insert和search的時間復雜度會逐漸脫離常數。同時,選擇散列函數時需要非常謹慎。對于元素關鍵字隨機化程度較高的情況,可采用二分搜索樹的實

36、現方式。這種方式可以保證search的時間復雜度為O(log n),但是對元素關鍵字隨機化程度的要求比較高。為了防止不平衡的二分搜索樹出現,可采用AVL樹或者紅黑樹作為路由結構。只是兩者在元素的insert操作時需要一些額外的時間。目前廣泛流行的路由表結構是采用radix樹的構造。它可以保證最壞情況下search的時間復雜度達到O(log n)。第5章習題解答參考思路習題1: 本題主要考查對ICMP軟件整體結構的理解程度,幫助學生梳理ICMP軟件中函數之間的關系,從而更好地掌握ICMP軟件中函數的功能和處理機制。詳細描述請參照5.3節(jié)。習題2:(1)終點不可達報文:當路由器不能為報文找到路由或

37、者主機不能交付報文時,丟棄該報文并發(fā)送該類型報文給源主機;(2)源點抑制報文:當路由器或主機因擁塞而丟棄報文時,向源主機發(fā)送該類型報文;(3)超時報文:當路由器收到TTL為零的報文或目的主機在規(guī)定的時間內沒有收到所有的分片報文時,向源主機發(fā)送該類型報文;(4)參數錯誤報文:當路由器或主機收到存在二義性或字段缺失的報文時,丟棄該報文并發(fā)送該類型報文;(5)改變路由報文:當路由器收到本應發(fā)往其他路由器的報文時,把該報文發(fā)送給正確的路由器,并發(fā)送該類型報文通知源主機更正路由,以幫助更新路由。ICMP的5種差錯報告報文結構如下: (1)終點不可達報文 類型:3代碼:015檢驗和未使用(全0)收到的IP

38、數據報的一部分,包括IP數據報首部以及數據報數據的前8個字節(jié)(2)源點抑制報文 類型:4代碼:0檢驗和未使用(全0)收到的IP數據報的一部分,包括IP數據報首部以及數據報數據的前8個字節(jié)(3)超時報文 類型:11代碼:0或1檢驗和未使用(全0)收到的IP數據報的一部分,包括IP數據報首部以及數據報數據的前8個字節(jié)(4)參數錯誤報文類型:12代碼:0或1檢驗和指針未使用(全0)收到的IP數據報的一部分,包括IP數據報首部以及數據報數據的前8個字節(jié)(5)改變路由報文類型:5代碼:03檢驗和目標路由器IP地址收到的IP數據報的一部分,包括IP數據報首部以及數據報數據的前8個字節(jié)習題3:本題主要考查對

39、PING程序實現及與ICMP報文聯系的掌握程度,幫助學生更深入地了解ICMP報文的實現。詳細描述請參照5.6節(jié)。 習題4:icsetbuf.c文件的源代碼如下。/*-* icsetbuf - 為ICMP報文申請一個緩沖區(qū)* icsetbuf()函數為ICMP報文分配緩沖區(qū),設置了兩個變量,其中一個變量指出該報文是否是一個差錯報告報文(或是一個信息請求);而另一個指出這個報文的類型是否是對上一個請求做出的應答。* 該函數很直觀,具體分四種情況:對絕大多數的應答,icsetbuf()函數重新利用抵達的請求報文占用的緩沖區(qū)(即返回由入口參數pa1提供的地址);對于沒有具體實現的報文類型,icsetb

40、uf()函數釋放引起差錯的報文,返回SYSERR;對含有大量數據的ICMP報文,icsetbuf()函數為其分配一個大緩沖區(qū);對其他不能利用原緩沖區(qū)的報文,icsetbuf()函數為它們分配一個標準緩沖區(qū)。*-*/struct ep *icsetbuf(type, pa1, pisresp, piserr)inttype;char*pa1;/*舊的報文(如果有的話)*/Bool*pisresp,/*查詢報文*/*piserr;/*差錯報告報文*/Struct ep *pep; /*正在處理的以太網幀*/*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);/* 函數原型為blkcopy(to, from, nbytes)*/pa1 = (char *)pep;*piserr = TRUE;break;case ICT_DESTUR:/*終點不可達報文*/case ICT_SRCQ: /*源點抑制報文*/case ICT_TIMEX: /*超時報文*/case

42、ICT_PARAMP: /*參數錯誤報文*/pep = (struct ep *)pa1;*piserr = TRUE;break;case ICT_ECHORP:/*ECHO應答報文*/case ICT_INFORP:/*消息應答報文*/case ICT_MASKRP:/ *ICMP掩碼應答報文*/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:/* 時間戳應答報文 */* IcmpOutTimestampsReps+; */IcmpOutErrors-;/* Kludge:超時報文數加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)/*從預先設定的緩沖池申請緩沖區(qū),如果沒有可用的緩沖區(qū)則立即返回*/struct ep /* 以太幀結構*/IPaddrep_nexthop; /* niput函數使用 */shortep_len; /*以太幀長度 */structeh ep_eh; /*以太幀首部 */charep_dataEP_DLEN;/*以太幀的數據部分*/;icsetdata.c

46、文件的源代碼如下。/* ECHOMAX必須是偶數*/#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應答報文*/len = pip-ip_len-IP_HLEN(pip)-IC_HLEN;/* 長度 = IP報文長度-IP首部長度-ICMP首部長度*/if (isodd(len)/*

47、 isodd()函數:判斷其參數是不是奇數,如果是奇數就返回TRUE,否則返回FASLE和錯誤值*/pic-ic_datalen = 0;/*ICMP數據區(qū)CRC校驗 */return len;case ICT_DESTUR:/*終點不可達報文*/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) 重定向到網關*/break;case ICT_PARAMP:/*參數錯誤報文*/len = (int)pa2;pic-ic_ptr

溫馨提示

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

評論

0/150

提交評論