解析arp數(shù)據(jù)包-計算機網(wǎng)絡課程設計_第1頁
已閱讀1頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機網(wǎng)絡</b></p><p><b>  課程設計報告</b></p><p>  題 目: 解析ARP數(shù)據(jù)包 </p><p>  姓 名: </p><p>  學 號:

2、 </p><p>  同組姓名: </p><p>  專業(yè)班級: </p><p>  指導教師: </p><p><b>  目 錄</b></p><p>  一、課程設計目的:2</p>&l

3、t;p>  二、課程設計要求:2</p><p>  三、課程設計分析3</p><p>  1.課程設計中的重點及難點3</p><p><b>  2.參考算法3</b></p><p><b>  3.核心代碼4</b></p><p>  四、源程序及

4、運行截圖5</p><p><b>  五、心得體會9</b></p><p><b>  六、參考文獻10</b></p><p><b>  一、課程設計目的:</b></p><p>  本課程設計的目的是對網(wǎng)絡上的ARP數(shù)據(jù)包進行解析,從而熟悉ARP數(shù)據(jù)包的結構,

5、對ARP協(xié)議有更好的理解和認識。</p><p><b>  二、課程設計要求:</b></p><p>  通過編制程序,獲取網(wǎng)絡中的ARP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結果顯示在標準輸出上,并同時寫入日志文件。</p><p>  程序的具體要求如下所示:</p><p>  1.以命令行的形式運行,如下所示:<

6、/p><p>  arpparse logfile</p><p>  其中,arpparse為程序名;logfile為日志文件名。</p><p>  2.程序輸出內(nèi)容如下所示:</p><p>  源IP地址  源MAC地址  目的IP地址   操作  時間</p><p>  各部分的說明如下所示:</p&

7、gt;<p>  源IP地址:輸出ARP消息格式中的源IP地址字段。</p><p>  源MAC地址:輸出ARP消息格式中的源物理地址字段。</p><p>  目的IP地址:輸出ARP消息格式中的目的IP地址字段。</p><p>  目的MAC地址:輸出ARP消息格式中的目的物理地址字段。</p><p>  操作:輸出A

8、RP消息格式中的操作字段,若為ARP請求,則為1,若為ARP應答,則為2。</p><p>  時間:該ARP包產(chǎn)生的時間</p><p>  3.當程序接收到鍵盤輸入Ctrl+C時退出。</p><p><b>  三、課程設計分析</b></p><p>  1.課程設計中的重點及難點</p><

9、p>  程序中會用到Winpcap,Winpcap是Win32環(huán)境下數(shù)據(jù)包捕獲的開放代碼函數(shù)庫?;赪inpcap的應用程序一般按照下面幾個步驟進行設計:</p><p><b>  輸出網(wǎng)卡設備列表。</b></p><p><b>  選擇網(wǎng)卡并打開。</b></p><p>  捕獲數(shù)據(jù)包時,可能需要設置過濾器

10、。</p><p>  捕獲數(shù)據(jù)包或者發(fā)送數(shù)據(jù)包。</p><p>  在程序設計過程中需要注意網(wǎng)絡—主機字節(jié)順序的轉(zhuǎn)化。由于不同的計算機系統(tǒng)所采用的數(shù)據(jù)表示方式不同,對于2B或4B的數(shù)據(jù),有的采用低字節(jié)地址存放數(shù)據(jù)的高權值位,而有的卻以低地址字節(jié)存放數(shù)據(jù)低權位值,在網(wǎng)絡的數(shù)據(jù)傳輸中,我們應該統(tǒng)一表示,所以我們在捕獲數(shù)據(jù)包后,應將數(shù)據(jù)包頭部的表示長度或類型的數(shù)據(jù)轉(zhuǎn)換成本地機的表達形式??梢?/p>

11、利用函數(shù)ntohs()將網(wǎng)絡字節(jié)序轉(zhuǎn)換為主機字節(jié)序。</p><p>  選擇網(wǎng)卡并打開時,注意選擇可用的網(wǎng)卡。</p><p><b>  2.參考算法</b></p><p>  取得當前網(wǎng)卡設備列表。</p><p>  選擇Ethernet網(wǎng)卡并打開,注意判斷所選網(wǎng)卡是否為實際存在的可用網(wǎng)卡。</p>

