繁体   English   中英

如何在Linux内核模块中获取下一个TCP段?

[英]How to get next TCP segment in linux kernel module?

我知道我可以这样获得TCP数据包数据的指针:

char *data = (char *)tcphdr + 4 * tcph->doff;

但是,一旦数据被分割,我就无法以这种方式获取完整的数据。 那么,如何获取下一个片段的下一个sk_buff

我的简单代码:

#include ...

static struct nf_hook_ops nfho;

unsigned int hook_funcion(void *priv, struct sk_buff *skb, const struct
                          nf_hook_state *state)
{

    // check if it is TCP packet

    char *data = (char *)tcphdr + 4 * tcph->doff;

    // do something here

    return NF_ACCEPT;
}

static int __init hook_init(void)
{
    int ret;

    nfho.hook = hook_funcion;
    nfho.pf = NFPROTO_IPV4;
    nfho.hooknum = NF_INET_POST_ROUTING;
    nfho.priority = NF_IP_PRI_LAST;
    ret = nf_register_hook(&nfho);
    printk("xmurp-test start\n");
    printk("nf_register_hook returnd %d\n", ret);

    return 0;
}

static void __exit hook_exit(void)
{
    nf_unregister_hook(&nfho);
    printk("xmurp-test stop\n");
}

module_init(hook_init);
module_exit(hook_exit);

您的问题有点复杂,因为TCP中没有“完整数据”这样的东西,因为TCP是协议,而不是数据报协议(与UDP相反)。 这意味着数据没有特定的末端(除非连接已关闭/重置)。

如果要处理将TCP流分割为大小消息(例如HTTP)的应用程序层协议,则应执行以下步骤:

  1. 解析TCP有效负载并找出当前消息的大小。
  2. 只有这样,您才能处理以下数据包/分段,因为它们到达网络堆栈时是同一消息的继续。
  3. 最后,在您期望的所有数据到达之后,您可以重新组装它们,然后在应用程序层上使用它们的数据。

请记住,网络工作在数据报中 ,TCP是一种协议。 因此,很可能在处理第一个段时,其余数据尚未到达。 因此,您必须对此特定流上的此数据包和将来的数据包进行碎片整理(碎片整理),然后才能解析上层协议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM