icmp port unreachable

摘要:
pskb_ may_ pull){__ICMP_INC_STATS;return;}raw_ ICMP_ error;ipprot=rcu_解引用;ifapprot-˃错误_处理程序;//----udp_Err}:最后根据icmp中的控制信息找到对应的协议;udp_errtcp_v4_Err,等待,然后唤醒进程_ up

icmp port unreachable第1张

端口不可达:

client------>server 结果server回复端口不可达,

由于是icmp报文; 到达client内核协议栈后进入icmp_rcv处理:

/*
 *    Deal with incoming ICMP packets.
 */
int icmp_rcv(struct sk_buff *skb)
{
    struct icmphdr *icmph;
    struct rtable *rt = skb_rtable(skb);
    struct net *net = dev_net(rt->dst.dev);
    bool success;

    
    success = icmp_pointers[icmph->type].handler(skb);

    if (success)  {
        consume_skb(skb);
        return 0;
    }
}
--->/*
 *    Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEED, ICMP_QUENCH, and
 *    ICMP_PARAMETERPROB.
 */

static bool icmp_unreach(struct sk_buff *skb)
{
    const struct iphdr *iph;
    struct icmphdr *icmph;
    struct net *net;
    u32 info = 0;

    net = dev_net(skb_dst(skb)->dev);

    /*
     *    Incomplete header ?
     *     Only checks for the IP header, there should be an
     *    additional check for longer headers in upper levels.
     */

    if (!pskb_may_pull(skb, sizeof(struct iphdr)))
        goto out_err;

    

    icmp_socket_deliver(skb, info);

out:
    return true;
out_err:
    __ICMP_INC_STATS(net, ICMP_MIB_INERRORS);
    return false;
}

static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
{
    const struct iphdr *iph = (const struct iphdr *) skb->data;
    const struct net_protocol *ipprot;
    int protocol = iph->protocol;

    /* Checkin full IP header plus 8 bytes of protocol to
     * avoid additional coding at protocol handlers.
     */
    if (!pskb_may_pull(skb, iph->ihl * 4 + 8)) {
        __ICMP_INC_STATS(dev_net(skb->dev), ICMP_MIB_INERRORS);
        return;
    }

    raw_icmp_error(skb, protocol, info);

    ipprot = rcu_dereference(inet_protos[protocol]);
    if (ipprot && ipprot->err_handler)
        ipprot->err_handler(skb, info);//----udp_err(struct sk_buff * skb, u32 info)
}

:最后根据 icmp里面的  控制信息找到对应协议处理;udp_err  tcp_v4_err等

然后唤醒进程 wake_up

免责声明:文章转载自《icmp port unreachable》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DDD:策略模式如何结合动态表达式mysql-utf8mb4问题!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)linux 内存管理——内核的shmall 和shmmax 参数

内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好。SHMMIN= 最小的内存segment的大小 SHMMNI= 整个系统的内存segment的总个数 SHMSEG= 每个进程可以使用的内存segment的最大个数配置信号灯( semphor...

iptables.sh 初始化防火墙配置

#!/bin/bash iptables -F iptables -X iptables -Z iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #--------------------------------...

CentOS 7 下网络无法访问 Failed to start LSB: Bring up/.

[root@localhost Desktop]# ping 192.168.2.1PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.067 ms64 bytes from 192.168.2.1:...

云计算管理平台之OpenStack启动虚拟机实例

  在前边的博客中,我们主要聊了下openstack的基础环境、核心服务(认证服务keystone/镜像服务glance/计算服务nova/网络服务neutron)的安装配置;回顾请查看前边的博客;今天我们主要来聊一聊基于前边安装配置的服务来启动一个虚拟机实例;   我们知道在openstack中要启动一个虚拟机实例,通常会经过这样几步,第一步我们要有一个...

信息安全期末复习

一、米特尼克的圣诞攻击 1、攻击背景 在Unix世界中,可以很容易地给予信任。 假设用户在机器A和机器B上都有一个帐户,为了使两者之间的麻烦最小,就可以在它们之间建立全双工的信任关系。 在A的主目录中,创建一个 .rhosts 文件:echo "hostB 用户名" > .rhosts,在B的主目录中做同样的操作,现在,用户可以使用任何 r* 命令来...

Netscreen防火墙功能

一.拒绝服务攻击DoS1. 拒绝服务攻击的目的是用极大量的虚拟信息流耗尽受害者的资源,使其无法处理合法的信息流。攻击的目标可以是防火墙、防火墙所保护的网络资源、个别主机的特定硬件平台或操作系统等。通常DoS攻击中的源地址是欺骗性的。2. 发自多个源地址的DoS攻击称为分布式拒绝服务攻击(DDoS)。DDoS攻击中的源地址可以是欺骗性地址,也可以是被损害过的...