TCPIP微课堂(4):链路层协议-PPP协议
PPP(point to point protocol)是点对点协议,主要用于在全双工的同异步链路上进行点到点的数据传输。
PPP帧格式
一个PPP报文以7E开始,以7E结束,因此判断PPP报文的开始和结束都是查找7E。PPP控制字段共8个字节,LCP报文格式如下
PPP帧中常用的协议类型有以下几种:
0021:数据报文
C021:LCP 链路控制协议,用于建立、配置及测试数据链路。
8021:IPCPIP层控制协议(NCP网络控制协议中的一种,针对IP使用的就是IPCP)
C023:PAP( Password Authentication Protocol)密码认证协议,使用明文方式传输密码,安全性不高。
C223:CHAP(Challenge handshake authentication protocol),挑战握手认证协议,是一种三次握手认证协议,验证端会发送一个随机数,主叫将密码和随机数一起进行加密后,发送给被叫,被叫根据自己的计算结果和消息中携带的字段进行比较验证。
FCS(Frame Check Sequence)字段为循环冗余校验码,将报文内容通过一定的算法计算出FCS,放入数据报文中,接收方用来检测传输中可能出现的数据错误。(计算范围为PPP帧除去帧头和帧尾两个7E外的所有字节。)
PPP协议类型
LCP:链路控制协议,用于协商数据链路的选项,如协商链路最大接收单元MRU,探测链路回路和其它普通的配置错误,以及终止链路。
1、链路配置包,用于建立和配置链路。
Configure-Request(配置请求) | Code=01 | 用于携带要协商的选项 |
Configure-Ack(配置正确应答)
| code=02 | 如果在收到的Configure-Request包中每一个配置选项及其所有的值都是能接受的,那么就应答一个Configure-Ack包 |
Configure-Nak(配置不应答) | code=03 | 如果在收到的Configure-Request包中的协商项是可以接受的,但是协商值不能接受,那么就应答一个Configure-Nak报文,将不接受的协商项带在该报文中。如果接收方有一些新的需要协商的项,也可以带在Configure-Nak报文中,发送方在下一个Configure-Request消息中会将这些项带过来协商。 |
Configure-Reject(配置拒绝) | code=04 | 如果收到的Configure-Request包中的协商项就是不可接受的,那么就应答一个Configure-Reject报文,报文中携带不可接受的协商项。注意Configure-Reject和Configure-Nak的区别,一个是协商项不可接受,一个是协商项的值不可接受。 |
LCP协商项:
RESERVED | 0x00 | (保留) |
Maximum-Receive-Unit(最大-接收-单元) | 0x01 | 协商最大传输单元MRU |
Async-Control-Character-Map(异步-控制-字符-映射) | 0x02 | 协商哪些字符需要进行转义的ACCM值,后面详细介绍转义和ACCM。 |
Authentication-Protocol(鉴定-协议) | 0x03 | 协商鉴权协议为PAP还是CHAP |
Quality-Protocol(质量-协议) | 0x04 | 协商链路想要使用的质量监测协议,如:0xC025 链路质量报告 |
Magic-Number (魔术字) | 0x05 | 魔数字主要是用来监测网络中是否有自环现象。如果Configure-Request包的发送方反复收到和自己发送包中的魔数字相同的Configure-Request包,则认为网络中存在自环。 |
Protocol-Field-Compression(协议域压缩) | 0x07 | 协商协议域是否压缩 |
Address-and-Control-Field-Compression(地址和控制域压缩) | 0x08 | 协商地址域和控制域是否压缩 |
2、链路结束包,用于结束一个链路。
Terminate-Request(终止请求) | code=05 | 链路一端如果想关闭链路,则发送Terminate request消息 |
Terminate-Ack(终止应答) | code=06 | 链路一端收到Terminate request消息,如果同意关闭链路,则应答Terminate Ack消息 |
3、链路维护包,用于管理和调试链路。
Code-Reject | code=07 | 在接收到一个带有未知代码的LCP包时,则必须发送一个Code-Reject给发送方。当接收到一个Code-Reject包,则应该报告问题并结束连接。 |
Protocol-Reject | code=08 | 在接收到带有未知协议域的PPP消息时,发送Protocol Reject消息,对端收到该消息后,停止发送这类协议的PPP报文。 |
Echo-Request | code=09 | 心跳消息,定时发送,检测链路是否正常 |
Echo-Reply | code=0A | 心跳应答,收到心跳请求消息后,进行应答,表明链路正常。 |
Discard-Request | code=0B |
PAP和CHAP
PAP( PasswordAuthentication Protocol)密码认证协议,使用明文方式传输密码。
PAP报文格式:
7E | FF | 03 | C023 | Code | ID | Length | Data | FCS | 7E |
Code:
0x01 Authenticate-Request
0x02 Authenticate-Ack
0x03 Authenticate-Nak
CHAP(Challenge handshake authentication protocol),挑战握手认证协议,使用三次握手协议,加密密码,安全性较高。
CHAP报文格式:
7E | FF | 03 | C223 | Code | ID | Length | Data | FCS | 7E |
0x01 Challenge
0x02 Response
0x03 Success
0x04 Failure
IPCP
IPCP的主要作用是IP地址的分配和压缩的协商。
报文格式和类型同LCP类似。IPCP消息格式如下图所示:
Code 1字节 | ID 1字节 | Length 2字节 | Data |
Code=01,Configure-Request Code=02,Configure-Ack Code=03,Configure-Nak Code=04,Configure-Reject Code=05,Terminate-Request Code=06,Terminate-Ack Code=07,Code-Reject |
Type 1字节 | Length 1字节 | Data |
Type类型:
02:TCPIP压缩,用于协商压缩协议,0X002d表示TCPIP压缩
03:IP地址,发送方发送ConfigureRequest消息,如果携带有效IP地址,表示建议使用的IP地址,如果携带的IP地址为全0,表示请求分配IP地址。
异步PPP
为了避免PPP报文中的数据和网络中一些控制字符冲突,避免将这些字符解释成特殊的含义。所以一般要对PPP报文中小于0X20的字符进行转义。
LCP阶段协商的ACCM值就是用来控制那些字符需要进行转义的。ACCM共4个字节,32个bit,每一个bit表示0x00~0x1F是否需要进行转义。ACCM中的Bit是1表示对应的字符需要转义,一般情况下LCP阶段都会协商ACCM为全F,即,0x00到0x1F都需要进行转义。
转义的方式是加上7d20,比如0x01转义为0x7d21,0x1A转义为0x7d3A。特殊字符7E转义为0x7D5E,7D转义为0x7D5D。
PPP压缩
为了降低时延,提升效率,在LCP协商阶段会协商协议域压缩,以及地址和控制域压缩。
如果协商了协议域压缩,则PPP协商结束后,转发数据报文时的协议类型0021,会被压缩成21
如果协商了地址和控制域压缩,则后续报文不再携带PPP头中的地址域和控制域,即不携带FF 03两个字节。
版权声明:本文著作权归新newPPP平台所有,NewPPP小编欢迎分享本文,您的收藏是对我们的信任,newppp谢谢大家支持!