网络诊断工具:ICMP、Ping 和 Traceroute 的原理与应用

文章目录

    • 一、ICMP:互联网控制消息协议
      • 1.1 ICMP 消息结构
      • 1.2 常见的ICMP 类型和代码
    • 二、Ping:网络连通性测试
      • 2.1 基本原理
      • 2.2 详细解析:Ping 的工作流程及其网络诊断功能
    • 三、Traceroute:路由追踪
      • 3.1 基本原理
      • 3.2 C 语言实现
    • 四、应用场景
    • 五、结论

在网络通信中,确保数据有效传输至目的地是至关重要的。为了诊断网络连接问题,工程师常用一些基本工具,如 ICMP、Ping 和 Traceroute。这些工具不仅帮助检测网络问题,还能辨识连接故障的具体位置。本文将深入探讨这些工具的工作原理及其在网络诊断中的应用。

一、ICMP:互联网控制消息协议

互联网控制消息协议(ICMP)是互联网协议套件的核心部分,主要用于在IP主机、路由器之间传递控制消息。控制消息是指网络通讯中的各种问题反馈,例如目的不可达、路由重定向、超时等。ICMP在网络诊断中扮演着监控和问题反馈的角色。

1.1 ICMP 消息结构

ICMP消息包含在IP数据包中,其基本结构包括:

 0                   1                   2                   3  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     类型 (Type)    |     代码 (Code)    |         校验和 (Checksum)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             可变字段                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      原始IP头部和数据的前8字节(如果有)                      ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明

  1. 类型 (Type):8位,标识ICMP消息的类型,例如回显请求(8)和目的不可达(3)。
  2. 代码 (Code):8位,进一步细化类型字段的信息,具体取决于类型。
  3. 校验和 (Checksum):16位,用于检查ICMP消息在传输过程中是否被破坏。
  4. 可变字段:这部分的内容根据ICMP消息的类型和代码不同而有所不同。例如,在回显请求和回显应答中,这部分包含了一个标识符和序列号。
  5. 原始IP头部和数据的前8字节:这部分通常用于错误消息,如目的不可达,以帮助发送者诊断问题。

1.2 常见的ICMP 类型和代码

  1. 目的不可达(Type 3)

    • 网络不可达(Code 0):无法到达目标网络。
    • 主机不可达(Code 1):无法到达目标主机。
    • 协议不可达(Code 2):目标网络无法识别请求的协议。
    • 端口不可达(Code 3):目标主机上没有进程监听目标端口。
    • 需要进行分片但设置了不分片位(Code 4):数据包太大,需要分片,但IP头部的不分片(DF)标志被设置。
  2. 超时(Type 11)

    • TTL超时(Code 0):数据包在网络中的生存时间(TTL)耗尽。
    • 分片重组超时(Code 1):IP分片在指定时间内未能完全重组。
  3. 回显请求(Type 8)和回显应答(Type 0)

    • 用于Ping操作,回显请求由发送端发出,接收端回复回显应答。
  4. 时间戳请求(Type 13)和时间戳应答(Type 14)

    • 用于同步网络上的日期和时间。
  5. 路由器通告(Type 9)和路由器选择(Type 10)

    • 用于路由器或主机发现网络上的路由器信息。

二、Ping:网络连通性测试

2.1 基本原理

Ping是基于ICMP协议的网络诊断工具,其基本功能是测试数据包能否通过网络到达特定的设备。Ping通过发送一个ICMP回显请求消息到目标地址,并等待接收ICMP回显应答。如果收到应答,说明目标可达;反之,则可能存在网络故障。Ping不仅可以检测网络是否连通,还能通过响应时间来评估网络延迟。

2.2 详细解析:Ping 的工作流程及其网络诊断功能

Ping 主要通过发送 ICMP 回显请求(Echo Request)消息并等待 ICMP 回显应答(Echo Reply)消息来实现其功能。下面是 Ping 使用 ICMP 协议的详细步骤:

