免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1756 | 回复: 3
打印 上一主题 下一主题

[C] 网络编程遇到的问题:tcp校验码 [复制链接]

论坛徽章:
1
天蝎座
日期:2015-03-09 10:14:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-18 09:39 |只看该作者 |倒序浏览

uint16_t checksum(void *buffer, uint32_t length)
{
        uint16_t *pAddr = (uint16_t *)buffer;
        uint32_t sum = 0;

        while (length > 1)
        {
                sum += *(uint16_t *)pAddr++;
                if (sum & 0x80000000)
                {
                        sum = (sum & 0xffff) + (sum >> 16);
                }
                length -= 2;
        }

        if (length > 1)
        {
                sum += *(uint8_t *)pAddr;
        }

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

        return ~sum;
}



void test_checksum(char *buf, PSDHEADER *psdHeader,unsigned char* calcBuf)
{
  
        struct ether_header *ethHdr = (struct ether_header*)buf;
        struct ip *ipHdr = (struct ip*)(buf + sizeof(struct ether_header));
        struct tcphdr *tcpHdr = (struct tcphdr*)(buf + sizeof(struct ether_header) + sizeof(struct ip));
  u_short ip_sum = 0;
  uint16_t tcp_check = 0;
        char *httpbuf = (char*)(buf + sizeof(struct ether_header) + sizeof(struct ip) + sizeof(struct tcphdr));
        //strcpy(httpbuf, request);
        int len = 0; //http + tcp len
       
  
        fprintf(stdout, "auto tcp->check = %d\n",  tcpHdr->check);
        ipHdr->ip_sum = 0;
        tcpHdr->check = 0;
       
        len = ntohs(ipHdr->ip_len)- ((ipHdr->ip_hl)&15)*4;
        fprintf(stdout, "ip len = %d http + tcp len = %d\n", ((ipHdr->ip_hl)&15)*4, len);
        memset(calcBuf, 0, sizeof(calcBuf));
        memcpy(calcBuf, (void*)ipHdr, sizeof(struct ip));
       
       
        ip_sum = checksum((uint16_t*)(buf + sizeof(struct ether_header)), sizeof(struct ip));
       
  
       
       
        psdHeader->saddr = (unsigned long)ipHdr->ip_src.s_addr;
        psdHeader->daddr = (unsigned long)ipHdr->ip_dst.s_addr;
       
        psdHeader->mbz   = 0;
        psdHeader->ptcl  = 0x06;
//        psdHeader->tcpl  = htons((u_short)(sizeof (struct tcphdr) + http_len));
        psdHeader->tcpl  = htons((u_short)(len));
       
        //tcpHdr->check        = CalcTCPSum((u_int16_t *)psdHeader, (u_int16_t *)tcpHdr,sizeof(struct tcphdr) + http_len);
        memset(calcBuf, 0, sizeof(calcBuf));
        memcpy(calcBuf, (void*)psdHeader, sizeof(PSDHEADER));
        memcpy(calcBuf + sizeof(PSDHEADER), (void*)tcpHdr, sizeof(struct tcphdr));
        //memcpy(calcBuf + sizeof(PSDHEADER), (void*)tcpHdr, len);
        memcpy(calcBuf + sizeof(PSDHEADER) + sizeof(struct tcphdr), (void*)httpbuf, len - sizeof(struct tcphdr));
       
        tcp_check = checksum((u_int16_t*)calcBuf, sizeof(PSDHEADER) + len); //
//        tcpHdr->check = tcp4_checksum (*ipHdr, *tcpHdr, (uint8_t *) httpbuf, http_len);
       
       
        fprintf(stdout, "tcp_check = %d\n",  tcp_check);
       
}  

这个函数是我用来测试tcp checksum是否正确的function。
参数 buf 就是raw sock 接收的以太网帧 psdheader 是tcp 伪首部 。
为什么一旦tcp包中带了数据tcp->check 就不正确了呢。求大神指点

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
2 [报告]
发表于 2015-06-18 13:56 |只看该作者
回复 1# Fart_King

不论校验和是否正确,TCP的服务端都会参与客户端发起的连接请求,synflood就是利用了这个特征




   

论坛徽章:
1
天蝎座
日期:2015-03-09 10:14:22
3 [报告]
发表于 2015-06-18 14:06 |只看该作者
回复 2# superwujc


    我想要计算tcp带http数据的 checksum 有办法吗,三次握手我知道谢谢。

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
4 [报告]
发表于 2015-06-18 18:22 |只看该作者
http://blog.csdn.net/hunanchenxingyu/article/details/8678906

此文详细描述了带 数据的 tcp校验和的计算方法,  跟http的计算方法一样,请参考。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP