PPP(point-to-point protocol)协议是一种点到点的链路层协议,主要用于全双工的同异步链路上进行点对点的数据传输。
我们主要针对一下两个问题来对PPP的基本原理进行解析:
为什么PPP链路两端的ip地址不在一个网段可以实现互通?
PPP中会出现三层环路么?如何产生的?如何避免?
第一个问题,关于PPP链路两端的ip地址不在一个网段可以实现互通的问题:
首先,能够互通这是毋庸置疑的,那么为什么可以实现互通呢,我们通过一个小实验来进行分析
![0b11b42d49187b027045b18281754a04.png](https://i-blog.csdnimg.cn/blog_migrate/0edd4e3e5785ea3616071d044d66e805.jpeg)
实验拓扑
如图,AR1和AR2的ip地址规划如图所示,链路类型为PPP。
![570dc912e98ccca79dd64dd8de57b26e.png](https://i-blog.csdnimg.cn/blog_migrate/f5990d0afed581b7e258ef42240d52bf.jpeg)
AR1
![befacd071596dc0f8e4812395f0e7e7a.png](https://i-blog.csdnimg.cn/blog_migrate/0269781de010371a1a496b3cf3323403.jpeg)
AR2
通常,对于以太网链路,双方需要通信,需要知道对方的ip地址所对应的接口的mac地址,也就是我们常说的ARP表项;满足了这个条件以后,还需要有到达对方ip网段的路由条目。主要涉及两个方面,也就是数据链路层和网络层的通信。
但是对于PPP链路,不需要获得对方ip地址所对应的接口的mac地址,也就是说在本地不需要有对方的ARP表项,因为PPP本身就是一个链路层协议,对于PPP的链路,双方只要在一条链路上,就可以满足底层通信的条件。
其次是路由层面,对于路由条目来说,PPP可以通过自身的IPCP协议进行ip地址自协商,双方通过IPCP协议中的报文进行交互,以此得知彼此接口的ip地址,并在本地生成关于对方接口ip地址的主机路由(掩码/32))条目,那么这个时候满足了路由的层面。
当有去往对端的数据,查询本地路由表,然后将数据发到PPP链路上,对端收到数据也是按照自己本地的路由表中的路由条目进行回包,此时双方就完成了通信。
![067a5579b8a422644fc241c801afc2c1.png](https://i-blog.csdnimg.cn/blog_migrate/54896634a00c425bf6d6701560e052dd.jpeg)
AR1
![5d6d41f6d7fff69e6446a2b2be444b29.png](https://i-blog.csdnimg.cn/blog_migrate/df2ddb4009a2407e242c9c30478a0822.jpeg)
AR2
那么在这过程中,双方是通过怎样的机制知道彼此接口的ip地址并且生成主机路由的呢?留意可以发现,上文中我们有提到"IPCP”这个词,那么到底什么是IPCP呢?双方又是通过怎么的机制确定彼此的呢?
IPCP--ip control protocol是NCP(network control protocol)中的一个协议,其中除IPCP外,还包括MPLSCP等,IPCP主要负责的就是ip地址的协商。
IPCP的协商报文主要有:configure requset、configure-ack、configure-nak,在静态协商ip地址(可以理解为手动配置ip地址)的过程中只会交互两种报文类型,那就是configure-requst和configure-ack报文。
![358d34dc2a25dfc56fee0b832bdb7a1d.png](https://i-blog.csdnimg.cn/blog_migrate/f7a34c706feb907c7a71a94e7f625ca0.jpeg)
![f283e24f33791ab07e363206f28f7fd4.png](https://i-blog.csdnimg.cn/blog_migrate/c1d189ad64ba22ef312b5151b09799de.jpeg)
AR1
![7e388a65dc8076e96e47d0e09454203e.png](https://i-blog.csdnimg.cn/blog_migrate/15369f894243cf65c9e9ab7c1fd7a330.jpeg)
AR2
configure-requst报文中包含了自己接口配置的ip地址,当对方收到以后,如果确定对端地址和自身接口ip地址不冲突,也就意味着同意对端使用该ip地址,此时会发送configure-ack报文予以确认。
![a2ff9e7cb96d6adb57ef0140af63efe2.png](https://i-blog.csdnimg.cn/blog_migrate/e7afc608b5bc8cfddd893aca05803036.jpeg)
AR1
![99d52a15efdd66042f9cf83c009ae0fa.png](https://i-blog.csdnimg.cn/blog_migrate/8599d246852ebbe9c10859bdbf7c35d8.jpeg)
AR2
此时NCP协商成功,接下来双方可以建立正常的通信。因此,即使双方接口ip地址不在一个网段,也是可以完成通信的,在PPP链路中,不使用ARP协议进行地址的解析,取而代之的是IPCP协议来协商网络层的参数,也就意味着,在PPP的链路中,双方是不检查接口是否在同一网段,掩码是否一致的,只要双方地址不冲突,就可以建立正常的通信。
那么对于PPP中会出现三层环路么?如果会,又该如何避免呢?
还是一个小实验来看一下,如图规划ip地址,AR1和AR2配置同网段接口ip地址。
![b0b88a98ae1d1995ce0cc1edd0c5011d.png](https://i-blog.csdnimg.cn/blog_migrate/458dcc9fd38e232d1b6c817677f7b503.jpeg)
实验拓扑
当AR1去pingAR2的时候,会发现
![47dc859281745bd1b99e697e74e32ad6.png](https://i-blog.csdnimg.cn/blog_migrate/2d0d4b1469a6eb73727746d4d2ff1f95.jpeg)
AR1
![9641db6b1777c99fc532db80507797f3.png](https://i-blog.csdnimg.cn/blog_migrate/ca818a971866e6b02de844f9037cadc1.jpeg)
AR2
![0ab286ec871ad02d5b118338e62a4ea0.png](https://i-blog.csdnimg.cn/blog_migrate/5dea52580e800d9048629dcc4eef9df5.jpeg)
可以正常通信,但是当我们用tracert去测试一个属于这个网段但是并没有在这个网络中出现的ip地址(比如1.1.1.3)的时候会发现环路的产生。
![8eccce79748ee4bc88f6383fa0811548.png](https://i-blog.csdnimg.cn/blog_migrate/112ac3543043b60b42bd4107142f64e2.jpeg)
导致这个问题的原因是当配置/24位掩码的时候,双方除了在本地生成一条对端接口ip地址的主机路由外还会额外的生成一条/24的路由条目:
![3413f38318894b8d191b3cf4ccb803d0.png](https://i-blog.csdnimg.cn/blog_migrate/081793adb2ab839ad43a70f414250e9b.jpeg)
AR1
![d6e59d77c7e0315ca2c86447b759a6e5.png](https://i-blog.csdnimg.cn/blog_migrate/946b5616d2e83a0e3a8c05788f2bd5c1.jpeg)
AR2
当去tracert一个不存在的ip地址的时候,双方由于在本地有这样的一条路由条目就会将数据发送到PPP的链路上,从而导致了路由环路,虽然TTL可以搞定,但是这也是我们不愿意看到的情况,那么这种情况下怎么处理呢?
接口配置/30位的掩码就可很好的解决这个问题,配置/30位的掩码在可以解决路由环路的同时还可以节省ip地址。
以上就是本章的内容,需要特别注意的是,上面没有提到在NCP前还有一个LCP的PPP链路的协商过程,由于本章内容主要是围绕着以上两个问题做解释,因此不涉及其他内容,谢谢!