• 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
    ...
    ........本文的内容收集与网络········算是东凑西凑的,也不知道作者是谁?把自己要的都收集来了所以作者看到·····别怪啦····
  • 相关阅读:
    bzoj 2213: [Poi2011]Difference
    51nod 1079 中国剩余定理
    51nod 1074 约瑟夫环 V2
    SpringBoot:第二篇 集成mybatis
    SpringBoot:第二篇 集成日志lombok
    SpringBoot:第一篇 新建spring boot 应用
    JVM常用内存参数配置
    深入研究Java GC
    应用性能监控分析
    Java -- 深入浅出GC自动回收机制
  • 原文地址:https://www.cnblogs.com/scrat/p/2620163.html
Copyright © 2020-2023  润新知