分享

UDP 头校验算法

 clhon 2012-05-11

UDP校验方法:
UDP的CHECKSUM算法与IP包的HEADER CHECKSUM的计算方法基本一样,只是取样数据不同。
UDP中,参与计算CHEKCSUM的数据包括三部分: 亚头部+UDP头部+数据部分
亚头部包括:4byte源IP地址 + 4byte目的IP地址 + 0x00 + 1byte协议 + UDP长度(2byte)
UDP包头:2byte源端口+2byte目的端口+2byteUDP包长+0x0000(checksum)
数据部分

计算方法,以2字节为一个单位,将其顺序相加,就会产生2个字节的SUM,如果超过2字节,则将高位的值再加回低位,然后取补,得到的就是UDP的checksum
{
    #define UDP_ALEN 4
    struct udphdr *pUdphdr = (struct udphdr *)((char *)pIp + TTPS_IP_HEAD_LEN);
   
    WORD* pUs = NULL;
    DWORD ulCheckSum = 0;
    int   iLen = 0;
    int   i = 0;
 
    iLen = ntohs(pUdphdr->uh_ulen);

    ulCheckSum = 0;
    pUs = (unsigned short *)&pIp->ip_src;

    for (i=0; i<UDP_ALEN; ++i)
        ulCheckSum += *pUs++;

    pUs = (unsigned short *)pUdphdr;
    ulCheckSum += htonl(IPPROTO_UDP + iLen);         /* 17, UDP protocol */

    while (iLen > 1)
    {
        ulCheckSum += *pUs++;
        iLen -=2;
    }
   
    if (iLen > 0)
    {
        ulCheckSum += * (unsigned char *) pUs;
    }

    /* Fold 32-bit sum to 16 bits */
    ulCheckSum = (ulCheckSum >> 16) + (ulCheckSum & 0xffff);
    ulCheckSum += (ulCheckSum >> 16);

    return (unsigned short)(~ulCheckSum);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多