步骤 1: 发送 ICMP 回显请求

  1. 初始化:当您在命令行输入 ping [目标IP地址或域名] 并执行时,Ping 程序开始工作。
  2. DNS 解析:如果您使用的是域名,系统首先解析域名以获取相应的 IP 地址。
  3. 构造 ICMP 消息:Ping 程序构造一个 ICMP 回显请求消息。这个消息包括:
    • 类型字段设置为 8(表示回显请求)。
    • 代码字段设置为 0。
    • 校验和字段,用于错误检测。
    • 标识符和序列号,用于标识回应的请求。
    • 可选的数据部分,通常包含时间戳和额外的填充数据,以帮助测量往返时间。
  4. 发送消息:ICMP 回显请求通过网络发送到目标 IP 地址。

步骤 2: 接收 ICMP 回显应答

  1. 等待应答:Ping 程序等待目标设备的响应。如果在特定时间内(通常是几秒)没有收到响应,Ping 程序可能会超时并尝试重新发送请求,或者报告丢包。
  2. 处理应答:如果目标设备可达并正确配置,它将接收到 ICMP 回显请求,并发送一个 ICMP 回显应答消息回来。这个应答消息的类型字段设置为 0(表示回显应答)。
  3. 接收并解析应答:Ping 程序接收到回显应答后,会解析消息,检查标识符和序列号以确认响应与请求匹配。
  4. 计算时间:Ping 程序使用发送时间和接收时间之间的差值来计算网络往返时间(RTT)。

步骤 3: 显示结果

  1. 输出信息:Ping 程序通常会显示每次回显请求和应答的结果,包括目标 IP 地址、ICMP 序列号、TTL(生存时间)、RTT 和是否有任何丢包。
  2. 统计信息:在一系列 Ping 尝试后,程序会提供一个总结,包括发送的总次数、接收的次数、丢包率等统计信息。

通过这种方式,Ping 利用 ICMP 协议提供了一个简单而有效的网络诊断工具,帮助用户诊断网络连接问题。

三、Traceroute:路由追踪

3.1 基本原理

Traceroute是一个用于显示数据包到达目标所经过的路径的工具。它通过发送一系列ICMP回显请求消息,每个消息的生存时间(TTL)逐渐增加,从1开始。每当数据包经过一个路由器,其TTL减1,当TTL减至0时,路由器会丢弃该包并发送一个ICMP超时响应回原始发送者。通过分析这些响应,Traceroute可以确定数据包传输过程中经过的所有路由器节点。

3.2 C 语言实现

下面是一个简化的 C 语言实现,用于展示如何发送 ICMP 回显请求,接收 ICMP 超时响应,并逐步增加 TTL 直到达到目标或达到最大 TTL 值。这个示例使用了原始套接字,因此需要 root 权限来运行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <errno.h>// 计算校验和
unsigned short checksum(void *b, int len) {    unsigned short *buf = b;unsigned int sum = 0;unsigned short result;for (sum = 0; len > 1; len -= 2)sum += *buf++;if (len == 1)sum += *(unsigned char *)buf;sum = (sum >> 16) + (sum & 0xFFFF);sum += (sum >> 16);result = ~sum;return result;
}// 主函数
int main(int argc, char *argv[]) {if (argc != 2) {printf("Usage: %s <ip>\n", argv[0]);return 1;}const char *ip_addr = argv[1];int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if (sockfd < 0) {perror("Socket error");return 1;}struct sockaddr_in dest_addr;dest_addr.sin_family = AF_INET;inet_pton(AF_INET, ip_addr, &dest_addr.sin_addr);struct icmp icmphdr;memset(&icmphdr, 0, sizeof(icmphdr));icmphdr.icmp_type = ICMP_ECHO;icmphdr.icmp_code = 0;icmphdr.icmp_id = getpid();icmphdr.icmp_seq = 0;icmphdr.icmp_cksum = checksum(&icmphdr, sizeof(icmphdr));char recvbuf[1024];struct sockaddr_in recv_addr;socklen_t addrlen = sizeof(recv_addr);for (int ttl = 1; ttl <= 30; ttl++) {setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));sendto(sockfd, &icmphdr, sizeof(icmphdr), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));int bytes = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&recv_addr, &addrlen);if (bytes > 0) {struct iphdr *iphdr = (struct iphdr *)recvbuf;struct icmp *icmp = (struct icmp *)(recvbuf + (iphdr->ihl << 2));if (icmp->icmp_type == ICMP_TIME_EXCEEDED) {printf("From %s icmp_seq=%d Time Exceeded\n", inet_ntoa(recv_addr.sin_addr), ttl);} else if (icmp->icmp_type == ICMP_ECHOREPLY) {printf("From %s icmp_seq=%d Echo Reply\n", inet_ntoa(recv_addr.sin_addr), ttl);break;}} else {printf("No reply for ttl=%d\n", ttl);}}close(sockfd);return 0;
}

