计算机网络整合复习(上)

TCP/IP五层模型和OSI七层模型

所谓**通信协议就是通信双方都必须要遵守的通信规则。**如果没有网络通信协议,计算机的数据将无法发送到网络上,更无法到达对方计算机,即使能够到达,对方也未必能读懂。有了通信协议,网络通信才能够发生。
在这里插入图片描述
可以看到七层模型相比于五层模型,就是在应用层和传输层之间增加了表示层和会话层,那么结合我们上述提到的通信协议,我们可以提出一个问题,模型有这么多层,难道用的都是相同的通信协议吗?

答案是否定的,协议的实现是很复杂的。因为协议要把人读得懂的数据,如网页、电子邮件等加工转化成可以在网络上传输的信号,需要进行的处理工作非常多。
两个系统中实体间的通信是一个十分复杂的过程。为了减少协议设计和调试过程的复杂性,网络协议通常都按结构化的层次方式来进行组织,每一层完成一定功能,每一层又都建立在它的下层之上。不同的网络协议,其层的数量、各层的名字、和功能不尽相同。

也就是说每一层其实都是在下一层的基础上,通过接口调用向上一层提供服务,而且调用的服务细节对上层是屏蔽的。

那么问题又来了,每一层之间所用的协议不同,那么他们怎么互相通信,并且下一层还可以给上层提供服务呢?

1)对等层之间通信(不同开放系统中的相同层次之间的通信,对等层实体之间的信息交换):OSI 标准为每一层的通信都严格定义了 协议数据单元 PDU的格式对等层之间的通信是目的,对等层实体的协作保证该层功能和服务的实现
2)相邻层之间通信(相邻的上下层之间的通信,属于局部问题):相邻层之间的通信是手段,保证对等层实体之间的通信得以实施

⭐ 假设网络协议分为若干层,那么 A、B 两节点通信,实际是节点 A 的第 n 层与节点 B 的第 n 层进行通信,故协议总是指某一层的协议,例如物理层协议、传输层协议、应用层协议。每一相邻层协议间有一接口,下层通过该接口向上一层提供服务。

物理层

两台计算机之间要进行通信,必然需要传输介质/物理媒介来连接两台计算机,这样,我们才能把数据传输过去。传输介质分为:
导向型传输介质:
双绞线:适用于近距离
同轴电缆(抗干扰性强):适用于远距离
光纤:带宽远远大于其他传输媒体
非导向型传输介质:
无线电波
微波
红外线、激光
⭐ 也就是说,物理层的作用就是实现计算机之间的数据传送,这个数据其实是比特流,物理层需要尽可能屏蔽掉具体传输介质和物理设备的差异, 使其上面的数据链路层不必考虑网络的具体传输介质是什么,即实现比特流的透明传输。

数据链路层

由于物理层只是简单的把两个计算机通过传输介质连接起来然后传输比特流,那么势必会出现问题:
1.传输的速度不对等
2.传输的数据有可能是不可靠的或者是出错的数据

也就是说仅仅靠物理层是无法满足传输数据的要求,那么数据链路层的出现其实就是加强了物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路使之对网络层表现为一条无差错的链路。也就是说链路层不仅要加强物理层的传输功能,还要为网络层提供服务,链路层最基本的功能就是将来自网络层的IP数据报封装成帧,然后可靠的传输到对应节点的网络层。

封装成帧
前面提到物理层传输的是比特流,单独的比特流是由0和1组成的,如果这些0和1的组成是毫无规则的,那么计算机是无法解读的,所以我们需要制定一套规则帮助计算机读懂比特流
⭐ 封装成帧就是:发送端的链路层接受到网络层传递的IP数据报之后,在其前后分别添加首部、尾部,这样就形成了一个帧,然后通过物理层传递比特流给对应节点时,计算机就可以根据首部和尾部的标记,从比特流中找到数据帧的开始和结束位置。
在这里插入图片描述
那么问题来了,如果只有两台计算机还好说,但是现在计算机的数量以亿来计算,我们怎么识别这个数据帧是从何处发送的,或者要发给谁呢?
于是,MAC 地址出现了 👇
MAC地址
MAC 地址就是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。计算机之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。
一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
那么MAC地址又是怎么得来的呢?这就是网络层的工作了

网络层

在计算机通信过程中可能需要经过很多的数据链路和通信子网,那么如何在众多路线中选出最快,最好的路线,就是网络层的工作了。
网络层的作用就是选择合适的网间路由和交换节点,确保数据可以及时送达
在发送数据时,网络层把传输层产生的报文段或用户数据报封装成IP数据报进行传输

IP协议
IP协议用于屏蔽下层物理层比特流的差异,为上层提供统一的IP数据报。
IP协议定义的地址叫做IP地址,IP数据报中就包含了发送方和接收方的IP地址。
IP协议提供不可靠的,无连接的,尽力传输的数据报传输服务。
1.不可靠:IP协议本身不保证数据的完整性,在传输过程中如果数据丢失或者延迟、乱序等等,IP协议不会进行检测,也不会通知收发双方错误发生。

  • 当发送错误时,由路由器通过ICMP协议通知错误发生,必要时,通过高层的(TCP协议)实体进行数据恢复。

2.无连接:这个好理解,就是发送方可以在任意时刻发送数据,接收方也不知道自己什么时候会接收到数据。

3.尽力传输:执行数据报的分组和封装(数据报—>IP数据报),以适应不同的传输网络,在接收处再进行合段处理(当数据报长度 > MTU(最大传输单元 MTU—Maximun Transfer Unit )时,需对数据报分段 。)

那么我们知道网络层通信有IP地址,但是我们链路层需要的MAC地址在哪里呢?这就是ARP协议要做的事情了

ARP地址解析协议
网络层实现的是两台计算机之间的通信,而链路层实现的是具体每一段链路之间的通信,所以在通信过程中IP地址是保持不变的,而MAC地址是随链路变化而变化的

⭐ ARP(Address Resolution Protocol )协议就可以实现由 IP 地址得到 MAC 地址。

在这里插入图片描述
每一个主机都有一个ARP高速缓存,里面有本局域网的各主机->路由器的IP地址到MAC地址的映射。

当主机A有主机B的IP地址,但是ARP高速缓存中没有主机B的MAC地址怎么办?这时候主机A通过广播的方式发送ARP请求报文(这个报文里含有主机A的IP地址,MAC地址以及目标主机B的IP地址),主机B收到这个报文后会返回一个ARP响应报文给主机A,这样A就获得了主机B的MAC地址,可以进行链路层传输了。
在这里插入图片描述

💡 对应的,RARP 协议可以实现由 MAC地址转化为 IP 地址

那么这时候问题又来了,网络层的工作是选择最优的传输链路,那么这个IP地址是从何处来的呢?这就是DNS协议的工作了。这个协议存在于应用层中

传输层

通过网络层、数据链路层、物理层,我们已经把数据成功的传输到对应主机了,但是一台电脑有那么多应用程序,我们怎么知道这个数据是给哪个程序使用的呢?就好比接受一条信息,我们电脑是如何分辨这个是qq消息还是微信消息呢?——所以我们在传输数据的时候,还要加上一个端口号,用来标识这个数据是发送给哪个应用使用的。
简单来说,IP地址+端口号就可以确定一台电脑上的某个特定程序
也就是说,网络层、链路层这些都是主机与主机之间的通信,而从传输层开始,就是进程和进程之间的通信了
传输层最常见的两大协议是 TCP 协议和 UDP 协议,其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
1)UDP——用户数据报协议
UDP协议传输数据前不需要建立连接,接收方也无需给出任何响应,虽然UDP不提供可靠传输,但是在即时通信的情况下确实成效显著(qq,微信,直播等)
2)TCP——传输控制协议
TCP是面向连接的协议,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP 的可靠体现在 TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、流量控制、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。(不考虑速度,考虑安全性)

应用层

应用层的作用是通过应用进程之间的交互来完成特定的网络应用。

应用层协议定义的是应用进程之间的通信和交互的规则,因为从传输层传送过来的数据五花八门,有文字,图片,视频,超文本链接等等。所以对于不同的网络应用,我们就需要不同的应用层协议,应用层的协议有很多,比如最常见的万维网协议HTTP,域名系统DNS协议(获取IP地址),电子邮件协议SMTP等。

那么上述部分可以说是对计算机通信中的TCP/IP五层模型大概总结了一下,接下来的内容就是细致的讲解每一层每一个协议具体的作用了。

链路层+网络层协议总结

这一个章节主要涉及到链路层和网络层的协议解析,由于这两者之间是互相作用的,所以很多知识点会结合起来一起总结

网络层的IP协议

在上文我们提到过两个主机进行通信,这个通信过程中要经过很多数据链路和通信子网,那么网络层的作用就是在众多链路和子网中,选择最合适的网间路由和交换结点,确保数据及时送达,通俗的说,链路层就好像一个工具人,它本身是无意识的,你给它输入什么指令,它就做什么事情,网络层就相当于控制链路层的大脑,网络层指哪,链路层走哪。
在这里插入图片描述
传输层传递给网络层的数据是TCP/UDP报文段,这些报文段一旦超出链路层的最大传输单元MTU,那么网络层还会负责将这些报文段分组封装成IP数据报,再传输给链路层(其实网络层除了不出力,其他事情都安排的明明白白!),然后链路层将网络层传下来的IP数据报封装成帧,就可以开始传输了。

那么为什么网络层中的数据叫做IP数据报呢,这就不得不提到网络层的IP协议了。

什么是IP协议

IP协议是TCP/IP五层模型的核心,也是构成互联网的基础,位于五层模型中的网络层,它最主要的作用,就是屏蔽下层物理层的差异,给上层提供统一的IP数据报
在这里插入图片描述
IP协提供的是无连接,不可靠,尽力的数据报投递服务(上文有讲这里就不再赘述)

IP协议的重点——IP地址

我们都知道,IP数据报中不只包含数据,还有收发双方的IP地址,那么什么是IP地址呢,它是怎么得来的,它的作用是什么?我们一个一个来解释

IP地址其实可以看做我们的身份证,世界上有千千万万台计算机,那么在通信过程中我们怎么确定起点和终点呢,靠的就是IP地址,每台主机都有其独一无二的IP地址

根据TCP/IP协议规定,IP 地址用二进制来表示,每个 IP 地址长 32 比特,也就是 4 个字节(这里说的是 IPV4 地址长 32 比特 / 4 字节,而 IPV6 地址占 128 比特 / 16 字节)。那么,IPV4 地址的最大值就是 2**32=4294967296,也就是说:最多给大约 43 亿台接入互联网的设备配置其独一无二的 IPV4 地址。

一个采用二进制形式的 IP 地址是一串很长的数字,人们处理起来也太费劲了。为了方便人们的使用,IP 地址习惯性地被写成十进制的形式,使用 “.” 分开不同的字节。这种表示法叫做点分十进制表示法,这显然比一连串二进制地 1 和 0 容易记忆得多。举个例子(一般8位为分隔标准):
在这里插入图片描述
既然知道IP地址是拿来确定起点和终点的,那么有IP地址就可以完成通信了吗?其实不然,我们有时候需要进行远距离传输的时候,比如说从北京发信息到深圳,这么远的距离,中间肯定需要中转站,那么MAC地址就是我们需要的中转站了。

MAC地址和IP地址的关系

大家不要误会一台计算机只能有一个IP地址,IP 地址并不是根据主机台数来配置的,而是根据网卡(网络适配器)来的。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

那么MAC地址是和IP地址一一对应的,有多少IP地址,就有多少MAC地址。

我们知道IP地址已经替我们确定了起点和终点,就好比我们坐高铁,从深圳做到北京,如果要修一条直达的线路,耗费实在太大,所以我们需要中转,那么在这里,MAC地址就是我们中转的地址了,结合下面的图片来理解
在这里插入图片描述
网络层控制数据传输的过程,我们称为路由控制

IP地址分类

我们上述提到如今的IP地址有几十亿个,那么这么多的IP地址,我们如果一个一个来管理,一次就要管理几十亿个,实在太多了,所以大佬们就对IP地址进行了分类(A,B,C,D,E五类)

在这里插入图片描述

上图中我们可以看到,A 类 IP 地址的首位是 0,B 类 IP 地址的前几位是 10,C 类 IP 地址的前几位是 110…,我们将这些称之为分类号,用于区分 IP 地址的类别。

其中A,B,C三类主要为网络号+主机号两个部分:
**网络号:**用于区分其属于互联网的那一部分网络
**主机号:**用于表示其属于该网络中的哪一个主机

大家可能疑惑为什么需要分离主机号和网络号?
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址(网络号)是否相同:
1)如果网络号相同,表示通信的两台主机位于同一网络域,可以直接把IP数据报发送至目标主机,无需转发给其他网络中转
2)如果网络号不相同,此时接收方主机称为远程主机,和远程主机之间的通信必须要通过本地网关来传递转发数据。

链路层的路由器在传递数据的时候,就是通过网络号来确定要将数据传输到哪块网络中,然后进行传递。
在这里插入图片描述
IP地址分类的优势在于,不管路由器位于那个网络中,都可以通过网络号很快的找出网络地址,然后通过主机号找出对应的主机地址。

在这里插入图片描述
在这里插入图片描述
对于上面这个表,大家肯定会有疑惑,第一个可用网络号是如何确定的?最后一个可用网络号又是如何确定的?,最大主机数是如何确定的?
我们一一来解释。
1)第一个可用网络号如何确定
很简单,网络号全部置0即可,以B类地址为例子
在这里插入图片描述
上图所示B类第一个网络号应该为128.0才对,怎么是128.1?这是因为网络号全 0 代表本网络。因此真正可用的网络号应该是从 1 开始。
在这里插入图片描述
A 类和 C 类地址同理
2)那么最后一个网络号如何确定?
很简单,第一个是网络号全部为0,那么最后一个就是全部为1即可,还是以B类地址为例。
在这里插入图片描述
3)最大可用主机数如何确定,为什么都要减2?
计算网络中的最大主机数就是要看主机号的位数,比如 B 类地址的主机号占 8 位,那么 B 类地址的最大主机个数就是 28−2 个,为什么要减2,那是因为主机号全为 0 和主机号全为 1 的这两个 IP 地址是特殊的,在主机号的分配过程中,应该去掉这两种情况:
1)主机号全为1指定某个网络地址下的全部主机,通常用于
广播**
在这里插入图片描述
2)主机号全部为0指定一个特定的网络在这里插入图片描述

IP广播/单播/多播

上文我们提到主机号全部为1时用于广播,那么什么是广播呢?
广播地址用于在同一个链路中相互连接的主机之间发送数据包,即一个发送方对应多个接收方。接收方在接收到数据包之后,可以根据自己的需要选择接收还是丢弃。
举个例子,就好比学校里的广播台,中午广播了一个消息——小米同学来饭堂领取掉落的钱包,此时校园就相当于一个
特定网络
,听到广播的学生就好比当前网络里的所有主机,小米同学就会响应这则信息,而其他同学则丢弃这则信息。
当主机号全为 1 时,就表示该网络的广播地址。例如把 172.20.0.0/16 用二进制表示如下:

10101100.00010100.00000000.00000000

广播地址为

10101100.00010100.11111111.11111111

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

广播地址又分为本地广播和直接广播两种

1)在本网络内广播的叫做本地广播。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255。因为这个广播地址的 IP 包会被路由器屏蔽(即路由器不转发该广播包,广播包无法穿透路由器),所以不会到达 192.168.0.0/24 以外的其他链路上。
2)在不同网络之间的广播叫做直接广播。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给 192.168.1.0/24,从而使得所有 192.168.1.1 ~ 192.168.1.254 的主机都能收到这个包。(注意此时两个IP地址的网络号不同
由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发广播包,即本地广播,广播包无法穿透路由

IP单播
广播是一个发送方对应多个接收方,那么单播就是一对一的情况了,也就是一个发送就对应一个接收。单播是可以穿透路由器的,也即路由器会对数据包其进行转发

IP多播
上面我们讲了 A、B、C 类地址,D、E 类还没讲。D 类和 E 类地址是没有主机号的,所以不可用于主机 IP
多播使用 D 类地址,因此如果IP地址首位是 1110,就可以认为是多播地址,而剩下的 28 位可以称为多播的组编号。E 类是预留的分类,暂时未使用。

那么多播和广播相比,多播是一个发送方对应多个特定的接收方,而且多播也是可以穿透路由的。

在出现多播之前,我们都是在使用广播的方式传递数据,先是由主机发生数据,然后再由接收主机决定是否响应,这就造成了很多不必要的流量,而且大多数情况下使用本地广播,无法穿透路由,所以多播的出现也就是必然的了。

子网划分

子网划分应该是IP协议中最繁杂的部分了,所以需要多总结,多复习

1.为什么要进行子网划分
子网划分的出现是因为IP地址分类会造成很多的资源浪费,为什么这么说呢,以B类地址为例子,主机号有16位,理论上允许一个链路上连接大约6万台主机,但是实际情况并不需要这么多,直接使用 A 类、B 类或 C 类地址,确实有些浪费资源。因此子网划分出现了。

所谓的子网划分,其实就是将传统的两级地址(网络号+主机号)变成了
粒度更小的三级 IP 地址(网络号 + 子网号 + 主机号)
在这里插入图片描述
同样的,子网主机号不能全为0或1

  • 但是需要注意的是,某单位划分子网后,对外仍表现为一个网络,即本单位外的网络看不见本单位内的子网划分。

如下图所示,将网络地址 145.13.0.0 划分成 3 个子网,子网的网络地址分别为 145.13.3.0、145.13.7.0、145.13.21.0:

网络地址就是指定了网络号
那么子网的网络地址就是指定网络号+子网号
在这里插入图片描述

2.如何划分子网——子网掩码
子网掩码只有一个作用,就是将某个 IP 地址划分成网络地址和主机地址两部分,子网掩码由一连串的 0 和 1 构成(0 或 1 必须连续),二级 IP 地址中的网络号和三级 IP 地址中的网络号 + 子网号对应到子网掩码中都用 1 来表示,而主机号对应到子网掩码中用 0 来表示。将 IP 地址与子网掩码做按位 AND(与)运算(只有两个都为 1,结果才为 1,否则为 0),得出的就是网络地址:

举个子网掩码划分子网的例子:假设对 C 类地址进行子网划分,网络地址 192.168.1.0(二级 IP 地址),使用子网掩码 255.255.255.192 对其进行子网划分:

在这里插入图片描述
子网掩码255.255.255.192有26个1,表示网络号+子网号=26,而C类地址的网络号有24位,所以子网号有2位,需要从主机号中借两位。由于子网网络地址被划分成 2 位,那么子网地址就有 2**2=4 个,分别是 00、01、10、11,具体划分如下图:
在这里插入图片描述
划分后的4个子网为
在这里插入图片描述

另外说明一点,子网掩码还有一种更为简单明了的写法,子网掩码的作用不就是用来分离网络号和主机号的嘛,我们直接在 IP 地址的后面注明网络号的位数(网络号 + 子网号)不就行了。
以网络地址 192.168.1.0(C 类二级 IP 地址),子网掩码 255.255.255.192 为例,我们可以写成:192.168.1.0/26,表示网络号 + 子网号共 26 位。

路由控制

上文我们提到过网络层选择合适的网间路由和交换结点,确保数据及时送达就叫做路由控制,所以一旦路由控制出现异常,数据传输肯定会出错
在这里插入图片描述
为了将数据准确准时送达目标主机,所有主机和路由都维护着一张路由控制表,这个路由控制表维护两个字段:

1.IP 地址
2.如果想要到达这个 IP 地址,在当前路由器,数据包的下一步应该是发送到哪个路由器

在发送 IP 数据报时,首先要确定IP数据报首部的目标IP地址,然后再从路由控制表中找到与这个IP地址具有相同网络地址的记录,如果找出多个具有相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配
然后转发给下一个路由器
在这里插入图片描述
进行路由控制的其实是IP地址中的网络地址,我们结合一个图来看

  • 主机 A 要发送一个 IP 数据报,其源地址是 10.1.1.30 ,目标地址是 10.1.2.10,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 的网络地址,于是把包被转发到默认路由(路由器 1 )
  • 在路由器1的路由控制表中找出和10.1.2.10具有相同网络地址的10.1.2.0的记录,路由器把这个IP数据报转发给地址为10.1.0.2的路由器2
  • 路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 数据报从路由器 2 的 10.1.2.1 这个接口出去,最终经过交换机把 IP 数据报转发到了目标主机

在这里插入图片描述
上面我们提到了默认路由,什么是默认路由呢?

默认路由 Default Route
就是指路由表中任何一个地址都能与之匹配的记录。如果一张路由表中包含所有的网络和子网信息,将会造成无端的浪费。这时,默认路由就是一个不错的选择。默认路由一般标记为
0.0.0.0/0 或 default

网络层的ARP协议—>链路层的MAC地址

在上一章节,我们知道只要有IP地址,就可以将IP数据报从一台主机发送到另一台主机,如果说网络层实现的是主机与主机间的通信,那么链路层实现的就是具体每段链路之间的通信。

那么如何将IP地址转换成MAC地址,就需要使用到ARP协议了。

什么是ARP

ARP(Address Resolution Protocol )地址解析协议:实现由 IP 地址到 MAC 地址的转换。准确的来说,ARP 协议以目标 IP 地址为线索,用来定位下一个传递数据帧的网络设备对应的 MAC 地址

以坐高铁为例,IP地址就是北京—深圳,而MAC地址就好比北京-南京-广州-深圳,这个过程就是路由控制。

那么路由控制过程中,维护的其实还是IP地址,但是在链路层传输的数据人家只认MAC地址,那么ARP协议就显得尤为重要了。

ARP工作原理

简单地说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。我们知道每个主机和路由不仅维护了路由控制表,还有一个ARP高速缓存,里面维护的就是IP地址对应的MAC地址

当一个路由A只知道下一个路由B的IP地址,但是不知道对应的MAC地址时,它会以广播的方式发送一个ARP请求包,里面包含源IP地址,目标IP地址和它自己的ARP地址,那么对应的路由设备B接收这个请求报文后,就会返回一个ARP响应报文,里面包含对应的MAC地址

  • 响应报文的传输形式是单播,避免流量浪费。

当路由A接受到响应报文后,就会将这个MAC地址存进自己的ARP高速缓存在这里插入图片描述
当然,缓存是有一定期限的,超过这个期限,缓存的内容将被清空。这也使得即使 MAC 地址和 IP 地址的映射关系发生了变化,也依然能够正确的将数据包发送给目标地址。

ICMP—网络层的情报兵!

上文我们提到,网络层的IP协议提供的是无连接,不可靠,尽量传递数据的服务,如果真的在传输过程中出现了差错,IP协议是不会返回错误结果的,那么难道我们就只能这样任由错误发生吗?当然不会,再有大佬想出了方法

ICMP——网络控制报文协议,应运而生
我们传输数据的时候主要关注两个方面:
1.网络是否可以正常工作
2.传输的数据是否出现错误

通俗来说,IP协议就好像一个将军,ICMP就好比情报兵,战场上出了什么突发情况,你不可能让将军去亲自打探吧,术业有专攻,ICMP情报兵就是专门负责收集情报,向IP将军汇报工作的。

ICMP的作用
1)确认 IP 数据报是否成功送达目标地址
2)如果某个 IP 数据报因为某种原因未能正常到达目的地,则由 ICMP 负责通知具体的原因

