Как получить следующий TCP-сегмент в модуле ядра Linux? - PullRequest
0 голосов
/ 09 декабря 2018

Я знаю, что могу получить указатель данных пакета 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);

1 Ответ

0 голосов
/ 10 декабря 2018

Ваш вопрос немного сложен, поскольку в TCP не существует такой вещи, как «полные данные», поскольку TCP - это протокол stream , а не протокол дейтаграмма (в отличие отUDP).Это означает, что нет конкретного конца данных (если соединение не закрыто / сброшено).

Если вы работаете с протоколом прикладного уровня, который сегментирует поток TCP на сообщения размером (например, HTTP)), вы должны выполнить следующие шаги:

  1. Анализировать полезную нагрузку TCP и выяснить, насколько велико это текущее сообщение.
  2. Только тогда вы можете обрабатывать следующие пакеты / сегменты какони поступают в сетевой стек как продолжение того же сообщения.
  3. Наконец, после того, как все ожидаемые вами данные получены, вы можете собрать их и только затем использовать их на прикладном уровне.

Помните, что сеть работает в дейтаграммах , а TCP - это протокол stream .Поэтому вполне возможно, что во время обработки вашего первого сегмента остальные данные еще не поступили.Поэтому вы должны управлять десегментацией (дефрагментацией) над этим и будущими пакетами по этому конкретному потоку и только затем анализировать протоколы верхнего уровня.

...