UDP校验和计算

原文链接

UDP的校验和需要计算UDP首部加数据荷载部分,但也需要加上UDP伪首部。
这个伪首部指,源地址、目的地址、UDP数据长度、协议类型(0x11),协议类型就一个字节,但需要补一个字节的0x0,构成12个字节。
伪首部+UDP首部+数据 一起计算校验和。
在抓包实验中,也发现过在Linux系统下UDP检验和仅计算在UDP首部的情况,没具体分析是否包含了伪首部,但是肯定没计算数据。在windows系统的接收端上用wireshark抓包,发现校验和是对的。

UDP检验和的计算方法是:
1.按每16位求和得出一个32位的数;
2.如果这个32位的数,高16位不为0,则高16位加低16位再得到一个32位的数;
3.重复第2步直到高16位为0,将低16位取反,得到校验和。

较难和的计算,帖个代码。自己组了个码流,同时也从抓包中把UDP的码流和伪首部直接写到数组里了,两个相互比较,只是为了做个验证。代码也就没有写得那么通用。
当然,要注意的是,算出来的这个校验和是主机序的,如果要跟抓包中的校验和相比较,转成网络序再对比。


#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>

typedef struct {
    int srcIp;
    int dstIp;
    short udp_len;
    char rsv;
    char protocol;
    unsigned short src_port;
    unsigned short dst_port;
    unsigned short len;
    unsigned short check_sum;
    char data[2];
} UDPHDR;

char arr[100] = {0xc0, 0xa8, 0xd1, 0x80, 0xc0, 0xa8, 0xd1, 0x01, 0x00, 0x0a, 0x00, 0x11, 0x13, 0x88, 0x13, 0x88, 0x00, 0x0a, 0x00, 0x00, 0x61, 0x66};

unsigned short check_sum(unsigned short *a, int len);

int main()
{
    short b = 0;
    UDPHDR udphdr = {0};

    udphdr.srcIp = inet_addr("192.168.209.128");
    udphdr.dstIp = inet_addr("192.168.209.1");
    udphdr.udp_len = htons(10);
    udphdr.protocol = 0x11;
    udphdr.rsv = 0;
    udphdr.src_port = htons(5000);
    udphdr.dst_port = htons(5000);
    udphdr.len = htons(10);
    udphdr.check_sum = 0;
    udphdr.data[0] = 0x61;
    udphdr.data[1] = 0x66;

    b = check_sum((short *)&udphdr, 22);
    printf("[test ...] b = %04x\n", b & 0xffff);

    b = check_sum((short *)arr, 22);
    printf("[test arr] b = %04x\n", b & 0xffff);

    return 0;
}

unsigned short check_sum(unsigned short *a, int len)
{
    unsigned int sum = 0;

    while (len > 1) {
        sum += *a++;
        len -= 2;
    }

    if (len) {
        sum += *(unsigned char *)a;
    }

    while (sum >> 16) {
        sum = (sum >> 16) + (sum & 0xffff);
    }

    return (unsigned short)(~sum);
}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP校验和计算工具是一种用于计算UDP数据报校验和的工具。UDP(用户数据报协议)是一种面向无连接的传输层协议,不像TCP那样提供可靠的数据传输,因此需要使用校验和来检测数据传输过程中的错误。 UDP校验和计算工具的主要功能是对UDP数据包进行校验和计算校验和是通过对数据包中各个字节进行加和操作,并取其反码得到的。在发送数据报之前,发送方会计算数据报的校验和,并将其添加到数据包的首部。当接收方接收到数据包时,会对接收到的数据包进行校验和计算,并与数据包中的校验和进行比较。如果两个校验和不一致,则说明数据包在传输过程中发生了错误。 计算UDP校验和的过程包括以下几个步骤: 1. 将UDP数据包中的数据划分成若干个16位的字块。 2. 对这些字块进行求和操作,将所有的字块相加,得到一个32位的和。 3. 将32位的和的高16位与低16位相加,直到最高位为0为止。 4. 取最终的和的反码作为校验和UDP校验和计算能够帮助检测数据包在传输过程中的传输错误,但并不能修复错误。因此,需要使用可靠的传输协议(如TCP)来保证数据的正确传输。UDP校验和计算工具作为一种辅助工具,可以帮助开发人员在开发和调试网络应用程序时,对UDP数据包进行校验和计算,提高数据传输的可靠性和正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值