西工大计算机网络实验四Word下载.docx

上传人:b****6 文档编号:18054109 上传时间:2022-12-13 格式:DOCX 页数:13 大小:98.96KB
下载 相关 举报
西工大计算机网络实验四Word下载.docx_第1页
第1页 / 共13页
西工大计算机网络实验四Word下载.docx_第2页
第2页 / 共13页
西工大计算机网络实验四Word下载.docx_第3页
第3页 / 共13页
西工大计算机网络实验四Word下载.docx_第4页
第4页 / 共13页
西工大计算机网络实验四Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

西工大计算机网络实验四Word下载.docx

《西工大计算机网络实验四Word下载.docx》由会员分享,可在线阅读,更多相关《西工大计算机网络实验四Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

西工大计算机网络实验四Word下载.docx

绑定网卡后,需要WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有网络数据,如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收到的数据就拷贝到套接字中。

因此,网卡就可以接收所有经过的IP包。

2)接收数据包

在程序中可使用RECV()函数接收经过的IP包。

该函数有四个参数,第一个参数接收操作所用的套接字描述符;

第二个参数接收到缓冲区的地址;

第二个参数接收缓冲区的地址;

第三个参数接收缓冲区的大小,也就是所要接收的字节数;

第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。

因为IP数据包的最大长度是65536B,因此缓冲区的大小不能小于65535B。

设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数接收。

然后定义IP头部的数据结构。

程序需要定义一个数据结构表示IP头部这时我们只考虑IP头部结构,不考虑数据部分。

在捕获IP数据包后,可以通过指针把缓冲区的内容强制转化为IP_HEADER数据结构。

3)解析IP数据包

解析IP数据包的字段有两种策略。

针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP_HEADER的成员指教获取。

要解析长度不是9位倍数的字段(或子字段)时,可以利用C语言中的位移以及及、或操作完成。

下面给出了通过IP_HEADER解析IP头各个字段的代码。

(3)IP源代码

#include"

winsock2.h"

ws2tcpip.h"

iostream"

stdio.h"

#pragmacomment(lib,"

ws2_32.lib"

usingnamespacestd;

staticconstintNumOfData=8;

typedefstruct_IP_HEADER

{

union

{

BYTEVersion;

//版本

BYTEHdrLen;

//IHL

};

BYTEServiceType;

//服务类型

WORDTotalLen;

//总长

WORDID;

//标识

WORDFlags;

//标志

WORDFragOff;

//分段偏移

BYTETimeToLive;

//生命期

BYTEProtocol;

//协议

WORDHdrChksum;

//头校验和

DWORDSrcAddr;

//源地址

DWORDDstAddr;

//目的地址

BYTEOptions;

//选项

DWORDData[NumOfData];

}IP_HEADER;

//逐位解析IP头中的信息

voidgetVersion(BYTEb,BYTE&

version)

{

version=b>

>

4;

}

voidgetIHL(BYTEb,BYTE&

result)

result=(b&

0x0f)*4;

char*parseServiceType_getProcedence(BYTEb)

switch(b>

5)

case7:

return"

NetworkControl"

;

break;

case6:

InternetworkControl"

case5:

CRITIC/ECP"

case4:

FlashOverride"

case3:

Flash"

case2:

Immediate"

case1:

Priority"

case0:

Routine"

default:

Unknown"

}

char*parseServiceType_getTOS(BYTEb)

b=(b>

1)&

0x0f;

switch(b)

Normalservice"

Minimizemonetarycost"

Maximizereliability"

Maximizethroughput"

case8:

Minimizedelay"

case15:

Maximizesecurity"

voidgetFlags(WORDw,BYTE&

DF,BYTE&

MF)

DF=(w>

14)&

0x01;

MF=(w>

13)&

voidgetFragOff(WORDw,WORD&

fragOff)

fragOff=w&

0x1fff;

char*getProtocol(BYTEProtocol)

switch(Protocol)

ICMP"

IGMP"

IPinIP"

TCP"

BGP"

case17:

UDP"

case41:

RSVP"

case89:

OSPF"

UNKNOWN"

voidipparse(FILE**buffer)

intk,j;

IP_HEADERip=*(IP_HEADER*)buffer;

fseek();

for(k=0;

k<

5;

k++)

for(j=0;

j<

20;

j++)

{

fprintf(file,"

%x%x"

((unsignedchar)buffer[20*k+j])>

4,(buffer[20*k+j]&

0x0f));

}

fprintf(file,"

\n"

);

//解析版本信息

BYTEversion;

getVersion(ip.Version,version);

fprintf(file,"

版本=%d\r\n"

version);

//解析IP长度

BYTEheaderLen;

getIHL(ip.HdrLen,headerLen);

头长度=%d(BYTE)\r\n"

headerLen);

//解析服务类型

服务类型=%s,%s\r\n"

parseServiceType_getProcedence(ip.ServiceType),

parseServiceType_getTOS(ip.ServiceType));

//解析数据包长度

数据报长度=%d(BYTE)\r\n"

ip.TotalLen);

//解析数据包ID

数据报ID=%d\r\n"

ip.ID);

//解析标志位

BYTEDF,MF;

getFlags(ip.Flags,DF,MF);

分段标志DF=%d,MF=%d\r\n"

DF,MF);

