DNS和ICMP

域名介绍

在网络通信中,需要用到ip加port,但是ip并不方便记忆,于是我们常用域名来对应一个ip

例如:www.baidu.com    对应    156.36.56.98(随便写的)

com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) .

baidu: 二级域名, 公司名.

www: 只是一种习惯用法.

域名解析

域名解析分为两步

1.查本地 /etc/hosts

互连网信息中心(SRI-NIC)会管理一个 hosts 文件,本地主机只需要定期下载即可,里面就是域名和ip的对应

2.使用DNS技术

如果/etc/hosts找不到,那就去向本地DNS服务器发送请求进行查询,本地DNS服务器通常以守护进程形式存在

ICMP协议

ICMP协议是一个网络层协议,不保证可靠传输(没有超时重传机制),无连接,本地主机通过套接字和协议栈来处理响应,目标主机通过协议栈来处理请求,利用ICMP 响应报文来得到路由情况

ICMP 的报文格式 

标准 ICMP Echo Reply 报文格式​

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type(0)   |     Code(0)   |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Identifier          |        Sequence Number        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Data (可变长度,通常包含时间戳或填充字节)                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

ping 命令

ping www.baidu.com

ping命令过程分析:

在终端上写下了这几个字母,随着按下回车,终端模拟器将这几个字母write进主设备,然后驱动程序将主设备数据写进从设备,唤醒从设备等待队列上的进程也就是shell,然后shell读出来,分割字符串,然后创建子进程,进程替换为ping进程,域名通过命令行参数传给了ping进程,然后ping进程去/etc/hosts文件里面查找域名对应ip,如果找不到就向本地DNS守护进程发消息,然后DNS进程开始询问服务器,最后得到对应ip。ping进程接下来的操作如下:

步骤 1:创建原始套接字​

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sock < 0) {perror("socket");  // 需 root 权限或 CAP_NET_RAW 能力exit(1);
}

​步骤 2:构造 ICMP 报文​

  • ​报文结构​​:
    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(8)   |     Code(0)   |          Checksum             |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |           Identifier          |        Sequence Number        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                          Payload (可选)                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  • ​字段说明​​:
    • ​Type=8, Code=0​​:表示 Echo Request
    • ​Identifier​​:通常为进程 PID(用于响应能够查找到对应套接字)。
    • ​Sequence Number​​:递增序列号(区分多次请求)。
    • ​Checksum​​:ICMP 校验和(需手动计算)。

​步骤 3:发送报文​

struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr("93.184.216.34");  // 目标 IP// 发送 ICMP 报文
sendto(sock, icmp_packet, sizeof(icmp_packet), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));

​步骤 4:接收 Echo Reply​

char recv_buf[1024];
struct sockaddr_in src_addr;
socklen_t addr_len = sizeof(src_addr);// 阻塞等待响应(内核通过 Identifier 匹配报文)
recvfrom(sock, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&src_addr, &addr_len);

ping进程在应用层创建好原始套接字,并且创建好ICMP报文,然后用sendto发送,然后经过ip层和数据链路层封装后发出去,当目标主机收到后,经数据链路层和ip层的解包,交给了ICMP协议的接口,检查ICMP头里的类型,发现是请求,那就构建对应的ICMP响应,然后经IP协议和以太网协议的封装又发回去,源主机收到后开始解包,到ICMP协议层时,根据OS维护的hash表,通过响应里的identifier标识符,找到对应的套接字,然后将ICMP报文写进套接字接收缓冲区,并唤醒等待队列上的进程,ping进程recvfrom从接收缓冲区里读出来完整的ICMP报文,然后根据ICMP报文的内容,write写东西到从设备,终端驱动将从设备数据拷到主设备,然后唤醒终端模拟器,终端模拟器再将东西打到终端上,这就是一次发送数据测试,ping进程会不停发送echo request,并设置序列号来区分这些请求3

​完整流程:ping 命令的 ICMP 请求与响应全链路解析​


​1. ping 进程发送 ICMP Echo Request​

​(1)应用层(用户态)​

  1. ​创建原始套接字​

    int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

    • ​权限​​:需有CAP_NET_RAW (/bin/ping 已默认配置)。
    • ​作用​​:绕过传输层,直接操作网络层(IP)数据包。
  2. ​构造 ICMP Echo Request​

    • ​报文结构​​:

      Type=8 (Echo Request), Code=0

    • Identifier=进程PID, Sequence=递增序号

    • Payload=时间戳或填充数据

    • ​计算校验和​​:覆盖整个 ICMP 报文。
  3. ​发送请求​

    sendto(sock, icmp_req, sizeof(icmp_req), 0, &dest_addr, addr_len);

​(2)内核协议栈处理​

  1. ​IP 层封装​

    • 添加 IP 头部:
      • 源/目标 IP、TTL(默认 64)、协议号 1(ICMP)。
    • 查询路由表,确定下一跳 ip 地址和发送接口。
  2. ​数据链路层封装​

    • 添加以太网帧头:源/目标 MAC 地址、类型 0x0800(IPv4)。
    • 通过网卡驱动(如 eth0)发送到物理链路。

​2. 目标主机处理与响应​

​(1)网络接口接收​

  1. ​网卡(数据链路层)​

    • 检查目标 MAC 地址,若匹配则接收,剥离以太网帧头。
    • 将 IP 数据包交给内核网络协议栈。
  2. ​IP 层解包​

    • 校验 IP 头部(版本、校验和、目标 IP)。
    • 若 TTL 减至 0,丢弃并返回 ICMP Time Exceeded(Type=11)。
    • 若目标 IP 匹配本机,剥离 IP 头,根据协议类型是1, 交给 ICMP 模块。

​(2)ICMP 协议处理​

  1. ​解析 ICMP 报文​

    • 检查 Type=8(Echo Request),Code=0
    • 内核自动构造 Echo Reply(Type=0),保持相同的 Identifier 和 Sequence
  2. ​发送响应​

    • IP 层封装:源/目标 IP 互换,TTL 重置(如 64)。
    • 数据链路层封装:通过 ARP 获取源主机的 MAC 地址。
    • 网卡发送响应包。

​3. 源主机接收响应​

​(1)网络接口接收​

  1. ​网卡收包​

    • 过滤目标 MAC,剥离以太网帧头,IP 层校验后交给 ICMP 模块。
  2. ​ICMP 协议匹配​

    • 内核根据 Identifier(如 PID 1234)查找原始套接字。
    • 将报文写入套接字接收缓冲区。

​(2)唤醒 ping 进程​

  1. ​从阻塞中恢复​

    • ping 进程此前因 recvfrom() 阻塞,被内核移至就绪队列。
    • 从接收缓冲区读取 Echo Reply 数据。
  2. ​计算 RTT(往返时间)​

    • 对比当前时间与请求报文中的时间戳(Payload),得到延迟。

​(3)终端输出​

  1. ping 进程格式化输出​

    64 bytes from 93.184.216.34: icmp_seq=1 ttl=53 time=11.3 ms

    • ttl:从响应 IP 头部提取。
    • time:RTT 计算结果。
  2. ​终端显示流程​

    • ping 调用 write() 将结果写入标准输出(文件描述符 1)。
    • 终端驱动(如 tty)将数据从 ​​从设备​​(进程缓冲区)拷贝到 ​​主设备​​(终端显示器)。
    • 终端模拟器(如 xterm)渲染最终字符。

补充说明

1.ping 超时​​:内核未收到 Echo Replyrecvfrom() 超时后停止等待(等待默认 1 秒),靠sendto重发请求,也就是说ICMP协议是没有超时重传的功能的,真正能使其超时重传的是ping进程逻辑

2.ping发送请求到目标主机,目标主机通过硬件中断的协议栈就处理了该请求,根本就没涉及到进程和应用层逻辑

3.ping进程本身处理响应却是寄托协议栈加上进程和应用层逻辑,还使用了套接字

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

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

相关文章

2022 年 12 月青少年软编等考 C 语言六级真题解析

目录 T1. 电话号码T2. 区间合并T3. 扑克牌排序T4. 现代艺术思路分析T1. 电话号码 题目链接:SOJ D1137 此题为 2021 年 12 月六级第一题原题,见 2021 年 12 月青少年软编等考 C 语言六级真题解析中的 T1。 T2. 区间合并 题目链接:SOJ D1112 此题为 2021 年 9 月六级第三…

无锁队列:从零构建生产者-消费者数据结构

高性能无锁队列&#xff1a;从零构建生产者-消费者数据结构 问题的本质 生产者-消费者问题的核心挑战不在于数据传输&#xff0c;而在于协调。传统的锁机制虽然简单&#xff0c;但带来了三个致命问题&#xff1a; 性能瓶颈&#xff1a;线程阻塞和上下文切换优先级反转&#xff…

JAVA面试宝典 -《Spring IOC核心:Bean生命周期全解析》

文章目录&#x1f331; 《Spring IOC核心&#xff1a;Bean生命周期全解析》1️⃣ 引言&#xff1a;Bean 生命周期为什么重要&#xff1f;2️⃣ Bean 生命周期概览&#xff08;图示 简要说明&#xff09;3️⃣ 每一步详细解析&#xff08;源码理解 示例&#xff09;3.1 &#…

Python 类型注解实战:`Optional` 与安全数据处理的艺术

Python 类型注解实战&#xff1a;Optional 与安全数据处理的艺术 在 Python 开发中&#xff0c;类型注解&#xff08;Type Hints&#xff09;已经成为现代 Python 项目的标配。本文将通过一个真实的认证令牌获取函数 get_auth_token()&#xff0c;深入解析 Optional 类型的应用…

深入MyBatis:CRUD操作与高级查询实战

引言 在上一篇文章中&#xff0c;我们介绍了Mybatis的基础使用。 如有需要请移步查看&#xff1a; MyBatis入门&#xff1a;快速掌握用户查询实战https://blog.csdn.net/qq_52331401/article/details/149270402?spm1001.2014.3001.5502 今天&#xff0c;我将通过一个完整的…

Flink DataStream API详解(二)

一、引言 咱两书接上回&#xff0c;上一篇文章主要介绍了DataStream API一些基本的使用&#xff0c;主要是针对单数据流的场景下&#xff0c;但是在实际的流处理场景中&#xff0c;常常需要对多个数据流进行合并、拆分等操作&#xff0c;以满足复杂的业务需求。Flink 的 DataS…

Unity3D游戏线上崩溃排查指南

前言 排查Unity3D线上游戏崩溃是个系统工程&#xff0c;需要结合工具链、日志分析和版本管理。以下是详细的排查指南和关键步骤&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 一、崩溃信息收…

DPDK性能优化实践:系统级性能调优的方法论与实战(一套通用的方法论)

性能优化的挑战与现实困境 在高性能网络处理领域&#xff0c;性能优化往往被视为一门“玄学”而非科学。许多开发者在面对性能瓶颈时&#xff0c;要么盲目追求单一指标的极致优化&#xff0c;要么采用"试错法"进行零散的局部调优&#xff0c;结果往往是投入大量精力却…

Docker的/var/lib/docker/目录占用100%的处理方法

文章目录 一、问题描述 二、解决措施 三、可能遇到的问题 问题1、问题描述&#xff1a;执行 sudo systemctl stop docker 命令时&#xff0c;提示 Warning: Stopping docker.service, but it can still be activated by: docker.socket 问题2、问题描述&#xff1a;执行 s…

【UE教程/进阶】Slate链式编辑原理

目录链式编辑操作" . "操作" "操作" [ ] "链式编辑 SNew().&#xfeff;[] 操作" . " SLATE_ARGUMENT(ArgType, ArgName) 宏 调用宏 SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName) &#xff0c;在FArgument结构体中添加了变量…

将手工建模模型(fbx、obj)转换为3dtiles的免费工具!

文章目录1、工具下载2、使用说明3、详细说明命令行格式示例命令参数说明4、源码地址1、工具下载 百度网盘下载链接 选择最新版本下载即可&#xff0c;支持Linux和Windows系统 2、使用说明 1&#xff09;按住键盘winr键&#xff0c;在弹出的窗口中输入cmd 2&#xff09;点击…

FreeRTOS源码学习之内核初始化

目录 前言 一、主函数内容 二、osKernelInitialize ()内核初始化函数内容 三、IS_IRQ()宏定义中断检测函数内容 四、如果这篇文章能帮助到你&#xff0c;请点个赞鼓励一下吧ξ( ✿&#xff1e;◡❛)~ 前言 使用STM32CubeMX添加FreeRTOS进入工程之后&#xff0c;会自动在ma…

Docker—— 镜像构建原因

在现代软件开发和运维中&#xff0c;Docker已成为一种非常流行的工具&#xff0c;它通过容器化应用程序来简化部署过程。然而&#xff0c;默认的官方镜像往往只能满足基础需求&#xff0c;无法涵盖所有特定项目的具体要求。原因说明系统级改动无法通过 volume 实现修改用户、删…

锂电池自动化生产线的现状与发展

锂电池自动化生产线的概述锂电池自动化生产线是指采用自动化设备和控制系统&#xff0c;实现锂电池从原材料到成品的全流程自动化生产过程。随着新能源产业的快速发展&#xff0c;锂电池作为重要的储能元件&#xff0c;其生产制造技术也在不断进步。自动化生产线通过减少人工干…

java底层的native和沙箱安全机制

沙箱安全机制沙箱&#xff08;Sandbox&#xff09;安全机制是一种将程序或代码运行在隔离环境中的安全技术&#xff0c;旨在限制其对系统资源&#xff08;如文件系统、网络、内存、其他进程等&#xff09;的访问权限&#xff0c;从而降低潜在恶意代码带来的风险。其核心思想是“…

【分享】文件摆渡系统适配医疗场景:安全与效率兼得

根据国家信息安全相关法规要求&#xff0c;医院为了网络安全&#xff0c;大多会采用网闸等隔离手段&#xff0c;将网络隔离为内网和外网&#xff0c;但网络隔离后&#xff0c;医院的内外网间仍存在较为频繁的文件摆渡需求。文件摆渡系统则是可以解决跨网络或跨安全域文件传输中…

vscode 中的 mermaid

一、安装软件 Mermaid preview Mermaid support 二、运行命令 创建.md 文件右键选择 ​Open Preview​&#xff08;或按 CtrlShiftV&#xff09; 三、流程图 注意&#xff1a; 要md 文件要保留 mermaid 1. #mermaid-svg-nchqbvlWePe5KCwJ {font-family:"trebuchet ms"…

微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态

点击此处&#xff0c;了解微服务引擎 MSE 产品详情。

【TCP/IP】7. IP 路由

7. IP 路由7. IP 路由概述7.1 直接传递与间接传递7.2 IP 路由核心机制7.3 路由表7.3.1 路由表的构成7.3.2 信宿地址采用网络地址的好处7.3.3 下一跳地址的优势7.3.4 特殊路由表项7.3.5 路由算法7.4 静态路由7.4.1 特点7.4.2 自治系统&#xff08;AS&#xff09;7.4.3 配置命令7…

xFile:高性能虚拟分布式加密存储系统——Go

xFile&#xff1a;高性能虚拟分布式加密存储系统 目录xFile&#xff1a;高性能虚拟分布式加密存储系统1 背景介绍2 设计初衷与目标3 项目简介4 系统架构5 核心优势1. 真正的分布式块存储2. 块级加密与压缩&#xff0c;安全高效3. 灵活的索引与元数据管理4. 多用户与权限体系5. …