ip_vs_core阅读

来源:互联网 发布:仁爱英语听力软件下载 编辑:程序博客网 时间:2024/04/29 22:18

ip_vs_in函数的了解;

当报文首先进入到系统中,这个函数的处理:外部到达本机的报文都要经过LOCAL_IN这个节点。(到达的报文分为哪些类型)

首先检查/* Packet types */,当/* Packet types */不是本机时,不处理,

类型如果不是主机还有以下几种情况:PACKET_BROADCAST 广播,PACKET_MULTICAST 多播,

PACKET_OUTGOING PACKET_LOOPBACK回环    (PACKET_FASTROUTE 快转 这个稍后讨论)

试想以下,如果不做检查的话,将多播的报文也做了负载均衡,会引起不必要的网络错误。所以检查报文类型是第一道门。

(那么什么时候会对报文的头做标记呢?这个Packet types是什么贴到报文身上的呢)

    返回值                含义
NF_DROP                丢弃该数据包
NF_ACCEPT            保留该数据包
NF_STOLEN            忘掉该数据包
NF_QUEUE            将该数据包插入到用户空间
NF_REPEAT            再次调用该hook函数

如果这个接口接收到类型非本机的包,将返回NF_ACCEPT给netfilter框架,这个返回值的意义是,告诉它这个包需要其他的接口继续处理,把这个包返还给netfilter框架。

下一步就是检查进来的ip报文是否为icmp包,icmp包只有ping的时候才会用到,和网络检查的时候才可以用到,

if (unlikely(iph.protocol == IPPROTO_ICMP)) {
        int related, verdict = ip_vs_in_icmp(skb, &related, hooknum);

        if (related)
            return verdict;

ip_vs_in_icmp(skb, &related, hooknum);关于这个函数 

它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。ICMP报文在IP帧结构的首部协议类型字段(Protocol 8bit)的值=1.

    if ((ic->type != ICMP_DEST_UNREACH) &&
        (ic->type != ICMP_SOURCE_QUENCH) &&
        (ic->type != ICMP_TIME_EXCEEDED)) {
        *related = 0;
        return NF_ACCEPT;
    }

返回这个就是不相关,查看icmp报文,看一下type是在什么时候赋值的









0 0