ping和traceroute的工作原理

ping和traceroute的工作原理PING原理PING是基于ICMP协议(网络层)工作的ICMP:InternetControlMessageProtocol,互联网控制报文协议ICMP用于报告传输过程中出现的问题,比如确认IP包是否成功送达,或者发送过程中被废弃的原因比如主机A向主机B发送消息,在途径某个路由器时,无法发现B的存在。路由器就会向A发送一个ICMP不可达的数据包,A解析ICMP的首部和数据段得知具体信息ICMP报文封装在IP包里,从左到右依次是IP头、ICMP头、ICMP数据段,后两部分构成IP

大家好,又见面了,我是你们的朋友全栈君。

PING原理

PING是基于ICMP协议(网络层)工作的

ICMP:Internet Control Message Protocol,互联网控制报文协议

ICMP用于报告传输过程中出现的问题,比如确认IP包是否成功送达,或者发送过程中被废弃的原因

比如主机A向主机B发送消息,在途径某个路由器时,无法发现B的存在。路由器就会向A发送一个ICMP不可达的数据包,A解析ICMP的首部和数据段得知具体信息

  • ICMP报文

封装在IP包里,从左到右依次是IP头、ICMP头、ICMP数据段,后两部分构成IP数据段。

ICMP 报文

ICMP是IP首部的“协议”字段来区分,不同ICMP以其首部的“类型”和“代码”来区分

类型字段

大致分为两类,一类是主动查询(回送),一类是通知差错

查询类是由主机主动发送的,差错类是由路由遭遇异常时发送的

内容 种类
0回送应答 查询
3目标不可达 差错
4原点抑制 差错
5重定向或改变路由 差错
8回送请求 查询
11超时 差错

回送消息

PING命令就是根据回送消息来实现的,用于判断消息是否成功到达对端。其中,主动发送的叫回送请求被动接收的叫回送应答

每发送一个消息,序号字段会自增1

目标不可达

当类型是目标不可达时,可以根据代码字段作进一步区分:

  1. 网络不可达:根本找不到目标IP网络
  2. 主机不可达:可以找到网络,但是找不到主机(可能未连接)
  3. 协议不可达:通过某种协议(比如TCP)访问目的主机时,防火墙禁止该协议访问
  4. 端口不可达:目的主机没有监听访问的端口
  5. 需要分片但设置了不分片

原点抑制

遇到网络拥堵/低速路线时,向源主机发送原点抑制消息,从而增大传输间隔(等)

重定向消息

路由器发现了一条更优的路由选择

超时消息

TTL减小到0时,IP包被丢弃,然后发送超时消息

  • PING

执行ping指令时发生了什么 ( A → B ) (A\rightarrow B) (AB),同一子网

  1. A构建ICMP回送请求消息(类型、序号、发送时间)
  2. 通过ICMP构建IP数据包(源IP、目的IP、协议)
  3. 添加MAC头(ARP映射表or发起ARP查询),获得数据帧(源MAC、目的MAC)
  4. B收到数据帧,检查目的MAC,检查目的IP
  5. 构建ICMP回送响应消息(类型、序号)
  6. A收到后计算RTT

TRACEROUTE原理

和PING类似,TRACEROUTE同样是利用ICMP实现,但是TRACEROUTE(基于UDP)使用的是差错报文类型

  1. 设置TTL,追踪途径的路由器
  2. 设置不分片,确定MTU

追踪路由

发送一连串的ICMP,TTL不断增大,使每次能比前一次多经过一个路由。每次能够获取一个ICMP超时消息,其中就包含了最新到达的路由IP

TRACEROUTE会给ICMP设置一个**“不可能”的端口号**,如果到达目的主机了,就会收到端口不可达

确定MTU

通过需要分片但设置了不分片的差错消息实现

当发送的ICMP不分片,且大小大于MTU时,会被路由丢弃,然后返回差错ICMP告知MTU大小

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162550.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • string的format方法_string str = new string(“abc”)

    string的format方法_string str = new string(“abc”)问题在开发的时候一段字符串的中间某一部分是需要可变的比如一个Textview需要显示”XXX用户来自上海年龄21性别男” 其中的XXX是用户名每个用户也是不一样的 地区上海为可变的string数据 年龄21为可变的int数据 性别男为可变的string数据 遇到这种情况你们是怎么样解决的呢?把这段字符串保存在常量类里吗?不!我们应该遵循Google的开发…

  • ubuntu: 查看cuda版本

    ubuntu: 查看cuda版本nvcc-V

  • Emgu CV3+C#图像处理(四):使用EmguCV获取摄像头、读取视频

    首先按(一)中的操作配置EmguCV,并添加系统动态链接库中的“System.Windows.Forms.dll”。示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Win…

  • 关于部分动态爬虫「建议收藏」

    关于部分动态爬虫「建议收藏」前言爬虫的动态处理方法(我用较为简单的一些网址举例比如豆瓣的热门电影)一、动态爬虫动态爬虫与静态爬虫的最大区别就是源代码与网页内容不同,动态爬虫可以通过抓包(就是直接利用浏览器的F12进行network抓包,获取相关对应的文件)二、使用步骤1.先通过网址找到需要的东西截图如下(示例):按F12进入开发者模式,第二步点击左上角刷新重新加载一下内容,第三步在红框里选取需要的内容,可以通过“预览”来查看是否对应查找正确之后然后在“标头”里找到“请求URL”以及“User-Agent”,把这些找到

  • navicat15激活码免费【在线注册码/序列号/破解码】

    navicat15激活码免费【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • blend基础_blender入门

    blend基础_blender入门http://wenku.baidu.com/view/eca9ec7301f69e31433294b5.html

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号