文章目录
- 路由表
- 数据链路层
- 分片
- mac帧报头
- ARP协议
- ARP的周边话题
路由表
当主机a想要发送消息到主机b,这一整个过程中,数据报文在进行传输的过程实际上是一跳一跳的过去的,而报文可能会经过公网进行传递,本质上这些网络都是靠对应的路由器来进行链接的
当在之前的实验中,向某个地方进行请求的时候,请求的ip都是公网ip,而在平时的云服务器中是使用的是公网ip的,并且在ip协议的报头中,也有对应的ip字段,表示的是源ip地址和目标ip地址,这些都是来保证网络数据包可以传递过去的保障,那这和这里的路由有什么关系呢?
路由的工作之一是有路由转发的工作,每一个主机都有一个叫做路由表的东西,那这个路由表有什么用呢?在Linux的操作系统中可以查到这个内容:
那我上述所示的这个机器,通过这样的指令就查询到了路由表的存在,那当现在要有一个目标主机,现在要进行报文的发送了,就会拿着这个目标主机的ip,和子网掩码进行按位与,得到的就是Destination,然后再和每一行的Destination进行比对,如果匹配成功就发送,没有成功就继续进行匹配
那匹配路由表会有下面的几种可能性,我们分别进行讨论
**1. 不知道?**这种情况通常来说是路由的算法做的不佳的原因,这里我们不考虑这种情况
**2. 给主机具体的下一跳:**通过查询路由表,找到了想要传递的下一跳的目的地,所以直接就通过下一跳跳过去了
**3. 路由器也不清楚:**比对路由表,发现没匹配成功,这个时候就会把报文传递给默认路由,所谓的默认路由,就是网段内的另外一个路由器,然后在这个路由器中进行查询,继续传递
**4. 到达入口路由器:**这个就是比较理想的状态了,此时已经找到目标服务器了,那么就可以直接传递进去了
数据链路层
在实际的使用当中,报文其实并没有直接通过网络发出去,而是会交给下一层协议,那这层协议就是我们要谈论的最后一层协议了:数据链路层
对于数据链路层来说,实际上已经算是一个网卡硬件驱动层了,数据链路层不能发送过大的报文,这也是和硬件相关的,被硬件所控制的,那这就必然要求,上层不能交付过大的报文,这也就解释了对应的在TCP中,进行流量控制的章节中我们讲到,流量控制说的是对方的接收能力,比如现在对方接收能力是64kb,那为什么不直接把这64kb直接发过去,而是要一点一点发?原因就在于此,因为底层的发送是有限制的,这个限制就来源于网卡硬件
分片
那假设,现在就是运气不好,上层传递过来的报文就是太大了,那这该怎么办呢?作为网络层的ip协议,自然也有自己的方案,其中一种概念叫做分片,分片工作是由ip协议完成,然后传递到目标主机再由对方的ip协议进行组装,这个分片简单来说就是把ip在底层划分为若干个小的ip,然后这些小的ip再进行分次传送,送过去以后再组装成一个大的ip,再向上交付,那现在要考虑的几个问题就是,如何进行分片?又如何进行组装?
分片
对于分片来说,概念也相对比较简单,首先要知道的一点是进行分片也是要组装报头的,回顾ip协议,它的报头中是存在一个16位的标识的:
那这个标识是ip协议的标号,不同的ip协议标识肯定是不同的,对于相同的ip协议分片之后的标号也是相同的,这些都算比较好理解
再看下一个字段,说的是3位标志,那这个标志是干什么的呢?在这3位标志当中,其中第二位表示的是是否允许进行分片,如果显示的结果是0,那么就是表示允许分片,如果是1那就是表示的是不允许分片,第三位表示的是是否为结束标记,如果是1表示当前还没有结束,如果是0表示的是当前已经结束了,代表这个分片结束了
再看下一个字段是片偏移,这个就更简单了,就是一个偏移量
下面我用一个例子来进行解释上面的这一套理论:假设现在有一个报文是3000字节,而数据链路层最多发1500字节的报文,那它该如何进行划分呢?
那现在划分的问题结束了,它是如何进行组装的呢?正是由于有标记位的存在,才能保证不会丢失,偏移量和标记位加起来就能确定这个报文是不是最后一个,是不是开头,是不是中间
需要注意的是,正常来说是不建议进行分片的,因为如果有一个报文丢失了,那么整个报文都要进行重传,ip协议是没有TCP协议的保存机制的
mac帧报头
在计算机当中,每台主机除了对应的ip之外,还应该拥有一个mac地址,这个mac地址指的是网卡,对于每一个网卡来说,它都有一个单独的mac地址与之对应,它的作用主要就是用来在同一个局域网中进行区分特定的主机
那下图所示的是mac帧的报头信息
首先是数据部分,这个数据部分指的是ip报文,那随之而来的就是每一个协议都要思考的问题,它是如何做到报头和有效载荷进行分离,以及它是如何进行交付的?
报头和有效载荷分离
结论是,它是采用的定长报头的方式,当收到报文的时候就可以根据定长的报头实现和有效载荷的分离,其中有源地址和目的地址还有类型
如何进行分用?
如何进行识别这个报文是用以做什么的呢?答案是在报头的类型中会有记录,如果当前使用的是0800类型,那么表示的就是一个ip的数据包,这个使用的是0806类型,那么表示就是一个ARP请求,如果使用的是8035,那么表示的是RARP请求报文
ARP协议
这里我假设一个场景,有一个数据包要从A主机传递到B主机,经过一系列传输后,传递到了入口路由器,假设这个入口路由器叫做路由器d,那在它接受到这个数据包之后,根据子网掩码的运算,发现此时这个路由器d直接相连的网络就是这个数据包的目的地,那么这就意味着这个路由器d要经过内网转发,把数据交给主机b,那这就意味着一件事,对于数据包来说,它必须要知道主机b的mac帧地址,这样才能把数据送到主机b,那现在的问题是,路由器d接受到了这个报文,只知道目标主机b的ip地址,但是不知道主机b的mac地址,所以在内网交付的过程中,路由器d是无法把数据交给主机b的
所以现在对于路由器d来说,它必须要有一种方法,能根据ip地址转换成目标主机的mac地址,只有得到了对方的mac地址,才能把信息数据交给主机b,所以在一个局域网中,这种把ip地址和mac地址相关联的方法,就叫做是ARP协议
如上图所示,展示的就是ARP协议的一个基本的过程,主机a通常就是入口路由器,它和所在局域网当中的所有主机进行相连,当它要进行内网传递的时候,就要发送一个ARP请求包,然后去获取这个主机的mac地址,如果获取成功了,就把这个数据包发送出去,如果没成功这个数据包就发送失败了
ARP协议报头
既然是协议,那么就意味着ARP协议也是有报头的,那么这里对于ARP协议的报头进行理解:
如上图所示,展示的是ARP协议的报文信息,而前面的字节表示的是报头,后面的28字节ARP请求和应答表示的是有效载荷,那我们先说这个报头的信息
对于报头来说,头部有这个以太网的目的地址和源地址,ARP协议是属于mac帧的上层的,但是它又是属于数据链路层的
对于有效载荷来说,第一个参数是硬件类型,一般来说说的是网络类型,这里一般填写的也是以太网,一般写1就行,不过有时候也可能会有无线网的信息,第二个参数是协议类型,协议类型的意思就是要转化的地址,比如说这个ARP协议是要转换成mac地址,那么这里一般的固定写法就是写成0800,代表的是要把ip地址转换成mac地址,再说后面的类型,硬件地址长度和协议地址长度,硬件地址长度对于以太网来说是6字节,对于ip地址来说是4字节,这些字段的内容一般都是固定的,直接填写就好
重点是后面的这个op字段,这个op字段如果写的是1,表示的这是一个ARP请求,如果写的是2,表示的这是一个ARP应答,比如作为入口路由器来说,它作为发起者,它本身填写的就是1,而如果作为接收端要返回,那么写的就是2,后面是发送端的ip地址和以太网地址,还有目的端的以太网地址和ip地址
在首次发起请求的时候,是并不知道这个信息的,所以对于目标的这些不清楚的字段,一般用全f来进行表示
所以我们可以看到对于整个网络协议栈来说,是分为四层的,其中在最底层的叫做mac帧,mac帧的上层是ARP协议,这个ARP协议也是属于数据链路层,这俩是在一层的,所以在网络中进行路由的时候,路由表当中是会包含有主机相连的信息
ARP的周边话题
下面对于ARP的周边问题进行解释
ARP的触发机制?
数据包从a主机到b主机的这个过程,是需要到入口路由器的,然后入口路由器再传递到主机b,而这个ARP机制并不会重复去做,只有在ARP缓存失效的时候才会触发这个ARP机制
ping问题
实际上,对于每一个子网来说,都有自己的内网ip和内网对应的子网掩码,而在网络中是存在一条叫做ping的命令的,这个命令就是给目标主机发送一个报文,而主要目的是要收到目标主机的应答,它的作用主要是用来检测网络的连通性的报文,所以依据这个ping命令,是可以做到获取同一个网段的所有人的ip地址和mac地址的,换句话说,通过我的ip和子网掩码,可以得到我的网络号,根据我的网络号再拼接ip地址,就能ping所有的主机,得到所有主机的ip地址和mac地址
ARP应答的问题?
当ARP应答获取成功了之后,那么就会把mac地址和ip地址缓存起来,形成一个对应关系,而这个缓存是有时间限制的,太长的缓存信息就被丢弃了,那假设现在有一个主机的网卡被更换了呢?这就意味着mac地址也会被更换,所以ARP协议对于收到了新的ARP信息之后,会自动更新为最新的信息,这都没问题,但是会出现一个问题
假设现在有另外一个主机m,它接入到了这个网段当中,它有ipm和macm,那么假设未来它构建一个报文,经过内网转发,直接一直向主机a发送ARP的应答,那么对于路由器来说,就会构建出一个主机b和macm的映射关系,那这其实是一个比较恐怖的事,因为未来这个路由器向主机b发送的消息,都会推送到主机m上,而转到主机b上的信息因为mac地址不匹配,反而会被丢弃,那这个主机m就被叫做是一个中间人机器