您的位置:首页 > 其它

IP报文及ICMP报文结构原理

2012-08-02 16:00 127 查看
在一个不可以称之为学校的学校上学,没啥项目可练手,也没老师指导,只能自己给自己找点事情做了,目前打算写个扫描器,现在也在恶补网络知识中(虽然以前学过点,但是不够用啊······呵呵····)

IP报头结构:

//定义IP首部

typedef struct _iphdr{

unsigned char h_lenver; //4 位IP版本号+4位首部长度

unsigned char tos; //8位服务类型TOS

unsigned short total_len; //16位IP包总长度(字节)

unsigned short ident; //1 6位标识, 用于辅助IP包的拆装

unsigned short frag_and_flags; //3位标志位+13位偏移位, 也是用于IP包的拆装

unsigned char ttl; //8位IP包生存时间 TTL

unsigned char proto; //8位协议 (TCP, UDP 或其他)

unsigned short checksum; //16位IP首部校验和,最初置零,等所有包头都填写正确后,计算并替换.

unsigned int sourceIP; //32位源IP地址

unsigned int destIP; //32位目的IP地址

}IP_HEADER;

在给张图片看下ip报头的结构:



计算校验和的经典函数:

SHORT checksum(USHORT* buffer, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff);
cksum += (cksum>>16);
return (USHORT)(~cksum);}

ICMP报头结构:

//定义ICMP首部
typedef struct _icmphdr{
unsigned char i_type; //8位类型
unsigned char i_code; //8位代码
unsigned short i_cksum; //16位校验和, 从TYPE开始,直到最后一位用户数据,如果为字节数为奇数则补充一位
unsigned short i_id ; //识别号(一般用进程号作为识别号), 用于匹配ECHO和ECHO REPLY包
unsigned short i_seq ; //报文序列号, 用于标记ECHO报文顺序
unsigned int timestamp; //时间戳
}ICMP_HEADER;

在上一张图看看:



ICMP报文的各种状态:

目的不可达报文

类型:3代码:0至15检验和
未使用(全0)
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节
源端抑制报文

类型:4代码:0检验和
未使用(全0)
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节
超时报文

类型:11代码:0或1检验和
未使用(全0)
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节
参数问题

类型:12代码:0或1检验和
指针未使用(全0)
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节
改变路由

类型:5代码:0到3检验和
目标路由器IP地址
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节
回送请求和回答

类型:8或0代码:0检验和
标识符序号
由请求报文发送;由回答报文重复
时间戳请求和回答

类型:13或14代码:0检验和
标识符序号
原始时间戳
接收时间戳
发送时间戳
地址掩码请求和回答

类型:17或18代码:0检验和
标识符序号
地址掩码
路由询问和通告

类型:10代码:0检验和
标识符序号
类型:9代码:0检验和
地址数地址项目长度寿命
路由器地址1
地址参考1
路由器地址2
地址参考2
...
........本文的内容收集与网络········算是东凑西凑的,也不知道作者是谁?把自己要的都收集来了所以作者看到·····别怪啦····
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: