首页 >> 大全

二、 IP 地址的基础知识

2023-06-24 大全 47 作者:考证青年

文章目录 二、 IP 地址的基础知识 三、IP 协议相关技术

一、IP的基础认识

IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。

网络层的主要作用是 :实现主机与主机之间的通信,也叫点对点(end to end)通信。

网络层与数据链路层有什么关系呢?

其实很容易区分,在上面我们知道 IP 的作用是主机之间通信用的,而MAC 的作用则是实现直连的两个设备之间通信,而IP 则负责在没有直连的两个网络之间进行通信传输。

举个生活的栗子,小林要去⼀个很远的地方旅行,制定了⼀个行程表,其间需先后乘坐飞机、地铁、公交车才能抵达目的地,为此小林需要买飞机票,地铁票等。

飞机票和地铁票都是去往特定的地点的,每张票只能够在某⼀限定区间内移动,此处的区间内就如同通信网络中数据链路。

在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。

整个旅游行程表就相当于网络层,充当远程定位的功能,行程的开始好比源 IP,行程的终点好比目的 IP 地址。

如果小林只有行程表而没有车票,就无法搭乘交通工具到达目的地。相反,如果除了车票而没有行程表,恐怕也很难到达目的地。因为小林不知道该坐什么车,也不知道该在哪里换乘。

总之,其实链路层其实就是进行数据传输的,网络层就是转发的功能,地图作用,导向目的地。

因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与此类似,计算机网络中也需要数据链路层和网络层这个分层才能实现向最终目标地址的通信。

还有重要⼀点,旅行途中我们虽然不断变化了交通⼯具,但是旅行行程的起始地址和目的地址始终都没变。其实,在网络中数据包传输中也是如此,源IP地址和目标IP地址在传输过程中是不会变化的,只有源 MAC 地址和目标MAC ⼀直在变化。

二、 IP 地址的基础知识

在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。

IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以⼆进制的方式处理的。

而人类为了方便记忆采用了点分十进制的标记⽅式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「 . 」隔开,再将每组转换成⼗进制。

那么,IP 地址最大值也就是

也就说,最大允许 43 亿台计算机连接到网络。

实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

因此,让 43 亿台计算机全部连网其实是不可能的,更何况 IP 地址是由网络标识和主机标识这两个部分组成的,所以实际能够连接到网络的计算机个数更是少了很多。

可能有的小伙伴提出了疑问,现在不仅电脑配了 IP, 手机、IPad 等电子设备都配了 IP 呀,照理来说肯定会超过 43亿啦,那是怎么能够支持这么多 IP 的呢?

因为会根据⼀种可以更换 IP 地址的技术 NAT ,使得可连接计算机数超过 43 亿台。 NAT 技术后续会进⼀步讨论和说明。

IP 地址的分类

互联网诞生之初,IP 地址显得很充裕,于是计算机科学家们设计了分类地址。

IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。

上图中⻩色部分为分类号,用以区分 IP 地址类别。

什么是 A、B、C 类地址?

其中对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。这很好理解,好比小林是 A 小区 1 栋 101 号,你是 B 小区 1 栋 101 号。

我们可以用下面这个表格, 就能很清楚的知道 A、B、C 分类对应的地址范围、最大主机个数。

A、B、C 分类地址最⼤主机个数是如何计算的呢?

最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:

为什么要减 2 呢?

因为在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。

因此,在分配过程中,应该去掉这两种情况。

广播地址用于什么?

广播地址用于在同⼀个链路中相互连接的主机之间发送数据包。

学校班级中就有广播的例子,在准备上课的时候,通常班长会喊:“上课, 全体起立!”,班里的同学听到这句话是不是全部都站起来了?这个句话就有广播的含义。

当主机号全为 1 时,就表示该网络的广播地址。例如把 172.20.0.0/16 用二进制表示如下:

...

将这个地址的主机部分全部改为 1,则形成广播地址:

.. .

再将这个地址用十进制表示,则为 172.20.255.255 。

⼴播地址可以分为本地广播和直接广播两种:

什么是 D、E 类地址?

而D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。

多播地址用于什么?

多播用于将包发送给特定组内的所有主机。

还是举班级的栗子,老师说:“最后⼀排的同学,上来做这道数学题。”,老师指定的是最后一排的同学,也就是多播的含义了。

由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播。

多播使⽤的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。

从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:

IP 分类的优点:

不管是路由器还是主机解析到⼀个 IP 地址时候,我们判断其 IP 地址的首位是否为 0,为 0 则为 A 类地址,那么就能很快的找出网络地址和主机地址。

其余分类判断方式参考如下图:

所以,这种分类地址的优点就是简单明了、选路(基于网络地址)简单。

IP 分类的缺点:

这两个缺点,都可以在 CIDR 无分类地址解决。

无分类地址CIDR

正因为 IP 分类存在许多缺点,所以后面提出了无分类地址的方案,即 CIDR 。

这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号。

怎么划分网络号和主机号的呢?

表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于网络号, x 的范围是 0 ~ 32 ,这就使得 IP 地址更加具有灵活

性。

比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。

还有另⼀种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。

将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

为什么要分离网络号和主机号?

因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。

路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。

怎么进行子网划分?

在上面我们知道可以通过子网掩码划分出网络号和主机号,那实际上子网掩码还有⼀个作用,那就是划分子网。

子网划分实际上是将主机地址分为两个部分:子网络地址和子网主机地址。形式如下:

假设对 C 类地址进行子网划分,网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。

C 类地址中前 24 位是网络号,最后 8 位是主机号,根据子网掩码可知从 8 位主机号中借用2 位作为子网号。

由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00、01、10、11,具体划分如下图:

公有 IP 地址与私有 IP 地址

在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。

平时我们办公室、家里、学校用的 IP 地址,⼀般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是⼀样的。

就像每个小区都有自己的楼编号和门牌号,你小区家可以叫 1 栋 101 号,我小区家也可以叫 1 栋 101,没有任何问题。但⼀旦出了小区,就需要带上中山路 666 号(公网IP 地址),是国家统⼀分配的,不能两个小区都叫中山路 666。

所以,公有 IP 地址是有个组织统⼀分配的,假设你要开⼀个博客网站,那么你就需要去申请购买⼀个公有 IP,这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯⼀。

公有 IP 地址由谁管理呢?

私有 IP 地址通常是内部的 IT ⼈员管理,公有 IP 地址是由 ICANN 组织管理,中文叫互联网名称与数字地址分配机构。

IANA 是 ICANN 的其中⼀个机构,它负责分配互联网 IP 地址,是按州的方式层层分配。

IP 地址与路由控制

IP地址的网络地址这⼀部分是用于进行路由控制。

路由控制表中记录着网络地址与下⼀步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下⼀个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

下⾯以下图的网络链路作为例子说明:

主机 A 要发送⼀个 IP 包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10 ,由于没有在主机 A 的路由表

找到与目标地址 10.1.2.10 的网络地址,于是包被转发到默认路由(路由器 1 )路由器 1 收到 IP 包后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,发现匹配到了,于

是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器 2 的 10.1.2.1 这个接

口出去,最终经过交换机把 IP 数据包转发到了目标主机

环回地址是不会流向网络:

环回地址是在同⼀台计算机上的程序之间进行网络通信时所使用的⼀个默认地址。

计算机使用⼀个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是⼀个叫做 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。

IP 分片与重组

每种数据链路的最大传输单元 MTU 都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。

每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的MTU 也就不同。

其中,我们最常见数据链路是以太网,它的 MTU 是 1500 字节。

那么当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。

经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。

假设发送方发送⼀个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。

在分片传输中,⼀旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS 也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送⼀个大于 MTU 的数据报文。

IPv6 基本认识

IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 年 IPv4 地址就已经被分配完了。

但是 IPv6 的地址是 128 位的,这可分配的地址数量是大的惊人,说个段子 IPv6 可以保证地球上的每粒沙⼦都能被分配到⼀个 IP 地址。