12、<p>  設置過濾器,此處的過濾器正則表達式為“arp”或者“ether proto\\arp”。</p><p>  捕獲數(shù)據(jù)包并進行處理(包括輸出各IP地址,物理地址,操作類型以及時間)。由于要記錄日志文件,為了便于輸出流參數(shù),建議采用pcap_next_ex()函數(shù)。</p><p><b>  流程圖如下圖所示:</b></p>

13、<p><b>  3.核心代碼</b></p><p><b>  ARP數(shù)據(jù)包結構</b></p><p>  struct arppkt{ </p><p>  unsigned short hdtyp; //硬件類型。值0001表示其為Ethernet</p>

14、<p>  unsigned short protyp; //協(xié)議類型。值0800表示上層協(xié)議為IP</p><p>  unsigned char hdsize; //硬件地址長度。值為06</p><p>  unsigned char prosize; //協(xié)議地址長度。值為04</p><p>  unsigned short op;

15、 //操作值為0001/0002,分別表示ARP請求/應答</p><p>  u_char smac[6]; //源MAC地址,6B</p><p>  u_char sip[4]; //源IP地址,4B</p><p>  u_char dmac[6]; //目的MAC地址</p><p

16、>  u_char dip[4]; //目的IP地址</p><p><b>  };</b></p><p>  獲取網(wǎng)絡設備列表,并以混雜模式打開網(wǎng)絡設備</p><p>  //獲取網(wǎng)絡設備列表</p><p>  if(pcap_findalldevs(&alldevs,errbu

17、f)==-1)</p><p><b>  {</b></p><p>  cout<<"Error in pcap_findalldevs:"<<errbuf;</p><p><b>  return;</b></p><p><b>  }

18、</b></p><p>  //選擇Ethernet卡</p><p>  for(d=alldevs;d;d=d->next)</p><p><b>  { </b></p><p>  //以混雜模式打開網(wǎng)卡,以接受所有的幀</p><p>  if((adhandle=

19、pcap_open_live(d->name,1000,1,300,errbuf))==NULL)</p><p><b>  {</b></p><p>  cout<<"\nUnable to open the adapter.";</p><p>  pcap_freealldevs(alldevs)

20、; //釋放設備列表</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL)</p><p>&

21、lt;b>  break;</b></p><p><b>  }</b></p><p>  編譯過濾器并設置過濾器,只捕獲ARP數(shù)據(jù)包</p><p>  char packet_filter[]=”ether proto \\arp”; //過濾,選擇arp協(xié)議</p><p>  if(p

