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;
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));