转移套接字的 TCP 校验和计算

Posted

技术标签:

【中文标题】转移套接字的 TCP 校验和计算【英文标题】:TCP checksum calculation for divert socket 【发布时间】:2012-10-23 15:03:14 【问题描述】:

我有一个转换插座。我正在尝试更改数据包上的端口,因为我看到它们。当我这样做时 - 我需要重新计算 TCP 校验和和 IP 校验和吗?

我正在尝试这样做,但我在 tcpdump 中看到了重置数据包。我不知道这是因为我计算的 tcp 校验和错误,还是其他原因。

我使用了这个网站的 cksum 方法:

http://www.enderunix.org/docs/en/rawipspoof/

我认为使用转换插座,如果我改变一件事,它应该是相当简单的,但似乎不是。有没有一个 TCP 校验和计算器可以用来验证我得到了正确的值?

【问题讨论】:

【参考方案1】:

您确实需要重新计算校验和。下面是计算的说明:TCP/IP Checksum calculation

【讨论】:

【参考方案2】:

请参阅RFC 1631 的第 3.3 节,了解 NAT/PAT 必须进行的校验和调整。您不必遍历整个数据包,只需根据您修改的字节调整校验和即可。

【讨论】:

有趣。在他们的 C 函数中,你知道具体的 args 旧指针和新指针指的是什么吗?我是否只需要创建两个包含新旧数据的变量? optr 指向您要从旧数据包中删除的内容,而 nptr 指向您要插入新数据包中的内容。因此,如果您只是更改端口号, optr 指向原始端口, nptr 指向替换端口。您可以使用两个变量,或者一个可以指向数据包中的位置。 啊,好吧——这很有道理。我不确定是否需要旧数据包和数据包的完整副本。 当我说“你不必检查整个数据包”时,我想我在答案中已经明确了这一点。校验和的好处是,如果您更改一个字节,校验和只会根据旧字节和新字节之间的差异而改变。 CRC 和 MD5 等算法提供了更好的完整性检查,但它们更昂贵并且没有这个简单的属性。

以上是关于转移套接字的 TCP 校验和计算的主要内容,如果未能解决你的问题,请参考以下文章

即使我在计算之前已经将校验和设置为 0,TCP 校验和计算也会返回 0

关于 TCP 校验和计算的问题

校验和计算方法

ip协议首部校验及tcp校验计算

TCP 校验和能否检测到错误?如果是,如何处理?

什么是校验和?