计算机网络课程设计.docx
- 文档编号:5469888
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:18
- 大小:157.20KB
计算机网络课程设计.docx
《计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计
发送EthernetARP包
一、课程设计目的
IP地址将不同的物理地址统一起来,从而将物理地址隐藏起来,上层软件使用IP地址标识结点。
但是。
两台计算机只有在知道彼此的物理地址时才能进行通信。
IP数据包常通过Ethernet发送。
Ethernet设备并不识别32位IP地址,它们是以48位MAC地址传输Ethernet数据包的。
因此,IP驱动器必须把IP目的地址转换成Ethernet网络目的地址。
这两种地址之间存在着某种静态的或动态的映射,通常需要查看一张表来进行这种映射。
这种地址协议(ARP)就是用来确定这些映象的协议。
ARP工作时,送出一个所希望的IP地址的Ethernet广播数据包。
目的地主机以一个含有IP和Ethernet地址对的数据包作为应答。
发送者将这个地址对高速缓存起来,以节约不必要的ARP通信。
本课程设计的目的是进一步熟悉ARP协议的帧结构以及它的运行过程
二、课程设计要求
在熟悉ARP协议并了解Winpcap编程的前提下,构造ARP包,选择并打开网卡,将ARP包发送出去。
1)命令行格式:
arpsendsrc_ipsrc_macdst_macflag
其中arpsend作为程序名。
各参数意义:
src_ip:
源IP地址。
src_mac:
源MAC地址。
dst_ip:
目的IP地址。
dst_mac:
目的MAC地址。
Flag:
0表示ARP请求;1表示ARP应答。
三、课程设计相关知识
1.ARP协议概述
ARP,即地址解析协议,实现通过IP地址得知其物理地址。
在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。
为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。
这样就存在把IP地址变换成物理地址的地址转换问题。
以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。
这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。
2.ARP工作原理
我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。
当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。
如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:
“192.168.1.1的MAC地址是什么?
”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:
“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。
这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。
同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。
ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
3、ARP包的填充
将命令行的参数作适当的转换后填到ARP分组结构的各字段中即可。
要注意的是,填充请求包时。
因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充为任意值,因为它此时不起作用。
“填充数据”字段要填充为0
四、课程设计分析
1.程序流程
2.核心代码及说明
头文件:
#pragmaonce
//#include
#include
#include".\Iphlpapi.h"
#include".\IPRTRMIB.h"
#include".\IPTYPES.h"
#include".\IPEXPORT.h"
//#pragmacomment(lib,"Iphlpapi.lib")
#pragmacomment(lib,"ws2_32.lib")
#pragmacomment(lib,".\\wpdpack\\Iphlpapi.lib")
#defineMAX_ADAPTER10
#defineMAX_ARP20
//网卡信息
typedefstructAdapterInfo
{
charszDeviceName[128];//名字
charszIPAddrStr[16];//IP
charszHWAddrStr[18];//MAC
DWORDdwIndex;//编号
}INFO_ADAPTER,*PINFO_ADAPTER;
//ARP条目信息
typedefstructARPInfo
{
charszIPAddrStr[16];//IP
charszHWAddrStr[18];//MAC
DWORDdwType;//类型
}INFO_ARP,*PINFO_ARP;
classCSysInfo
{
public:
CSysInfo(void);
~CSysInfo(void);
staticvoidAddAdapInfoToList(CListCtrl&list);
staticvoidAddARPInfoToList(CListCtrl&list,constshortnAdpaterIndex);
inlinestaticchar*GetCurAdapterName(constshortnAdapterIndex)//返回对应网卡名字
{
returnAdapterList[nAdapterIndex].szDeviceName;
}
staticchar*GetCurAdapterMAC(constshortnAdapterIndex);//返回对应网卡MAC
inlinestaticchar*GetCurAdapterIP(constshortnAdapterIndex)//返回对应网卡IP
{
returnAdapterList[nAdapterIndex].szIPAddrStr;
}
staticvoidformatStrToMAC(constLPSTRlpHWAddrStr,unsignedchar*HWAddr);//用户输入的MAC地址字符串赋给数据包结构体
private:
staticINFO_ADAPTERAdapterList[MAX_ADAPTER];//网卡列表
staticINFO_ARPARPList[MAX_ARP];//ARP列表
staticvoidformatMACToStr(LPSTRlpHWAddrStr,constunsignedchar*HWAddr);
};
源代码:
#include"StdAfx.h"
#include"SysInfo.h"
INFO_ADAPTERCSysInfo:
:
AdapterList[MAX_ADAPTER];
INFO_ARPCSysInfo:
:
ARPList[MAX_ARP];
CSysInfo:
:
CSysInfo(void)
{
}
CSysInfo:
:
~CSysInfo(void)
{
}
voidCSysInfo:
:
AddAdapInfoToList(CListCtrl&list)//获得系统的网卡信息,并将其添加到list控件中
{
chartempChar;
ULONGuListSize=1;
PIP_ADAPTER_INFOpAdapter;//定义PIP_ADAPTER_INFO结构存储网卡信息
intnAdapterIndex=0;
DWORDdwRet=GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar,&uListSize);//关键函数,调用GetAdaptersInfo函数获取网络需求缓冲区信息,并存到uListSize中
if(dwRet==ERROR_BUFFER_OVERFLOW)//调用GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar,&uListSize)成功
{
PIP_ADAPTER_INFOpAdapterListBuffer=(PIP_ADAPTER_INFO)new(char[uListSize]);//给pAdapterInfo分配uListSize大小的内存空间
dwRet=GetAdaptersInfo(pAdapterListBuffer,&uListSize);//获取网络信息,并存储到pAdapterListBuffer
if(dwRet==ERROR_SUCCESS)//调用GetAdaptersInfo(pAdapterInfo,&uListSize)函数成功
{
pAdapter=pAdapterListBuffer;
while(pAdapter)//枚举网卡,然后将相关条目添加到List中
{
CStringstrTemp=pAdapter->AdapterName;//网卡名字
strTemp="\\Device\\NPF_"+strTemp;//加上前缀
list.InsertItem(nAdapterIndex,strTemp);
strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);
strcpy(AdapterList[nAdapterIndex].szIPAddrStr,pAdapter->IpAddressList.IpAddress.String);//IP
list.SetItemText(nAdapterIndex,1,AdapterList[nAdapterIndex].szIPAddrStr);
formatMACToStr(AdapterList[nAdapterIndex].szHWAddrStr,pAdapter->Address);//MAC
list.SetItemText(nAdapterIndex,2,AdapterList[nAdapterIndex].szHWAddrStr);
AdapterList[nAdapterIndex].dwIndex=pAdapter->Index;//编号
pAdapter=pAdapter->Next;
nAdapterIndex++;
}
deletepAdapterListBuffer;//释放缓冲区内存空间
}
}
}
voidCSysInfo:
:
AddARPInfoToList(CListCtrl&list,constshortnAdapterIndex)//读入系统的ARP缓存列表,并添加到对话框中
//用到了IpHelperapiGetIpNetTable而且用到了WinSock的api,所以要包含
{
chartempChar;
DWORDdwListSize=1;
DWORDdwRet;
in_addrinaddr;
list.DeleteAllItems();
dwRet=GetIpNetTable((PMIB_IPNETTABLE)&tempChar,&dwListSize,TRUE);//关键函数IPHelperAPIGetIpNetTable函数能够提取出本机上的所有ARP表项
if(dwRet==ERROR_INSUFFICIENT_BUFFER)
{
PMIB_IPNETTABLEpIpNetTable=(PMIB_IPNETTABLE)new(char[dwListSize]);//分配内存空间
dwRet=GetIpNetTable(pIpNetTable,&dwListSize,TRUE);
if(dwRet==ERROR_SUCCESS)
{
for(inti=0;i<(int)pIpNetTable->dwNumEntries;i++)//dwNumEntries为PMIB_IPNETTABLE结构体数组大小
{
inaddr.S_un.S_addr=pIpNetTable->table[i].dwAddr;//table[i]为PMIB_IPNETTABLE结构体数组本身
strcpy(ARPList[i].szIPAddrStr,inet_ntoa(inaddr));//IP
formatMACToStr(ARPList[i].szHWAddrStr,pIpNetTable->table[i].bPhysAddr);//MAC
ARPList[i].dwType=pIpNetTable->table[i].dwType;//Type
if(AdapterList[nAdapterIndex].dwIndex!
=pIpNetTable->table[i].dwIndex)
continue;
list.InsertItem(i,ARPList[i].szIPAddrStr);
list.SetItemText(i,1,ARPList[i].szHWAddrStr);
switch(ARPList[i].dwType){//根据type的值来转换成字符显示
case3:
list.SetItemText(i,2,"Dynamic");
break;
case4:
list.SetItemText(i,2,"Static");
break;
case1:
list.SetItemText(i,2,"Invalid");
default:
list.SetItemText(i,2,"Other");
}
}
}
deletepIpNetTable;
}
}
voidCSysInfo:
:
formatMACToStr(LPSTRlpHWAddrStr,constunsignedchar*HWAddr)//将用户输入的MAC地址字符转成相应格式
{
inti;
shorttemp;
charszStr[3];
strcpy(lpHWAddrStr,"");
for(i=0;i<6;++i)
{
temp=(short)(*(HWAddr+i));
_itoa(temp,szStr,16);
if(strlen(szStr)==1)strcat(lpHWAddrStr,"0");
strcat(lpHWAddrStr,szStr);
if(i<5)strcat(lpHWAddrStr,"-");//加上-
}
}
voidCSysInfo:
:
formatStrToMAC(constLPSTRlpHWAddrStr,unsignedchar*HWAddr)//将用户输入的MAC地址字符转成数据包结构体需要的格式
{
unsignedinti,index=0,value,temp;
unsignedcharc;
_strlwr(lpHWAddrStr);//转换成小写
for(i=0;i { c=*(lpHWAddrStr+i); if((c>='0'&&c<='9')||(c>='a'&&c<='f')) { if(c>='0'&&c<='9')temp=c-'0';//数字 if(c>='a'&&c<='f')temp=c-'a'+0xa;//字母,0xa表示字母的开始 if((index%2)==1) { value=value*0x10+temp; HWAddr[index/2]=value; } elsevalue=temp; index++; } if(index==12)break; } } char*CSysInfo: : GetCurAdapterMAC(constshortnAdapterIndex)//获取网卡MAC { staticcharchTemp[12]; intj=0; for(inti=0;i<18;i++)//去掉mac地址中间的横线 { if(AdapterList[nAdapterIndex].szHWAddrStr[i]! ='-') { chTemp[j]=AdapterList[nAdapterIndex].szHWAddrStr[i]; j++; } } returnchTemp; } 五、负责部分(ARP数据包的发送和应答) 1)ARP数据包的发送和应答运行过程 a)ARPtest运行界面: b)ARP发送数据包: c)ARP获取目的MAC地址: d)基于ARP欺骗的监听: 2)发送ARP包的编程实现: 填充数据包: 需要三个结构体,如下: //DLCHeader typedefstructDLCHeader { unsignedchar DesMAC[6]; /*destinationHWaddrress*/ unsignedchar SrcMAC[6]; /*sourceHWaddresss*/ unsignedshort Ethertype; /*ethernettype*/ }DLCHEADER,*PDLCHEADER; ARPFrame: //ARPFrame typedefstructARPFrame { unsignedshort HW_Type; /*hardwareaddress*/ unsignedshort Prot_Type; /*protocoladdress*/ unsignedchar HW_Addr_Len; /*lengthofhardwareaddress*/ unsignedchar Prot_Addr_Len; /*lengthofprotocoladdress*/ unsignedshort Opcode; /*ARP/RARP*/ unsignedchar Send_HW_Addr[6]; /*senderhardwareaddress*/ unsignedlong Send_Prot_Addr; /*senderprotocoladdress*/ unsignedchar Targ_HW_Addr[6]; /*targethardwareaddress*/ unsignedlong Targ_Prot_Addr; /*targetprotocoladdress*/ unsignedchar padding[18]; }ARPFRAME,*PARPFRAME; //ARPPacket=DLCheader+ARPFrame typedefstructARPPacket { DLCHEADER dlcHeader; ARPFRAME arpFrame; }ARPPACKET,*PARPPACKET; ARP发送用到的函数: voidformatARPPacket(char*srcDLC,char*desDLC,char*srcMAC,char*srcIP,char*desMAC,char*desIP,intarpType); voidSendARPPacket(shortnAdpaterIndex); formatARPPacket •voidCSender: : formatARPPacket(char*srcDLC,char*desDLC,char*srcMAC,char*srcIPchar*desMAC,char*desIP,intarpType) •{ •memset(&ARPPacket,0,sizeof(ARPPACKET));//数据包初始化为0 • •//DLC帧头 •CSysInfo: : formatStrToMAC(srcDLC,ARPPacket.dlcHeader.SrcMAC); •CSysInfo: : formatStrToMAC(desDLC,ARPPacket.dlcHeader.DesMAC); • •//源地址 CSysInfo: : formatStrToMAC(srcMAC,ARPPacket.arpFrame.Send_HW_Addr); •ARPPacket.arpFrame.Send_Prot_Addr=inet_addr(srcIP); •//目的地址 •CSysInfo: : formatStrToMAC(desMAC,ARPPacket.arpFrame.Targ_HW_Addr); •ARPPacket.arpFrame.Targ_Prot_Addr=inet_addr(desIP); •/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计