解析arp數(shù)據(jù)包課程設計_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設計</b></p><p><b>  院系:通信工程學院</b></p><p>  課程名稱:計算機網絡與通信</p><p>  設計名稱:解析ARP數(shù)據(jù)包</p><p><b>  目錄</b></p><p&g

2、t;  課程設計目的………………………………………2</p><p>  課程設計要求………………………………………2</p><p>  相關知識………………………………………………3</p><p>  ARP數(shù)據(jù)報的消息格式……………………3</p><p>  ARP協(xié)議的工作流程………………………..4</p><

3、;p>  課程設計分析……………………………………….6</p><p>  課程設計中的重點及難點………………..6</p><p>  參考算法………….………………………………7</p><p>  核心代碼…………………………………………..8</p><p>  相關擴展………………………………………………15</p&g

4、t;<p>  心得體會………………………………………………16</p><p>  參考文獻………………………………………………17</p><p><b>  課程設計目的:</b></p><p>  本課程設計的目的是對網絡上的ARP數(shù)據(jù)包進行解析,從而熟悉ARP數(shù)據(jù)包的結構,對ARP協(xié)議有更好的理解和認識。</p&

5、gt;<p><b>  課程設計要求:</b></p><p>  通過編制程序,獲取網絡中的ARP數(shù)據(jù)包,解析數(shù)據(jù)包的內容,將結果顯示在標準輸出上,并同時寫入日志文件。</p><p>  程序的具體要求如下所示:</p><p>  1,以命令行的形式運行,如下所示:</p><p>  11ARP其

6、中,11ARP為程序名;11為日志文件名。</p><p> ?。?,程序輸出內容如下所示:</p><p>  源IP地址  源MAC地址  目的IP地址  操作 時間</p><p>  各部分的說明如下所示:</p><p>  源IP地址:輸出ARP消息格式中的源IP地址字段;</p><p>  源MAC地址:

7、輸出ARP消息格式中的源物理地址字段;</p><p>  目的IP地址:輸出ARP消息格式中的目的IP地址字段;</p><p>  目的MAC地址:輸出ARP消息格式中的目的物理地址字段;</p><p>  操作:輸出ARP消息格式中的操作字段,若為ARP請求,</p><p>  則為1,若為ARP應答,則為2;</p>

8、<p>  時間:該ARP包產生的時間。</p><p>  3,當程序接收到鍵盤輸入Ctrl+C時字段</p><p><b>  相關知識</b></p><p>  ARP數(shù)據(jù)報的消息格式</p><p>  網絡上的每臺主機或設備都有一個或多個IP地址。IP地址是網絡層的地址,在網絡層,數(shù)據(jù)被組裝成I

9、P包。但是發(fā)送IP包需要物理設備的支持(通常是Ethernet設備,在本課程設計中我們指定為Ethernet設備),即發(fā)送端必須知道目的物理地址才能將IP包發(fā)送出去,所以需要一種將IP地址映射為物理地址的機制。ARP協(xié)議就是用來完成這個任務的。ARP協(xié)議能夠在同一個物理網絡中,在給定目的主機或設備的IP地址的條件下,得到目的主機或設備的物理地址。ARP協(xié)議的數(shù)據(jù)包格式如圖所示:</p><p>  0

10、 8 16 24 31(位) </p><p>  ARP數(shù)據(jù)包的消息格式</p><p>  下面對數(shù)據(jù)包的各個部分進行說明</p><p>  硬件類型:指定硬件接口類型。例如,值為1表示Ethernet</p><p>  協(xié)議類型:指定發(fā)送方支持的上層協(xié)議的類型</p

11、><p>  物理地址長度:指定物理(硬件)地址的長度</p><p>  協(xié)議地址長度:網絡層協(xié)議的地址長度。若為IP協(xié)議,其值為4</p><p>  操作:指定ARP的操作類型,例如,1表示ARP請求,2表示ARP應答</p><p>  源物理地址:指定發(fā)送方的IP地址</p><p>  目的物理地址:指定目的物

12、理地址。</p><p>  目的IP地址:指定目的IP地址</p><p>  ARP分組必須在數(shù)據(jù)鏈路層中被封裝成偵,才能發(fā)送出去封裝形式如圖所示</p><p>  將ARP數(shù)據(jù)包封裝成一個幀</p><p>  b)ARP協(xié)議的工作流程。</p><p>  在發(fā)送一個ARP分組之前,源主機首先根據(jù)目的IP地址

13、,在本地ARP高速緩存表中查找與之對應的目的物理地址。如果找到對應的物理地址,就不用進行地址解析,否則需要進行地址解析。</p><p>  實現(xiàn)地址解析的第一步是產生ARP請求分組。在相應的字段寫入本地主機的源物理地址、源IP地址,在目的物理地址字段寫入0,并在操作字段寫入1。</p><p>  將ARP分組發(fā)送到本地的數(shù)據(jù)鏈路層,并封裝成幀。以源物理地址作為源地址,以物理廣播地址(F

14、F-FF-FF-FF-FF-FF)作為目的地址,通過物理層發(fā)送出去。</p><p>  由于采用了廣播地址,因此網段內所有的主機或設備都能接受到該幀。除了目的主機外,所有接受到該分組的主機和設備都會丟棄該分組,因為目的主機能夠識別ARP消息中的目的IP地址。</p><p>  目的主機發(fā)送ARP應答分組。在ARP應答分組中,以請求分組中源物理地址、源IP地址作為其目的物理地址、目的IP

15、地址,并將目的主機自身的物理地址、IP地址填入應答分組的源物理地址、源IP地址字段,并在操作字段中寫入2。該分組通過數(shù)據(jù)鏈路層以點對點的方式發(fā)送出去(因為現(xiàn)在目的方已經知道雙方的物理地址)。</p><p>  源結點接收到ARP應答分組,知道對應于目的IP地址的目的物理地址,將它作為一條新記錄加入到ARP高速緩存表。</p><p>  源結點將有完整源IP地址、源物理地址、目的IP地址

16、、目的物理地址的信息和數(shù)據(jù)作為一個發(fā)送分組,傳送給它的數(shù)據(jù)鏈路層并封裝成楨,然后以點對點的方式發(fā)送到目的主機。</p><p><b>  四、課程設計分析</b></p><p>  課程設計中的重點及難點</p><p>  程序中會用到Winpcap,Winpcap是Win32環(huán)境下數(shù)據(jù)包捕獲的開放代碼函數(shù)庫。基于Winpcap的應用程序

17、一般按照下面幾個步驟進行設計:</p><p><b>  輸出網卡設備列表。</b></p><p><b>  選擇網卡并打開。</b></p><p>  捕獲數(shù)據(jù)包時,可能需要設置過濾器。</p><p>  捕獲數(shù)據(jù)包或者發(fā)送數(shù)據(jù)包。</p><p>  在程序設計

18、過程中需要注意網絡—主機字節(jié)順序的轉化。由于不同的計算機系統(tǒng)所采用的數(shù)據(jù)表示方式不同,對于2B或4B的數(shù)據(jù),有的采用低字節(jié)地址存放數(shù)據(jù)的高權值位,而有的卻以低地址字節(jié)存放數(shù)據(jù)低權位值,在網絡的數(shù)據(jù)傳輸中,我們應該統(tǒng)一表示,所以我們在捕獲數(shù)據(jù)包后,應將數(shù)據(jù)包頭部的表示長度或類型的數(shù)據(jù)轉換成本地機的表達形式??梢岳煤瘮?shù)ntohs()將網絡字節(jié)序轉換為主機字節(jié)序。</p><p>  選擇網卡并打開時,注意選擇可用的

19、網卡。</p><p><b>  參考算法</b></p><p>  取得當前網卡設備列表。</p><p>  選擇Ethernet網卡并打開,注意判斷所選網卡是否為實際存在的可用網卡。</p><p>  設置過濾器,此處的過濾器正則表達式為“arp”或者“ether proto\\arp”。</p>

20、<p>  捕獲數(shù)據(jù)包并進行處理(包括輸出各IP地址,物理地址,操作類型以及時間)。由于要記錄日志文件,為了便于輸出流參數(shù),建議采用pcap_next_ex()函數(shù)。</p><p><b>  流程圖如圖所示:</b></p><p><b>  核心代碼</b></p><p><b>  AR