注意事项

  1. 权限:因为这个程序使用原始套接字,它需要管理员权限来运行。
  2. 环境:这个程序应该在支持原始套接字的系统上运行,如 Linux。
  3. 安全性:发送和接收 ICMP 数据包可能会受到网络安全策略的限制。

这个程序展示了如何使用 C 语言在 Linux 环境下实现 Traceroute 的基本功能。在 Android 或其他平台上实现可能需要额外的配置和权限管理。

四、应用场景

  1. 网络状态检查:使用Ping定期检测关键设备的网络状态,确保网络的稳定性。
  2. 故障定位:当网络通讯出现问题时,Traceroute可以帮助快速定位问题发生的网络段或设备。
  3. 网络性能分析:通过分析Ping的响应时间,可以评估网络的延迟和稳定性。

五、结论

ICMP、Ping和Traceroute是网络管理中不可或缺的工具,它们简单而有效,能够帮助网络管理员监控网络健康状况,快速诊断和解决网络问题。掌握这些工具的使用方法和原理,对于维护一个稳定和高效的网络环境至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450919.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android取证简介(翻译)

在此文中&#xff0c;我们将探讨 Android 取证、获取 Android 设备的过程、反取证技术以及从 Android 设备映像分析和恢复已删除文件的实际示例。 # 本文中使用的关键术语 采集(Acquisition) &#xff1a; 在数字取证调查期间收集敏感数据 取证健全性(Forensically Soundnes…

【linux】Microsoft Edge 的 Bookmarks 文件存储位置

在 Linux 系统中&#xff0c;Microsoft Edge 的书签&#xff08;Bookmarks&#xff09;文件存储在用户的配置目录下。具体路径通常如下&#xff1a; ~/.config/microsoft-edge/Default/Bookmarks说明&#xff1a; 路径解释&#xff1a; ~ 表示当前用户的主目录。.config 是一个…

pinia学习笔记(1.0)

首先贴出官网地址&#xff1a;开始 | Pinia pinia作为Vue3项目中常用的状态管理工具&#xff0c;正逐渐取代vuex&#xff0c;现从0到1自己搭建pinia仓库。 首先&#xff0c;安装pinia&#xff0c;使用包管理器工具&#xff08;npm,pnpm,yarn,Bun等都可以&#xff09; 安装成…

UE5运行时动态加载场景角色动画任意搭配-相机及运镜(二)

通过《MMD模型及动作一键完美导入UE5》系列文章,我们可以把外部场景、角色、动画资产导入UE5,接下来我们将实现运行时动态加载这些资产,并任意组合搭配。 1、运行时播放相机动画 1、创建1个BlueprintActor,通过这个蓝图动态创建1个LevelSequence,并Play 2、将这个Bluep…

linux基本环境配置 安装Docker RedisMysql

目录 一、安装docker 1、卸载系统之前的docker 2、安装Docker-CE 3、启动docker 4、设置docker开机自启 5、root测试docker命令 6、配置docker镜像加速 二、Docker安装Mysql 1、下载镜像文件 2、创建实例并启动 3、修改MySQL字符集 4、设置容器自启动 三、Docker安…

CTFHUB技能树之SQL——MySQL结构

开启靶场&#xff0c;打开链接&#xff1a; 先判断一下是哪种类型的SQL注入&#xff1a; 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说明是整数型注入 判断一下字段数&#xff1a; 1 order by 2# 正常回显 1 order by 3# 回显错误&#xff0c;说明字段数是2列 知道…

Vue3嵌套导航相对路径问题

有如下的页面设计&#xff0c;页面上方第一次导航&#xff0c;两个菜单&#xff0c;首页和新闻 点击新闻&#xff0c;内容里面嵌套一个左侧和右侧&#xff0c;左侧有4条新闻&#xff0c;点击某一条新闻&#xff0c;右侧显示详情 代码如下&#xff1a; ​ File Path: d:\hello\…

