ping和traceroute原理

极客逐星号说
• 阅读 3233

ping原理

ping主要是用来探测主机和主机之间是否可以进行通信,如果不能ping到某台主机,表示不能与这台主机建立连接。ping使用的是ICMP协议,他发送ICMP回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机,如果源主机在一定时间内收到应答,表明主机可达。ICMP协议是通过IP协议发送的,IP协议是无连接的,不可靠的数据报协议。

ping是用来检测网络是否畅通或者网络连接速度的命令

在同一网段内:

在主机 A 上运行“Ping 192.168.0.5”后,都发生了些什么呢?

首先,Ping 命令会构建一个固定格式的 ICMP 请求数据包, 然后由 ICMP 协议将这个数据包连同地址“192.168.0.5”一起 交给IP 层协议,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 层传过来的物理地址,源地址则是本机的MAC地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送 出去。 主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的MAC地址对比,如符合, 则接收;否则丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层 协议。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议,后者处理后,马上构建 一个 ICMP 应答包,发送给主机 A,其过程和主机 A 发送 ICMP 请求包到主机 B 一模一样。

在不同网段内:

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

Understanding Ping Command and ICMP with Examples

Traceroute原理

Traceroute是用来侦测由源主机到目的主机所经过的路由的情况的重要工具,也是最简洁的工具,尽管ping可以进行侦测,但是ping受到IP头的限制(IP首部字段最多只能放9个IP地址),ping不能完全记录所经过的路由器,所以才会引入Traceroute。

Traceroute原理:其实Traceroute的原理很简单,他收到目的主机IP后,首先给目的主机发送一个TTL=1(TTL指生存时间)的udp数据包,而经过的第一个路由器收到这个数据包之后,自动把TTL减去1,而TTL变为0之后,路由器就将这个数据包抛弃了,并同时产生一个主机不可达的ICMP超时数据报给主机。主机收到这个ICMP数据报以后,会发送一个TTL=2的数据报给目的主机,然后刺激第二个路由器给主机发送ICMP数据报,如此反复,直到到达目的主机。这样Traceroute就可以拿到所有路由器的IP,从而避开IP头只能记录有限路由的IP地址。

那么我们怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较小的端口,比如说80,比如说23,等等。而traceroute发送的是端口>30000(真变态)的UDP报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道目的主机到了。

————————————————

understanding traceroute

Exploring ICMP Protocol with Examples

Understanding Ping Command and ICMP with Examples

What is ICMP type?

icmp port

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
SSH公钥免密登录其他主机
在多台主机之间使用SSH免密登录,假设主机A免密登录主机B:1\.在主机A上生成自己的ssh公钥:root@A~sshkeygentrsa执行上面命令,一路回车,完成后,会在~/.ssh目录下生成2个文件:id\_rsa(私钥)和id\_rsa.pub(公钥)2\.将主机A上生成的公钥
Stella981 Stella981
3年前
CentOS “Destination Host Unreachable”问题解决办法
挑战极速安装CentOS时遇到局域网主机不能通信的情况:root@zjdnetworkscriptsping8.8.8.8PING8.8.8.8(8.8.8.8)56(84)bytesofdata.64bytesfrom8.8.8.8:icmp_seq1ttl40time28.0m
Wesley13 Wesley13
3年前
ubuntu16.04下mysql 配置(1)
现状   最近在学习WordPress,于是在windows10(以下称主机)下搭建了ubuntu16.04的虚拟机(以下称客机),主机IP:192.168.1.101,客机采用桥接方式连接,客机IP:192.168.1.102。问题   发现主机能ping通客机,客机也能ping通主机,但My
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
virtualbox主机与虚拟机之间互相通信教程
前言  在使用虚拟机搭建集群时,需要实现虚拟机与虚拟机之间互相ping通,并且主机与虚拟机也可以互相ping通。一、环境准备:1、主机为win72、virtualbox下创建两台ubuntu虚拟机二、virtualbox配置1、选中虚拟机,打开设置网络2、连接方式选择“桥接网卡”3、点开高级,混杂模式选择“全部允许”
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
ping命令使用及其常用参数
PING(PacketInternetGroper),因特网包探索器,用于测试网络连接量检查网络是否连通,可以很好地帮助我们分析和判定网络故障。Ping发送一个ICMP(InternetControlMessagesProtocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMP echo(ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。