1. ping过程:

我们以下面一个网络为例:有A、B、C、D四台机子,一台路由RA,子网掩码均为255.255.255.0,默认网关为192.168.0.1

1、在同一网段内

在主机A上运行“Ping 192.168.0.5”后,都发生了些什么呢? 首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.0.5”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.0.5”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并想办法得到192.168.0.5的MAC地址(物理地址,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),以便交给数据链路层构建一个数据帧。关键就在这里,IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的MAC,如果以前两机有过通信,在A机的ARP缓存表应该有B机IP与其MAC的映射关系,如果没有,就发一个ARP请求广播,得到B机的MAC,一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。

2、不在同一网段内

在主机A上运行“Ping 192.168.1.4”后,开始跟上面一样,到了怎样得到MAC地址时,IP协议通过计算发现D机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的MAC取过来,至于怎样得到路由的MAC,跟上面一样,先在ARP缓存表找,找不到就广播。路由得到这个数据帧后,再跟主机D进行联系,如果找不到,就向主机A返回一个超时的信息。

2. iputils软件包:

执行ping -V:

baoli@ubuntu:~$ ping -V

ping utility, iputils-s20161105

可知ping命令属于iputils软件包,参考: iputils软件包

ping过程中会涉及两种协议:

  • ICMP

  • ARP:查找MAC地址

ping报文格式:

MAC + IP + ICMP

iputils中ping相关文件:

  • ping.c

  • ping6.c

  • ping_common.c

3. ping代码实现流程:

1. 首先创建raw socket:icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

2. 处理命令行选项

3. 如果没有指定源IP(网络接口),需要 创建probe_fd = socket(AF_INET, SOCK_DGRAM, 0),然后通过getsockname()找到源地址。

4. 通过setsockopt()设置各种选项

5. bind:bind(icmp_sock, (struct sockaddr*)&source, sizeof(source))

6. 发送icmp报文:pinger(),在send_probe()中先构造struct icmphdr *icp,然后通过sendmsg发送出去。

7. 接收ICMP消息:recvmsg(icmp_sock, &msg, polling),再通过parse_reply()解析消息。

8. 已达指定次数、ctrl+c等退出处理。其中ctrl+c利用Linux signal实现。

set_signal(SIGINT, sigexit);

set_signal(SIGALRM, sigexit);

set_signal(SIGQUIT, sigstatus);

Linux ping的原理与实现相关推荐

  1. Ping原理Linux,ping实现原理

    ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这 ...

  2. PING的原理以及ICMP协议

    主要内容: 1.ping的原理以及工作过程 2.ICMP协议 3.ICMP的应用:ping,traceroute 1.ping的原理以及工作过程  ping的原理  ping 程序是用来探测主机到主机 ...

  3. Linux 路由实现原理

    目录 前言 一.什么时候需要路由 1.1 发送数据时选路 1.2 接收数据时选路 1.3 linux 路由小结 二.Linux 的路由实现 2.1 路由表 2.2 路由查找 三.路由的使用方法 3.1 ...

  4. Linux 企业级安全原理和防范技巧

    Linux 企业级安全原理和防范技巧 1. 企业级Linux系统防护概述 1.1 企业级Linux系统安全威胁 1.2 企业级Linux系统安全立体式防范体系 1.2.1 Linux文件系统访问安全 ...

  5. ping工作原理和使用

     PING 工作原理 一.什么是 PING 是 DOS 命令,一般用于检测网络通与不通 ,也叫时延,其值越大,速度越慢 PING (Packet Internet Grope),因特网包探索器,用于测 ...

  6. linux ping 命令 参数详解,常用ping命令详解

    Ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用"ping"命令可以检查网络是否连通,可以很好地帮助我们 ...

  7. [转帖]linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...

  8. linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 Moblin Core是在Gnome Mobile的平台上建立.我以前玩Linux,提交的都和图像没有关系,连Xwindows都不用启动,开机后 ...

  9. linux命令菜鸟ping,Linux ping命令

    Linux ping命令 Linux ping命令用于检测主机. 执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 语 ...

最新文章

  1. pytorch 归一化与反归一化
  2. 解决“无法找到运行搜索助理需要的一个文件”
  3. linux图片添加滤镜,PhotoFlare开源图像和照片编辑器,附在Ubuntu 18.04下的安装方法...
  4. 详解Mysql中的JSON系列操作函数
  5. (二)再议MII、RMII、GMII接口
  6. android布局新建联系人,Android中设置搜素联系人的布局
  7. SQL Server 中 with tmp 临时表的用法
  8. 水泥行业超低排放政策频发,企业如何完成超低排放改造?
  9. 1.EKL在项目中担当的位置
  10. 275. H 指数 II
  11. 从CSDN博客到出书,我的新书《SQL编程思想》是这样诞生的
  12. 常见NoSQL的对比及使用场景(Redis,memcached,mongodb)
  13. 2021年制冷与空调设备运行操作最新解析及制冷与空调设备运行操作模拟考试题库
  14. 睢宁县计算机学校,睢宁管理好的计算机专业报考条件_汽车装修专业
  15. MAC 系统安装 Maven 及环境变量配置
  16. 关于su和sudo以及vi sudo 的权限讨论
  17. lazada API 获得商品评论列表
  18. 初识 OpenGL ES2.0
  19. 【算法题】2660. 保龄球游戏的获胜者
  20. vue同意本站协议的制作

热门文章

  1. HTML中显示的文字自动换行
  2. CONTROLLER_NAME 常量 当前访问的控制器
  3. 使用Java操作文本文件的方法详解
  4. Delphi-IOCP学习笔记三====工作线程和Listener
  5. Java中反射机制(Reflection)学习
  6. NAS优缺点完全剖析
  7. 6月第2周回顾:雅虎收购案谈崩 中国***成焦点
  8. 两表左连接count某一字段_表连接解决多日留存率问题|SQL
  9. android 抽象方法作用,android – 类必须声明为abstract或实现抽象方法
  10. linux怎么远程命令,Linux远程命令