首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux icmp 源码

Linux中的ICMP(Internet Control Message Protocol)源码主要位于内核的net/ipv4目录下,特别是在icmp.c文件中。ICMP是一种用于传输错误报告和控制信息的协议,它是TCP/IP协议族的一部分。

基础概念

ICMP主要用于网络设备发送错误消息和操作信息。例如,当数据包无法到达目的地时,路由器会发送ICMP消息通知源主机。常见的ICMP消息包括回显请求(ping)和回显应答。

相关优势

  1. 错误检测:ICMP能够帮助网络管理员诊断网络问题。
  2. 网络控制:通过ICMP,路由器可以通知主机网络状况,如网络拥塞或路由变化。
  3. 简单高效:ICMP协议设计简洁,处理速度快,适合用于快速的网络状态查询。

类型

ICMP消息分为两大类:

  • 查询报文:如回显请求(类型8)和回显应答(类型0)。
  • 差错报文:如目标不可达(类型3)、超时(类型11)等。

应用场景

  • 网络诊断工具:如ping命令就是利用ICMP回显请求和应答来测试网络连通性。
  • 路由跟踪:traceroute命令使用ICMP超时消息来确定数据包到达目的地的路径。

遇到的问题及解决方法

问题:无法ping通另一台主机

原因

  • 目标主机防火墙禁止ICMP流量。
  • 网络路由问题导致数据包无法到达目标主机。
  • 目标主机未开启ICMP响应。

解决方法

  1. 检查目标主机的防火墙设置,确保允许ICMP echo请求。
  2. 使用traceroute命令检查数据包的路由路径,查找可能的故障点。
  3. 确认目标主机的网络配置,确保ICMP协议未被禁用。

示例代码:简单的ICMP Echo请求(ping)

以下是一个使用原始套接字发送ICMP Echo请求的简单示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/ip_icmp.h>

unsigned short calculate_checksum(unsigned short *buffer, int size) {
    unsigned long checksum = 0;
    while (size > 1) {
        checksum += *buffer++;
        size -= sizeof(unsigned short);
    }
    if (size) {
        checksum += *(unsigned char *)buffer;
    }
    checksum = (checksum >> 16) + (checksum & 0xffff);
    checksum += (checksum >> 16);
    return (unsigned short)(~checksum);
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: %s <hostname/IP>\n", argv[0]);
        return 1;
    }

    int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sockfd < 0) {
        perror("socket");
        return 1;
    }

    struct sockaddr_in dest_addr;
    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;
    inet_pton(AF_INET, argv[1], &dest_addr.sin_addr);

    char sendbuf[1500];
    struct icmp *icmp = (struct icmp *)sendbuf;
    icmp->icmp_type = ICMP_ECHO;
    icmp->icmp_code = 0;
    icmp->icmp_cksum = 0;
    icmp->icmp_id = getpid();
    icmp->icmp_seq = 0;

    memset(sendbuf + sizeof(struct icmp), 0, 56);
    icmp->icmp_cksum = calculate_checksum((unsigned short *)icmp, sizeof(sendbuf));

    if (sendto(sockfd, sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) <= 0) {
        perror("sendto");
        close(sockfd);
        return 1;
    }

    printf("Ping request sent to %s\n", argv[1]);
    close(sockfd);
    return 0;
}

注意:运行此代码可能需要root权限,因为它使用了原始套接字。

通过以上信息,你应该对Linux中的ICMP源码有了基本的了解,包括其概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ICMP

ICMP ICMP用来传递差错控制,查询等信息。 ICMP Echo消息常用于诊断源和目的之间的网络连通性,同时还可以提供其他信息,如报文往返时间等。...当网络设备无法保证访问目标网络时,会自动发送ICMP目的不可达报文到发送端设备 type表示ICMP消息类型,code表示同一消息类型中的不同信息。  ICMP的一个典型应用是ping。...用户可以在ping命令中指定不同参数,如ICMP报文长度、发送ICMP报文个数、等待回复响应的超时时间等,设备根据配置的参数来构造并发送ICMP报文,进行ping测试。...如果不指定源IP地址,将采用出接口的IP地址作为ICMP echo-request报文发送的源地址。 2、-c count指定发送ICMP echo-request报文次数。...缺省值是255 4、-t timeout指定发送完ICMP echo-request后,等待ICMP echo-replay的超时时间。 Tracert ICMP的另一个典型应用是Tracert。

