版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編程實(shí)現(xiàn)基于ICMP的PING學(xué)生姓名: 指導(dǎo)老師:摘 要 本次課程設(shè)計(jì)主要是基于Linux系統(tǒng),使用編程語(yǔ)言C語(yǔ)言,編寫(xiě)一個(gè)實(shí)驗(yàn)程序,實(shí)現(xiàn)基于ICMP報(bào)文的PING的類似功能。本文主要介紹了ICMP報(bào)文,PING功能的相關(guān)原理,根據(jù)設(shè)計(jì)要求,用C語(yǔ)言編程運(yùn)行、仿真,通過(guò)觀察實(shí)驗(yàn)結(jié)果,從而判定本次設(shè)計(jì)成功完成任務(wù)。通過(guò)這次計(jì)算機(jī)網(wǎng)絡(luò)方面的課程設(shè)計(jì),提高了我們對(duì)網(wǎng)絡(luò)領(lǐng)域的認(rèn)識(shí),有利于培養(yǎng)我們?cè)谠摲矫娴脑O(shè)計(jì)能力。一人一題特別有利于鍛煉我們獨(dú)立分析問(wèn)題和解決問(wèn)題的能力。設(shè)計(jì)過(guò)程的復(fù)雜加老師的嚴(yán)格要求有益于培養(yǎng)我們嚴(yán)謹(jǐn)?shù)墓ぷ髯黠L(fēng)。關(guān)鍵詞 Linux;C語(yǔ)言;ICMP;PINGProgramming P
2、ING capabilities based on ICMP protocolStudent Name:Li minghong Instructor:Long jizhengAbstract The curriculum design is mainly based on the Linux system, use the programming language C language, write a test program, packet-based ICMP PING similar function. This paper describes the ICMP message, PI
3、NG function of relevant principles, according to design requirements, the C programming language to run the simulation, by observing the results, which determine the success of this design task. Through this computer network design aspects of the curriculum, improve our knowledge in the field of net
4、working, helping to train us in that aspect of the design capacity. One person, one problem is particularly conducive to exercise our independent analysis of issues and problem-solving ability. The complexity of the design process increases the stringent requirements of teacher training benefit our
5、strict style of workKeywords Linux;C language;ICMP;PING1 引 言當(dāng)現(xiàn)代社會(huì)逐漸變?yōu)榫哂懈叨鹊南嗷ヒ蕾嚨木薮缶W(wǎng)絡(luò)時(shí),我們所生活的世界無(wú)法不變成一個(gè)被計(jì)算機(jī)網(wǎng)絡(luò)緊密聯(lián)結(jié)起來(lái)的世界。計(jì)算機(jī)網(wǎng)絡(luò)從技術(shù)角度來(lái)說(shuō),是作為一種布局,將經(jīng)有關(guān)聯(lián)但相距遙遠(yuǎn)的事物通過(guò)通信線路連接起來(lái),但是對(duì)網(wǎng)絡(luò)的思考決不是傳統(tǒng)的二維平面思維甚至三維的球面思維所能達(dá)到的。在信息時(shí)代,網(wǎng)絡(luò)的生命在于其安全性和可靠性。計(jì)算機(jī)網(wǎng)絡(luò)最重要的方面是它向用戶所提供的信息服務(wù)及其所擁有的信息資源,網(wǎng)絡(luò)連接在給用戶帶來(lái)方便的同時(shí),也給網(wǎng)絡(luò)入侵者帶來(lái)了方便。因此,未來(lái)的計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)該具有很高的
6、安全性和可靠性,可以抵御高智商的網(wǎng)絡(luò)入侵者,使用戶更加可靠、更加方便地?fù)碛写罅扛魇礁鳂拥膫€(gè)性化客戶服務(wù)。1.1 課程設(shè)計(jì)的目的本次設(shè)計(jì)的目的就是在掌握計(jì)算機(jī)網(wǎng)絡(luò)理論的基礎(chǔ)上,了解網(wǎng)絡(luò)技術(shù),掌握網(wǎng)絡(luò)相關(guān)設(shè)計(jì)方法和思想,通過(guò)本次課程設(shè)計(jì),達(dá)到鞏固和綜合運(yùn)用計(jì)算機(jī)網(wǎng)絡(luò)原理的知識(shí),理論聯(lián)系實(shí)際,鞏固所學(xué)理論知識(shí),并且提高自己通過(guò)所學(xué)理論分析、解決計(jì)算機(jī)實(shí)際問(wèn)題的能力。掌握計(jì)算機(jī)網(wǎng)絡(luò)課程的知識(shí)可使學(xué)生打下一個(gè)堅(jiān)實(shí)的專業(yè)基礎(chǔ),可提高處理通信系統(tǒng)問(wèn)題能力和素質(zhì)。由于通信工程專業(yè)理論深、實(shí)踐性強(qiáng),做好課程設(shè)計(jì),對(duì)學(xué)生掌握本專業(yè)的知識(shí)、提高其基本能力是非常重要的。 本次設(shè)計(jì)的目的也是為了學(xué)生加深對(duì)所學(xué)計(jì)算機(jī)網(wǎng)絡(luò)
7、知識(shí)的理解,培養(yǎng)學(xué)生專業(yè)素質(zhì),提高利用計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)處理通信系統(tǒng)問(wèn)題的能力,為今后的專業(yè)課程的學(xué)習(xí)、畢業(yè)設(shè)計(jì)和工作打下良好的基礎(chǔ)。使學(xué)生能比較扎實(shí)地掌握本專業(yè)的基礎(chǔ)知識(shí)和基本理論。 本次課程設(shè)計(jì)主要是基于Linux系統(tǒng),使用編程語(yǔ)言C語(yǔ)言,編寫(xiě)一個(gè)實(shí)驗(yàn)程序,實(shí)現(xiàn)基于ICMP報(bào)文的PING的類似功能。本文主要介紹了ICMP報(bào)文,PING功能的相關(guān)原理,根據(jù)設(shè)計(jì)要求,用C語(yǔ)言編程運(yùn)行、仿真,通過(guò)觀察實(shí)驗(yàn)結(jié)果,從而判定本次設(shè)計(jì)成功完成任務(wù)。通過(guò)這次計(jì)算機(jī)網(wǎng)絡(luò)方面的課程設(shè)計(jì),提高了我們對(duì)網(wǎng)絡(luò)領(lǐng)域的認(rèn)識(shí),有利于培養(yǎng)我們?cè)谠摲矫娴脑O(shè)計(jì)能力。一人一題特別有利于鍛煉我們獨(dú)立分析問(wèn)題和解決問(wèn)題的能力。設(shè)計(jì)過(guò)程的
8、復(fù)雜加老師的嚴(yán)格要求有益于培養(yǎng)我們嚴(yán)謹(jǐn)?shù)墓ぷ髯黠L(fēng)。1.2 課程設(shè)計(jì)的主要任務(wù)和要求 課程設(shè)計(jì)的主要任務(wù)編程實(shí)現(xiàn)PING的服務(wù)器端和客戶端,實(shí)現(xiàn)操作系統(tǒng)提供的ping命令的類似功能。服務(wù)器端PingServer功能:可以并發(fā)地為多個(gè)用戶服務(wù);顯示用戶通過(guò)客戶端發(fā)送來(lái)的消息內(nèi)容(包含頭部和payload);能夠模擬分組的丟失;能夠模擬分組傳輸延遲;將用戶發(fā)送來(lái)的請(qǐng)求request在延遲一段隨機(jī)選擇的時(shí)間(小于1s)后返回給客戶端,作為收到請(qǐng)求的響應(yīng)reply; 通過(guò)如下命令行啟動(dòng)服務(wù)器:java PingServer port。port為PingServer的工作端口號(hào)客戶端PingClient功
9、能:?jiǎn)?dòng)后發(fā)送10個(gè)request。發(fā)送一個(gè)request后,最多等待1秒以便接收PingServer返回的reply消息。如果在該時(shí)間內(nèi)沒(méi)有收到服務(wù)器的reply,則認(rèn)為該請(qǐng)求或?qū)υ撜?qǐng)求的reply已經(jīng)丟失;在收到reply后立即發(fā)送下一個(gè)request。請(qǐng)求消息的payload中至少包含關(guān)鍵字PingUDP、序號(hào)、時(shí)間戳等內(nèi)容。如:PingUDP SequenceNumber TimeStamp CRLF其中:CRLF表示回車換行符(0X0D0A);TimeStamp為發(fā)送該消息的機(jī)器時(shí)間。為每個(gè)請(qǐng)求計(jì)算折返時(shí)間(RTT),統(tǒng)計(jì)10個(gè)請(qǐng)求的平均RTT、最大/小RTT。通過(guò)如下命令行啟動(dòng):j
10、ava PingClient host port。host為PingServer所在的主機(jī)地址;port為PingServer的工作端口號(hào)課程設(shè)計(jì)的要求: (1)按要求編寫(xiě)課程設(shè)計(jì)報(bào)告書(shū),能正確闡述設(shè)計(jì)結(jié)果。(2)通過(guò)課程設(shè)計(jì)培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)隊(duì)協(xié)作精神。(3)學(xué)會(huì)文獻(xiàn)檢索的基本方法和綜合運(yùn)用文獻(xiàn)的能力。(4)在老師的指導(dǎo)下,要求每個(gè)學(xué)生獨(dú)立完成課程設(shè)計(jì)的全部?jī)?nèi)容。2 理論基礎(chǔ)2.1 ICMP相關(guān)介紹ICMP是(Internet Control Message Protocol)Internet控制報(bào)文協(xié)議。它是TCP/IP協(xié)議族的一個(gè)子協(xié)議,用于在IP主機(jī)、路由器之間
11、傳遞控制消息。控制消息是指網(wǎng)絡(luò)通不通、主機(jī)是否可達(dá)、路由是否可用等網(wǎng)絡(luò)本身的消息。這些控制消息雖然并不傳輸用戶數(shù)據(jù),但是對(duì)于用戶數(shù)據(jù)的傳遞起著重要的作用。ICMP協(xié)議是一種面向無(wú)連接的協(xié)議,用于傳輸出錯(cuò)報(bào)告控制信息。它是一個(gè)非常重要的協(xié)議,它對(duì)于網(wǎng)絡(luò)安全具有極其重要的意義。 它是TCP/IP協(xié)議族的一個(gè)子協(xié)議,屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機(jī)與路由器之間傳遞控制信息,包括報(bào)告錯(cuò)誤、交換受限控制和狀態(tài)信息等。當(dāng)遇到IP數(shù)據(jù)無(wú)法訪問(wèn)目標(biāo)、IP路由器無(wú)法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時(shí),會(huì)自動(dòng)發(fā)送ICMP消息。 ICMP提供一致易懂的出錯(cuò)報(bào)告信息。發(fā)送的出錯(cuò)報(bào)文返回到發(fā)送原數(shù)據(jù)的設(shè)備,因?yàn)橹挥邪l(fā)送設(shè)
12、備才是出錯(cuò)報(bào)文的邏輯接受者。發(fā)送設(shè)備隨后可根據(jù)ICMP報(bào)文確定發(fā)生錯(cuò)誤的類型,并確定如何才能更好地重發(fā)失敗的數(shù)據(jù)報(bào)。但是ICMP唯一的功能是報(bào)告問(wèn)題而不是糾正錯(cuò)誤,糾正錯(cuò)誤的任務(wù)由發(fā)送方完成。 我們?cè)诰W(wǎng)絡(luò)中經(jīng)常會(huì)使用到ICMP協(xié)議,比如我們經(jīng)常使用的用于檢查網(wǎng)絡(luò)通不通的Ping命令(Linux和Windows中均有),這個(gè)“Ping”的過(guò)程實(shí)際上就是ICMP協(xié)議工作的過(guò)程。還有其他的網(wǎng)絡(luò)命令如跟蹤路由的Tracert命令也是基于ICMP協(xié)議的。ICMP協(xié)議對(duì)于網(wǎng)絡(luò)安全具有極其重要的意義。ICMP協(xié)議本身的特點(diǎn)決定了它非常容易被用于攻擊網(wǎng)絡(luò)上的路由器和主機(jī)。例如,在1999年8月海信集團(tuán)“懸賞”
13、50萬(wàn)元人民幣測(cè)試防火墻的過(guò)程中,其防火墻遭受到的ICMP攻擊達(dá)334050次之多,占整個(gè)攻擊總數(shù)的90%以上!可見(jiàn),ICMP的重要性絕不可以忽視! 比如,可以利用操作系統(tǒng)規(guī)定的ICMP數(shù)據(jù)包最大尺寸不超過(guò)64KB這一規(guī)定,向主機(jī)發(fā)起“Ping of Death”(死亡之Ping)攻擊?!癙ing of Death” 攻擊的原理是:如果ICMP數(shù)據(jù)包的尺寸超過(guò)64KB上限時(shí),主機(jī)就會(huì)出現(xiàn)內(nèi)存分配錯(cuò)誤,導(dǎo)致TCP/IP堆棧崩潰,致使主機(jī)死機(jī)。(現(xiàn)在的操作系統(tǒng)已經(jīng)取消了發(fā)送ICMP數(shù)據(jù)包的大小的限制,解決了這個(gè)漏洞) 此外,向目標(biāo)主機(jī)長(zhǎng)時(shí)間、連續(xù)、大量地發(fā)送ICMP數(shù)據(jù)包,也會(huì)最終使系統(tǒng)癱瘓。大量
14、的ICMP數(shù)據(jù)包會(huì)形成“ICMP風(fēng)暴”,使得目標(biāo)主機(jī)耗費(fèi)大量的CPU資源處理,疲于奔命。2.2 PING相關(guān)介紹 Ping 是Windows系列自帶的一個(gè)可執(zhí)行命令。利用它可以檢查網(wǎng)絡(luò)是否能夠連通,用好它可以很好地幫助我們分析判定網(wǎng)絡(luò)故障。應(yīng)用格式:Ping IP地址。該命令還可以加許多參數(shù)使用,PING是DOS命令,一般用于檢測(cè)網(wǎng)絡(luò)通與不通 ,也叫時(shí)延,其值越大,速度越慢。PING (Packet Internet Grope),因特網(wǎng)包探索器,用于測(cè)試網(wǎng)絡(luò)連接量的程序。Ping發(fā)送一個(gè)ICMP回聲請(qǐng)求消息給目的地并報(bào)告是否收到所希望的ICMP回聲應(yīng)答。 它是用來(lái)檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接
15、速度的命令。作為一個(gè)生活在網(wǎng)絡(luò)上的管理員或者黑客來(lái)說(shuō),ping命令是第一個(gè)必須掌握的DOS命令,它所利用的原理是這樣的:利用網(wǎng)絡(luò)上機(jī)器IP地址的唯一性,給目標(biāo)IP地址發(fā)送一個(gè)數(shù)據(jù)包,再要求對(duì)方返回一個(gè)同樣大小的數(shù)據(jù)包來(lái)確定兩臺(tái)網(wǎng)絡(luò)機(jī)器是否連接相通,時(shí)延是多少? ping指的是端對(duì)端連通,通常用來(lái)作為可用性的檢查, 但是某些病毒木馬會(huì)強(qiáng)行大量遠(yuǎn)程執(zhí)行ping命令搶占你的網(wǎng)絡(luò)資源,導(dǎo)致系統(tǒng)變慢,網(wǎng)速變慢。嚴(yán)禁ping入侵作為大多數(shù)防火墻的一個(gè)基本功能提供給用戶進(jìn)行選擇。通常的情況下你如果不用作服務(wù)器或者進(jìn)行網(wǎng)絡(luò)測(cè)試,可以放心的選中它,保護(hù)你的電腦。 簡(jiǎn)單的說(shuō),Ping就是一個(gè)測(cè)試程序,如果Ping
16、運(yùn)行正確,你大體上就可以排除網(wǎng)絡(luò)訪問(wèn)層、網(wǎng)卡、MODEM的輸入輸出線路、電纜和路由器等存在的故障,從而減小了問(wèn)題的范圍。但由于可以自定義所發(fā)數(shù)據(jù)報(bào)的大小及無(wú)休止的高速發(fā)送,Ping也被某些別有用心的人作為DDOS(拒絕服務(wù)攻擊)的工具,曾經(jīng)Yahoo就是被黑客利用數(shù)百臺(tái)可以高速接入互聯(lián)網(wǎng)的電腦連續(xù)發(fā)送大量Ping數(shù)據(jù)包而癱瘓的。 按照缺省設(shè)置,Windows上運(yùn)行的Ping命令發(fā)送4個(gè)ICMP(網(wǎng)間控制報(bào)文協(xié)議)回送請(qǐng)求,每個(gè)32字節(jié)數(shù)據(jù),如果一切正常,你應(yīng)能得到4個(gè)回送應(yīng)答。 Ping能夠以毫秒為單位顯示發(fā)送回送請(qǐng)求到返回回送應(yīng)答之間的時(shí)間量。如果應(yīng)答時(shí)間短,表示數(shù)據(jù)報(bào)不必通過(guò)太多的路由器或
17、網(wǎng)絡(luò)連接速度比較快。Ping還能顯示TTL(Time To Live存在時(shí)間)值,你可以通過(guò)TTL值推算一下數(shù)據(jù)包已經(jīng)通過(guò)了多少個(gè)路由器:源地點(diǎn)TTL起始值(就是比返回TTL略大的一個(gè)2的乘方數(shù))-返回時(shí)TTL值。例如,返回TTL值為119,那么可以推算數(shù)據(jù)報(bào)離開(kāi)源地址的TTL起始值為128,而源地點(diǎn)到目標(biāo)地點(diǎn)要通過(guò)9個(gè)路由器網(wǎng)段(128-119);如果返回TTL值為246,TTL起始值就是256,源地點(diǎn)到目標(biāo)地點(diǎn)要通過(guò)9個(gè)路由器網(wǎng)段。 通過(guò)Ping檢測(cè)網(wǎng)絡(luò)故障的典型次序。正常情況下,當(dāng)你使用Ping命令來(lái)查找問(wèn)題所在或檢驗(yàn)網(wǎng)絡(luò)運(yùn)行情況時(shí),你需要使用許多Ping命令,如果所有都運(yùn)行正確,你就可
18、以相信基本的連通性和配置參數(shù)沒(méi)有問(wèn)題;如果某些Ping命令出現(xiàn)運(yùn)行故障,它也可以指明到何處去查找問(wèn)題。下面就給出一個(gè)典型的檢測(cè)次序及對(duì)應(yīng)的可能故障: ping 127.0.0.1-這個(gè)Ping命令被送到本地計(jì)算機(jī)的IP軟件,該命令永不退出該計(jì)算機(jī)。如果沒(méi)有做到這一點(diǎn),就表示TCP/IP的安裝或運(yùn)行存在某些最基本的問(wèn)題。 ping 本機(jī)IP-這個(gè)命令被送到你計(jì)算機(jī)所配置的IP地址,你的計(jì)算機(jī)始終都應(yīng)該對(duì)該P(yáng)ing命令作出應(yīng)答,如果沒(méi)有,則表示本地配置或安裝存在問(wèn)題。出現(xiàn)此問(wèn)題時(shí),局域網(wǎng)用戶請(qǐng)斷開(kāi)網(wǎng)絡(luò)電纜,然后重新發(fā)送該命令。如果網(wǎng)線斷開(kāi)后本命令正確,則表示另一臺(tái)計(jì)算機(jī)可能配置了相同的IP地址。
19、ping 局域網(wǎng)內(nèi)其他IP-這個(gè)命令應(yīng)該離開(kāi)你的計(jì)算機(jī),經(jīng)過(guò)網(wǎng)卡及網(wǎng)絡(luò)電纜到達(dá)其他計(jì)算機(jī),再返回。收到回送應(yīng)答表明本地網(wǎng)絡(luò)中的網(wǎng)卡和載體運(yùn)行正確。但如果收到0個(gè)回送應(yīng)答,那么表示子網(wǎng)掩碼(進(jìn)行子網(wǎng)分割時(shí),將IP地址的網(wǎng)絡(luò)部分與主機(jī)部分分開(kāi)的代碼)不正確或網(wǎng)卡配置錯(cuò)誤或電纜系統(tǒng)有問(wèn)題。 ping 網(wǎng)關(guān)IP-這個(gè)命令如果應(yīng)答正確,表示局域網(wǎng)中的網(wǎng)關(guān)路由器正在運(yùn)行并能夠作出應(yīng)答。3 結(jié)構(gòu)定義與程序設(shè)計(jì)3.1 IP首部結(jié)構(gòu)與程序定義由于IP層協(xié)議是一種點(diǎn)對(duì)點(diǎn)的協(xié)議,而非端對(duì)端的協(xié)議,它提供無(wú)連接的數(shù)據(jù)報(bào)服務(wù),沒(méi)有端口的概念,因此很少使用bind()和connect()函數(shù),若有使用也只是用于設(shè)置IP地
20、址。發(fā)送數(shù)據(jù)使用sendto()函數(shù),接收數(shù)據(jù)使用recvfrom()函數(shù)。IP報(bào)頭格式如圖3-1所示:版本號(hào)IP報(bào)頭長(zhǎng)度IHL服務(wù)類型TOS數(shù)據(jù)報(bào)長(zhǎng)度TL報(bào)文標(biāo)志ID報(bào)文標(biāo)志F分段偏移量FO生存時(shí)間TTL協(xié)議號(hào)PORT報(bào)頭校驗(yàn)和源地址目標(biāo)地址任選項(xiàng)和填充位圖3-1 IP報(bào)頭格式在Linux中,IP報(bào)頭格式數(shù)據(jù)結(jié)構(gòu)(<netinet/ip.h>)定義如下:struct ip #if _BYTE_ORDER = _LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* versio
21、n */#endif#if _BYTE_ORDER = _BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */#endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */#define IP_RF 0x8000 /*
22、reserved fragment flag */#define IP_DF 0x4000 /* dont fragment flag */#define IP_MF 0x2000 /* more fragments flag */#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_int8_t ip_ttl; /* time to live */ u_int8_t ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src, ip_dst
23、; /* source and dest address */ ;其中ping程序只使用以下數(shù)據(jù): IP報(bào)頭長(zhǎng)度IHL(Internet Header Length)以4字節(jié)為一個(gè)單位來(lái)記錄IP報(bào)頭的長(zhǎng)度,是上述IP數(shù)據(jù)結(jié)構(gòu)的ip_hl變量。 生存時(shí)間TTL(Time To Live)以秒為單位,指出IP數(shù)據(jù)報(bào)能在網(wǎng)絡(luò)上停留的最長(zhǎng)時(shí)間,其值由發(fā)送方設(shè)定,并在經(jīng)過(guò)路由的每一個(gè)節(jié)點(diǎn)時(shí)減一,當(dāng)該值為0時(shí),數(shù)據(jù)報(bào)將被丟棄,是上述IP數(shù)據(jù)結(jié)構(gòu)的ip_ttl變量。 3.2 ICMP首部結(jié)構(gòu)與程序定義 ICMP報(bào)文分為兩種,一是錯(cuò)誤報(bào)告報(bào)文,二是查詢報(bào)文。每個(gè)ICMP報(bào)頭均包含類型、編碼和校驗(yàn)和這三項(xiàng)內(nèi)容,
24、長(zhǎng)度為8位,8位和16位,其余選項(xiàng)則隨ICMP的功能不同而不同。Ping命令只使用眾多ICMP報(bào)文中的兩種:"請(qǐng)求回送'(ICMP_ECHO)和"請(qǐng)求回應(yīng)'(ICMP_ECHOREPLY)。在Linux中定義如下: #define ICMP_ECHO 0#define ICMP_ECHOREPLY 8這兩種ICMP類型報(bào)頭格式如圖3-2所示:類型TYPE(8或0)編碼CODE(未使用)校驗(yàn)和CHECKSUM標(biāo)志符Identifier順序號(hào)Sequence NO圖3-2 ICMP類型報(bào)頭格式在Linux中ICMP數(shù)據(jù)結(jié)構(gòu)(<netinet/ip_icmp
25、.h>)定義如下:struct icmpu_int8_t icmp_type; /* type of message, see below */u_int8_t icmp_code; /* type sub code */u_int16_t icmp_cksum; /* ones complement checksum of struct */unionu_char ih_pptr; /* ICMP_PARAMPROB */struct in_addr ih_gwaddr; /* gateway address */struct ih_idseq /* echo datagram */u
26、_int16_t icd_id;u_int16_t icd_seq; ih_idseq;u_int32_t ih_void; /* ICMP_UNREACH_NEEDFRAG - Path MTU Discovery (RFC1191) */struct ih_pmtuu_int16_t ipm_void;u_int16_t ipm_nextmtu; ih_pmtu;struct ih_rtradvu_int8_t irt_num_addrs; u_int8_t irt_wpa;u_int16_t irt_lifetime; ih_rtradv; icmp_hun;#define icmp_p
27、ptr icmp_hun.ih_pptr#define icmp_gwaddr icmp_hun.ih_gwaddr#define icmp_id icmp_hun.ih_idseq.icd_id#define icmp_seq icmp_hun.ih_idseq.icd_seq#define icmp_void icmp_hun.ih_void#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu#define icmp_num_addrs icmp_hun.
28、ih_rtradv.irt_num_addrs#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetimeUnionstructu_int32_t its_otime;u_int32_t its_rtime;u_int32_t its_ttime; id_ts;structstruct ip idi_ip; /* options and then 64 bits of data */ id_ip;struct icmp_ra_addr id_radv;u_int3
29、2_t id_mask;u_int8_t id_data1; icmp_dun;#define icmp_otime icmp_dun.id_ts.its_otime#define icmp_rtime icmp_dun.id_ts.its_rtime#define icmp_ttime icmp_dun.id_ts.its_ttime#define icmp_ip icmp_dun.id_ip.idi_ip#define icmp_radv icmp_dun.id_radv#define icmp_mask icmp_dun.id_mask#define icmp_data icmp_dun
30、.id_data;使用宏定義令表達(dá)更簡(jiǎn)潔,其中ICMP報(bào)頭為8字節(jié),數(shù)據(jù)報(bào)長(zhǎng)度最大為64K字節(jié)。 (1) 校驗(yàn)和算法:這一算法稱為網(wǎng)際校驗(yàn)和算法,把被校驗(yàn)的數(shù)據(jù)16位進(jìn)行累加,然后取反碼,若數(shù)據(jù)字節(jié)長(zhǎng)度為奇數(shù),則數(shù)據(jù)尾部補(bǔ)一個(gè)字節(jié)的0以湊成偶數(shù)。此算法適用于IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP校驗(yàn)和,更詳細(xì)的信息請(qǐng)參考RFC1071,校驗(yàn)和字段為上述ICMP數(shù)據(jù)結(jié)構(gòu)的icmp_cksum變量。 (2) 標(biāo)識(shí)符:用于唯一標(biāo)識(shí)ICMP報(bào)文, 為上述ICMP數(shù)據(jù)結(jié)構(gòu)的icmp_id宏所指的變量。 (3) 順序號(hào):ping命令的icmp_seq便由這里讀出,代表ICMP報(bào)
31、文的發(fā)送順序,為上述ICMP數(shù)據(jù)結(jié)構(gòu)的icmp_seq宏所指的變量。 ICMP數(shù)據(jù)報(bào)Ping命令中需要顯示的信息,包括icmp_seq和ttl都已有實(shí)現(xiàn)的辦法,但還缺rtt往返時(shí)間。為了實(shí)現(xiàn)這一功能,可利用ICMP數(shù)據(jù)報(bào)攜帶一個(gè)時(shí)間戳。使用以下函數(shù)生成時(shí)間戳:#include int gettimeofday(struct timeval *tp,void *tzp)其中timeval結(jié)構(gòu)如下:struct timevallong tv_sec;long tv_usec; 4 程序設(shè)計(jì)與驗(yàn)證4.1 程序設(shè)計(jì)流程 根據(jù)課程設(shè)計(jì)的要求,結(jié)合程序設(shè)計(jì)流程,本次設(shè)計(jì)按如下流程進(jìn)行,如圖4-1所示。開(kāi)始
32、功能分析程序設(shè)計(jì)程序校驗(yàn)通過(guò)結(jié)束 Y N圖4-1 程序設(shè)計(jì)流程圖4.2 程序驗(yàn)證結(jié)果 圖4-2 程序驗(yàn)證截圖 5 小結(jié) 本次課程設(shè)計(jì)主要是基于Linux系統(tǒng),使用編程語(yǔ)言C語(yǔ)言,編寫(xiě)一個(gè)實(shí)驗(yàn)程序,實(shí)現(xiàn)基于ICMP報(bào)文的PING的類似功能。本文主要介紹了ICMP報(bào)文,PING功能的相關(guān)原理,根據(jù)設(shè)計(jì)要求,用C語(yǔ)言編程運(yùn)行、仿真,通過(guò)觀察實(shí)驗(yàn)結(jié)果,從而判定本次設(shè)計(jì)成功完成任務(wù)。通過(guò)這次計(jì)算機(jī)網(wǎng)絡(luò)方面的課程設(shè)計(jì),提高了我們對(duì)網(wǎng)絡(luò)領(lǐng)域的認(rèn)識(shí),有利于培養(yǎng)我們?cè)谠摲矫娴脑O(shè)計(jì)能力。一人一題特別有利于鍛煉我們獨(dú)立分析問(wèn)題和解決問(wèn)題的能力。設(shè)計(jì)過(guò)程的復(fù)雜加老師的嚴(yán)格要求有益于培養(yǎng)我們嚴(yán)謹(jǐn)?shù)墓ぷ髯黠L(fēng)在整個(gè)設(shè)計(jì)過(guò)程
33、當(dāng)中,首先要根據(jù)模塊設(shè)計(jì)所要達(dá)到的要求編寫(xiě)源代碼,在編寫(xiě)完后編譯的過(guò)程中經(jīng)常會(huì)出現(xiàn)程序編譯錯(cuò)誤。根據(jù)系統(tǒng)提示,我找到了錯(cuò)誤的位置,然后查詢錯(cuò)誤的原因。通過(guò)和同學(xué)探討,或者請(qǐng)教老師,所有的問(wèn)題都一一解決了。 在整個(gè)程序驗(yàn)證執(zhí)行成功后發(fā)現(xiàn),其實(shí)整個(gè)設(shè)計(jì)實(shí)現(xiàn)的功能還是比較實(shí)用和易于操作的,而自己也為此付出了許多:從根據(jù)課題要求查找相關(guān)資料,學(xué)習(xí)編程語(yǔ)言,到自己能夠獨(dú)立編寫(xiě)小程序;從對(duì)Visual Studio2005軟件平臺(tái)的摸索,一次次修改程序,到仿真得到較滿意的結(jié)果;從對(duì)截圖工具的搜索下載,論文資料的搜集,到文字排版的學(xué)習(xí)。在設(shè)計(jì)過(guò)程中遇到了很多困難,在指導(dǎo)老師的指引和同學(xué)的幫助下,通過(guò)不斷探索
34、學(xué)習(xí),使問(wèn)題得到了一定的解決。終于使模擬PING功能正常運(yùn)行,設(shè)計(jì)成功。通過(guò)本學(xué)期課程設(shè)計(jì)的學(xué)習(xí),我從中學(xué)習(xí)到了很多,對(duì)可編程邏輯器件,計(jì)算機(jī)編程語(yǔ)言,Visual Studio2005軟件平臺(tái)有了一定的了解,尤其是用C語(yǔ)言編程和仿真。在本次設(shè)計(jì)中最大的收獲是在不斷地發(fā)現(xiàn)問(wèn)題,分析問(wèn)題,解決問(wèn)題的過(guò)程中培養(yǎng)了自己的科研能力,為今后的學(xué)習(xí)和工作積累了一定的經(jīng)驗(yàn)。第 19 頁(yè) 共 19 頁(yè) 李明洪 編程實(shí)現(xiàn)基于ICMP的PING參考文獻(xiàn)1謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(第五版)M.北京:電子工業(yè)出版社,20082 (美)W.Richard Stevens. TCP/IP詳解·卷:TCP 事務(wù)協(xié)議、H
35、TTP、NNTP和UNIX域協(xié)議M.北京:機(jī)械工業(yè)出版社,20003李尊朝,蘇軍.Java語(yǔ)言程序設(shè)計(jì)(第二版)M.北京:中國(guó)鐵道出版社,20084 劉燁,用Java實(shí)現(xiàn)Socket模型. 科技信息(學(xué)術(shù)版)J,2007年,第32期:91附錄:源程序設(shè)計(jì)清單/ 程序名稱:編程實(shí)現(xiàn)基于ICMP的PING/ 程序功能:采用編程語(yǔ)言C語(yǔ)言設(shè)計(jì)程序,實(shí)現(xiàn)PING功能。/ 程序作者:李明洪/ 最后修改日期:2011-7-1PING功能實(shí)現(xiàn)程序:#include <stdio.h>#include <signal.h>#include <arpa/inet.h>#inc
36、lude <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <netinet/ip.h>#include <netinet/ip_icmp.h>#include <netdb.h>#include <setjmp.h>#include <errno.h>#define PACKET_SIZE 4096#define MAX_WAIT_TIME 5#define MA
37、X_NO_PACKETS 3char sendpacketPACKET_SIZE;char recvpacketPACKET_SIZE;int sockfd,datalen=56;int nsend=0,nreceived=0;struct sockaddr_in dest_addr;pid_t pid;struct sockaddr_in from;struct timeval tvrecv;void statistics(int signo);unsigned short cal_chksum(unsigned short *addr,int len);int pack(int pack_
38、no);void send_packet(void);void recv_packet(void);int unpack(char *buf,int len);void tv_sub(struct timeval *out,struct timeval *in);void statistics(int signo) printf("n-PING statistics-n"); printf("%d packets transmitted, %d received , %d lostn",nsend,nreceived, (nsend-nreceived)
39、/nsend*100);close(sockfd);exit(1);/*校驗(yàn)和算法*/unsigned short cal_chksum(unsigned short *addr,int len) int nleft=len; int sum=0; unsigned short *w=addr; unsigned short answer=0;/*把ICMP報(bào)頭二進(jìn)制數(shù)據(jù)以2字節(jié)為單位累加起來(lái)*/while(nleft>1) sum+=*w+; nleft-=2; /*若ICMP報(bào)頭為奇數(shù)個(gè)字節(jié),會(huì)剩下最后一字節(jié)。把最后一個(gè)字節(jié)視為一個(gè)2字節(jié)數(shù)據(jù)的高字節(jié),這個(gè)2字節(jié)數(shù)據(jù)的低字節(jié)為0,繼續(xù)
40、累加*/ if( nleft=1) *(unsigned char *)(&answer)=*(unsigned char *)w; sum+=answer; sum=(sum>>16)+(sum&0xffff); sum+=(sum>>16); answer=sum; return answer;/*設(shè)置ICMP報(bào)頭*/int pack(int pack_no) int i,packsize;struct icmp *icmp;struct timeval *tval;icmp=(struct icmp*)sendpacket;icmp->icm
41、p_type=ICMP_ECHO;icmp->icmp_code=0;icmp->icmp_cksum=0;icmp->icmp_seq=pack_no;icmp->icmp_id=pid;packsize=8+datalen;tval= (struct timeval *)icmp->icmp_data;gettimeofday(tval,NULL); /*記錄發(fā)送時(shí)間*/icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校驗(yàn)算法*/return packsize;/*發(fā)送三個(gè)
42、ICMP報(bào)文*/void send_packet() int packetsize; while( nsend<MAX_NO_PACKETS) nsend+; packetsize=pack(nsend); /*設(shè)置ICMP報(bào)頭*/ if( sendto(sockfd,sendpacket,packetsize,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr) )<0 ) perror("sendto error"); continue; sleep(1); /*每隔一秒發(fā)送一個(gè)ICMP報(bào)文*/ /*接收
43、所有ICMP報(bào)文*/void recv_packet() int n,fromlen; extern int errno; signal(SIGALRM,statistics); fromlen=sizeof(from); while( nreceived<nsend) alarm(MAX_WAIT_TIME);if( (n=recvfrom(sockfd,recvpacket,sizeof(recvpacket),0,(struct sockaddr *)&from,&fromlen) <0) if(errno=EINTR)continue;perror(&quo
44、t;recvfrom error");continue; gettimeofday(&tvrecv,NULL); /*記錄接收時(shí)間*/if(unpack(recvpacket,n)=-1)continue;nreceived+; /*剝?nèi)CMP報(bào)頭*/int unpack(char *buf,int len) int i,iphdrlen;struct ip *ip;struct icmp *icmp;struct timeval *tvsend;double rtt;ip=(struct ip *)buf;iphdrlen=ip->ip_hl<<2; /
45、*求ip報(bào)頭長(zhǎng)度,即ip報(bào)頭的長(zhǎng)度標(biāo)志乘4*/icmp=(struct icmp *)(buf+iphdrlen); /*越過(guò)ip報(bào)頭,指向ICMP報(bào)頭*/len-=iphdrlen; /*ICMP報(bào)頭及ICMP數(shù)據(jù)報(bào)的總長(zhǎng)度*/if( len<8) /*小于ICMP報(bào)頭長(zhǎng)度則不合理*/ printf("ICMP packets's length is less than 8n"); return -1; /*確保所接收的是我所發(fā)的的ICMP的回應(yīng)*/if( (icmp->icmp_type=ICMP_ECHOREPLY) && (icmp->icmp_id=pid) ) tvsend=(struct timeval *)icmp->icmp_data;tv_sub(&tvrecv,tvsend); /*接收和發(fā)送的時(shí)間差*/rtt=tvrecv.tv_sec*1000+tvrecv.tv_usec/1000; /*以毫秒為單位計(jì)算rtt*/ /*顯示相關(guān)信息*/printf("%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f msn", len, inet_ntoa(from.sin_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中班課件拼圖教學(xué)課件
- 2024廣東佛山市南海區(qū)數(shù)據(jù)資源中心招聘政府輔助工作人員2人管理單位遴選500模擬題附帶答案詳解
- 課件比賽主題教學(xué)課件
- 代持股權(quán)合同模板
- 仿古工業(yè)園區(qū)建設(shè)合同
- 井隊(duì)領(lǐng)導(dǎo)力與變革管理
- 二手住宅買賣保險(xiǎn)購(gòu)買協(xié)議
- 企業(yè)員工關(guān)懷共建協(xié)議
- 產(chǎn)房醫(yī)院感染管理:預(yù)防為主
- 會(huì)計(jì)臨時(shí)工合同書(shū)
- 會(huì)務(wù)服務(wù)的合同范本(通用3篇)
- NB_T 10339-2019《水電工程壩址工程地質(zhì)勘察規(guī)程》_(高清最新)
- 繁體校對(duì)《太上老君說(shuō)常清靜經(jīng)》
- 關(guān)于統(tǒng)一規(guī)范人民防空標(biāo)識(shí)使用管理的通知(1)
- 電纜振蕩波局部放電試驗(yàn)報(bào)告
- 西門子RWD68說(shuō)明書(shū)
- 針對(duì)建筑工程施工數(shù)字化管理分析
- 多品種共線生產(chǎn)質(zhì)量風(fēng)險(xiǎn)評(píng)價(jià)
- 【MBA教學(xué)案例】從“蝦國(guó)”到“國(guó)蝦”:國(guó)聯(lián)水產(chǎn)的戰(zhàn)略轉(zhuǎn)型
- Unit-1--College-Life
- 醫(yī)院車輛加油卡管理制度
評(píng)論
0/150
提交評(píng)論