ping的详细过程学习笔记

2023-05-16

 pc1---ping ---pc2   也就是pc1:192.168.1.1    ping   pc2:192.168.1.2   属于同一网段的ping过程

步骤1、ping开始------------------------------------------即后台运行192.168.1.1  ping 192.168.1.2

解释:ping过程是源主机ICMP协议发送一个ICMP协议报文给目的主机的ICMP协议,目的主机收到ICMP报文后,ICMP协议规则规定收到请求报文要强制回一个应答报文给源主机。源主机收到应答报文后一次完整的ping过程才算完成。ICMP(internet-control-message-protocol)网际控制信息报文---名字就说明此报文的用途,发送一些网络间控制信息的报文。比如ping中强制应答就是控制信息。ICMP属于TCP/IP网际层,调用同样位于网际层的IP协议,只是比IP层更接近上层而已,ICMP协议号是1。

步骤2、PC1开始封包---------------------------------------确切说是pc1的TCP/IP协议簇开始封包

解释:封包就是把要发送的数据封装在有固定头部格式的协议内方便传输中识别和控制。比如实时语音包(手机打电话的数据)就要求特别对待优先处理;再比如你发送1G的数据,不可能一次一个包发送完,要根据规则分割成一小块一小块的数据进行多次发送。再比如你发送的是银行密码和存款金额,就要求稳定传输和保密传输,这些控制的规则信息、加密的规则信息、都在封包的包头里有对应的标识。此处ping命令对应的操作实际是ICMP协议调用同层(调用也不全是上层调用下层)的IP协议向目的地址发包,IP协议会通过协议号1来标注是ICMP协议让我发包的,到目的地后以这个协议号为依据把包交给ICMP协议。IP协议封装源IP和目的IP,也就是ping命令中源和目的IP地址,然后把包交给下层即数据链路层,数据链路层会用协议号0x0800标注是IP协议让我发的这个包,以便传到目的地址时交给对方的IP协议。因为此过程一直没用到四层的端口号,所以ICMP属于三层协议。数据链路层会检查包的头部封装的目的IP,然后到pc1的mac地址表中找目的IP对应的二层mac地址。因为二层设备在发送过程中是不认识IP地址的(因为IP属于三层的编址,二层设备不识别),只认MAC地址,mac地址是烧录在网卡中的全球唯一,每个交换机接口也有一个全球唯一的mac地址。数据链路层在pc1的mac地址表中找目的IP对应的mac发现找不到,封装失败。

步骤3.没有目的Mac---封包失败,开始找目的IP的Mac地址--------------------------------------即ARP找目的Mac

解释:ARP(address resolution protocol)---地址解析协议-----就是通过IP地址找Mac地址的过程。PC1的TCP/IP协议簇的数据链路层调用ARP协议完成地址解析。ARP协议发送一个目的IP为192.168.1.2,源地址为192.168.1.1,目的Mac为全0,源Mac地址为pc1mac的ARP请求包。目的Mac为全0的二层广播就像IP地址主机位全为F的广播一样,交换机收到此广播后,会向网络内所有接口发送-也叫泛洪。在此过程,交换机1学到了如下信息(交换机1接口1-------IP:192.168.1.1---mac:pc1mac)。PC2的Mac地址表学到如下信息(IP:192.168.1.1-----mac:pc1mac)。备注,此过程路由器1接口1也会收到泛洪包,检查目的地址不是自己随即丢弃包,并不做任何回应。----这也体现了广播或者泛洪的坏处,白干活,没效果(拆包--检查---丢弃)。

同一网络内主机收到此arp请求数据包(此时叫frame---二层数据包标准称呼),会拆包检查三层的IP地址,不一致的丢弃,一致的回ARP-reply包。arp-reply包内容自动填自己的mac地址为源mac。此处为PC2发送,包的头部如下:sourcemac:pc2mac--destinationmac:pc1mac--sourceIP:192.168.1.2--destinationIP:192.168.1.1。pc1会收到此包,拆包,填pc2的mac地址和IP在mac地址表中。在此过程,交换机1学到了如下信息(交换机1接口2-------IP:192.168.1.2---mac:pc2mac)。PC1的Mac地址表学到如下信息(IP:192.168.1.2-----mac:pc2mac)。

步骤4.重新封包发送

解释:pc1封包如下:smac:pc1mac--dmac:pc2mac--sip:192.168.1.1--dip:192.168.1.2,从网卡发包给交换机1接口1,交换机在ARP过程学到红字标注的信息,建立了自己的mac地址转发表。查看收到pc1的包头目的Mac地址为PC2Mac直接从接口2转发出去。PC2收到包后核对目的mac和自己一致,开始解包,根据包头标注上层协议号0x0800把包头丢掉,数据传给IP协议,IP协议检查IP地址一致后根据上层协议号1把包头丢掉,数据传给ICMP,ICMP根据数据中的type=0code=0得知是echo-request即要回应的请求报文,就会立即发送一个返回的ICMP报文的echo-reply即回应应答报文。

