大家好,又见面了,我是你们的朋友全栈君。
一、ping
ping 程序的主要目的是测试主机是否可达,它发送 ICMP 回显请求报文给目的主机,并等待返回 ICMP 回显应答
ping 程序一般会周期性持续地发送 ICMP 请求报文,除非用户手动终止,或指定了发送报文个数
回显请求和回显应答通过序列号(icmp_seq)进行匹配,下图中序列号依次为 1、2、3、4 …
ping 程序通过数据报中记录的发送请求时间值和接收到回显应答报文的当前时间值,计算往返耗时(time)
常见问题:
1. 为什么 ping 第一次一般会产生更多耗时?
因为 ping 第一次的时候,需要首先进行 ARP 解析,获取 IP 地址对应的 MAC 地址(同时将映射关系缓存),
而下次 ping 的时候会直接从 ARP 高速缓存读取,少了一个步骤,自然时间就缩短了!
二、traceroute
traceroute 程序的主要目的是获取从当前主机到目的主机所经过的路由
官方方案(TCP/IP详解里提供的基于 UDP 的方案):通过封装一份 UDP 数据报(指定一个不可能使用的端口,30000以上),依次将数据报的 TTL 值置为 1、2、3…,并发送给目的主机。当路径上第一个路由器收到 TTL 值为 1 的数据报时,首先将该数据报的 TTL 值减 1,发现 TTL 值为 0,而自己并非该数据报的目的主机,就会向源主机发送一个 ICMP 超时报文,traceroute 收到该超时报文,就得到了路径上第一台路由器的地址;然后照此原理,traceroute 发送 TTL 为 2 的数据报时,会收到路径上第二台路由器返回的 ICMP 超时报文,记录第二台路由器的地址;直到报文到达目的主机,目的主机不会返回 ICMP 超时,但由于端口无法使用,就会返回一份端口不可达报文给源主机,源主机收到端口不可达报文,证明数据报已经到达了目的地,停止后续的 UDP 数据报发送,将记录的路径依次打印出来,使命完成,结束任务。
注意:目的主机端口号最开始设置为 33435,且每发送一个数据报加 1,可以通过命令行选项来改变开始的端口号
约束:
1. 不能保证现在的路由也是将来所要采用的路由,甚至两份连续的 IP 数据报都可能采用不同的路由;
2. 不能保证 ICMP 报文的路由与 traceoute 程序发送的 UDP 数据报采用同一路由,时间测量可能不准;
3. 返回的 ICMP 报文中的信源 IP 地址是 UDP 数据报到达的路由器接口的 IP 地址;
当从网络1某主机执行 traceroute 程序到网络3某主机,返回的路径将是 if1 和 if3 的地址;
而反方向,将打印出 if4 和 if2 的地址
缺陷:
1. 中间路由器有可能做了限制,不返回 ICMP 超时报文,traceroute 就无法获得其地址了,
只能打印出 * 或 no reply
2. 目的主机可能由于安全原因不会向源主机返回端口不可达的 ICMP 报文,
尽管探测数据报已经到达了目的主机,但 traceroute 程序收不到端口不可达报文,就仍会持续发送请求 …
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162536.html原文链接:https://javaforall.cn