21、P數(shù)據(jù)包結構</b></p><p>  struct arppkt{ </p><p>  unsigned short hdtyp; //硬件類型。值0001表示其為Ethernet</p><p>  unsigned short protyp; //協(xié)議類型。值0800表示上層協(xié)議為IP</p>&

22、lt;p>  unsigned char hdsize; //硬件地址長度。值為06</p><p>  unsigned char prosize; //協(xié)議地址長度。值為04</p><p>  unsigned short op; //操作值為0001/0002,分別表示ARP請求/應答</p><p>  u_char smac[6];

23、 //源MAC地址,6B</p><p>  u_char sip[4]; //源IP地址,4B</p><p>  u_char dmac[6]; //目的MAC地址</p><p>  u_char dip[4]; //目的IP地址</p><p><b>  

24、};</b></p><p>  獲取網絡設備列表,并以混雜模式打開網絡設備</p><p>  //獲取網絡設備列表</p><p>  if(pcap_findalldevs(&alldevs,errbuf)==-1)</p><p><b>  {</b></p><p>

25、;  cout<<"Error in pcap_findalldevs:"<<errbuf;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  //選擇Ethernet卡</p><p>  f

26、or(d=alldevs;d;d=d->next)</p><p><b>  { </b></p><p>  //以混雜模式打開網卡,以接受所有的幀</p><p>  if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL)</p><p&

27、gt;<b>  {</b></p><p>  cout<<"\nUnable to open the adapter.";</p><p>  pcap_freealldevs(alldevs); //釋放設備列表</p><p><b>  return;</b></p&g

28、t;<p><b>  }</b></p><p>  if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL)</p><p><b>  break;</b></p><p><b>  }</b>&

29、lt;/p><p>  編譯過濾器并設置過濾器,只捕獲ARP數(shù)據(jù)包</p><p>  char packet_filter[]=”ether proto \\arp”; //過濾,選擇arp協(xié)議</p><p>  if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)</p&g

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

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

32、lt;/p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  循環(huán)捕獲ARP包,并進行解析</p><p>  while((result=pcap_n

33、ext_ex(adhandle,&header,&pkt_data))>=0)</p><p><b>  {</b></p><p>  輸出ARP數(shù)據(jù)包的各個域的內容到文件和屏幕上</p><p><b>  }</b></p><p><b>  源程序<

34、/b></p><p>  #include<winsock2.h></p><p>  #pragma comment(lib,"Ws2_32.lib") //用到ntobs()</p><p>  //等同于點擊"project-setting-link"打開object/library module編輯

35、框后加入文件</p><p>  #pragma comment(lib,"wpcap.lib")</p><p>  #include "pcap.h" //此頭文件沒有包含在VC中,需要另外加入</p><p>  #include<fstream.h></p><p>  #inc

36、lude<iomanip.h> //格式化輸出需要用到</p><p>  #include<conio.h> //用到_getch()</p><p>  //注意到接收的數(shù)據(jù)包頭中代表類型,數(shù)據(jù)長度的字段采用的是big-endian</p><p>  //所以對于2B/4B的數(shù)據(jù)要用ntohs()轉換為本機形式</p&

37、gt;<p><b>  //ARP包結構</b></p><p>  struct arppkt{</p><p>  unsigned short hdtyp; //硬件類型.值0001</p><p>  unsigned short protyp;</p><p>  unsigned char

38、 hdsize;</p><p>  unsigned char prosize;</p><p>  unsigned short op;</p><p>  u_char smac[6];</p><p>  u_char sip[4];</p><p>  u_char dmac[6];</p>&