简述:1.pc1-ping -pc2-------2.pc1准备封包发送--------3.发现没pc2的Mac-------4.ARP请求PC2的Mac(发请求时交换机1学到接口1连接pc1,回请求时交换机1学到接口2连接pc2)------5.重新封包--------6.pc1发包给交换机1接口1-----7.交换机1根据转发表从接口2发出------8.pc2收到包,并按要求回包-------9.pc2发包给pc1-----10.pc1收到回包,一次完整内网ping包过程完成。

外网ping过程:(此例为:pc1--ping--pc3----------192.168.1.1--ping --172.16.1.1)

1.ping开始

2.ICMP协议检查目标IP不在同一网段,直接发包给网关

3.封包时,有网关Mac直接封包,如果没有网关Mac

4.arp网关IP,请求网关mac,此例为arp   192.168.1.254

5.完成封包,发包给网关(目的Mac:路由器1接口1Mac--源Mac:pc1网卡mac--目的IP:172.16.1.1--源IP:192.168.1.1)

6.路由器1接口1收到包后,检查包头目的Mac和自己接口1Mac一致拆包,不一致丢弃。

7.检查Mac一致后,拆开二层包头后丢弃包头,转交给包头中标注的上层协议IP协议处理,IP协议检查三层包头,根据目的IP找路由表对应下一跳接口,此处路由表中有172.16.1.0网络条目(每个途径的路由器的路由条目都应该有目的IP的路由,否则会因为路由不可达而ping不通,路由条目一般由路由协议动态获得,如网络简单也可手工静态建立,现实网络中在路由协议建立邻居的时候其实已经获得邻居的mac地址,完成了地址表的建立,ping包会自动在网络中畅通传输,不需要每一步都arp,只有在首尾两端客户机上才偶尔会用到arp)

8.如果路由表中没有目的IP对应的出口,则丢弃包,并返回给源IP一个relay报文,告知对方报文不可达。

9.路由器1找到下一跳后重新封包,(目的Mac:路由器2接口1Mac--源Mac:路由器1接口2Mac-目的IP:172.16.1.1--源IP:192.168.1.1)

10.如果mac地址表(路由器也有此表)中没有下一跳接口地址对应的mac,ARP查询获取后封包。

11.路由器2从接口1收到包后,核对目的Mac和接口1的mac一致,拆包,丢包头,根据包头协议号,把包转给上层协议IP协议处理。

12.IP协议检查目的IP,找路由表对应条目(此条目包含下一跳IP或根据出接口能递归查询到下一跳IP地址)发送出去,发送前封包(目的Mac:路由器3接口1Mac--源Mac:路由器2接口2Mac-目的IP:172.16.1.1--源IP:192.168.1.1)

13.路由器3接口1收到包,查包目的Mac和接受接口1mac,不一致,拆包,一致,拆包,丢掉二层包头,交给上层协议IP处理,IP根据目的IP,找到出口,arp获得或查表得下一跳Mac,封装,发给下一跳。(目的Mac:pc2网卡Mac--源Mac:路由器3接口2Mac-目的IP:172.16.1.1--源IP:192.168.1.1)

14.pc2网卡收到包后,查mac一致,拆包,丢包头,转给上层协议(IP协议)处理,IP检查目的IP和自己IP一致,拆包,丢包头,根据包头指定协议号把包转给上层协议ICMP,ICMP根据协议规则查看type=0code=0是个echo-relay报文,立即给源地址发送echo-relay报文。

15.pc1接受到echo-relay报文得知网路畅通。ping一次完整过程完成。