但 IPv6 除了有更多的地址之外,还有更好的安全性和扩展性,说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。

但是因为 IPv4 和 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备⽀持,还需要⽹络运营商对现有的设备进⾏升级,所以这可能是 IPv6 普及率⽐较慢的⼀个原因。

IPv6 的亮点:

IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点。

IPv6 地址的标识方法:

IPv4 地址长度共 32 位,是以每 8 位作为⼀组,并用点分十进制的表示方式。

IPv6 地址长度是 128 位,是以每 16 位作为⼀组,每组用冒号 : 隔开。

如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 ::隔开。但是,⼀个 IP 地址中只允许出现一次两个连续的冒号。

IPv6 地址的结构:

IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。

IPv6 的地址主要有以下类型地址:

IPv4 首部与 IPv6 首部

IPv4 首部与 IPv6 首部的差异如下图:

IPv6 相比 IPv4 的首部改进:

三、IP 协议相关技术

跟 IP 协议相关的技术也不少,接下来说说与 IP 协议相关的重要且常见的技术。

DNS

我们在上网的时候,通常使用的方式是域名,而不是 IP 地址,因为域名方便人类记忆。

那么实现这一技术的就是 DNS 域名解析,DNS 可以将域名网址自动转换为具体的 IP 地址。

域名的层级关系:

DNS 中的域名都是用句点来分隔的,比如 ,这里的句点代表了不同层次之间的界限。

在域名中,越靠右的位置表示其层级越高。

毕竟域名是外国⼈发明,所以思维和中国人相反,比如说⼀个城市地点的时候,外国喜欢从小到大的方式顺序说起(如 XX 街道 XX 区 XX 市 XX 省),⽽中国则喜欢从⼤到⼩的顺序(如 XX 省 XX 市 XX 区 XX 街道)。

根域是在最顶层,它的下一层就是 com 顶级域,再下面是 。

所以域名的层级关系类似⼀个树状结构:

域名解析的工作流程:

浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就 检查本机域名解析⽂件hosts , 如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:

客户端首先会发出⼀个 DNS 请求,问 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 ,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“⽼⼤, 能告诉我 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明⼀条道路。根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“ 这个域名归 .com 区域管

理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 的 IP 地吗?”顶级域名服务器说:“我给你负责 区域的权威 DNS 服务器的地址,你去问它应该能问到”。本地 DNS 于是转向问权威 DNS 服务器:“⽼三,对应的IP是啥呀?” 的权威

DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

至此,我们完成了 DNS 的解析过程。现在总结⼀下,整个过程我画成了⼀个图。

DNS 域名解析的过程蛮有意思的,整个过程就和我们日常生活中找人问路的过程类似,只指路不带路。

ARP

在传输⼀个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机路由表确定 IP 数据包下⼀跳。然而,网络层的下⼀层是数据链路层,所以我们还要知道下⼀跳的 MAC 地址。

由于主机的路由表中可以找到下⼀跳的 IP 地址,所以可以通过 ARP 协议,求得下⼀跳的 MAC 地址。

那么 ARP 又是如何知道对方 MAC 地址的呢?

简单地说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。

操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC地址。

不过,MAC 地址的缓存是有⼀定期限的,超过这个期限,缓存的内容将被清除。

RARP 协议你知道是什么吗?

ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。

通常这需要架设⼀台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:

最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。

DHCP

DHCP 在生活中我们是很常见的了,我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。

接下来,我们来看看我们的电脑是如何通过 4 个步骤的过程,获取到 IP 的。

先说明一点,DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号。

这 4 个步骤:

⼀旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用DHCP 服务器分配的 IP 地址。如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:

可以发现,DHCP 交互中,全程都是使用UDP广播通信。

咦,用的是广播,那如果 DHCP 服务器和客户端不是在同⼀个局域网内,路由器又不会转发⼴播包,那不是每个网络都要配⼀个 DHCP 服务器?

所以,为了解决这⼀问题,就出现了 DHCP 中继代理。有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由⼀个 DHCP 服务器统⼀进行管理。

因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。

NAT

IPv4 的地址是非常紧缺的,在前面我们也提到可以通过无分类地址来减缓 IPv4 地址耗尽的速度,但是互联网的用户增速是非常惊人的,所以 IPv4 地址依然有被耗尽的危险。

于是,提出了⼀种网络地址转换 NAT 的方法,再次缓解了 IPv4 地址耗尽的问题。

简单的来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。

那不是 N 个私有 IP 地址,你就要 N 个公有 IP 地址?这怎么就缓解了 IPv4 地址耗尽的问题?这不瞎扯吗?

确实是,普通的 NAT 转换没什么意义。

由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的。

因此,可以把 IP 地址 + 端口号⼀起进行转换。

这样,就用⼀个全球 IP 地址就可以了,这种转换技术就叫网络地址与端口转换 NAPT。

很抽象?来,看下面的图解就能瞬间明白了。

图中有两个客户端 192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172 进行通信,并且这两个客户端的本地端口都是 1025。

此时,两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。

于是,生成⼀个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端 A、B 能同时与服务器之间进行通信。

这种转换表在 NAT 路由器上自动生成。例如,在 TCP 的情况下,建立TCP 连接首次握手时的 SYN 包⼀经发出,就会生成这个表。而后又随着收到关闭连接时发出 FIN 包的确认应答从表中被删除。

NAT 那么牛逼,难道就没缺点了吗?

当然有缺陷,肯定没有十全十美的方案。

由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:

如何解决 NAT 潜在的问题呢?

解决的方法主要有两种方法。

第⼀种就是改用IPv6:

IPv6 可用范围非常大,以至于每台设备都可以配置⼀个公有 IP 地址,就不搞那么多花里胡哨的地址转换了,但是IPv6 普及速度还需要⼀些时间。

第二种 NAT 穿透技术:

NAT 穿越技术拥有这样的功能,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目,注意这些都是 NAT设备后的应用程序自动完成的。

也就是说,在 NAT 穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它外发的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT 设备来建立映射了。

说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,就不需要 NAT 设备来进行转换了。

ICMP

ICMP 全称是 ,也就是互联网控制报文协议。

里面有个关键词 —— 控制,如何控制的呢?

网络包在复杂的网络传输环境里,常常会遇到各种问题。

当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。

ICMP 功能都有啥?

ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。

在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。

如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,

这时,路由器 2 就会向主机 A 发送⼀个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。

ICMP 的这种通知消息会使用IP 进行发送 。

因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收到该 ICMP

包的主机 A 则分解 ICMP 的⾸部和数据域以后得知具体发⽣问题的原因。

ICMP 类型:

ICMP 大致可以分为两大类:

IGMP

ICMP 跟 IGMP 是⼀点关系都没有的,就好像周杰与周杰伦的区别,大家不要混淆了。

在前面我们知道了组播地址,也就是 D 类地址,既然是组播,那就说明是只有⼀组的主机能收到数据包,不在⼀组的主机不能收到数组包,怎么管理是否是在一组呢?那么,就需要 IGMP 协议了。

IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间,如上图中的蓝色部分。

IGMP 工作机制:

IGMP 分为了三个版本分别是,、、。

接下来,以 作为例子,说说常规查询与响应和离开组播组这两个工作机制。

常规查询与响应工作机制:

路由器会周期性发送目的地址为 224.0.0.1 (表示同⼀网段内所有主机和路由器) IGMP 常规查询报文。主机1 和 主机 3 收到这个查询,随后会启动报告延迟计时器,计时器的时间是随机的,通常是 0~10

秒,计时器超时后主机就会发送 IGMP 成员关系报告报文(源 IP 地址为自己主机的 IP 地址,目的 IP 地址为组播地址)。如果在定时器超时之前,收到同⼀个组内的其他主机发送的成员关系报告报文,则自己不再发送,这样可以减少网络中多余的 IGMP 报文数量。路由器收到主机的成员关系报文后,就会在 IGMP 路由表中加⼊该组播组,后续网络中⼀旦该组播地址的数据到达路由器,它会把数据包转发出去。