39、lt;p>  u_char dip[4];</p><p><b>  };</b></p><p>  void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out);</p><p>  void main(int argc,

40、char *argv[ ])</p><p><b>  {</b></p><p>  if(argc!=2)</p><p><b>  {</b></p><p>  cout<<"Usage:arpparse logfilename"<<endl;

41、</p><p>  cout<<"press any key to continue."<<endl;</p><p><b>  _getch();</b></p><p><b>  return;</b></p><p><b>  }&

42、lt;/b></p><p>  pcap_if_t *alldevs;</p><p>  pcap_if_t *d;</p><p>  pcap_t *adhandle;</p><p>  char errbuf[PCAP_ERRBUF_SIZE];</p><p>  u_int netmask;<

43、;/p><p>  char packet_filter[]="ether proto \\arp";</p><p>  struct bpf_program fcode;</p><p>  struct pcap_pkthdr *header;</p><p>  const u_char *pkt_data;</

44、p><p>  if(pcap_findalldevs(&alldevs,errbuf)==-1)</p><p><b>  {</b></p><p>  cout<<"Error in pcap_findalldevs:"<<errbuf;</p><p><b

45、>  return;</b></p><p><b>  }</b></p><p>  for(d=alldevs;d;d=d->next)</p><p><b>  { </b></p><p>  if((adhandle=pcap_open_live(d->n

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

47、<b>  return;</b></p><p><b>  }</b></p><p>  if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addressess!=NULL)</p><p><b>  break;</b></p&

48、gt;<p><b>  }</b></p><p>  if(d==NULL)</p><p><b>  {</b></p><p>  cout<<"\nNo interfaces found! Make sure Winpcap is installed.\n";<

49、;/p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //獲得子網掩碼</b></p><p>  netmask=((sockaddr_in *)(d->netmask))->sin_addr.s_un

50、.s_addr;</p><p>  //編譯過濾器,只捕獲ARP包</p><p>  if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)</p><p>  { cout<<"\nUnable to compile the packet filter.Ch

51、eck the syntax.\n";</p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //設置過濾器</b></p

52、><p>  if(pcap_setfilter(ashandle,&fcode)<0)</p><p>  { cout<<"\nError setting the filter.\n";</p><p>  pcap_freealldevs(alldevs);</p><p><b>

53、;  return;</b></p><p><b>  }</b></p><p>  cout<<"\t\tlistening on "<<d->description<<"..."<<endl<<endl;</p><p>

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

55、t);</b></p><p>  fout.seekp(0,ios::end);</p><p>  if(fout.tellp()!=0)</p><p>  fout<<endl;</p><p>  fout<<"\t\tARP request(1)/reply(2) on"&l

56、t;<ctime(&t);</p><p>  cout<<Sour Ip Addr"<<" "<<"Sour MAC Address"</p><p>  <<" "<<"Des Ip Addr"<<&quo

57、t; "<<"Des MAC Address"</p><p>  <<" "<<"OP"<<" "<<"Time"<<endl;</p><p>  fout<<Sour Ip Add

58、r"<<" "<<"Sour MAC Address"</p><p>  <<" "<<"Des Ip Addr"<<" "<<"Des MAC Address"</p><p>

59、;  <<" "<<"OP"<<" "<<"Time"<<endl;</p><p><b>  //釋放設備列表</b></p><p>  pcap_freealldevs(alldevs);</p>&

60、lt;p>  int result;</p><p>  while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0)</p><p><b>  { </b></p><p>  if(result==0)</p><p><

61、;b>  continue;</b></p><p>  packer_handler(header,pkt_data,cout);</p><p>  packet_handler(header,pkt_data,fout);</p><p><b>  }</b></p><p><b>

62、  }</b></p><p>  void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out)</p><p><b>  {</b></p><p>  arpkt* arph = (arppkt *)(pkt_dat

63、a +14);</p><p>  for(int i=0;i<3;i++)</p><p>  out<<int(arph->sip[i])<<'.';</p><p>  out.setf(ios::left);</p><p>  out<<setw(3)<<i

64、nt(arph->sip[3])<<" ";</p><p>  out.unsetf(ios::uppercase);</p><p>  for(i=0;i<5;i++)</p><p>  out<<hex<<setw(2)<<int(arph->smac[i])<&

65、lt;'-';</p><p>  out<<hex<<setw(2)<<int(arph->smac[5])<<" ";</p><p>  out.fill(oldfillchar);</p><p>  out.unsetf(ios::hex|ios::uppercas

66、e);</p><p>  for(i=0;i<3;i++)</p><p>  out<<int(arph->dip[3])<<'.';</p><p>  out.unsetf(ios::left);</p><p>  //輸出目的MAC地址</p><p> 

67、 out.fill('0');</p><p>  out.setf(ios::uppercase);</p><p>  for(i=0;i<5;i++)</p><p>  out<<hex<<setw(2)<<int(arph->dmac[i])<<'-';</p

68、><p>  out.fill(oldfillchar);</p><p>  out.unsetf(ios::hex|ios::uppercase);</p><p>  out<<ntohs(arph->op)<<" ";</p><p>  struct tm *ltime;</p

69、><p>  ltime=localtime(&header->ts.tv_sec);</p><p>  out.fill('0');</p><p>  out<<ltime->tm_hour<<':'<<setw(2)<<ltime->tm_min<&l

70、t;':'<<setw(2)<<ltime->tm_sec;</p><p>  out.fill(oldfillchar);</p><p>  out<<endl;</p><p><b>  }</b></p><p><b>  五、相關擴展&l