总结:ping包在传递过程中,是一跳一跳转发的,每经过一个交换机,不停留不拆包直接按目的mac转发,每进过一个路由器拆封包一次。更换二层包头,去掉上一网段Mac地址,换成下一网段Mac地址。在ping包的整个传输过程中,源IP和目的IP始终不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ping的详细过程学习笔记 的相关文章

  • 桥接模式下电脑主机ping不通虚拟机,出现 :无法访问目标主机。而虚拟机能ping通主机

    1 我的状况描述 xff1a 主机 win7 ip 192 168 0 103 自动分配 xff0c 虚拟机 centos6 7桌面版 ip xff1a 192 168 0 105 昨天刚安装好了虚拟机 xff0c 主机与虚拟机直接都能相互
  • Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,报连接不上服务器的错误解决方案:...

    http askubuntu com questions 711889 err apt get update on ubuntu 14 04 br br br 即使给Ubuntu配置了代理 xff0c terminal能ping通网络 xf
  • 能ping通,但是不能wget或curl

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 当出现http接口请求超时时 xff0c 可以从以下几个方面排查问题 xff1a 检查接口服务本身是否正常 xff1b 检查接口所在服务器的防火墙是否开启 xff0c 尝试
  • 计算机网络-网络层

    网络层 1 前言 2 网络层的作用 3 网络层数据交换 4 网络层协议及报文格式 5 ARP与RARP 6 国际控制报文协议ICMP 1 前言 网络层介于传输层和数据链路层之间 其主要作用是实现两个网络系统之间的数据透明传送 具体包括路由选
  • ping 不通百度问题的解决

    ping 不通百度问题的解决 问题 网络能够ping通百度的ip地址 115 239 210 27这个ip地址 但是ping www baidu com长时间等待无反应 解决方式 碰到这个问题两次了 每次都挺无奈的 第一次解决是通过回退快照
  • Java InetAddress.isReachable() 超时

    我试图查明我的网络上的特定主机是否可以访问 我的java代码如下 InetAddress adr InetAddress getByName host if adr isReachable 3000 System out println h
  • 使用 PHP 创建 ping 正常运行时间服务

    我有一台可以使用 PHP 的服务器和一个可以从 Internet ping 通的路由器 我想编写一个 PHP 脚本 每 5 分钟向路由器发送一次 ping 结果如下 如果 ping 成功 则不会发生任何事情 如果 ping 失败 则会等待几
  • Python 控制台和 Ping 的文本输出,包括 \n\r [重复]

    这个问题在这里已经有答案了 我不知道发生了什么 但是当我打印到控制台或文本文件时 换行符 n 不起作用 而是显示在字符串中 知道如何在控制台和文本文件中避免这种情况吗 My code import subprocess hosts file
  • 如何使用本机 python 执行 ping 或 Traceroute?

    我希望能够从 Python 中执行 ping 和跟踪路由 而不必执行相应的 shell 命令 所以我更喜欢本地 python 解决方案 如果您不介意使用外部模块并且不使用 UDP 或 TCP scapy是一个简单的解决方案 from sca
  • 为什么 Ping 超时无法正常工作?

    我有 5 台电脑 我想 ping 这台电脑是否可用 所以我使用 C Ping 类 两台电脑可用 但当我对它们执行 ping 操作时 另外 3 台电脑已关闭 我的程序等待至少 7 秒才能响应 我只想检查 1000 毫秒并返回 OK 或 ERR
  • 发送 ICMP ping

    对于 ICMP ping 请求 回显请求 我是否需要获取目的地的 MAC 地址 我正在尝试学习如何使用原始套接字在 C 中实现此功能 但无法理解如何获取目标的 MAC 地址 任何帮助表示赞赏 谢谢 我需要获取目的地的MAC地址吗 不 在大多
  • 使用 WMI 和 C# 检测机器是否在线或离线

    我使用vs2008 winxp 在局域网中使用Win2003服务器 我想要在winxp中安装一个应用程序来检测win2003机器是否在线或离线 以及启动时是否离线 我有这个参考资料 还有更多参考资料 代码示例和最佳实践吗 http dani
  • mac dns 查找行为不当

    买了一台新 Mac 现在我正在尝试安装 更新一些东西 我遇到的第一个问题是 从内部脚本 程序 例如 git 或 ruby gem 发出的 http 请求不起作用 我将在下面举一个我使用的解决方法的示例 因为它比任何解释都更好地说明了问题 任
  • 我想在 ping 主机后获取 ping 执行时间和结果字符串

    我想在 ping 主机后获取 ping 执行时间和结果字符串 我该怎么做 long currentTime System currentTimeMillis boolean isPinged InetAddress getByName se
  • 为什么我可以 ping 通服务器但无法通过 SSH 连接? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当我 ping 我的服务器时 它响应 user localhost ping my server PING my server 111 111 111
  • 来自 Azure Function 的 Ping 服务器

    我有以下 Azure 函数 但失败了访问被拒绝 忽略逻辑很奇怪的事实 我只是在做第一次测试 public static void Run TimerInfo myTimer ILogger log List
  • 检查 Android/Java 上的端口是否打开

    我想检查端口是否打开 或者服务器是否正在其上运行 我已经以多种方式尝试过 例如 system bin ping 和 InetAddress 但如果我是对的 我无法使用这些 ping 特定端口 这次我用 DatagramSockets 的想法
  • PHP 如何在没有 system() 或 exec() 的情况下 ping 服务器

    我正在尝试 ping 服务器 但我的主机被禁用exec and system 由于安全原因 是否还有其他选项可以让它工作 或者我是否必须要求我的主机启用它们 我得到的错误 警告 出于安全原因 system 已被禁用警告 出于安全原因 exe
  • 如何获取 bash 中从 Ping 接收到的数据包的百分比?

    当 ping 主机时 我希望输出仅显示收到的数据包 已发送 5 个 的百分比 我想我需要使用grep不知怎的 但我不知道如何 我是 bash 编程的新手 这是我所在的地方 ping c 5 q host grep grep 中应该包含什么
  • 为什么 youtube.com 解析后的 IP 会指向 google.com? [复制]

    这个问题在这里已经有答案了 这可能是一个非常愚蠢的问题 但我很好奇 对 youtube com 的 ping 显示解析的 IP 为 74 125 127 93 现在 如果你在浏览器中访问这个IPhttp 74 125 127 93 http

随机推荐