具体的出错原因是 ICMP 协议负责通知的,这个通知的学名就是 ICMP 报文,那么 ICMP 报文是由发送方发送方发出的还是由接收方发出的呢?

都不是,ICMP报文是由路由器发出的。

举个例子,主机A向主机B发送数据,但是主机B此时已经关机了,无法接收数据,假设数据会经过路由器1和2,
在这里插入图片描述
众所周知传输数据不仅需要IP地址,还需要MAC地址,那么当数据传输到路由器2的时候,路由器2为了知道主机B的MAC地址,就会发送一个ARP请求报文,但主机B已经关机了,自然就无法响应这个请求。

为此,路由器 2 会一遍又一遍的重新发送着 ARP 请求报文,在多次无果后,路由器 2 就会返回一个 ICMP Destination Unreachable 的包给主机 A(关于 ICMP 报文类型下文会讲),通知主机 A,非常遗憾,您发往主机 B 的包未能成功抵达。

那么ICMP报文是如何传输给主机A的呢?TCP/UDP报文怎么传输,它就怎么传输。
也就是说,数据会先加上ICMP首部,封装成ICMP报文,然后被IP协议封装成IP数据报进行明文传输,当主机A收到后会一层一层解封装,了解情况。

ICMP报文类型

上文提到了 ICMP Destination Unreachable,也就是目标不可达的 ICMP 报文。

