实 验 报 告
实验四解析IP分组
实验目
1IP分组网络层传输基单元通接受解析IP分组解IP分组基结构IP协议基功
2输出TCP报文数16进制输出建立TCP连接分析TCP三次握手
二实验程
(1)实验流程
(2)实验原理:
想抓取网络中IP数包必须网卡进行编程套接字(socket)进行编程通常情况网络通信套接字程序响应硬件址相匹配数包广播形式出发数包形式数包已达网络接口发送址数包网络接口验证投递址非身址引起响应说应程序法收取关数包想获取流网络设备数包需网卡设置混杂模式
程序三部分构成:初始化原始套接字反复监听捕获数包解析数包
1)原始套接字
套接字分三种流套接字(Stream Socket)数报套接字(Datagram Socket)原始套接字(Raw Socket)进行IP数包接受发送应原始套接字
WSASoccet函数中第参数指定通信发生区字段AF_INET针Internet允许远程机间通信第二参数套接字类型AF_INET址族SOCK_STREAMSOCK_DGRAMSOCK_RAW三种套接字类型里设置SOCK_RAW表示声明原始套接字类型第三参数赖第二参数指定套接字特定协议里IP协议第四参数WSAPROTOCOL_INFO位该位置空永远置0第六参数标志位WSA_FLAG_OVERRLAPPED表明发送接收超时设置课程设计标志位设置NULL设计考虑超时情况
创建原始套接字IP头会包含接收数中然设置IP头操作选项调sotscockpot函数中flag设置TRUE设定IP_HDRINCL选项表明户亲IP头进行处理完成socket初始化工作
填写sockaddr_in容时址值应填写机IP址通gethostbyname()函数获取端口号便填写系统突协议族应填写AF_INET注意sockaddr_in 结构值必须网络字节序表示值直接机字节序值htoms()函数符号短整型机数转换网络字节序数bind()函数socket绑定网卡
绑定网卡需WSAIoctl()函数网卡设置混杂模式网卡够接收网络数果接收数包中协议类型定义原始套接字匹配接收数拷贝套接字中网卡接收IP包
2)接收数包
程序中RECV()函数接收IP包该函数四参数第参数接收操作套接字描述符第二参数接收缓区址第二参数接收缓区址第三参数接收缓区接收字节数第四参数附加标志果发送数没特殊求直接设0IP数包长度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 winsock2h
#include ws2tcpiph
#include iostream
#include stdioh
#pragma comment(libws2_32lib)
using namespace std
static const int NumOfData 8
typedef struct _IP_HEADER
{
union
{
BYTE Version版
BYTE HdrLenIHL
}
BYTE ServiceType服务类型
WORD TotalLen总长
WORD ID标识
union
{
WORD Flags标志
WORD FragOff分段偏移
}
BYTE TimeToLive生命期
BYTE Protocol协议
WORD HdrChksum头校验
DWORD SrcAddr源址
DWORD DstAddr目址
BYTE Options选项
DWORD Data[NumOfData]
}IP_HEADER
逐位解析IP头中信息
void getVersion(BYTE bBYTE &version)
{
versionb>>4
}
void getIHL(BYTE bBYTE &result)
{
result(b & 0x0f)*4
}
char *parseServiceType_getProcedence(BYTE b)
{
switch(b>>5)
{
case 7
return Network Control
break
case 6
return Internet work Control
break
case 5
return CRITICECP
break
case 4
return Flash Override
break
case 3
return Flash
break
case 2
return Immediate
break
case 1
return Priority
break
case 0
return Routine
break
default
return Unknown
}
}
char *parseServiceType_getTOS(BYTE b)
{
b(b>>1)&0x0f
switch(b)
{
case 0
return Normal service
break
case 1
return Minimize monetary cost
break
case 2
return Maximize reliability
break
case 4
return Maximize throughput
break
case 8
return Minimize delay
break
case 15
return Maximize security
break
default
return Unknown
}
}
void getFlags(WORD wBYTE &DFBYTE &MF)
{
DF(w>>14)&0x01
MF(w>>13)&0x01
}
void getFragOff(WORD wWORD &fragOff)
{
fragOffw&0x1fff
}
char *getProtocol(BYTE Protocol)
{
switch(Protocol)
{
case 1
return ICMP
case 2
return IGMP
case 4
return IP in IP
case 6
return TCP
case 8
return BGP
case 17
return UDP
case 41
return RSVP
case 89
return OSPF
default
return UNKNOWN
}
}
void ipparse(FILE *filechar *buffer)
{
int kj
IP_HEADER ip*(IP_HEADER *)buffer
fseek(file0SEEK_END)
for(k0k<5k++)
{
for(j0j<20j++)
{
fprintf(filexx ((unsigned char)buffer[20*k+j])>>4(buffer[20*k+j]&0x0f))
}
fprintf(file\n)
}
解析版信息
BYTE version
getVersion(ipVersionversion)
fprintf(file版d\r\nversion)
解析IP长度
BYTE headerLen
getIHL(ipHdrLenheaderLen)
fprintf(file头长度d(BYTE)\r\nheaderLen)
解析服务类型
fprintf(file服务类型ss\r\nparseServiceType_getProcedence(ipServiceType)
parseServiceType_getTOS(ipServiceType))
解析数包长度
fprintf(file数报长度d(BYTE)\r\nipTotalLen)
解析数包ID
fprintf(file数报IDd\r\nipID)
解析标志位
BYTE DFMF
getFlags(ipFlagsDFMF)
fprintf(file分段标志DFdMFd\r\nDFMF)
解析分段偏移
WORD fragOff
getFragOff(ipFragOfffragOff)
fprintf(file分段偏移值d\rnfragOff)
解析生存期
fprintf(file生存期d\r\nipTimeToLive)
解析协议
fprintf(file协议s\r\ngetProtocol(ipProtocol))
解析头校验
fprintf(file头校验0x0x\r\nipHdrChksum)
解析IP址
fprintf(file源IP址s\r\ninet_ntoa(*(in_addr *)&ipDstAddr))
解析目IP址
fprintf(file目IP址s\r\ninet_ntoa(*(in_addr *)&ipDstAddr))
解析数包前32字节
for (int i 0 i < NumOfData ++i)
{
fprintf(file数报第d字节x\r\n4 * iipData[i])
}
fprintf(file\r\n)
}
int main(int argcchar *argv[])
{
if(argc2)
{
printf(usage error\n)
return 1
}
FILE *file
if((filefopen(argv[1]wb+))NULL)
{
printf(fail to open file sargv[1])
return 1
}
WSADATA wsData
初始化失败程序退出
if(WSAStartup(MAKEWORD( 2 2 )&wsData)0)
{
printf(WSAStartup failed\n)
return 1
}
SOCKET sock建立原始socket
if((socksocket(AF_INETSOCK_RAWIPPROTO_IP))INVALID_SOCKET )
{
printf(create socket failed\n)
return 1
}
BOOL flagTRUE
设置IP头操作选项中flag设置true户亲IP头进行处理
if(setsockopt(sockIPPROTO_IPIP_HDRINCL(char *)&flagsizeof(flag))SOCKET_ERROR)
{
printf(setsockopt failed\n)
return 1
}
char hostName[128]
if(gethostname(hostName100)SOCKET_ERROR)
{
printf(gethostname failed\n)
return 1
}
获取IP址
hostent *pHostIP
if((pHostIPgethostbyname(hostName))NULL)
{
printf(gethostbyname failed\n)
return 1
}
充SOCKADDR_IN结构
sockaddr_in addr_in
addr_insin_addr*(in_addr *)pHostIP>h_addr_list[0]
addr_insin_familyAF_INET
addr_insin_porthtons(6000)
原始socket绑定网卡
if(bind(sock(PSOCKADDR)&addr_insizeof(addr_in))SOCKET_ERROR)
{
printf(bind failed)
return 1
}
DWORD dwValue1
设置SOCK_RAWSIO_RCVALL便接收IP包
#define IO_RCVALL _WSAIOW(IOC_VENDOR1)
DWORD dwBufferLen[10]
DWORD dwBufferInLen1
DWORD dwBytesReturned0
if(WSAIoctl(sockIO_RCVALL&dwBufferInLensizeof(dwBufferInLen)&dwBufferLensizeof(dwBufferLen)&dwBytesReturnedNULLNULL)SOCKET_ERROR)
{
printf(ioctlsocket failed\n)
cout<
}
设置接收数包缓区长度
#define BUFFER_SIZE 65535
char buffer[BUFFER_SIZE]
监听网卡
printf(开始解析机IP数包\n)
while(true)
{
int sizerecv(sockbufferBUFFER_SIZE0)
if(size>0)
{
ipparse(stdoutbuffer)
ipparse(filebuffer)
}
}
fclose(file)
return 0
}
(4)实验结果分析
IP分组16进制形式输出:
IP数报分析:
版445中4占4位
头部长度20字节45中5包头长度5行532 位5*3220*8包头长度20字节
服务类型正常服务占8位00获更服务
总长度10240字节00 282*16*16*16+8*16*1610240指首部数长度字段占16位
标识ID397284 0f0*16*16*16+f*16*16+8*16+43972字段占16位
分段标志DF0MF04表示数包分片分片
分段偏移分片整数包相位置
生存时间1286480占8位
层协议类型TCP协议占8位06 0表示IP协议6表示TCP协议
头部校验0x19e5e5数值检错确保封包正确误接收该字段占16位
源IP址192168875c0 a8 08 4bc*16192 a*16+8168 0*16+88 4*16+b75该字段占32位
目IP址192168875c0 a8 08 4bc*16192 a*16+8168 0*16+88 4*16+b75该字段占32位
三实验中遇问题:
IP分组抓包熟悉导致实验直失败时IP数报组成非常解导致分析截获数报时知手学帮助解决问题完成实验
四心体会
次实验中重解IP数报组成分析截获数包出结修改代码部分需充分查找相关资料正确效代码
通次实验学解析IP数包更加深刻解IP数包结构IP协议相关问题IP层工作原理更理解认识
时希老师进行类实验时够先讲原理实验基程步骤样更方便实验时利进行实验头雾水知手
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档