yd0412 发表于 2007-1-18 13:33:49

linux内核转发IP分片包问题

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内核处理分片过程中,就不会等到所有的数据分片包,则超时后会丢弃此数据包,回否造成数据包丢失?
以上问题,系各位高手不吝赐教!谢谢各位!

zyzii 发表于 2007-1-18 15:36:50

1.虽然通过NAT转换,但源IP地址不同啊,所以不会出错的。
2。 分片是有定时器的,见ip_expire(),超时会丢包的。

yd0412 发表于 2007-1-18 17:06:53

谢谢楼上的!
如果转换后,源IP相同呢??

zyzii 发表于 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, 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);
}

zyzii 发表于 2007-1-19 10:58:21

这个函数就是你要找的函数了。
    判断的条件是:   id, saddr,daddr, protocol, user.
    你说的情况里不同的PC的源地址经过NAT后也是不一样的啊。

zyzii 发表于 2007-1-19 10:59:55

可能不同的IP经过同一个iptable的NAT后会一样? 我也不是很清楚的。我觉得会不一样吧。
页: [1]
查看完整版本: linux内核转发IP分片包问题