gt2333588
驱动牛犊
驱动牛犊
  • 注册日期2008-02-27
  • 最后登录2012-06-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2796回复:7

passthru下TCP校验和的计算问题 郁闷好几天了

楼主#
更多 发布于:2010-12-30 00:56
写了一个数据包捕获转发的驱动 计算TCP校验一直不正确 IP校验和没问题 算TCP校验和的时候我已经增加了伪头啊...
源码如下
USHORT 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;
}

封装TCP包部分
    //计算TCP包    
    nTempPort=TcpHdr.sourcePort;
    TcpHdr.sourcePort=TcpHdr.destinationPort;
    TcpHdr.destinationPort=nTempPort;

    nTempSeq=TcpHdr.sequenceNumber;
    TcpHdr.sequenceNumber=TcpHdr.acknowledgeNumber;//上次的ACK值作为SEQ
    TcpHdr.acknowledgeNumber=nTempSeq+htons((nDataLen-sizeof(ETHeader)-sizeof(IPHeader)));//计算ACK内容
    
    TcpHdr.dataoffset=(sizeof(TCPHeader)/4<<4|0);
    TcpHdr.flags=0x18;
    TcpHdr.windows=65535;
    TcpHdr.checksum=0;

    //填充TCP伪头
    PsdHdr.saddr = IpHdr.ipSource;
    PsdHdr.daddr = IpHdr.ipDestination;
    PsdHdr.mbz = 0;
    PsdHdr.ptcl = IPPROTO_TCP;
    PsdHdr.tcpl = ntohs(sizeof(TCPHeader));

    RtlZeroMemory(szSendData,2048);//清零
    RtlCopyMemory(szSendData,&PsdHdr,sizeof(PSDHeader));
    RtlCopyMemory(szSendData+sizeof(PSDHeader),&TcpHdr,sizeof(TCPHeader));
    TempCheckNum=checksum((USHORT*)szSendData,sizeof(PSDHeader)+sizeof(TCPHeader)); //计算TCP校验和
    TcpHdr.checksum=TempCheckNum;
gt2333588
驱动牛犊
驱动牛犊
  • 注册日期2008-02-27
  • 最后登录2012-06-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-12-30 01:01
补充一句 客户端网卡已经收到包了 只不过因为校验和不对被上层丢弃了
gt2333588
驱动牛犊
驱动牛犊
  • 注册日期2008-02-27
  • 最后登录2012-06-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-12-30 11:15
  没用 我已经加了伪头了
gt2333588
驱动牛犊
驱动牛犊
  • 注册日期2008-02-27
  • 最后登录2012-06-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-12-30 18:52
自己解决了 因为不在TCP握手阶段 校验和要校验数据包大小 感谢两位好心的朋友帮忙 困扰了好几天了也
游客

返回顶部