TCP/IP-ICMP-Ping-Traceroute
TCP/IP-ICMP
作者:Danbo 2015-8-22
I C M P经常被认为是I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。I C M P报文通常被I P层或更高层协议( T C P或U D P)使用。一些I C M P报文把差错报文返回给用户进程。I C M P报文是在I P数据报内部被传输的。类型字段可以有1 5个不同的值,以描述特定类型的I C M P报文。某些I C M P报文还使用代码字段的值来进一步描述不同的条件。检验和字段覆盖整个I C M P报文。
ICMP报文
常见的类型和代码:
0 0 回显应答
3 3 端口不可达
8 0 请求回显
11 0 TTL超时(Traceroute会用到)
全部如下图所示:
注意:端口不可达只能针对UDP,如果是TCP的话就会回应TCP的RST包清理掉该连接请求。
不过基于安全和稳定方面的考虑,在开发应用程序的时候都会忽略ICMP不可达信息,但是会提供足够的信息让程序意识到这个问题的存在。
当发送一份I C M P差错报文时,报文始终包含I P的首部和产生I C M P差错报文的I P数据报的前8个字节。这样,接收I C M P差错报文的模块就会把它与某个特定的协议(根据I P数据报首部中的协议字段来判断)和用户进程(根据包含在I P数据报前8个字节中的T C P或U D P报文首部中的T C P或U D P端口号来判断)联系起来。
下面各种情况都不会导致产生I C M P差错报文:
1) ICMP差错报文(但是,I C M P查询报文可能会产生I C M P差错报文)。
2) 目的地址是广播地址或多播地址的I P数据报。
3) 作为链路层广播的数据报。
4) 不是I P分片的第一片。(只有第一片才有端口号信息)
5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许I C M P差错报文对广播分组响应所带来的广播风暴。
UDP端口不可达中返回ICMP报文的实例
PING
我们称发送回显请求的p i n g程序为客户,而称被p i n g的主机为服务器。
几年前我们还可以作出这样没有限定的断言,如果不能P i n g到某台主机,那么就不能Te l n e t或F T P到那台主机。随着I n t e r n e t安全意识的增强,出现了提供访问控制清单的路由器和防火墙(比如禁用了ping),那么像这样没有限定的断言就不再成立了。一台主机的可达性可能不只取决于I P层是否可达,还取决于使用何种协议以及端口号。
Ping的路径记录 选项:-R
p i n g程序为我们提供了查看I P记录路由( R R)选项的机会。大多数不同版本的p i n g程第7章Ping程序使用65 下载序都提供-R选项,以提供记录路由的功能。它使得p i n g程序在发送出去的I P数据报中设置I PR R选项(该I P数据报包含I C M P回显请求报文)。这样,每个处理该数据报的路由器都把它的I P地址放入选项字段中。当数据报到达目的端时, I P地址清单应该复制到I C M P回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当p i n g程序收到回显应答时,它就打印出这份I P地址清单。源端主机生成RR选项,中间路由器对RR选项的处理,以及把ICMP回显请求中的RR清单复制到ICMP回显应答中。即来去都要记录。
IP首部中的首部长度字段只有4 bit,因此整个I P首部最长只能包括1 5个32 bit长的字(即6 0个字节)。由于I P首部固定长度为2 0字节, R R选项用去3个字节(下面我们再讨论),这样只剩下3 7个字节( 6 0-2 0-3)来存放I P地址清单,也就是说只能存放9个I P地址。
IP记录路由选项结构:
Ping的IP记录会把出接口IP放入到清单中,最后一条会把入接口放入到清单中。后面讲的Traceroute记录的是入接口IP。
通过下面我们可以对比一下Ping和Traceroute记录IP的区别。
R1#traceroute 3.3.3.3
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 12.1.1.2 40 msec 24 msec 32 msec
2 23.1.1.3 40 msec 40 msec 40 msec
R1#ping ip
Target IP address: 3.3.3.3
Repeat count [5]: 1
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface:
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]: R
Number of hops [ 9 ]: 9
Loose, Strict, Record, Timestamp, Verbose[RV]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet has IP options: Total option bytes= 39, padded length=40
Record route: <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
Reply to request 0 (68 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route:
(12.1.1.1)
(23.1.1.2)
(3.3.3.3)
(23.1.1.3)
(12.1.1.2)
(12.1.1.1) <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
End of list
Traceroute
Tr a c e r o u t e程序可以让我们看到I P数据报从一台主机传到另一台主机所经过的路由。
Traceroute操作的过程:
它发送一份T T L字段为1的I P数据报给目的主机。处理这份数据报的第一个路由器将T T L值减1,丢弃该数据报,并发回一份超时I C M P报文。这样就得到了该路径中的第一个路由器的地址。然后Tr a c e r o u t e程序发送一份T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到T T L值为1的I P数据报,也不会丢弃该数据报并产生一份超时I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢?
Tr a c e r o u t e程序发送一份U D P数据报给目的主机,但它选择一个不可能的值作为U D P端口号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的U D P模块产生一份“端口不可达”错误的I C M P报文。这样,Tr a c e r o u t e程序所要做的就是区分接收到的I C M P报文是超时还是端口不可达,以判断什么时候结束。
下图是Traceroute的一个抓包过程实例:
我们发现源端口(49175)也很大。Traceroute程序将其发送的UDP数据报的源端口设置为Unix进程号与32768之间的逻辑或值。对于在同一台主机上多次运行Traceroute程序的情况,每个进程都查看ICMP返回的UDP首部的源端口号,并且只处理那些对自己发送应答的报文。1)、我们并不能保证现在的路由也是将来的所要采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。
2)、不能保证ICMP报文的路由与Traceroute程序发送的UDP数据报采用同一路由。这表明打印出来的往返的时间可能并不能真正体现数据报发出和返回的时间差(如UDP数据报从源到路由器的时间是1s,而ICMP报文用另一条路由返回信源用了3s时间,则打印出来的往返时间是4s)
3)、返回的ICMP报文中的源IP是UDP数据报达到的路由器接口的IP地址。这与IP记录路由选项不同,IP记录的记录的是发送接口的IP地址。
源站路由所指的每一个IP地址是如接口IP。分为严格和宽松,严格则必须每一条都是直连的;而宽松则没必要,只要经过的路由IP是在记录内即可。
一个Traceroute应用的实例:
有时候我们ping不通,此时有可能是ping包没有到达目的地,也有可能ping包无法返回。此时我们就用到Traceroute,目的IP写自己的IP地址,宽松源站路由写目的IP:Traceroute过去到了目的,然后再Traceroute回来。只要中间任何地方出现了不通就会报错,然后就知道问题出现在哪儿了。
默认情况下XP是不转发数据包的,交换机也是不转发包的。
ICMP重定向
当I P数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送I C M P重定向差错报文给I P数据报的发送端。只有当主机可以选择路由器发送分组的情况下,我们才可能看到I C M P重定向报文。
1) 我们假定主机发送一份I P数据报给R 1。这种选路决策经常发生,因为R 1是该主机的默认路由。
2) R1收到数据报并且检查它的路由表,发现R 2是发送该数据报的下一站。当它把数据报发送给R 2时,R 1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的L A N)。这样就给路由器发送重定向报文给原始发送端提供了线索。
3) R1 发送一份I C M P重定向报文给主机,告诉它以后把数据报发送给R 2而不是R 1。
我们做一下实验:
此时我们在Host上配置默认网关:default gataway 123.1.1.2,然后关闭Host的F0/0接口的路由功能:no ip routing。R2与R3运行OSPF,然后我们在Host上Traceroute 3.3.3.3发生了重定向:
R1#traceroute 3.3.3.3
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 123.1.1.3 28 msec 20 msec 16 msec
然后启动Host上的路由功能,配置指向R2的默认路由 ip route 0.0.0.0 0.0.0.0 123.1.1.2,此时我们抓包发现Host还是能收到R2发送的重定向消息,不过Host并不会理睬这个消息,因为自己有路由功能。
R1#traceroute 3.3.3.3
Type escape sequence to abort.
Tracing the route to 3.3.3.3
1 123.1.1.2 40 msec 12 msec 8 msec
2 123.1.1.3 16 msec 20 msec 20 msec
在生成I C M P重定向报文之前这些条件都要满足。
1) 出接口必须等于入接口。
2) 用于向外传送数据报的路由不能被I C M P重定向报文创建或修改过,而且不能是路由器的默认路由。
3) 数据报不能用源站选路来转发。
4) 内核必须配置成可以发送重定向报文。
主机在收到ICMP重定向消息后要做以下检查:
1) 新的路由器必须直接与网络相连接。
2) 重定向报文必须来自当前到目的地所选择的路由器。
3) 重定向报文不能让主机本身作为路由器。
4) 被修改的路由必须是一个间接路由。
TCP/IP-ICMP-Ping-Traceroute的更多相关文章
- TCP/IP 工具Ping
TCP/IP 工具Ping 在网络中Ping 是一个十分好用的TCP/IP工具.它主要的功能是用来检测网络的连通情况和分析网络速度. C:\Users\gechong>ping /? 用法: p ...
- <TCP/IP>ICMP报文的分类
Internet控制报文协议,即为ICMP(Internet Control Message Protocal),用于主机,路由器之间传递信息,其目的是让我们能够检测网路的连线状况﹐也能确保连线的准确 ...
- [TCP/IP]ICMP和IGMP的区别
ICMP(Internet 控制消息协议,Internet Control Message Protocol)协议用来给IP协议提供控制服务,允许路由器或目标主机给数据的发送方提供反馈信息.需要发送反 ...
- TCP/IP||ICMP
1.概述 ICMP为IP组成部分之一,传递差错报文并返回用户进程,在IP数据报内部被传输 类型字段可以有15个不同的值,以描述特定类型的ICMP报文,检验和字段覆盖整个ICMP报文. 2.报文类型 在 ...
- centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...
- TCP/IP详解 卷一(第七、八章 Ping、Traceroute程序)
Ping程序 Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达. 该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答. ping程序还能测出到这台主机的往返时 ...
- TCP/IP详解之:Ping程序、Traceroute程序
Ping程序: ping程序是通过发送一份ICMP回显请求报文(即ICMP报文的一种,其类型为8,代码为0)给主机,并等待返回ICMP回显应答 来测试另一台主机是否可达. ping程序不用经过传输层, ...
- TCP/IP协议学习之实例ping命令学习笔记
TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...
- TCP/IP——内外网IP+子网掩码作用+PING(网络总结)
目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...
- TCP/IP的网际层协议——ICMP
ICMP经常被认为是IP层的一个组成部分.它携带于IP数据包中,ICMP封装在IP数据包内部: IP首部 ICMP数据包 下面是一份差错报文的例子: 最右边的+或者-代表该报文是查询报文还是错误报文. ...
随机推荐
- js拖拽效果的实现
1.最基础的写法 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> < ...
- NYOJ90 整数划分(经典递归和dp)
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正 ...
- Careercup | Chapter 2
链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...
- Codeforces 323 B Tournament-graph
Discription In this problem you have to build tournament graph, consisting of n vertices, such, that ...
- Go语言:变参函数
变参函数: 函数中形式参数的数目通常是确定的,在调用的时候要依次传入与形式参数对应的所有实际参数,但是在某些函数的参数个数可以根据实际需要来确定,这就是变参函数. Go语言支持不定长变参,但是要注意不 ...
- SqlServer 并发事务:死锁跟踪(三)6种跟踪死锁的方法总结 大神
http://blog.csdn.net/kk185800961/article/details/42504857
- Silverlight 离线安装包
直接下载地址 https://www.microsoft.com/getsilverlight/locale/en-us/html/Microsoft%20Silverlight%20Release% ...
- NSThread学习
使用多线程可以防止主线程阻塞.同时也可以将一个大的任务分成若干个小的任务去做. 常用方法一: 1, 首先使用 detachNewThreadSelector:toTarget:withObject: ...
- 集合对象(NSSet,NSMutableSet,NSIndexSet)
NSArray:有序的集合,NSSet:无序的集合,散列存储. 但是NSSet保证数据的唯一性.当插入相同的数据时,不会有任何效果.从内部实现来说是hash表.NSMutableSet是NSSet的子 ...
- Direct2D教程(二)来看D2D世界中的Hello,World
引子 任何一门语言的第一个教程几乎都是Hello,world.我们也不例外,但是这里不是教大家打印Hello,world,而是编写一个简单的D2D绘制程序,让大家对Direct2D的程序结构及编程方法 ...