gpt4 book ai didi

c - 如何计算TCP校验和

转载 作者:IT王子 更新时间:2023-10-29 00:33:13 28 4
gpt4 key购买 nike

我正在编写一个内核模块,它使用 Netfilter Hook 来修改一些 TCP header 信息,显然,在发送之前,我想重新计算校验和。
我还在接收端编辑了 header ,所以我也需要在那里重新计算它。

网上搜了一下,发现有人说我可以简单的设置为0就可以计算出来,显然不行。
我也找到了这个功能

tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);

虽然没有人解释这是如何使用的,以及我是否可以在接收/发送时以同样的方式使用它。
我自己的尝试是将校验和设置为 0,然后调用此函数传递我拥有的 skb 和我拥有的 skb->sk,但仍然没有。

那么请问,计算 TCP 数据报校验和的直接方法是什么?

最佳答案

要重新计算校验和,您最好计算增量校验和 - 只需根据您更改的字段修改现有校验和,而不是读取整个数据包。

这必须在您更改数据包时完成,此时您知道您存储的旧值和新值。

基本思想是tcp->check += (new_val - old_val)
它比这有点复杂,因为:
1. old_valnew_val 需要是 16 位值,按 2 个字节对齐(例如更改端口号)。
2、校验和采用补码运算,所以需要做“进位反馈”。这基本上意味着,如果 tcp->check + new_val - old_val 为负数,则需要从结果中减去 1。

关于c - 如何计算TCP校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407081/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com