22、cap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)</p><p>  { cout<<"\nUnable to compile the packet filter.Check the syntax.\n";</p><p>  pcap_freealldevs(alldevs);

23、</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //設置過濾器</b></p><p>  if(pcap_setfilter(adhandle,&fcode)<0)</p>

24、<p>  { cout<<"\nError setting the filter.\n";</p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p>

25、<p>  循環(huán)捕獲ARP包,并進行解析</p><p>  while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0)</p><p><b>  {</b></p><p>  輸出ARP數(shù)據(jù)包的各個域的內(nèi)容到文件和屏幕上</p>

26、<p><b>  }</b></p><p>  四、源程序及運行截圖</p><p><b>  1.源程序如下:</b></p><p>  #include<winsock2.h></p><p>  #pragma comment(lib,"Ws2_32.l

27、ib") //用到ntobs()</p><p>  //等同于點擊"project-setting-link"打開object/library module編輯框后加入文件</p><p>  #pragma comment(lib,"wpcap.lib")</p><p>  #include "pca

28、p.h" //此頭文件沒有包含在VC中,需要另外加入</p><p>  #include<fstream.h></p><p>  #include<iomanip.h> //格式化輸出需要用到</p><p>  #include<conio.h> //用到_getch()</p>&l

29、t;p>  //注意到接收的數(shù)據(jù)包頭中代表類型,數(shù)據(jù)長度的字段采用的是big-endian</p><p>  //所以對于2B/4B的數(shù)據(jù)要用ntohs()轉(zhuǎn)換為本機形式</p><p><b>  //ARP包結構</b></p><p>  struct arppkt{ </p><p&

30、gt;  unsigned short hdtyp; //硬件類型。值0001表示其為Ethernet</p><p>  unsigned short protyp; //協(xié)議類型。值0800表示上層協(xié)議為IP</p><p>  unsigned char hdsize; //硬件地址長度。值為06</p><p>  unsigned char p

31、rosize; //協(xié)議地址長度。值為04</p><p>  unsigned short op; //操作值為0001/0002,分別表示ARP請求/應答</p><p>  u_char smac[6]; //源MAC地址,6B</p><p>  u_char sip[4]; //源IP地址,4B</p&g

32、t;<p>  u_char dmac[6]; //目的MAC地址</p><p>  u_char dip[4]; //目的IP地址</p><p><b>  };</b></p><p>  void packet_handler(const pcap_pkthdr *header,cons

33、t u_char *pkt_data,ostream& out);</p><p>  void main(int argc,char *argv[ ])</p><p><b>  {</b></p><p>  if(argc!=2)</p><p><b>  {</b></p&

34、gt;<p>  cout<<"Usage:arpparse logfilename"<<endl;</p><p>  cout<<"press any key to continue."<<endl;</p><p><b>  _getch();</b><

35、/p><p><b>  return;</b></p><p><b>  }</b></p><p>  pcap_if_t *alldevs;</p><p>  pcap_if_t *d;</p><p>  pcap_t *adhandle;</p>&l

36、t;p>  char errbuf[PCAP_ERRBUF_SIZE];</p><p>  u_int netmask;</p><p>  char packet_filter[]="ether proto \\arp";</p><p>  struct bpf_program fcode;</p><p> 

37、 struct pcap_pkthdr *header;</p><p>  const u_char *pkt_data;</p><p>  if(pcap_findalldevs(&alldevs,errbuf)==-1)</p><p><b>  {</b></p><p>  cout<<

38、"Error in pcap_findalldevs:"<<errbuf;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  for(d=alldevs;d;d=d->next)</p><p>&l

39、t;b>  { </b></p><p>  if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL)</p><p><b>  {</b></p><p>  cout<<"\nUnable to open the adapte

40、r.";</p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(pcap_datalink(adhandle)==DLT_EN10MB&&

41、;d->addressess!=NULL)</p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(d==NULL)</p><p><b>  {</b></p><p>  cout&

42、lt;<"\nNo interfaces found! Make sure Winpcap is installed.\n";</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //獲得子網(wǎng)掩碼</b>&l

43、t;/p><p>  netmask=((sockaddr_in *)(d->netmask))->sin_addr.s_un.s_addr;</p><p>  //編譯過濾器,只捕獲ARP包</p><p>  if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)</p

44、><p>  { cout<<"\nUnable to compile the packet filter.Check the syntax.\n";</p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p&g

45、t;<b>  }</b></p><p><b>  //設置過濾器</b></p><p>  if(pcap_setfilter(ashandle,&fcode)<0)</p><p>  { cout<<"\nError setting the filter.\n"

46、;</p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  cout<<"\t\tlistening on "<<d->

47、description<<"..."<<endl<<endl;</p><p>  //顯示提示信息及每項含義</p><p>  ofstream fout(argv[1],ios::app); //日志記錄文件</p><p>  //為了查看日志時的方便,其中加入了日期記錄</p>&l

48、t;p><b>  time_t t;</b></p><p><b>  time(&t);</b></p><p>  fout.seekp(0,ios::end);</p><p>  if(fout.tellp()!=0)</p><p>  fout<<endl;

49、</p><p>  fout<<"\t\tARP request(1)/reply(2) on"<<ctime(&t);</p><p>  cout<<Sour Ip Addr"<<" "<<"Sour MAC Address"</p>

50、<p>  <<" "<<"Des Ip Addr"<<" "<<"Des MAC Address"</p><p>  <<" "<<"OP"<<" "<

51、<"Time"<<endl;</p><p>  fout<<Sour Ip Addr"<<" "<<"Sour MAC Address"</p><p>  <<" "<<"Des Ip Addr"

52、;<<" "<<"Des MAC Address"</p><p>  <<" "<<"OP"<<" "<<"Time"<<endl;</p><p><b>  /

53、/釋放設備列表</b></p><p>  pcap_freealldevs(alldevs);</p><p>  int result;</p><p>  while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0)</p><p><b&

54、gt;  { </b></p><p>  if(result==0)</p><p><b>  continue;</b></p><p>  packer_handler(header,pkt_data,cout);</p><p>  packet_handler(header,pkt_data,

55、fout);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out)</p><p&g

56、t;<b>  {</b></p><p>  arpkt* arph = (arppkt *)(pkt_data +14);</p><p>  for(int i=0;i<3;i++)</p><p>  out<<int(arph->sip[i])<<'.';</p>&l

57、t;p>  out.setf(ios::left);</p><p>  out<<setw(3)<<int(arph->sip[3])<<" ";</p><p>  out.unsetf(ios::uppercase);</p><p>  for(i=0;i<5;i++)</p&

58、gt;<p>  out<<hex<<setw(2)<<int(arph->smac[i])<<'-';</p><p>  out<<hex<<setw(2)<<int(arph->smac[5])<<" ";</p><p> 

59、 out.fill(oldfillchar);</p><p>  out.unsetf(ios::hex|ios::uppercase);</p><p>  for(i=0;i<3;i++)</p><p>  out<<int(arph->dip[3])<<'.';</p><p> 

60、 out.unsetf(ios::left);</p><p>  //輸出目的MAC地址</p><p>  out.fill('0');</p><p>  out.setf(ios::uppercase);</p><p>  for(i=0;i<5;i++)</p><p>  out&l

61、t;<hex<<setw(2)<<int(arph->dmac[i])<<'-';</p><p>  out.fill(oldfillchar);</p><p>  out.unsetf(ios::hex|ios::uppercase);</p><p>  out<<ntohs(arp

62、h->op)<<" ";</p><p>  struct tm *ltime;</p><p>  ltime=localtime(&header->ts.tv_sec);</p><p>  out.fill('0');</p><p>  out<<lt

63、ime->tm_hour<<':'<<setw(2)<<ltime->tm_min<<':'<<setw(2)<<ltime->tm_sec;</p><p>  out.fill(oldfillchar);</p><p>  out<<endl;<

64、/p><p><b>  }</b></p><p><b>  2.運行截圖如下:</b></p><p><b>  五、心得體會</b></p><p>  本次課程設計,完成了在xp環(huán)境下的解析ARP數(shù)據(jù)包。</p><p>  在具體實現(xiàn)獲取網(wǎng)絡中

65、的ARP數(shù)據(jù)包解析數(shù)據(jù)包的內(nèi)容,并將其寫入日志文件的過程中,使我更加清楚物理地址、IP地址的關聯(lián),源地址與目的地址的關系,以及二者對數(shù)據(jù)類型的格式要求。最重要的是通過這次的實際訓練讓我對ARP協(xié)議更加理解。</p><p>  通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立

66、思考的能力。在設計的過程中遇到問題,同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,通過這次課程設計之后,一定把以前所學過的知識重新溫故才行。</p><p>  課程設計是培養(yǎng)我們綜合運用所學知識,發(fā)現(xiàn)、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對我們實際工作能力的具體訓練和考察過程。隨著科學技術發(fā)展的日新月異,網(wǎng)絡已經(jīng)成為當今計算機發(fā)展中空前活躍的領域,在生

67、活中可以說是無處不在,因此作為二十一世紀的計算機專業(yè)的大學生來說掌握網(wǎng)絡組網(wǎng)技術是十分重要的。</p><p><b>  六、參考文獻</b></p><p>  【1】謝希人著. 計算機網(wǎng)絡(第四版)大連理工大學出版社2003</p><p>  【2】宋凱等著. 計算機網(wǎng)絡. 北京:清華大學出版社 2010</p><

溫馨提示

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

評論

0/150

提交評論