ICMP 报文类型大体上可以分为两种,差错报文和询问报文,解释一下:
所谓查询报文就是,用于主机进行诊断的查询消息
通俗的说,就好比打仗的时候遇到了一片大雾,前方不知什么情况,于是IP将军派遣ICMP小兵去打探情报,有什么情况立刻回禀。
常见的ICMP查询报文有:

  • 回送应答(Echo Reply),对应 ICMP 报文首部类型字段的值:0
  • 回送请求(Echo Request),对应 ICMP 报文首部类型字段的值:8

而差错报文就是,用于通知主机出错的原因。显然,ICMP 差错报告报文是伴随着出错数据产生的。一旦 ICMP 协议发现某个 IP 数据报出错了,首先就会毅然地丢弃出错的这个 IP 数据报,然后发送 ICMP 差错报文。

ICMP差错报文有以下几种:

目标不可达(Destination Unreachable),对应 ICMP 报文首部类型字段的值:3
原点抑制(Source Quench),对应 ICMP 报文首部类型字段的值:4
重定向或改变路由(Redirect),对应 ICMP 报文首部类型字段的值:5
超时(Time Exceeded),对应 ICMP 报文首部类型字段的值:11

ICMP报文类型详解

1.ICMP查询报文(0,8)
用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息。
可以向对端主机发送 ICMP 回送请求的消息(Echo Request,类型 8),
也可以接收对端主机发回来的 ICMP 回送应答消息(Echo Reply,类型 0)

在这里插入图片描述
我们常见的ping命令其实就是基于ICMP查询报文实现的。