//解析分段偏移

WORDfragOff;

getFragOff(ip.FragOff,fragOff);

分段偏移值=%d\rn"

fragOff);

//解析生存期

生存期=%d\r\n"

ip.TimeToLive);

//解析协议

协议=%s\r\n"

getProtocol(ip.Protocol));

//解析头校验和

头校验和=0x%0x\r\n"

ip.HdrChksum);

//解析IP地址

源IP地址=%s\r\n"

inet_ntoa(*(in_addr*)&

ip.DstAddr));

//解析目的IP地址

目的IP地址=%s\r\n"

//解析数据包前32字节

for(inti=0;

i<

NumOfData;

++i)

数据报第%d字节:

%x\r\n"

4*i,ip.Data[i]);

--------------------------------------------------\r\n"

intmain(intargc,char*argv[])

if(argc!

=2)

printf("

usageerror!

return-1;

FILE*file;

if(((argv[1],"

wb+"

))==NULL)

failtoopen"

argv[1]);

WSADATAwsData;

//初始化失败,程序退出

if(WSAStartup(MAKEWORD(2,2),&

wsData)!

=0)

WSAStartupfailed\n"

SOCKETsock;

//建立原始socket

if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)

createsocketfailed!

BOOLflag=TRUE;

//设置IP头操作选项,其中flag设置为true,用户可以亲自对IP头进行处理

if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&

flag,sizeof(flag))==SOCKET_ERROR)

setsockoptfailed!

charhostName[128];

if(gethostname(hostName,100)==SOCKET_ERROR)

gethostnamefailed\n"

//获取本地IP地址

hostent*pHostIP;

if((pHostIP=gethostbyname(hostName))==NULL)

gethostbynamefailed\n"

//地充SOCKADDR_IN结构

sockaddr_inaddr_in;

addr_in.sin_addr=*(in_addr*)pHostIP->

h_addr_list[0];

addr_in.sin_family=AF_INET;

addr_in.sin_port=htons(6000);

//把原始socket绑定到本地网卡上

if(bind(sock,(PSOCKADDR)&

addr_in,sizeof(addr_in))==SOCKET_ERROR)

bindfailed"

DWORDdwValue=1;

//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包

#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)

DWORDdwBufferLen[10];

DWORDdwBufferInLen=1;

DWORDdwBytesReturned=0;

if(WSAIoctl(sock,IO_RCVALL,&

dwBufferInLen,sizeof(dwBufferInLen),&

dwBufferLen,sizeof(dwBufferLen),&

dwBytesReturned,NULL,NULL)==SOCKET_ERROR)

ioctlsocketfailed\n"

cout<

<

GetLastError()<

endl;

//设置接收数据包的缓冲区长度

#defineBUFFER_SIZE65535

charbuffer[BUFFER_SIZE];

//监听网卡

开始解析经过本机的IP数据包\n"

while(true)

intsize=recv(sock,buffer,BUFFER_SIZE,0);

if(size>

0)

ipparse(stdout,buffer);

ipparse();

}

fclose(file);

return0;

(4)实验结果及分析

将IP分组按16进制形式输出:

IP数据报分析:

版本为4,“45”中的“4”,占4位;

头部长度为20字节,“45”中的“5”是包头长度为5行,即5个32位,5*32=20*8,故包头长度有20个字节;

服务类型为正常服务,占8位,依据“00”,用来获得更好的服务;

总长度为10240字节,“0028”,2*16*16*16+8*16*16=10240,指的是首部和数据之和的长度,此字段占16位;

标识ID=3972,依据“840f”,0*16*16*16+f*16*16+8*16+4=3972此字段占16位,;

分段标志DF=0,MF=0,依据“4”,表示数据包可以分片,并且是最后一个分片;

分段偏移,此分片在整个数据包的相对位置;

生存时间12864,依据“80”,占8位;

上层协议类型,TCP协议,占8位,依据“06”“0”表示IP协议,“6”表示TCP协议;

头部校验和,0x19e5,依据“e5”,这个数值主要用来检错用的用以确保封包被正确无误的接收到,该字段占16位;

源IP地址,“192.168.8.75”,依据“c0a8084b”,c*16=192,a*16+8=168,0*16+8=8,4*16+b=75,该字段占32位;

目的IP地址,“192.168.8.75”,依据“c0a8084b”,c*16=192,a*16+8=168,0*16+8=8,4*16+b=75,该字段占32位。

三、实验中遇到的问题:

由于对IP分组的抓包不熟悉,导致实验一直失败,同时,由于对IP数据报的组成不是非常了解,导致我在分析截获的数据报时不知从何下手,最后在同学们的帮助下才解决问题,完成实验。

四、心得体会

在此次实验中,重要的是要了解IP数据报的组成,才能分析截获的数据包,最后得出结论。

而在修改代码的部分则需要充分地查找相关资料,才能得到正确有效的代码。

通过本次实验,学习了如何解析IP数据包,从而更加深刻的了解到了IP数据包的结构及IP协议的相关问题,对IP层的工作原理有更好的理解和认识。

同时,希望老师以后再进行此类实验时,能够和我们先讲一下原理和实验的基本过程和步骤,这样更方便我们在实验时能顺利进行实验,不至于一头雾水,不知从何下手。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1