离开组播组工作机制

离开组播组的情况⼀,网段中仍有该组播组:

主机 1 要离开组 224.1.1.1,发送 离组报⽂,报⽂的⽬的地址是 224.0.0.2(表示发向⽹段内的所有路由器)路由器 收到该报⽂后,以 1 秒为间隔连续发送 IGMP 特定组查询报⽂(共计发送 2 个),以便确认该⽹络是否还有 224.1.1.1 组的其他成员。主机 3 仍然是组 224.1.1.1 的成员,因此它⽴即响应这个特定组查询。路由器知道该⽹络中仍然存在该组播组的成员,于是继续向该⽹络转发 224.1.1.1 的组播数据包。

离开组播组的情况二,网段中没有该组播组:

主机 1 要离开组播组 224.1.1.1,发送 IGMP 离组报⽂。路由器收到该报⽂后,以 1 秒为间隔连续发送 IGMP 特定组查询报⽂(共计发送 2 个)。此时在该⽹段内,组 224.1.1.1 已经没有其他成员了,因此没有主机响应这个查询。⼀定时间后,路由器认为该⽹段中已经没有 224.1.1.1 组播组成员了,将不会再向这个⽹段转发该组播地址的数据包。 ping 的工作原理

在日常生活或工作中,我们在判断与对方网络是否畅通,使用的最多的莫过于 ping 命令了。

“那你知道 ping 是如何工作的吗?”

可能有的小伙伴奇怪的问:“我虽然不明白它的工作,但 ping 我也用的贼 6 啊!”

你用的是 6 ,但你在面试官面前,你就 6 不起来了,毕竟他们也爱问。

所以,我们要抱有知其然,知其所以然的态度,这样就能避免面试过程中,出门右拐的情况了。

IP协议的助手 —— ICMP 协议

ICMP 包头格式

ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。

查询报文类型

回送消息 —— 类型 0 和 8

回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的⼀种消息, ping 命令就是利用这个消息实现的。

可以向对端主机发送回送请求的消息( ICMP Echo ,类型 8 ),也可以接收对端主机发回来的回送应答消息( ICMP Echo Reply ,类型 0 )。

相比原生的 ICMP,这里多了两个字段:

在选项数据中, ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

差错报文类型

接下来,说明几个常用的 ICMP 差错报文的例子:

目标不可达消息 —— 类型 为 3

原点抑制消息 —— 类型 4

重定向消息 —— 类型 5

超时消息 —— 类型 11

目标不可达消息( ) —— 类型为 3

IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回⼀个目标不可达的 ICMP 消息,并在这消息中显示不可达的具体原因,原因记录在 ICMP 包头的代码字段。

由此,根据 ICMP 不可达的具体消息,发送端主机也就可以了解此次发送不可达的具体原因。

举例 6 种常见的目标不可达类型的代码:

a. 网络不可达代码为 0:

IP 地址是分为网络号和主机号的,所以当路由器中的路由器表匹配不到接收方 IP 的网络号,就通过 ICMP 协议以网络不可达( )的原因告知主机。

自从不再有网络分类以后,网络不可达也渐渐不再使用了。

b. 主机不可达代码为 1:

当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过 ICMP 协议以主机不可达( Host

)的原因告知主机。

c. 协议不可达代码为 2

当主机使⽤ TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防⽕墙已经禁⽌ TCP 协议访问,那么会通过 ICMP 协议以协议不可达的原因告知主机。

d. 端口不可达代码为 3:

当主机访问对端主机 8080 端口时,这次能找到对端主机了,防火墙也没有限制,可是发现对端主机没有进程监听8080 端口,那么会通过 ICMP 协议以端口不可达的原因告知主机。

e. 需要进行分片但设置了不分片位代码为 4:

发送端主机发送 IP 数据报时,将 IP 首部的分片禁止标志位设置为 1 。根据这个标志位,途中的路由器遇到超过MTU 大小的数据包时,不会进行分片,而是直接抛弃。

随后,通过⼀个 ICMP 的不可达消息类型,代码为 4 的报文,告知发送端主机。

