QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3817|回复: 5

linux内核转发IP分片包问题

[复制链接]
发表于 2007-1-18 13:33:49 | 显示全部楼层 |阅读模式
linux内核中对分片包转发的处理,如果有conntrack或nat模块,则先会在NF_IP_PRE_ROUTING钩子点重组分片,然后在ip_forward_finish函数中调用ip_send分片,继续在NF_IP_POST_ROUTING钩子点重组分片,最后分片,然后发送至网络!且在此过程中不会改变分片包的ID号.以上是linux2.4.32中的处理,(理解可能有偏差)我有几个问题想向各位高手请教!
1.如果从不同PC发出的,目的地址相同且ID号相同的同协议的数据包,通过linux路由NAT转发后,由于不改变ID号,那么目的主机接到这些数据包时,会否出现重组错误?
2.分片在网络传输中,不一定都会经过同一路由设备!那么在linux内核处理分片过程中,就不会等到所有的数据分片包,则超时后会丢弃此数据包,回否造成数据包丢失?
以上问题,系各位高手不吝赐教!谢谢各位!

发表于 2007-1-18 15:36:50 | 显示全部楼层
1.  虽然通过NAT转换,但源IP地址不同啊,所以不会出错的。
2。 分片是有定时器的,见ip_expire(),超时会丢包的。
回复

使用道具 举报

 楼主| 发表于 2007-1-18 17:06:53 | 显示全部楼层
谢谢楼上的!
如果转换后,源IP相同呢??
回复

使用道具 举报

发表于 2007-1-19 10:55:02 | 显示全部楼层
/* Find the correct entry in the "incomplete datagrams" queue for
* this IP datagram, and create new one, if nothing is found.
*/
static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
{
        __be16 id = iph->id;
        __u32 saddr = iph->saddr;
        __u32 daddr = iph->daddr;
        __u8 protocol = iph->protocol;
        unsigned int hash;
        struct ipq *qp;
        struct hlist_node *n;

        read_lock(&ipfrag_lock);
        hash = ipqhashfn(id, saddr, daddr, protocol);
        hlist_for_each_entry(qp, n, &ipq_hash[hash], list) {
                if(qp->id == id                &&
                   qp->saddr == saddr        &&
                   qp->daddr == daddr        &&
                   qp->protocol == protocol &&
                   qp->user == user) {
                        atomic_inc(&qp->refcnt);
                        read_unlock(&ipfrag_lock);
                        return qp;
                }
        }
        read_unlock(&ipfrag_lock);

        return ip_frag_create(iph, user);
}
回复

使用道具 举报

发表于 2007-1-19 10:58:21 | 显示全部楼层
这个函数就是你要找的函数了。
    判断的条件是:   id, saddr,daddr, protocol, user.
    你说的情况里不同的PC的源地址经过NAT后也是不一样的啊。
回复

使用道具 举报

发表于 2007-1-19 10:59:55 | 显示全部楼层
可能不同的IP经过同一个iptable的NAT后会一样? 我也不是很清楚的。我觉得会不一样吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 14:46 , Processed in 0.075306 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表