IP协议和ICMP协议
一、IP协议
1.1 IP协议的介绍
IP协议(Internet Protocol)是网络层的协议。
IP协议是TCP/IP协议族的核心协议,其主要包含两个方面:
-
IP头部信息。IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。
-
IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器之外的所有主机和路由器上。它们决定数据报是否应该转发以及如何转发。
1.2 IP协议的报文头部
IPv4的头部结构如下所示,其长度通常为20个字节(最多60个字节),除非含有可变长的选项部分
-
版本号(4位):指定IP协议的版本,此处为0100
-
IHL(4位):标识该IP头部有多少个32bit字(4字节),此处默认头部长度为20字节,故IHL为0101
-
服务类型(8位)包括一个3位的优先权字段,4位的TOS字段和1位的保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置位1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登陆程序需要的是最小延时服务,而文件传输程序ftp则需要最大吞吐量的服务。
-
总长度(16位)是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报的长度都远远没有达到最大值。
-
标识符(16位)唯一地标识主机发送地每一个数据报
-
标志字段(3位)地第一位保留。第二位表示"禁止分片"。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃该数据报并返回一个ICMP差错报文。第三位表示“更多分片”。除了数据报的最后一个分片外,其他分片都要把它置1。
-
分片偏移(13位)是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移量)。
-
生存时间(即TTL)(8位)是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见值位64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
-
协议(8位)用来区分上层协议,/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。其中ICMP是1,TCP是6,UDP是17。
-
头部校验和(16位)由发送端填充,接收端对其使用CRC算法以检验IP数据报头部在传输过程中是否损坏。
-
源端IP地址(32位)和目的端IP地址(32位)用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器
-
IPv4最后一个选项字段是可变长的可选信息。这部分最多包含40个字节,因为IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)
1.3 抓包验证报文信息
由以上抓包信息,可知1.2中介绍IP报文头部信息完全一致
二、ICMP协议
2.1 ICMP协议的介绍
ICMP协议是网络层协议,封装在IP数据报中。主要功能就是ping命令
和tracert命令
,可以检查网络的连通性和显示经过路径。
ICMP协议是TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层
ping 主机的ip后,得到不同的回复,对应不同的结果。
-
无法访问目标主机:没有网关或缺少目标主机MAC
-
请求超时:对方不在线或屏蔽 (即对方防火墙拦截)
-
传输失败:未获取MAC地址,导致无法进行ICMP封装
2.2 ICMP协议的报文头部
ICMP报文头部的3个固定字段(4字节):8位类型、8位代码和16位校验和
ICMP重定向报文的数据部分含义很明确,它给接收方提供了如下两个信息:
-
引起重定向的IP数据报的源端IP地址。
-
应该使用的路由器的IP地址。
接受主机根据这两个信息就可以断定引起重定向的IP数据报应该使用哪个路由器来转发,并且以此来更新路由表(通常是更新路由表缓冲,而不是直接更改路由表)
三、PING
如何判断主机A和主机B之间的网络是否通畅? 常用的方法是用 ping 命令(不是唯一方法)
关于ping命令是否为应用层程序,是否需要占用传输层端口号,是否能证明 主机A --> 主机B 网络通畅,也能证明 主机B --> 主机A 网络通畅?。。。
关于上述问题争论了很久,大家都各持己见,既然这样那就ping抓包分析看看(大家一致认同wireshark抓包分析方式)
由上图可以明显得出,ping 不涉及到传输层,既然不涉及传输层就没有所谓的端口号了,那也就不是应用层程序了。