关于通过sk_buff获取数据包头的问题

2524阅读 0评论2010-03-19 rain_fish
分类:LINUX

struct sk_buff *sb               
根据下图可以得出通过
struct tcphdr *tcph = (struct tcphdr*)(sb->h.th);
可以得出tcp包头,但是实际上得不到,反而通过下面的办法可以得到
struct tcphdr *tcph = (struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
可问题该方法的链路层包头怎么没有计算呢?
按说一个数据包应该是
链路包头14字节
然后是ip包头
tcp包头(假设数据包是tcp的)
可是
struct tcphdr *tcph = (struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
这个办法是没有链路层包头的啊?
请问是怎么回事?


Godbach:

你需要了解那几个union中的指针分别在什么时候才有效。

你说的情况就是union中的指针还不是有个有效指针。

rain_fish:
    哦,明白了,还有个问题就是
struct tcphdr *tcph = (struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
是不是应该是struct tcphdr *tcph = (struct tcphdr*)(sb->data+14(链路层包头)+(sb->nh.iph->ihl*4));
?

Godbach :
不用加MAC len。你之所以没有理解正确,还是我说的那个问题。skb中有些成员是会随着skb在不同的协议层而变化的,比如skb->data就是这样的成 员。
因此,建议LZ看一下分析sk_buff数据结构的文章,充分的理解这个结构体中若干关键成员的含义。


上一篇:使用netfilter的内核编程抓包程序
下一篇:putty的标题改变内容的方法