Java 关于TCP校验和计算的问题

Java 关于TCP校验和计算的问题,java,tcp,checksum,Java,Tcp,Checksum,我有两个问题: 声明应在96位伪报头、tcp报头和数据上计算校验和。伪报头包括源和目标IP地址。这难道不是挫败了将层分开的整个想法吗?因为现在当网络层开始使用不同大小的地址时,传输层也需要改变 在另一篇SO帖子中,我找到了以下java代码来计算校验和 private long computeChecksum( byte[] buf ){ int length = buf.length; int i = 0; long sum = 0; long data;

我有两个问题:

  • 声明应在96位伪报头、tcp报头和数据上计算校验和。伪报头包括源和目标IP地址。这难道不是挫败了将层分开的整个想法吗?因为现在当网络层开始使用不同大小的地址时,传输层也需要改变

  • 在另一篇SO帖子中,我找到了以下java代码来计算校验和

    private long computeChecksum( byte[] buf ){
        int length = buf.length;
        int i = 0;
        long sum = 0;
        long data;
    
        // loop through all 16-bit words unless there's 0 or 1 byte left.
        while( length > 1 ){
            data = ( ((buf[i] << 8) & 0xFF00) | ((buf[i + 1]) & 0xFF));
            sum += data;
            if( (sum & 0xFFFF0000) > 0 ){
                sum = sum & 0xFFFF;
                sum += 1;
            }
            i += 2;
            length -= 2;
        }
    
        if (length > 0 ){ // ie. there are 8 bits of data remaining.
            sum += (buf[i] << 8 & 0xFF00); // create a 16 bit word where the 8 lsb are 0's and add it to the sum.
            if( (sum & 0xFFFF0000) > 0) {
                sum = sum & 0xFFFF;
                sum += 1;
            }
        }
    
        sum = ~sum; 
        sum = sum & 0xFFFF;
        return sum;
    }
    
    private long computeChecksum(字节[]buf){
    int length=buf.length;
    int i=0;
    长和=0;
    长数据;
    //循环遍历所有16位字,除非剩下0或1字节。
    而(长度>1){
    数据=((buf[i]0){
    sum=sum&0xFFFF;
    总和+=1;
    }
    i+=2;
    长度-=2;
    }
    如果(长度>0){//,则剩余8位数据。
    总和+=(buf[i]
    这难道不是挫败了将层分开的整个想法吗?因为现在当网络层开始使用不同大小的地址时,传输层也需要改变

    是的。事实上,这就是重新定义IPv6伪头的原因:

    任何传输协议或其他上层协议,包括 IP报头校验和计算中的地址必须为 修改为通过IPv6使用,以包括128位IPv6地址 而不是32位IPv4地址。[…]

    data = ( ((buf[i] << 8) & 0xFF00) | ((buf[i + 1]) & 0xFF));