ping 这个单词源自声纳定位,而这个命令的作用也确实如此,它发送类型为 0 的 ICMP Echo Request 消息,收到请求的主机则用类型为 8 的 ICMP Echo Reply 消息进行回应。ping 就会计算发送 Requenst 和接收到 Reply 的消息间隔时间,并计算有多少个包被送达,丢失了多少个包等。用户就可以据此判断网络大致的情况。
(请求-应答=丢失的包,应答报文=送达的包)

ping也不是啥事没做,它在 ICMP 报文格式中又添加了两个字段:标识符和序号。这俩其实很好理解:
1)标识符用来区分是哪个应用程序发 ICMP 包。
2)序号用来确认网络包是否有丢失。

2.ICMP差错报文(3,5,11)

  1. ICMP 目标不可达消息(类型 3)
    路由器无法将数据发送到目标主机时,会给发送端主机发送一个目标不可达的ICMP报文
  2. ICMP 重定向消息(类型 5)
    这个其实也很好理解,我们上文提到过网络层进行路由控制的实质就是选出一条数据传输的最优路线,那么一旦发现走错路了,本来走50米就行,你非得绕路走500米,肯定不行。当某个路由发现发送端主机使用了某个不是最优的路径发送数据,他就会返回一个 ICMP 重定向消息(ICMP Redirect Message)给这个主机,并且,在这个消息中包含了最优的路由信息和源数据
  3. ICMP 超时消息(类型 11)
    IP数据报中有一个字段TTL,(Time to live,生存周期),每经过一个路由就减1,如果当TTL为0时仍未到达目标主机,此时这个IP数据报会被丢弃,并且路由会给发送端主机发送一个ICMP超时信息,并通知这个数据报已经丢弃。

设置TTL的原因是为了防止路由控制时出现循环状况时,IP报不断的在网络转发,耗费流量。

ICMP的应用

我们上文提到ICMP查询报文是ping命令的实质,其实还有一个命令的实质是基于ICMP差错报文的,在 Linux 下这条命令是 traceroute,在 Windows 是 tracert。

大家会任务ICMP差错报文只有在出错的时候才会有作用,其实不然,traceroute命令就是一个例外

traceroute命令有两个作用
1)故意设置特殊的 TTL,来追踪去往目的主机上沿途经过的路由器
发送端主机会不断的向接收端主机发送 UDP 报文,UDP 报文被封装成 IP 数据报,同时将 TTL 从 1 开始按照顺序递增。

比如说,将 TTL 设置 为 1,那么遇到第一个路由器的时候,这个 IP 数据报就会被丢弃,接着返回 ICMP 差错报文,类型是 ICMP 超时消息。

接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器时这个 IP 数据报就会被丢弃,接着返回ICMP 差错报文。
这样我们就可以得到这条链路上的所有路由的IP地址了

但是这里有个bug,就是traceroute怎么知道数据到达的是目标主机呢?
这个也很简单,我们指定一个不可能作为UDP报文的端口号作为端口号,那么在到达目标主机的时候,就会返回一个端口不可达ICMP报文(代码为3),我们就知道这个IP地址是目的主机的了。

2)故意设置不分片,从而确定路径的最大传输单元 MTU。
MTU是IP数据报是否需要分组的依据,那么我们如何获取当前链路的MTU呢,就是依靠traceroute命令。

发送端主机要做的工作很简单,就是像往常一样发送 IP 数据报,但是将 IP 首部的分片禁止标志位置为 1。

这样,如果 IP 数据报的长度超过了 MTU,该数据报会被路由器直接丢弃,并且给发送端主机发送 ICMP 目标不可达消息,其代码为 4,即需要进行分片但设置了不分片位

(就好比我们过桥的时候限重10kg,你非得带20kg的货物,那么出错是必然的)

然后我们每收到一次ICMP需要分片但不设置分片报文的时候,就将IP数据报的大小递减,直到不返回这个ICMP差错报文的时候,我们就知道MTU是多少了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值