免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5332 | 回复: 13
打印 上一主题 下一主题

请教2.6中分片重组后的怪现象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 16:53 |只看该作者 |倒序浏览
假設有一組分片包,frag1, frag2, frag3,從eth0收上來;
經過IP-PREROUTING的conntrack後,它們會重組為一個完整的大包 pkt;
那麼,按理,在此之後查看(如在IP_PREROUTING低於conntrack優先級的hook點)
pkt 包最後的內容一定與frag3最後的內容一樣,在2.4中確實是這樣。

但到了2.6,發現重組後的pkt最後的內容與frag3毫不相關。
我知道2.6的重組包不會線性化,在查看之前已經作了 skb_linearize(),但還是不行。
而最終轉發到最終的接收端卻還是對的,即pkt確實是由frag1+frag2+frag3組成的。

不知除了skb_linearize之外,還需什麼步驟,才能看到完整連續的pkt?
多謝!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-12-27 17:01 |只看该作者
记得最常用的也就是 skb_linearize 了。
你确定 2.4 中  conntrack 中对frag 的重组中,包含了数据包内容的重组吗,还是只是简单的将几个分片包串起来了。

论坛徽章:
0
3 [报告]
发表于 2010-12-29 10:56 |只看该作者
我記得是,卻不能確定。

現在我線性化之後,查看pkt的內容是 (frag1 + otherbits) 其中otherbits並不是frag2和frag3的data,不知道是另需其它步驟,還是有bug。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2010-12-29 12:39 |只看该作者
你是怎么生成分片报文的

论坛徽章:
0
5 [报告]
发表于 2010-12-29 14:03 |只看该作者
只要發送大於mtu的包,就產生分片包了


抱歉!是我自己的bug!線性化後未更新指針。

錯誤如下:
1. iph = 重組後、線性化前的IP頭
2. 線性化
3. 讀iph後的內容

應該在第3步前更新“iph =線性化後的IP頭”。
希望大家別犯我的錯誤,線性化後所有數據部分的指針都要更新。

评分

参与人数 1可用积分 +18 收起 理由
Godbach + 18 感谢分享

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2010-12-29 14:09 |只看该作者
只要發送大於mtu的包,就產生分片包了


抱歉!是我自己的bug!線性化後未更新指針。

錯誤如下:
1. ...
davhuang 发表于 2010-12-29 14:03


线性化以后 iph 的位置变化了?
这个之前还真没注意过,多谢分享经验!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-12-29 14:27 |只看该作者
线性化以后 iph 的位置变化了?
这个之前还真没注意过,多谢分享经验!

我也没注意过。按理说也是应该变化的。只要原先 skb 确实是非线性的,因为应该是重新分配了 skb。
另外,见 skb_linearize 函数及其注释

/**
*        skb_linearize - convert paged skb to linear one
*        @skb: buffer to linarize
*
*        If there is no free memory -ENOMEM is returned, otherwise zero
*        is returned and the old skb data released.
*/
static inline int skb_linearize(struct sk_buff *skb)
{
        return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
}

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2010-12-29 14:31 |只看该作者
我上面的解释可能不妥。

线性化时应该是对数据区进行扩展了。但是主 skb 应该没有被释放的

论坛徽章:
0
9 [报告]
发表于 2010-12-30 15:15 |只看该作者
本帖最后由 cyliu 于 2010-12-30 15:18 编辑

网络包分片和skb分片概念不同,记住不要混淆。


我使用skb_linearize_cow没有问题,一直在使用。注意调用完这个函数,需要重新获取iph头

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2010-12-30 17:39 |只看该作者
网络包分片和skb分片概念不同,记住不要混淆。

我理解的 LZ 说的分片包指的是 IP 分片,进入 IP 层后都是独立的 skb,只是被 conntrack 处理了一把。

你这里提到的 skb 分片值的是什么意思?

我使用skb_linearize_cow没有问题,一直在使用。注意调用完这个函数,需要重新获取iph头

这个地方研究了为什么要重新获取 iph 头没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP