Loading

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 不涉及到传输层,既然不涉及传输层就没有所谓的端口号了,那也就不是应用层程序了。

posted @ 2022-09-12 13:05  eiSouthBoy  阅读(2427)  评论(0编辑  收藏  举报