原点抑制消息(ICMP ) —— 类型 4:

在使用低速广域线路的情况下,连接 WAN 的路由器可能会遇到网络拥堵的问题。

ICMP 原点抑制消息的目的就是为了缓和这种拥堵情况。

当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送⼀个

ICMP 原点抑制消息。

收到这个消息的主机借此了解在整个线路的某⼀处发生了拥堵的情况,从而增⼤ IP 包的传输间隔,减少网络拥堵的情况。

然而,由于这种 ICMP 可能会引起不公平的网络通信,⼀般不被使用。

重定向消息(ICMP ) —— 类型 5

如果路由器发现发送端主机使用了不是最优的路径发送数据,那么它会返回⼀个 ICMP 重定向消息给这个主机。

在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息告知发送端 ,让它下次发给另外⼀个路由器。

好比,本可以过条马路就能到的地方,但不知道,所以绕了⼀圈才到,后⾯知道后,下次就不会那么傻再绕⼀圈了。

超时消息(ICMP Time ) —— 类型 11

IP 包中有⼀个字段叫做 TTL ( Time To Live ,生存周期),它的值随着每经过⼀次路由器就会减 1,直到减到

0 时该 IP 包会被丢弃。

此时,路由器将会发送⼀个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。

设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。

此外,有时可以用 TTL 控制包的到达范围,例如设置⼀个较小的 TTL 值。

ping —— 查询报文类型的使用

接下来,我们重点来看 ping 的发送和接收过程。

同个子网下的主机 A 和 主机 B,主机 A 执行ping 主机 B 后,我们来看看其间发送了什么?

ping 命令执行的时候,源主机首先会构建⼀个 ICMP 回送请求消息数据包。

ICMP 数据包内包含多个字段,最重要的是两个:

每发出一个请求数据包,序号会自动加 1 。为了能够计算往返时间 RTT ,它会在报文的数据部分插⼊发送时

间。

然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,协议字段设置为 1 表示是 ICMP 协议,再加上⼀些其他控制信息,构建⼀个 IP 数据包。

接下来,需要加入 MAC 头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可

以直接使用;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建⼀个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上⼀些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。

接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。

主机 B 会构建⼀个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0 ,序号为接收到的请求数据包

中的序号,然后再发送出去给主机 A。

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。

此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

针对上面发送的事情,总结成了如下图:

当然这只是最简单的,同⼀个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。

但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过⼀个路由器到达⼀个新的局域网,需要换 MAC 头里面的 MAC 地址。

说了这么多,可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO (类型为 8 ) 和 ECHO REPLY(类型为 0)。

—— 差错报文类型的使用

有⼀款充分利用ICMP 差错报文类型的应用叫做 (在UNIX、MacOS中是这个命令,而中对等的命令叫做 )。

作用一

的第⼀个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。

的参数指向某个目的 IP 地址:

192.168.1.100

这个作用是如何工作的呢?

它的原理就是利用IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的⼀种方法。

比如,将 TTL 设置 为 1 ,则遇到第⼀个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时。

接下来将 TTL 设置为 2 ,第⼀个路由器过了,遇到第⼆个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。

这样的过程, 就可以拿到了所有的路由器 IP。

当然有的路由器根本就不会返回这个 ICMP,所以对于有的公网地址,是看不到中间经过的路由的。

发送方如何知道发出的 UDP 包是否到达了目的主机呢?

在发送 UDP 包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000 )。当目的主

机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型是端口不可达。

所以,当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。

作用二

还有⼀个作用是故意设置不分片,从而确定路径的 MTU。

这么做是为了什么?

这样做的目的是为了路径MTU发现。

因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,但是非以外网的 MTU 值就不⼀样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。

它的工作原理如下:

首先在发送端主机发送 IP 数据报时,将 IP 包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。

随后,通过⼀个 ICMP 的不可达消息将数据链路上 MTU 的值⼀起给发送主机,不可达消息的类型为需要进行分片但设置了不分片位。

发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位⼀个合适的 MTU 值,以便能到达目标主机。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了