草庐IT

CRC校验码

全部标签

c - 对于大多数数据包,我的 TCP 校验和函数返回 0

我正在编写一个小程序来嗅探流量并重新计算TCP校验和以进行验证。对于大多数HTTP数据包,我的程序返回校验和为零。我所做的是通过PSEUDO_TCP_HEADER|构造一个缓冲区TCP_HEADER|TCP_有效载荷。伪TCPheader是一个由以下内容定义的结构:structpseudo_tcp{unsignedlongsaddr,daddr;unsignedcharmbz;unsignedcharptcl;unsignedshorttcpl;};然后我调用这个函数来计算校验和(我相信这个函数做了正确的工作,因为它已经被很多项目使用):unsignedshortin_cksum(un

c - TCP header 和校验和

我需要说明在计算校验和时正确使用TCPheader和伪header。伪header是否需要紧跟在IPheader之后和真正的TCPheader之前?这是我所拥有的:IPHeader*iph=(IPHeader*)(packet+ETHER_SIZE);//ETHER_SIZE==14ipLen=ntohs(iph->totLen)*4;TCPPseudo*tcps=(TCPPseudo*)(packet+ETHER_SIZE+ipLen);TCPHeader*tcp=(TCPHeader*)(tcps+sizeof(TCPPseudo));这是我的标题:typedefstruct__a

tcp - 我们是否应该构建整个数据包( header 、校验和等)以使用网络图?

我对netmap很感兴趣,它允许用户程序员访问用户空间中的数据包,这意味着用户应用程序可以使用此netamp非常快速地读取/发送网络数据包。网络map:http://info.iet.unipi.it/~luigi/netmap/任何一位非常熟悉netamp的人都可以告诉我我们应该创建要发送的整个数据包,还是使用堆栈功能将其发送出去。编辑:这里是关于如何使用这个api的例子https://www.freebsd.org/cgi/man.cgi?query=netmap&sektion=4#includevoidsender(void){structnetmap_if*nifp;stru

network-programming - Intranet 与 Internet 应用程序中的校验和验证

在查看Wireshark中的消息时,我注意到校验和验证始终处于禁用状态。它是过时的要求,还是仅适用于公司网络防火墙之外的互联网流量?此外,有人可以建议它是如何设置的吗(例如,是否来自应用程序或网卡设置等)PS:这个问题可能没有实际意义。我问这个是为了填补我糟糕的网络编程技能中的巨大空白。我听说校验和验证是tcp通信的主要瓶颈,但令我惊讶的是我看到的所有消息都禁用了它 最佳答案 这个问题在WiresharkFAQ中得到了回答。.结果是校验和通常由网卡计算,而Wireshark通常会在数据包到达执行实际计算的硬件之前拦截数据包。为这些数

tcp - ipv4 报头校验和

我是TCP/IP套件的初学者。ip报头的一个域HEADERCHECKSUM是将报头看成一个16位整数序列,用补码算法将它们相加,然后对结果取补码。但是ipheader还包含TTL字段,在传输过程中可能会发生变化。为什么它不会导致发送方和接收方之间的不一致? 最佳答案 ThechecksumisrecomputedateveryhopAstheTTLfieldisdecrementedoneachhop,anewchecksummustbecomputedeachtime.Themethodusedtocomputethechecks

linux - 如果我在 Linux 上使用原始套接字,内核是否会丢弃带有错误 TCP 校验和的传入数据包?

现在我正在编写一个使用原始TCP套接字的程序。如果有任何带有错误TCP校验和的传入数据包,内核会将它们传递给程序还是丢弃它们?我想知道的原因是弄清楚我是否需​​要手动执行该检查。 最佳答案 由于您自己编写TCP(使用“IP”套接字/层)将必须处理TCP校验和。下面的任何层或任何校验和都将由底层操作系统处理。有了TCP/IP协议(protocol)栈(从下到上的顺序)链接Internet传输申请 关于linux-如果我在Linux上使用原始套接字,内核是否会丢弃带有错误TCP校验和的传入数

java - 关于TCP校验和计算的问题

我有两个问题:RFC793指出校验和应该在96位伪header、tcpheader和数据上计算。伪header包括源IP地址和目标IP地址。这不会破坏保持层分离的整个想法,因为现在当网络层开始使用不同大小的地址时,传输层也需要改变。在另一篇SO帖子中,我发现了以下用于计算校验和的Java代码。privatelongcomputeChecksum(byte[]buf){intlength=buf.length;inti=0;longsum=0;longdata;//loopthroughall16-bitwordsunlessthere's0or1byteleft.while(lengt

http - HTTP 是否使用校验和?为什么/为什么不?

据我了解,TCP有一个relativelyreliablechecksummechanism,但它返回误报的可能性很小但目前仍然存在。HTTP是否使用应用程序级校验和(可能是哈希)?如果不是,为什么? 最佳答案 是的(:HTTP/1.1的规范(RFC2616)允许使用Content-MD5header。看看它的section14.15。复制粘贴:TheContent-MD5entity-headerfield,asdefinedinRFC1864[23],isanMD5digestoftheentity-bodyforthepurp

c++ - 了解 TCP 校验和函数

我相信TCP校验和函数执行以下操作:将伪报头和TCP段报头和数据分成2个字节的block。如果最后一个block的长度不是2个字节,则在最后一个block的末尾添加一个0字节的填充,使其成为2个字节。对和取反码得到TCP校验和。听起来很简单。因此,我编写了自己的通用checksum函数:#include#includeuint16_tchecksum(uint16_t*data,intsize){uint16_tsum=0;inti=0,length=size/2;while(i但是其他人编写的checksum函数似乎更复杂。例如:uint16_tchecksum(uint16_t*a

c - TCP校验和C代码返回错误结果

我得到一个很大的TCP校验和结果,而它本应为0。我通过将TCPpsuedoheader复制到数组的前12个字节,然后将TCPheader和数据复制到接下来的几个字节来解决这个问题数组的字节,并将该数组及其长度传递给校验和函数。我无法弄清楚为什么校验和与正确值有很大不同(即其中一个数据包的9180本应为0)。这是我的IP、TCP和伪TCPheader:typedefstruct__attribute__((__packed__))IPHeader{#if__BYTE_ORDER__==__LITTLE_ENDIAN__uint8_thdrLen:4;uint8_tversion:4;#e