IP报文及ICMP报文结构原理

 

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

 

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
...

 

 

........本文的内容收集与网络········算是东凑西凑的,也不知道作者是谁?把自己要的都收集来了所以作者看到·····别怪啦····

 

转载于:https://www.cnblogs.com/scrat/archive/2012/08/02/2620163.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值