netfilter内核编程,显示tcphdr的seq怎么总是不对?

zenco119 2007-08-14 08:12:40
代码大致如下:

iph=sk->nh.iph; //网络层指针
if (iph->protocol==0x06) //如果这是TCP协议
{
th=(struct tcphdr*)(sk->data +20) //找到TCP头的指针th
printk("Seq=%u, s_port=%u, d_port=%u\n",
ntohl(th->seq),
ntohs(th->source),
ntohs(th->dest));

}

在var/log/message中看到端口号都打印正确了,但是Seq却总是不对,往往是很大,有9,10位那样子,而且连续的数据包seq都一样。
ethereal抓包看到TCP包的seq都很正常,不到5位那样子。

请问这是怎么回事?
回答上的人100分全给你了。
...全文
232 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ben27519 2008-12-07
  • 打赏
  • 举报
回复
ethereal可能显示的是相对序列号(relative sequence number)。你可以改成显示绝对序列号(absolute sequence number)。
H2SO2H2SO2 2008-11-12
  • 打赏
  • 举报
回复
我也碰到了类似的问题,不知道是怎么回事?有没有大侠可以帮忙说下啊?
wangwanli1222 2007-09-14
  • 打赏
  • 举报
回复
你可以定义一个unsigned char *p;int i;
p = &th- >seq;
for(i=0;i<sizeof(th- >seq);i++)
printk("<0>""%2x_",*p++);
如果顺序不对,可以先把th->seq拷贝一份,然后变换一下字节序
你可以试一下,可能是字节对齐的问题
roadingyh 2007-08-15
  • 打赏
  • 举报
回复
不过你说两个16位的那打印正确...
建议还是打印出16进制的看看其值是否正确吧...
roadingyh 2007-08-15
  • 打赏
  • 举报
回复
1059这个序号不大可能,太小了.一般来说四个字节的SED还是比较大一些的.
建议LZ先用%X把这些字段的16进制值打印出来,再查看.
而且你确定32位的这东西,能够用nthol打印吗? 记得比较打印的时候我好像是用的一个NEQ..什么的宏.现在不大记得了...
zenco119 2007-08-14
  • 打赏
  • 举报
回复
我发现一个现象:我用ethereal抓包,发现一个数据包的TCP Seq段为: 2f ae 0b 3e, 这的确是一个
很大的数,是799935294,和我程序显示的大数一致。但是ethereal解析后,显示该序列号为1059,我就
不知道这两个数字是什么关系?
看来我中间缺少一个换算的过程,也不知道TCP的Seq是怎么换算的。
hyg2008 2007-08-14
  • 打赏
  • 举报
回复
netfilter啊,我正准备看,还菜得很哦
去chinunix,linuxfourm上问问吧,那上面有人在研究

18,777

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