




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機網(wǎng)絡(luò)課程設(shè)計實驗報告 目錄一、實驗內(nèi)容和要求41、實驗一數(shù)據(jù)包的捕獲與分析42、實驗二Ping程序的設(shè)計與實現(xiàn)4二、實驗環(huán)境51、實驗一數(shù)據(jù)包的捕獲與分析52、實驗二Ping程序的設(shè)計與實現(xiàn)5三、程序的需求分析與邏輯框圖51、實驗一數(shù)據(jù)包的捕獲與分析52、實驗二Ping程序的設(shè)計與實現(xiàn)6四、程序核心功能的實現(xiàn)機制71、實驗一數(shù)據(jù)包的捕獲與分析72、實驗二Ping程序的設(shè)計與實現(xiàn)72.1主函數(shù)設(shè)計與實現(xiàn)72.2循環(huán)接收數(shù)據(jù)包函數(shù)readloop設(shè)計與實現(xiàn)92.3分組處理函數(shù)proc設(shè)計與實現(xiàn)102.4發(fā)送分組函數(shù)send設(shè)計與實現(xiàn)10五、程序源代碼111、實驗一數(shù)據(jù)包的捕獲與分析112、實
2、驗二Ping程序的核心代碼122.1主函數(shù)核心代碼122.2循環(huán)接收數(shù)據(jù)包函數(shù)readloop核心代碼152.3分組處理函數(shù)proc核心代碼162.4發(fā)送分組函數(shù)send核心代碼182.5計算校驗和函數(shù)核心代碼19六、程序擴展功能的需求分析與實現(xiàn)201、實驗一數(shù)據(jù)包的捕獲與分析的擴展功能201.1總體數(shù)據(jù)包統(tǒng)計:201.2特定過濾條件數(shù)據(jù)包統(tǒng)計信息:201.3協(xié)議分析狀態(tài):211.4會話列表選擇所有ipv4會話:212、實驗二Ping程序的擴展功能222.1發(fā)送指定數(shù)量得包后停止222.2發(fā)送每個數(shù)據(jù)包之間的空閑時間232.3發(fā)送指定大小的數(shù)據(jù)包232.4改變服務(wù)類型232.5偽造源地址進行D
3、OS攻擊24七、實驗數(shù)據(jù)、結(jié)果分析251、實驗一的結(jié)果分析251.1抓包工具wireshark啟動并設(shè)置網(wǎng)卡為混雜模式251.2捕獲數(shù)據(jù)包261.3編寫過濾語句篩選數(shù)據(jù)包271.4對多種協(xié)議數(shù)據(jù)包進行分析281.5數(shù)據(jù)包信息的統(tǒng)計302、實驗二Ping程序的結(jié)果分析312.1發(fā)送指定數(shù)量得包后停止312.2發(fā)送每個數(shù)據(jù)包之間的空閑時間312.3處理接收到得所有類型的數(shù)據(jù)包322.4發(fā)送時指定生命值332.5向廣播地址發(fā)送回射請求332.6啟用安靜模式342.7設(shè)置數(shù)據(jù)包大小342.8設(shè)置服務(wù)類型352.9偽裝源地址352.10顯示幫助362.11不加任何選項的ping36八、總結(jié)37九、同組人
4、分工情況37一、實驗內(nèi)容和要求1、實驗一數(shù)據(jù)包的捕獲與分析目的:數(shù)據(jù)包捕獲技術(shù)是網(wǎng)絡(luò)管理系統(tǒng)的關(guān)鍵技術(shù)。本實驗通過Wireshark軟件的安裝使用,監(jiān)控局域網(wǎng)的狀態(tài),捕獲在局域網(wǎng)中傳輸?shù)臄?shù)據(jù)包,并結(jié)合在計算機網(wǎng)絡(luò)課程中學習到的理論知識,對常用網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包做出分析,加深網(wǎng)絡(luò)課程知識的理解和掌握。內(nèi)容和要求:Wireshark是一種開源的網(wǎng)絡(luò)數(shù)據(jù)包的捕獲和分析軟件,本實驗通過Wireshark軟件的安裝使用,監(jiān)控局域網(wǎng)的狀態(tài),捕獲在局域網(wǎng)中傳輸?shù)臄?shù)據(jù)包,并結(jié)合在計算機網(wǎng)絡(luò)課程中學習到的理論知識,對常用網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包做出分析,加深網(wǎng)絡(luò)課程知識的理解和掌握。具體內(nèi)容及要求如下:l Wiresha
5、rk軟件的安裝;l Wireshark軟件的啟動,并設(shè)置網(wǎng)卡的狀態(tài)為混雜狀態(tài),使得Wireshark可以監(jiān)控局域網(wǎng)的狀態(tài);l 啟動數(shù)據(jù)包的捕獲,跟蹤PC之間的報文,并存入文件以備重新查;l 設(shè)置過濾器過濾網(wǎng)絡(luò)報文以檢測特定數(shù)據(jù)流;l 對常用協(xié)議的數(shù)據(jù)包的報文格式進行分析,利用協(xié)議分析軟件的統(tǒng)計工具顯示網(wǎng)絡(luò)報文的各種統(tǒng)計信息。2、實驗二Ping程序的設(shè)計與實現(xiàn) 目的:1.通過設(shè)計和實現(xiàn)ping程序,從而使我們掌握網(wǎng)絡(luò)層協(xié)議的原理及實現(xiàn)方法。對偏底層的網(wǎng)絡(luò)程序設(shè)計,有一定的認識和理解。2.通過調(diào)用原始套接字進行編制程序,最終實現(xiàn)Ping程序,從而對套接字編程及網(wǎng)絡(luò)程序設(shè)計有進一步的理解。內(nèi)容和要求
6、:本實驗為ICMP實驗。實驗內(nèi)容:Ping命令實現(xiàn)的擴充,在給定的Ping程序的基礎(chǔ)上做如下功能擴充:l -h顯示幫助信息l -b允許ping一個廣播地址,只用于IPv4l -t 設(shè)置ttl值,只用于IPv4l -q安靜模式。不顯示每個收到的包的分析結(jié)果,只在結(jié)束時,顯示匯總結(jié)果Ping命令的基本描述Ping的操作是向某些IP地址發(fā)送一個ICMP Echo消息,接著該節(jié)點返回一個ICMP Echo reply消息。二、實驗環(huán)境1、實驗一數(shù)據(jù)包的捕獲與分析本實驗是在windows下進行的,具體實驗環(huán)境如下:操作系統(tǒng):windows XP抓包工具:Wireshark網(wǎng)絡(luò)環(huán)境:IPV4、IPV62、
7、實驗二Ping程序的設(shè)計與實現(xiàn)本實驗是在linux下進行的,具體實驗環(huán)境如下:操作系統(tǒng):Ubuntu 10.10_linux-2.6.38編輯工具:Gedit編譯工具:GCC調(diào)試工具:GDB網(wǎng)絡(luò)環(huán)境:IPV4、IPV6三、程序的需求分析與邏輯框圖1、實驗一數(shù)據(jù)包的捕獲與分析需求分析:如今,網(wǎng)絡(luò)已經(jīng)遍布了全球的大街小巷,幾乎每一天我們都得和它打交道,學習、工作都得用到網(wǎng)絡(luò)。網(wǎng)絡(luò)是一個很龐大的系統(tǒng),是系統(tǒng)就得有人去管理,然而要想管理好網(wǎng)絡(luò),那么就得對網(wǎng)絡(luò)有非常深入的認識和了解。數(shù)據(jù)包捕獲技術(shù)是網(wǎng)絡(luò)管理系統(tǒng)的關(guān)鍵技術(shù),所以我們可以通過學習數(shù)據(jù)包捕獲技術(shù)從而達到學習網(wǎng)絡(luò)的目的。這個實驗我們需要對數(shù)據(jù)包
8、進行捕獲和分析,這恰恰對我們學習網(wǎng)絡(luò)是有非常大的幫助的。開始安裝抓包工具Wireshark啟動Wireshark邏輯框圖:設(shè)置網(wǎng)卡工作在混雜模式開始抓包編寫過濾規(guī)則統(tǒng)計信息結(jié)束2、實驗二Ping程序的設(shè)計與實現(xiàn)需求分析:在繁華的網(wǎng)絡(luò)世界中,我們經(jīng)常想要看看網(wǎng)絡(luò)上的提供的各式各樣的新聞、有趣的東西,我們知道,要想讓自己的電腦能顯示出來這些內(nèi)容,就必須連入網(wǎng)絡(luò)中,這是一個大前提,可是光有了這個前提還是不行的。我們還得保證我們與提供內(nèi)容的那臺服務(wù)器的連接是通暢的,這就得用到我們編寫的ping程序了。在網(wǎng)絡(luò)層中工作的ping程序,可以給遠端的一個電腦發(fā)送一個回射請求,然后要是連接暢通,那么遠端的電腦會
9、給我們的電腦發(fā)送一個回射應(yīng)答,然后我們的ping程序就可以輸出一些信息,這樣我們就可以知道我們與目標主機的連接是否通暢啦。邏輯框圖:開始處理命令行參數(shù)1啟動發(fā)送模塊根據(jù)參數(shù)設(shè)置包格式接收應(yīng)答包打印輸出信息發(fā)送每個包之間的間隔時間到了嗎?填充相應(yīng)的ICMP頭格式發(fā)送回射請求數(shù)據(jù)包是否四、程序核心功能的實現(xiàn)機制1、實驗一數(shù)據(jù)包的捕獲與分析本實驗分為兩大部分:一部分主要是對抓包程序的基本運用,進行簡單抓包。另一部分主要是編寫過濾條件對所抓到得包進行過濾,讓程序只顯示我們關(guān)心的包的信息。比較簡單,就是啟動Wireshark軟件,并設(shè)置網(wǎng)卡的狀態(tài)為混雜狀態(tài),使得Wireshark可以監(jiān)控局域網(wǎng)的狀態(tài);啟
10、動數(shù)據(jù)包的捕獲,跟蹤PC之間的報文,并存入文件以備重新查。2、實驗二Ping程序的設(shè)計與實現(xiàn)程序分為兩大部分:一部分讀取收到的所有消息,并輸出ICMP Echo replay消息,另一部分每隔一秒鐘發(fā)送一個Echo消息。另一部分由SIGALARM信號每秒驅(qū)動一次。mainreadloopsig_alarmsendrecvfromproc注冊SIGALARM信號處理函數(shù)無限接收循環(huán)每隔固定秒數(shù)發(fā)送一個數(shù)據(jù)包程序首先肯定從main函數(shù)開始,然后處理完命令行參數(shù),后把主控權(quán)交給接收消息的無限循環(huán),在接收函數(shù)中啟動發(fā)送消息的函數(shù),并且這個發(fā)送函數(shù)在每次調(diào)用完真正的發(fā)送函數(shù)后,設(shè)置一個新的鬧鐘。然后鬧鐘
11、到了又會調(diào)用這個函數(shù),如此一直循環(huán)下去。概述邏輯框圖如下:具體實現(xiàn)細節(jié)分析如下:2.1主函數(shù)設(shè)計與實現(xiàn)主函數(shù)是我們程序的入口,整個程序都在主函數(shù)中,執(zhí)行完主函數(shù)也就意味著我們的程序結(jié)束啦。所以,在主函數(shù)中,我們應(yīng)該設(shè)計的是整個程序的框架,把整個程序分成若干個模塊,然后再去一點一點的實現(xiàn)各個模塊。各模塊之間的協(xié)調(diào)就得依靠主函數(shù)啦,所以,主函數(shù)的設(shè)計還是至關(guān)重要的。本程序的主函數(shù)起到了類似總線的功能,它把所有的模塊都串了起來,掌控著這一切,控制著程序的穩(wěn)步運行。在一開始,一個大的模塊就是識別和處理命令行參數(shù),在這一部分,我們用到了linux中的一套非常好的處理命令行參數(shù)的函數(shù),利用getopt函數(shù)
12、和與它相配的一些全局指針,讓我們的命令行參數(shù)處理起來,非常的省事兒而且很高效。對這套函數(shù)的具體介紹如下:表頭文件 #include定義函數(shù) int getopt(int argc,char * const argv ,const char * optstring);函數(shù)說明 getopt()用來分析命令行參數(shù)。參數(shù)argc和argv是由main()傳遞的參數(shù)個數(shù)和內(nèi)容。參數(shù) optstring為選項字符串, 告知 getopt()可以處理哪個選項以及哪個選項需要參數(shù),如果選項字符串里的字母后接著冒號“:”,則表示還有相關(guān)的參數(shù),全域變量optarg 即會指向此額外參數(shù)。如果在處理期間遇到了不符
13、合optstring指定的其他選項getopt()將顯示一個錯誤消息,并將全域變量optopt設(shè)為“?”字符,如果不希望getopt()印出錯信息,則只要將全域變量opterr設(shè)為0即可。getopt() 所設(shè)置的全局變量包括:optarg指向當前選項參數(shù)(如果有)的指針。 optind再次調(diào)用 getopt() 時的下一個 argv 指針的索引。 optopt最后一個已知選項。命令行參數(shù)處理完了就開始下一個規(guī)程了,那就是注冊兩個信號的處理函數(shù),一個 是SIGALARM鬧鐘的處理函數(shù),后面用于發(fā)送回射請求包。一個是SIGINT的處理函數(shù),用于用戶按了CTRL+C時顯示統(tǒng)計信息。再后面就是根據(jù)用
14、戶輸入的網(wǎng)絡(luò)地址來得到目標主機地址信息了,用了host_serv函數(shù),此函數(shù)又調(diào)用getaddrinfo完成了具體的獲得地址信息的工作。接下來就是根據(jù)獲得的地址信息,設(shè)置具體控制發(fā)送和接收數(shù)據(jù)包的結(jié)構(gòu)體pr的各項成員。最后調(diào)用循環(huán)接收數(shù)據(jù)包函數(shù)readloop,等此函數(shù)退出后,整個程序退出。整個主函數(shù)的邏輯流程圖如下:2.2循環(huán)接收數(shù)據(jù)包函數(shù)readloop設(shè)計與實現(xiàn)這個函數(shù)主要實現(xiàn)的是根據(jù)用戶輸入的命令行參數(shù),設(shè)置IP包頭選項,從而實現(xiàn)IP包格式的填充,然后顯示的調(diào)用一下SIGALARM信號處理函數(shù),讓發(fā)送循環(huán)開始。接下來是進入無限接收循環(huán),接收到一個分組,記錄接到的時間,調(diào)用相應(yīng)的處理函數(shù)
15、,進行分組的分析。這函數(shù)就是一切之后一直做的事情,程序一直就這樣運行著。整個readloop函數(shù)的邏輯流程圖如下: 到了這個函數(shù)就既有了發(fā)送,又有了接收了,只是整個函數(shù)它只管接收到分組,不管后續(xù)的處理,具體是怎么分析的分組就得下面的函數(shù)來處理啦,下面主要有兩個函數(shù),一個是發(fā)送函數(shù),主要管理著發(fā)送相關(guān)的處理;另一個是接收函數(shù),主要管理著接收相關(guān)的處理。2.3分組處理函數(shù)proc設(shè)計與實現(xiàn)在接收到分組以后,readloop函數(shù)就調(diào)用本函數(shù),并把接收到得分組和接收到的時間傳送給本函數(shù),本函數(shù)分為兩個版本,一個v4版本,一個v6版本。V4版本處理的是ipv4的分組,v6版本處理的是ipv6的分組,各個
16、版本根據(jù)相應(yīng)的ip頭格式和icmp的頭格式,把需要的信息讀取出來,并把數(shù)據(jù)段的第一個字節(jié)讀取出來,因為這個字節(jié)存放的是這個分組發(fā)送時的時間,然后與結(jié)束的時間相減得出這條路線的延遲時間。整個proc函數(shù)的邏輯流程圖如下:這個邏輯圖是v4版本和v6版本共同的地方,v4不同于v6版本的是,v4版本在或得icmp頭指針之前還得先獲得ip頭指針,然后把ip頭分析完才到icmp頭呢,而v6版本是直接就是icmp頭,沒有ip頭,所以我們不必再去獲得和分析ip頭。2.4發(fā)送分組函數(shù)send設(shè)計與實現(xiàn)此函數(shù)與proc函數(shù)非常類似也是有v4和v6兩個版本,各個版本的函數(shù)填充并發(fā)送對應(yīng)版本的數(shù)據(jù)包,唯一不同的就是v
17、4版本中如果用戶指定了偽裝源地址的話,是需要自己填寫一個ip頭的。除此之外,其他的都是共同的,主要就是填充icmp頭信息和獲取當前時間并把它存到數(shù)據(jù)包的第一個字節(jié)里。整個send函數(shù)的邏輯流程圖如下:五、程序源代碼1、實驗一數(shù)據(jù)包的捕獲與分析在實驗一中,因為主要是抓包,所以,沒有什么源代碼,主要也就有一些過濾條件,可以算是代碼。因此,在這里就把過濾條件說明如下:1 ip.dst = 這一個過濾代碼是指發(fā)往百度的ip包。所以,把這個寫到filter窗格里就可以只顯示發(fā)往百度主頁的ip包的信息了。2 tcp.dstport = 80這個是過濾了所有目的端口不是80的包,這樣剩下的就都是發(fā)往80端口
18、的數(shù)據(jù)包啦。3 tcp.dstport = 80 and ip.dst=過濾條件可以用與、或、非的關(guān)系運算符進行連接,所以這句就可以顯示出所有發(fā)往百度主頁的端口為80的數(shù)據(jù)包了。4 ip.addr !=值得注意的就是這個讓我們以為對的,可是其實不是非常對的表達式,說它我們以為對是因為,我們總把它想成是把所有發(fā)給百度主頁的包過濾掉,很不幸,它不會按照我們的期望進行。相反,那個表達式為真值的條件源地址或目標地址中的任意一個不等于即可。因此,那個表達式可以被讀作:該包包含的ip字段值必須不為 。因為一個ip數(shù)據(jù)報同含源地址和目標地址,只要兩個地址有一個不為表達式就為真。2、實驗二Ping程序的核心代
19、碼2.1主函數(shù)核心代碼intmain(int argc, char *argv)int c;int temp;struct addrinfo*ai;quite_mode=0;send_overtime.tv_sec=0;send_overtime.tv_usec=0; recv_overtime.tv_sec=0;recv_overtime.tv_usec=0;bzero(&false_source_addr,sizeof(struct sockaddr_in);opterr = 0;/* dont want getopt() writing to stderr */while ( (c =
20、getopt(argc, argv, vhT:c:i:vt:hbqs:o:r:) != -1) switch (c) case v:verbose+;break;case h:printf(!*This is a Ping program*! You can use it to send ICMP ECHO_REQUEST packets to network hosts.nUsage: ping OPTION. HOST .nn Options valid for all request types:nn -c NUMBER Stop after sending NUMBER packets
21、n -i NUMBER Wait NUMBER seconds between sending each packetn -v Verbose outputnn Options valid for -echo requests:nn -t NUM 設(shè)置ttl值為NUM,IPv4和IPv6同時適用n -b 允許ping一個廣播地址,只用于IPv4n -q 安靜模式n -s Send NUMBER data octetsnn Options valid for other:nn -o NUM Sever typen 0 -最小化延遲n1 -最大化吞吐量n 2 -最大化可靠性n 3 -最小化成本n
22、-r ipaddr 偽裝的源ip地址n -h 顯示幫助信息nn);return 0;case q:quite_mode=1;break;case t:en_ttl=1;ttl=atoi(optarg);if(ttl255) err_quit(The ttl value is too big! It must between 1 and 255!);break;case b:allow_broadcast=1;break;case c:ping_count=atoi(optarg);break;case i:delay=atoi(optarg);if(delay0) err_quit(The d
23、elay value is too small! It must bigger than 0!);case s:datalen=atoi(optarg);if(datalen1472 & datalen 65399) err_quit(The datalen value is too big!);break;case o:temp=atoi(optarg);if(temp3 |tempai_canonname, Sock_ntop_host(ai-ai_addr, ai-ai_addrlen), datalen);/* 4initialize according to protocol */i
24、f (ai-ai_family = AF_INET) pr = &proto_v4;#ifdefIPV6 else if (ai-ai_family = AF_INET6) pr = &proto_v6;if (IN6_IS_ADDR_V4MAPPED(&(struct sockaddr_in6 *) ai-ai_addr)-sin6_addr)err_quit(cannot ping IPv4-mapped IPv6 address);#endif elseerr_quit(unknown address family %d, ai-ai_family);if(ai-ai_family =
25、AF_INET6 & en_false_source_addr) err_quit(-r option cannt use on ipv6!);pr-sasend = ai-ai_addr;pr-sarecv = calloc(1, ai-ai_addrlen);pr-salen = ai-ai_addrlen;readloop();exit(0);2.2循環(huán)接收數(shù)據(jù)包函數(shù)readloop核心代碼 voidreadloop(void)intsize; const int en_broadcast=1;charrecvbufBUFSIZE;socklen_tlen;ssize_tn;struct
26、 timevaltval;sockfd = socket(pr-sasend-sa_family, SOCK_RAW, pr-icmpproto);setuid(getuid();/* dont need special permissions any more */size = 60 * 1024;/* OK if setsockopt fails */setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size);if(en_ttl) setsockopt(sockfd,pr-ttllevel,pr-ttloptname,&ttl
27、,sizeof(int);if(allow_broadcast) setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&en_broadcast,sizeof(int);if(en_server_type) setsockopt(sockfd,IPPROTO_IP,IP_TOS,&server_type,sizeof(int);if(en_false_source_addr) setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&en_broadcast,sizeof(int);sig_alrm(SIGALRM);/* send fi
28、rst packet */while(1) len = pr-salen;n = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, pr-sarecv, &len);if (n fproc)(recvbuf, n, &tval);2.3分組處理函數(shù)proc核心代碼1.IPV4版本voidproc_v4(char *ptr, ssize_t len, struct timeval *tvrecv)inthlen1, icmplen;doublertt;struct ip*ip;struct icmp*icmp;struct timeval*tvsend;
29、ip = (struct ip *) ptr;/* start of IP header */hlen1 = ip-ip_hl 2;/* length of IP header */icmp = (struct icmp *) (ptr + hlen1);/* start of ICMP header */if ( (icmplen = len - hlen1) 8)err_quit(icmplen (%d) icmp_type = ICMP_ECHOREPLY) if (icmp-icmp_id != pid)return;/* not a response to our ECHO_REQU
30、EST */if (icmplen 16)err_quit(icmplen (%d) icmp_data;tv_sub(tvrecv, tvsend);rtt = tvrecv-tv_sec * 1000.0 + tvrecv-tv_usec / 1000.0;if(!quite_mode)printf(%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f msn,icmplen, Sock_ntop_host(pr-sarecv, pr-salen),icmp-icmp_seq, ip-ip_ttl, rtt);+recv_pk_num;if(rttmax_r
31、tt) max_rtt=rtt;if(rttsarecv, pr-salen),icmp-icmp_type, icmp-icmp_code);2.IPV6版本voidproc_v6(char *ptr, ssize_t len, struct timeval* tvrecv)#ifdefIPV6inthlen1, icmp6len;doublertt;struct ip6_hdr*ip6;struct icmp6_hdr*icmp6;struct timeval*tvsend; icmp6=(struct icmp6_hdr *)ptr; if(icmp6len=len)8) /len-40
32、err_quit(icmp6len (%d) icmp6_type = ICMP6_ECHO_REPLY) if (icmp6-icmp6_id != pid)return;/* not a response to our ECHO_REQUEST */if (icmp6len 16)err_quit(icmp6len (%d) tv_sec * 1000.0 + tvrecv-tv_usec / 1000.0;if(!quite_mode)printf(%d bytes from %s: seq=%u, rtt=%.3f msn,icmp6len, Sock_ntop_host(pr-sar
33、ecv, pr-salen),icmp6-icmp6_seq, rtt);+recv_pk_num;if(rttmax_rtt) max_rtt=rtt;if(rttsarecv, pr-salen),icmp6-icmp6_type, icmp6-icmp6_code);#endif/* IPV6 */2.4發(fā)送分組函數(shù)send核心代碼1.IPV4版本voidsend_v4(void)int len;int head_len;struct icmp*icmp;struct ip *ip;if(en_false_source_addr) head_len=sizeof(struct ip)+
34、sizeof(struct icmp); ip=(struct ip *)sendbuf; ip-ip_v=IPVERSION; ip-ip_hl=sizeof(struct ip) 2; ip-ip_tos=server_type; ip-ip_len=head_len+datalen; ip-ip_id=0; ip-ip_off=0; ip-ip_ttl=ttl; ip-ip_p=IPPROTO_ICMP; ip-ip_sum=0; ip-ip_dst.s_addr=inet_addr(pr-sasend-sa_data); ip-ip_src.s_addr=false_source_ad
35、dr.sin_addr.s_addr; icmp= (struct icmp *)(sendbuf+sizeof(struct ip);else icmp = (struct icmp *) sendbuf;icmp-icmp_type = ICMP_ECHO;icmp-icmp_code = 0;icmp-icmp_id = pid;icmp-icmp_seq = nsent+;gettimeofday(struct timeval *) icmp-icmp_data, NULL);len = 8 + datalen;/* checksum ICMP header and data */ic
36、mp-icmp_cksum = 0;icmp-icmp_cksum = in_cksum(u_short *) icmp, len);if(en_false_source_addr) len+=sizeof(struct ip);sendto(sockfd, sendbuf, len, 0, pr-sasend, pr-salen);2.IPV6版本voidsend_v6()#ifdefIPV6intlen;struct icmp6_hdr*icmp6;icmp6 = (struct icmp6_hdr *) sendbuf;icmp6-icmp6_type = ICMP6_ECHO_REQU
37、EST;icmp6-icmp6_code = 0;icmp6-icmp6_id = pid;icmp6-icmp6_seq = nsent+;gettimeofday(struct timeval *) (icmp6 + 1), NULL);len = 8 + datalen;/* 8-byte ICMPv6 header */sendto(sockfd, sendbuf, len, 0, pr-sasend, pr-salen);/* kernel calculates and stores checksum for us */#endif/* IPV6 */2.5計算校驗和函數(shù)核心代碼un
38、signed shortin_cksum(unsigned short *addr, int len) int nleft = len; int sum = 0; unsigned short *w = addr; unsigned short answer = 0; while (nleft 1) sum += *w+; nleft -= 2; /* 4mop up an odd byte, if necessary */ if (nleft = 1) *(unsigned char *)(&answer) = *(unsigned char *)w ; sum += answer; /*
39、4add back carry outs from top 16 bits to low 16 bits */ sum = (sum 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum 16); /* add carry */ answer = sum; /* truncate to 16 bits */ return(answer);六、程序擴展功能的需求分析與實現(xiàn)1、實驗一數(shù)據(jù)包的捕獲與分析的擴展功能抓包實驗的擴展功能,我們主要放在了利用Wireshark強大的統(tǒng)計功能對龐大的數(shù)據(jù)包信息的統(tǒng)計功能上了,其實,這是很重要的一
40、個功能,在一個龐大吞吐量的網(wǎng)絡(luò)環(huán)境,這尤其顯得重要,我們可以知道現(xiàn)在最頻繁的包是什么,可以知道一種包的具體信息。1.1總體數(shù)據(jù)包統(tǒng)計:1.2特定過濾條件數(shù)據(jù)包統(tǒng)計信息:1.3協(xié)議分析狀態(tài):1.4會話列表選擇所有ipv4會話:2、實驗二Ping程序的擴展功能這部分的內(nèi)容不算很多,但是都比較有用,所以就作為擴展功能增加到了我們的ping程序中了,下面就詳細的單個的介紹一下:2.1發(fā)送指定數(shù)量得包后停止要是沒有這選項,我們的程序會一直不停的給目標主機發(fā)回射請求,直到用于強制退出程序,但很多時候我們都是只想直到我們的電腦和目標主機之間的網(wǎng)絡(luò)線路是不是通暢的,所以只需發(fā)送一定數(shù)量的包就可以啦,不需要一直
41、發(fā)。因此,我們設(shè)計了-c選項,在它后面加一個數(shù)字的參數(shù),就是指定要發(fā)送的包的數(shù)量。具體的實現(xiàn)如下:在命令行參數(shù)處理部分加入如下代碼:case c:ping_count=atoi(optarg);break;ping_count記錄著指定的要發(fā)送的包的數(shù)量。修改SIGALARM信號處理函數(shù)如下:voidsig_alrm(int signo)if(send_pk_num=ping_count) readloopstop(SIGINT); (*pr-fsend)();+send_pk_num; alarm(delay); return; /* probably interrupts recvfrom
42、() */這樣在發(fā)送的數(shù)據(jù)包的數(shù)量到達指定的數(shù)量的時候,我們的程序就去自動調(diào)用停止函數(shù)readloopstop,此函數(shù)實現(xiàn)如下:Void readloopstop(int signo)printf(n*Ping statistics for %s*n%d packets transmitted, %d packets received, %5.2f% packet loss nround-trip min/avg/max = %6.3f/%6.3f/%6.3f msnn,host,send_pk_num,recv_pk_num,(double)(send_pk_num-recv_pk_num)/(double)send_pk_num)*100,min_rtt,total_rtt/recv_pk_num,max_rtt);exit(1);2.2發(fā)送每個數(shù)據(jù)包之間的空閑時間在我們的ping程序執(zhí)行的時候,有的時候,我們會感覺輸出的太快啦,來不及仔細的參看,其實這不是輸出的太快,而其實質(zhì)是發(fā)送的數(shù)據(jù)包太快啦,使得接受的數(shù)據(jù)包源源不斷的來,最終造成輸出的信息非常快。所以,我們加了-i選項,在它之后加一個數(shù)字的參數(shù),指定發(fā)送每個包之間的間隔時間
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉儲服務(wù)居間合同樣本
- 皮草服裝采購合同
- 清潔工個人勞動合同
- 2025-2030年中國門加工行業(yè)競爭格局及發(fā)展趨勢分析報告
- 2025-2030年中國鋁棒市場運行態(tài)勢與十三五規(guī)劃分析報告
- 2025-2030年中國鋼鐵中厚板行業(yè)運行狀況及發(fā)展規(guī)劃分析報告
- 健身房連鎖品牌合作合同
- 2025-2030年中國茶多酚市場十三五規(guī)劃及投資戰(zhàn)略研究報告
- 智能酒店管理系統(tǒng)建設(shè)合同
- 2025-2030年中國納米二氧化鈦市場運行狀況及發(fā)展趨勢預(yù)測報告
- 民航法規(guī)與實務(wù)PPT全套教學課件
- 15 分章專項練習-整本書閱讀系列《經(jīng)典常談》名著閱讀與練習
- 幼兒園衛(wèi)生保健人員任命書(保健醫(yī)生)
- 一課一練┃二年級下冊:1古詩二首
- 財務(wù)報表2019新版-已執(zhí)行新金融和收入準則(財會〔2019〕6號)
- 2023年湖南食品藥品職業(yè)學院高職單招(英語)試題庫含答案解析
- GB/T 39096-2020石油天然氣工業(yè)油氣井油管用鋁合金管
- 爐外精煉說課
- 紅色喜慶大氣軍令狀2022頒獎誓師大會動態(tài)PPT模板
- 綠化養(yǎng)護工作計劃15篇
- 防災(zāi)減災(zāi)工程學第六章火災(zāi)害課件
評論
0/150
提交評論