71、t;/b></p><p>  本課程設計還可以在Linux環(huán)境下用rawsocket完成。</p><p><b>  算法和代碼提示:</b></p><p>  調用socket()打開協(xié)議簇為PF_PACKET的原始套接字,這樣我們就可以收到數(shù)據(jù)鏈路幀:</p><p>  int fd = socket(

72、PF_PACKET,SOCK_RAM,htons(ETH_P_ALL));</p><p>  對打開的套接字調用ioct1(),將網卡設置為混雜模式,這樣我們就可以接受到局域網中所有的包(包括目的地址不是本機的幀):</p><p>  struct ifreq req;</p><p>  memset (&req,0,sizeof(req));<

73、/p><p>  strncpy(req.ifr_name,”eth0”,strlen(“eth0”)+1);</p><p>  ioctl(fd,SIOCGIFFLAS,&req);</p><p>  req.ifr_flags|=IFF_PROMISC; //設置為混雜模式</p><p>  icotl(fd, SI

74、OCGIFFLAGS,&req);</p><p>  利用recvfrom()接收包:</p><p>  recvform(fd,buffer,sizeof(buffer),0,(struct sockaddr *)&from,&from_len);</p><p>  接收到包后,判斷是否為ARP包,若是ARP包則進行處理,否則丟棄。&

75、lt;/p><p>  If( (ntohs(eth_header->ether_type)==0x0806)</p><p>  &&(ntohs(arp_header->ar_hrd)==0x0001)</p><p>  &&(ntohs(arp_header->ar_pro)==0x0800)</p>

76、<p>  &&(arp_header->ar_hln==0x06)</p><p>  &&(arp_header->ar_pln==0x04)</p><p>  &&( (ntohs(arp_header->ar_op)==0x01)||</p><p>  (ntohs(arp_

77、header->ar_op)==0x02)))</p><p><b>  {</b></p><p>  對ARP數(shù)據(jù)包進行分析并打印</p><p><b>  }</b></p><p>  算法在3、4步之間進行循環(huán),直到強行退出為止。</p><p><

78、b>  六、心得體會</b></p><p>  本次課程設計,完成了在xp環(huán)境下的解析ARP數(shù)據(jù)包。</p><p>  在具體實現(xiàn)獲取網絡中的ARP數(shù)據(jù)包解析數(shù)據(jù)包的內容,并將其寫入日志文件的過程中,是我更加清楚物理地址、IP地址的關聯(lián),源地址與目的地址的關系,以及二者對數(shù)據(jù)類型的格式要求。最重要的是通過這次的實際訓練讓我對ARP協(xié)議更加理解。</p>

79、<p>  本次課程設計查閱了大量的案例,學到了很多知識,使我對計算機網絡有了更深入的了解。我覺得這次課程設計我覺得收獲挺大的。之前的學習僅限于書本,網絡的很多東西都只知道其然而不知道其所以然。在這次課程設計中,也遇到了很多的難題,如:在開始查找資料并編寫程序時,需用到Wincap軟件,且要對它進行正確的安裝。把Wincap文件中的Include和Lib里的全部文件分別復制到安裝VC++的位置中的Include和Lib中。&l

80、t;/p><p>  課程設計是培養(yǎng)我們綜合運用所學知識,發(fā)現(xiàn)、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對我們實際工作能力的具體訓練和考察過程。隨著科學技術發(fā)展的日新月異,網絡已經成為當今計算機發(fā)展中空前活躍的領域,在生活中可以說是無處不在,因此作為二十一世紀的計算機專業(yè)的大學生來說掌握網絡組網技術是十分重要的。</p><p><b>  七、參考資料</b>

81、;</p><p>  謝希人著. 計算機網絡(第四版)大連理工大學出版社2003</p><p>  宋凱等著. 計算機網絡. 北京:清華大學出版社 2010</p><p>  吳功宜等著. 計算機網絡課程設計. 北京:機械工業(yè)出版社2005.9</p><p>  李愛華等著. 面向對象程序設計(C++語言). 北京:清華大學出版社20

溫馨提示

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

評論

0/150

提交評論