1.2K20
  • Icmp protocol

    ICMP协议的作用:ICMP协议是IP协议的一个辅助,它可以传递差错报文以及其他信息 Ping用到的是ICMP协议,不是端口。...Capture ICMP Packets With Tcpdump 3.ICMP差错报文: ICMP差错报文,即端口不可达报文。它是ICMP目的不可达报文的一种,这种差错报文是立刻返回的。...IP数据报=IP首部+ICMP报文 =IP首部+ICMP首部+ICMP报文数据部分 =IP首部+ICMP首部+产生差错的数据报IP首部+原始IP数据报中数据的前8个字节 IP首部中包含 了协议字段,所以...Exploring TCP Connection Time_Wait in Linux 8.ping执行打印的信息 输出字节数,是64;输出目的主机的IP地址,是通过DNS协议解析来的;输出icmp_seq...Linux Tcpdump: Filter ipv6 ntp ping packets ————————————————

    1.3K10

    icmp回复报文_ICMP报文和ping命令

    ping使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。...同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。...即先由IP地址,在网络层传输,然后再根据mac地址由数据链路层传送到目的主机 三、ICMP协议: ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。...在Unix/Linux,序列号从0开始计数,依次递增。而Windows ping程序的ICMP序列号是没有规律。...ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节38字节 ICMP首部一般格式: 类型(8位) 代码(8位) 检验和(16位) 首部的其余部分(32位 不同类型

    2.4K10

    ICMP协议分析

    我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。...ICMP的作用与特点 ICMP的特点: ICMP本身是网络层的一个协议; ICMP差错报告采用路由器-源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因; ICMP并不能保证所有的IP...可以知道,ping基于ICMP协议。 ICMP属于哪一层?...Exploring ICMP Port Number with Example ICMP差错报文 报告IP数据报在传输中的差错是ICMP报文最基本的功能,ICMP差错报文有如下特点: ICMP差错报文都是由路由器发送到源主机的...当路由器发送一份参数错误等的ICMP差错报文时,ICMP报文数据区始终包含产生ICMP差错报文的IP数据报的头部和其数据区的前8个字节(64位)。

    2.4K00

    ICMP协议详解

    所以我们就需要一种协议来完成这样的功能–ICMP协议。 ICMP协议的功能 ICMP协议的功能主要有: 1. 确认IP包是否成功到达目标地址 2....ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6 ICMP的报文格式 ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。...一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。...ICMP报头如下图所示。 如下图: 字段说明: 类型 说明 类型 占一字节,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。...过程: 一台主机向一个节点发送一个类型字段值为8的ICMP报文,如果途中没有异常(如果没有被路由丢弃,目标不回应ICMP或者传输失败),则目标返回类型字段值为0的ICMP报文,说明这台主机存在。

    2.6K30

    icmp报文(1)

    ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。...当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。 各字段说明 类型:占一字节,标识ICMP报文的类型,目前已定义了14种,从类型值来看ICMP报文可以分为两大类。...代码:占一字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型。...校验和:这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错。其计算方法与在我们介绍IP报头中的校验和计算方法是一样的。...标识:占两字节,用于标识本ICMP进程,但仅适用于回显请求和应答ICMP报文,对于目标不可达ICMP报文和超时ICMP报文等,该字段的值为0。

    1.5K20

    ICMP 协议分析

    下面是一些基础的关于icmp协议的知识。 3.ICMP报文类型 ICMP 报文大致可分为两类:差错报文、查询报文。...—-ICMP 时间戳消息:可以向那些主机或路由器发送 ICMP 时间戳请求消息,然后通过接收 ICMP 时间戳应答消息获取时间信息。...ICMP 回显请求和 ICMP 回显应答报文是配合工作的。当源主机向目标主机发送了 ICMP 回显请求数据包后,它期待着目标主机的回答。...目标主机在收到一个 ICMP 回显请求数据包后,它会交换源、目的主机的地址,然后将收到的 ICMP 回显请求数据包中的数据部分原封不动地封装在自己的 ICMP 回显应答数据包中,然后发回给发送 ICMP...用tcpdump命令来抓取icmp的数据包 tcpdump -i eth0 icmp Filtering ICMP ICMPv6 Packets with Tcpdump Capture ICMP Packets

    1.5K10

    【计算机网络】网络层 : ICMP 协议 ( ICMP 差错报文 | 差错报文分类 | ICMP 询问报文 | ICMP 应用 | Ping | Traceroute )

    文章目录 一、ICMP 协议 二、ICMP 协议 简介 三、ICMP 五种差错报告报文 四、ICMP 差错报文形成 五、ICMP 差错报文 不发送 情形 六、ICMP 询问报文 七、ICMP 应用 一、...物理地址 ; ③ ICMP 和 IGMP 协议 : ICMP 和 IGMP 协议 是 网络层 与 传输层 之间的协议 ; 目的是更加有效的转发 IP 数据报 , 提高交付的成功率 ; 二、ICMP 协议...简介 ---- ICMP 协议 简介 : ① ICMP 协议 全称 : 网际控制报文协议 ; ② ICMP 协议 功能 : 差错报告 : 对应 发送 差错报文 ; 网络探寻 : 对应 发送 探寻报文...; ③ ICMP 报文 在 IP 数据报中位置 : ICMP 报文 属于 IP 数据报 的 数据部分 ; ICMP 报文内容 : 其中的类型是 差错报文 / 探询报文 ; 三、ICMP 五种差错报告报文...情形 ---- ICMP 差错报文 不发送 情形 : ① ICMP 差错报文错误 : IP 数据报 中 , 如果 ICMP 差错报文部分出错 , 就不用再发送 ICMP 差错报告报文了 ; ② 后续数据报分片

    7.3K00

    ICMP 协议「建议收藏」

    目录 什么是ICMP协议? ICMP出现的原因 那么我们详细介绍一下ICMP协议?...ICMP实现之ping命令 ICMP实现之traceroute命令 ICMP实现之端口扫描 ICMP和安全的关系 为什么停止方便的ICMP? ICMP攻击 抵御方法 什么是ICMP协议?...7)选项数据;—向对方传送数据 这三个包含在ICMP数据部分的字段。 ICMP协议提供的诊断报文类型 已经定义的ICMP消息类型大约有10多种,每种ICMP数据类型都被封装在一个IP数据包中。...路由器丢弃数据包的同时,用ICMP 报文来通知错误。这时使用的ICMP 报文是,类型为11,代码为0 的ICMP 超时报文。...由于ICMP 被恶意使用而遭受损害的用户正在不断增加之中,因此有了限制ICMP 使用的意见。 ICMP攻击 ICMP协议对于网络安全具有极其重要的意义。

    2K41

    ICMP报文分析

    ICMP同意主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。...ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。 二.ICMP报文的格式 1. 类型:占8位 2. 代码:占8位 3....ICMP报文详细分为查询报文和差错报文(对ICMP差错报文有时须要做特殊处理,因此要对其进行区分。...如:对ICMP差错报文进行响应时,永远不会生成还有一份ICMP差错报文,否则会出现死循环) 三.ICMP差错报文(56字节) 1....说明: 下面几种情况都不会导致产生ICMP差错报文 1>ICMP差错报文(可是,ICMP查询报文可能会产生ICMP差错报文) 2>目的地址是广播地址或多播地址的IP数据报 3>作为链路层广播的数据报 4

    1.3K10

    ICMP报文详解

    概述 ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。...ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。...其它字段都ICMP报文类型不同而不同。 1> ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和。 2> 8位类型和8位代码字段一起决定了ICMP报文的类型。...如:对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文,否则会出现死循环) ICMP差错报文(56字节) ICMP差错报告报文共有5种 1> 终点不可达:终点不可达分为:网络不可达,主机不可达...说明: 以下几种情况都不会导致产生ICMP差错报文 1>ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文) 2>目的地址是广播地址或多播地址的IP数据报 3>作为链路层广播的数据报 4

    2.6K30
    领券