IP头结构中的checksum

转载请注明原文链接,http://www.cnblogs.com/flyingcloude/p/6992326.html

对于IP头结构中checksum,一开始以为是通过CRC计算出来的,在TCP/IP协议中没有谈到有关这方面的知识。查资料之后,发现在RFC791里有说明。

计算45 00 00 1c 00 0b 00 00 80 01 (b7 53这个不要) c0 a8 01 17 c0 a8 01 1b

#include <stdio.h>

/*
 *函数名称:check_sum
 *    传入参数:unsigned char *ptr,指向需要计算checksum的unsigned char数组;
 *              int size,数组的长度,传入的数组的长度必须为偶数
 *    返回:返回一个unsigned short的值 
 */
unsigned short check_sum(unsigned char *ptr, int size)
{
    if(size % 2 != 0)
    {
        return 0;
    }
    int cksum = 0;
    
    int index = 0;
    while(index < size)
    {        
        cksum += *(ptr + index + 1);
        cksum += *(ptr + index) << 8; 
        
        index += 2;
    }
     
    while(cksum > 0xffff)
    {
        cksum = (cksum >> 16) + (cksum & 0xffff);
    }
    return ~cksum;
}

int main()
{
    unsigned char ptr[] = {0x45, 0x00, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x00, 0x80, 0x01,
                           0xc0, 0xa8, 0x01, 0x17, 0xc0, 0xa8, 0x01, 0x1b};
    
    printf("%x\n", check_sum(ptr, 18));
    
    system("pause");
    return 0;
}

计算得到b753

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992326.html

时间: 2024-09-30 10:52:44

IP头结构中的checksum的相关文章

python使用原始套接字 解析原始ip头数据

使用底层套接字解码底层流量,是这次做的重点工作. 首先来捕获第一个包 # coding:utf-8import socket # 监听的主机IP host = "192.168.1.100" socket_protocol = socket.IPPROTO_ICMP sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) sniffer.bind((host, 0)) sniffer.setso

IP头,TCP头,UDP头,MAC帧头定义

一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6];    //目的mac地址 char m_cSrcMacAddress[6];    //源mac地址 short m_cType;        //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp }__attribute__((packed))MAC_FRAME_HEADER,*PM

报文分析2、IP头的结构

IP头的结构 版本(4位) 头长度(4位) 服务类型(8位) 封包总长度(16位) 封包标识(16位) 标志(3位) 片断偏移地址(13位) 存活时间(8位) 协议(8位) 校验和(16位) 来源IP地址(32位) 目的IP地址(32位) 选项(可选) 填充(可选) 数据 (1)字节和数字的存储顺序是从右到左,依次是从低位到高位,而网络存储顺序是从左到右,依次从低位到高位. (2)版本:占第一个字节的高四位.头长度:占第一个字节的低四位. (3)服务类型:前3位为优先字段权,现在已经被忽略.接着

伪造ip头

x-forwarded-for: 127.0.0.1x-remote-IP: 127.0.0.1x-remote-ip: 127.0.0.1x-client-ip: 127.0.0.1x-client-IP: 127.0.0.1X-Real-IP: 127.0.0.1client-IP:127.0.0.1x-originating-IP:127.0.0.1x-remote-addr:127.0.0.1 原文地址:https://www.cnblogs.com/mrhonest/p/1031392

linux内核中ip,tcp等头的定义(转)

一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/typedef struct _MAC_FRAME_HEADER{ char m_cDstMacAddress[6];    //目的mac地址 char m_cSrcMacAddress[6];    //源mac地址 short m_cType;        //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp}__attribute__((packed))MAC_FRAME_HEADER,*PMAC_

《TCP/IP详解卷2:实现》笔记--IP:网际协议

本章介绍IP分组的结构和基本的IP处理过程,包括输入,转发和输出.下图显示了IP层常见的组织形式. 在之前的文章中,我们看到了网络接口如何把到达的IP分组放到IP输入队列ipintrq中去,并如何调用一个软件中断,如下图所示: 因为硬件中断的优先级比软件中断的要高,所以在发生一次软件中断之前,有的分组可能会被放到队列中.在软件中断中,ipintr 函数不断从ipintrq中移走和处理分组,直到对垒为空.在最终的目的地,IP把分组重装为数据包,并通过函数调用把该数据包直接 传给适当的运输层协议.如

《TCP/IP具体解释卷2:实现》笔记--IP:网际协议

本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调用一个软件中断,例如以下图所看到的: 由于硬件中断的优先级比软件中断的要高,所以在发生一次软件中断之前.有的分组可能会被放到队列中.在软件中断中,ipintr 函数不断从ipintrq中移走和处理分组,直到对垒为空.在终于的目的地,IP把分组重装为数据包,并通过函数调用把该数据包直接 传给适当的运输

计算数IP据报的校验和

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤: (1)把IP数据报的首部都置为0,包括校验和字段. (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和. (3)把得到的结果存入校验和字段中. 在接收数据时,计算数据报的校验和相对简单,按如下步骤: (1)当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2.3步,然后判断取反的结果是否为0,是则正确,否则有错. 1.发送方 i

TCP/IP协议,HTTP协议

1. 协议  a. TCP/IP总体构架概述     TCP/IP协议并不全然符合OSI的七层參考模型.传统的开放式系统互连參考模型,是一种通信协议的7层抽象的參考模型,当中每一层运行某一特定任务.该模型的目的是使各种硬件在同样的层次上相互通信.这7层是:物理层.数据链路层.网路层.传输层.话路层.表示层和应用层.而TCP/IP通讯协议採用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完毕自己的需求.这4层分别为:     i.   应用层:应用程序间沟通的层,如超文本传送协议(HTTP