【AIGC】ChatGPT提示词Prompt高效编写模式:思维链、Self-Consistency CoT与Zero-Shot CoT

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;思维链 (Chain of Thought, CoT)如何工作应用实例优势结论 &#x1f4af;一致性思维链 (Self-Consistency CoT)如何工作应用实例优势结论 &#x1f4af;零样本思维链 (Ze…

详细分析Redisson分布式锁中的renewExpiration()方法

目录 一、Redisson分布式锁的续期 整体分析 具体步骤和逻辑分析 为什么需要递归调用&#xff1f; 定时任务的生命周期&#xff1f; 一、Redisson分布式锁的续期 Redisson是一个基于Redis的Java分布式锁实现。它允许多个进程或线程之间安全地共享资源。为了实现这一点&…

51单片机数码管循环显示0~f

原理图&#xff1a; #include <reg52.h>sbit dulaP2^6;//段选信号 sbit welaP2^7;//位选信号unsigned char num;//数码管显示的数字0~funsigned char code table[]{ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//定义数码管显…

web前端-----html5----用户注册

以改图为例 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>用户注册</title> </hea…

彩色图片转灰度图

目录 原始彩色图片灰度图片代码 原始彩色图片 这张图片是原始的彩色图片&#xff0c;我们可以看到它的形状是 cloud is shape: (563, 703, 3)。 灰度图片 这张图片是将原始彩色图片转换为灰度后的图片&#xff0c;它的形状是 cloud_gary is shape: (563, 703)。 代码 以下是…

(C/C++)文件

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 fputc fgetc fputs fgets fprintf fscanf fwrite fread sprintf和sscanf snprintf ​编辑 4对比一组函数(prin…

【启明智显分享】ZX7981PM WIFI6 5G-CPE:2.5G WAN口,2.4G/5G双频段自动调速

昨天&#xff0c;我们向大家展现了ZX7981PG WIFI6 5G-CPE&#xff0c;它强大的性能也引起了一波关注&#xff0c;与此同时&#xff0c;我们了解到部分用户对更高容量与更高速网口的需求。没关系&#xff01;启明智显早就预料到了&#xff01;ZX7981PM满足你的需求&#xff01; …

reac nodejs 实现代码编辑器

地址 https://github.com/xiaobaidadada/filecat 说明

九盾叉车高位显示器:重塑叉车视界,引领高位精准

在繁忙的物流与仓储中&#xff0c;叉车不仅是力量与效率的化身&#xff0c;更是精准与安全的守护者。九盾安防&#xff0c;以科技之名&#xff0c;打造叉车高位显示器&#xff0c;彻底革新了货叉升降的盲区挑战&#xff0c;为物流、仓储及码头等领域带来了前所未有的作业体验。…

CTFHUB技能树之SQL——时间盲注

开启靶场&#xff0c;打开链接&#xff1a; 说明这关对所有信息都做了统一输出&#xff0c;换成延时注入试试 输入&#xff1a; 1 and sleep(15) &#xff08;这里不知道为什么加上--倒是会影响sleep()函数的触发&#xff0c;从而没有延时感&#xff09; 可以观察到有明显的延…

C++11新特性(4)

目录 1.包装器 2.线程库 2.1thread类的简单介绍 2.2线程函数参数 2.3原子性操作库(atomic) 2.4lock_guard与unique_lock 2.5mutex的种类 1. std::mutex 2. std::recursive_mutex 3. std::timed_mutex 4. std::recursive_timed_mutex 2.6lock_guard 2.7unique_lock 3.支持两个线…

【vue】指令补充+样式绑定+计算属性+侦听器

代码获取 知识总结 ⼀、指令补充 1.指令修饰符 1.1 什么是指令修饰符&#xff1f; 所谓指令修饰符就是让指令的 功能更强⼤&#xff0c;书写更便捷 1.2 分类 1.2.1 按键修饰符 keydown.enter&#xff1a;当enter键按下时触发 keyup.enter&#xff1a;当enter键抬起时触…

如何看待阿里通义千问团队发布Qwen2.5 MATH,效果怎么样,这是中国的草莓吗?

Qwen2.5-Math的发布标志着在数学问题解决领域的一个重要进展。这个由阿里通义千问团队发布的模型系列&#xff0c;通过结合Chain-of-Thought (CoT)和Tool-integrated Reasoning (TIR)技术&#xff0c;提升了对中英文数学问题的解决能力。Qwen2.5-Math系列包括基础模型和经过指令…