传入一个sk_buff的结构,如何获取tcp的端口和其它数据

时间:2023-02-08 11:00:47
一个函数,传入一个sk_buff的结构,如:struct sk_buff **skb  ,请问,如何从该结构中获得其协议类型?如果是TCP的包,如果获取端口号?如果TCP包承载的是http的协议报文,如何获取http的数据? 谢谢!

2 个解决方案

#1


sk_buff你都填充好了,其它的就简单了! 看看sk_buff的结构吧。

TCP包端口号: skb->h->th->dest/source

至于你说的HTTP数据,那么需要熟悉协议,自己解析了,比如:
ip数据位于 skb->data + skb->nh.iph->ihl * 4 处;
udp数据位于skb->data + skb->nh.iph->ihl *4 +sizeof(struct udphdr)处;
tcp数据位于skb->data + skb->nh.iph->ihl*4 +sizeof(struct tcphdr)出;

至于http数据,下层协议一般是TCP,所以HTTP数据通常就是从skb->data + skb->nh.iph->ihl*4 +sizeof(struct tcphdr)开始...

大概意思就这样,自己结合内核和sk_buff看看吧。

good luck!

#2


现在基本问题解决了,但获取HTTP的包老是获取不到正确的位置。 抓包发现tcp的头有时是20个字节,有时候又是32个字节。
还请高手指教一下,如果正确得到http的数据。再次感谢。。。。。

#1


sk_buff你都填充好了,其它的就简单了! 看看sk_buff的结构吧。

TCP包端口号: skb->h->th->dest/source

至于你说的HTTP数据,那么需要熟悉协议,自己解析了,比如:
ip数据位于 skb->data + skb->nh.iph->ihl * 4 处;
udp数据位于skb->data + skb->nh.iph->ihl *4 +sizeof(struct udphdr)处;
tcp数据位于skb->data + skb->nh.iph->ihl*4 +sizeof(struct tcphdr)出;

至于http数据,下层协议一般是TCP,所以HTTP数据通常就是从skb->data + skb->nh.iph->ihl*4 +sizeof(struct tcphdr)开始...

大概意思就这样,自己结合内核和sk_buff看看吧。

good luck!

#2


现在基本问题解决了,但获取HTTP的包老是获取不到正确的位置。 抓包发现tcp的头有时是20个字节,有时候又是32个字节。
还请高手指教一下,如果正确得到http的数据。再次感谢。。。。。