(内容整理自RFC1661,其中笔者觉得可能不精确的表达会用橙色贴出原文)
目录
1. 连接配置包(Link Configuration packets)
2.连接终止包(Link Termination packets)
Terminate-Request & Terminate-Ack
3.连接维护包(Link Maintenance packets)
5.Protocol-Field-Compression (PFC)
6.Address-and-Control-Field-Compression (ACFC)
-
简介
LCP(Link Control Protocol),用于PPP的链路协商,PPP连接的建立(即下图中的Establish阶段)就是从交换LCP报文开始的,LCP协商阶段所有非LCP报文都会被静默丢弃(silently discarded),LCP协商完成后,LCP就进入LCP Opened状态,而PPP开启下一个状态。
LCP功能涉及自动协商封装格式选项(automatically agree upon the encapsulation format options)、数据包大小限制、检测回环链路和配置错误以及终结连接(terminate the link)。
具体LCP协商机制就是不同的报文交换,也就是LCP Packets就决定了LCP的协商过程。
-
LCP包格式
LCP包可以分为三类:
1. 连接配置包(Link Configuration packets)
用于建立和配置连接,包括
- Configure-Request
- Configure-Ack
- Configure-Nak
- Configure-Reject
Configure-Request
这个包用于请求打开连接,Options字段是可变长字段,内容是对选项默认值的修改协商,默认值不需要包括在其中。
也就是说若Options的内容为空,则发送端希望就按照默认的参数建立连接。
具体的配置选项这里就不列出了。
Code:值取1代表Configure-Request
Identifier:用于指示通信序列号,当Options字段内容发生改变或者收到一个合法的Configure-Request回复时,Identifier必须改变。当然,重传当前包不需要。
Configure-Ack
在收到Configure-Request包后,若包中的Options都是可以接受的,则必须回复一个Configure-Ack包,并且包中的Options与对应的Configure-Request包需严格匹配,Identifier也需和Request包中的一致。非法的包会直接被丢弃。
Code:值取2代表Configure-Ack
Identifier:和收到的Configure-Request包中的Identifier一致,以指示回复的是哪个Request包
Configure-Nak
在收到Configure-Request包后,若包中的Options都是可识别的,但其中的一些协商值不接受,则回复Configure-Nak。
回复的包中Options仅仅包括Configure-Request中不接受的Options,且这些Options的顺序不会改变。也就是仅仅将Configure-Request中不接受的Options中接受的配置协商剔除。非法的包会直接被丢弃。
When a particular type of Configuration Option can be listed more than once with different values, the Configure-Nak MUST include a list of all values for that option which are acceptable to the Configure-Nak sender. This includes acceptable values that were present in the Configure-Request.
Code:值取3代表Configure-Nak
Identifier:和收到的Configure-Request包中的Identifier一致,以指示回复的是哪个Request包
Configure-Reject
在收到Configure-Request包后,若包中的Options有不可识别的,或者不可协商的(Configure-Request are not recognizable or are not acceptable for negotiation (as configured by a network administrator)),则回复Configure-Reject。
Options字段仅仅包括不可接受的配置选项,接受的Options被剔除。和Nak一样,其余Options顺序也不能改变。非法的包会直接被丢弃。
Code:值取4代表Configure-Reject
Identifier:和收到的Configure-Request包中的Identifier一致,以指示回复的是哪个Request包
2.连接终止包(Link Termination packets)
用于终止连接,包括
- Terminate-Request
- Terminate-Ack
Terminate-Request & Terminate-Ack
这两个包用于关闭连接,希望关闭的一方会发送Terminate-Request,另一方收到后会回复Terminate-Ack,若没有收到另一方的回复,Terminate-Request会持续发送。
Code:值取5代表Terminate-Request;值取6代表Terminate-Ack
Identifier:Terminate-Ack中的值应和Terminate-Request中一致
3.连接维护包(Link Maintenance packets)
用于管理或者测试链路(manage and debug a link),包括
- Code-Reject
- Protocol-Reject
- Echo-Request
- Echo-Reply
- Discard-Request
Code-Reject
当收到一个LCP包发现Code字段未知时(可能对端使用的协议版本不一致),就需要回复一个Code-Reject。
当对端收到Code-Reject,若其中指示的未知字段是协议要求的必须字段时(Upon reception of the Code-Reject of a code which is fundamental to this version of the protocol),对端通常会报告问题并关闭连接,因为这类问题通常没法自动协商解决。
Code:值取7代表Code-Reject
Identifier:每发送一个Code-Reject,Identifier都需改变
Rejected-Packet:完整包含收到LCP包中未知的部分(The Rejected-Packet field contains a copy of the LCP packet which is being rejected.)。
Protocol-Reject
当收到一个PPP包发现协议(Protocol)字段的内容未知/不支持时,就需要回复一个Protocol-Reject。
一旦接收到Protocol-Reject,必须立刻停止继续发送指定的协议相关包。
Protocol-Reject只允许在LCP Opened阶段发出/收到,在其他阶段发出/收到都会被丢弃。
Code:值取8代表Protocol-Reject
Identifier:每发送一个Protocol-Reject,Identifier都需改变
Rejected-Protocol:指示驳回(rejected)的协议
Rejected-Information:包含被驳回的包的内容(去掉头和FCS)
Echo-Request & Echo-Reply
这两个包用于链路检测,在LCP Opened阶段收到Echo-Request时,必须回复一个Echo-Reply。并且在LCP Opened阶段,必须有Request和Reply这个过程。
Code:值取9代表Echo-Request;值取10代表Echo-Reply
Identifier:Echo-Reply的Identifier必须和Echo-Request一致
Magic-Number:用于链路检测,具体见单独小节
Discard-Request
也是用于链路检测,向对端发送这个包,对端收到后直接丢弃。这个包也只能在LCP Opened阶段发出。
Code:值取11代表Discard-Request
-
LCP配置选项
配置选项(Configuration Option)在连接配置包(Link Configuration packets)类型中已经提到。它允许修改PPP默认的一些配置,如果Configure-Request包不提及这些配置,意味着使用PPP默认配置。
它的具体格式如下:
Type:指示配置选项类型,包括:
0 RESERVED
1 Maximum-Receive-Unit
3 Authentication-Protocol
4 Quality-Protocol
5 Magic-Number
7 Protocol-Field-Compression
8 Address-and-Control-Field-Compression
这六种类型接下来会详细解释。
Length:配置选项的总长度(Type、Length和Data字段)
Data:具体信息
1.Maximum-Receive-Unit (MRU)
这个配置选项是必须告知对端的,它表示本端允许收到的最大包大小。默认值为1500(字节)。这个值不包括PPP中的Protocol字段,只包括Information和Padding这两个字段。
Type:值取1
Length:值取4
Maximum-Receive-Unit:指示MRU
2.Authentication-Protocol
默认情况是不需要认证的。如果需要认证,这个配置选项也不应该在很早的Configure-Request包中就发出,因为保证链路能正常通信才是最重要的,所以在协商完一些基本参数后,才能开始协商认证这种事。
Type:值取3
Length:值≥4
Authentication-Protocol:有两种认证协议
c023 Password Authentication Protocol(PAP)
c223 Challenge Handshake Authentication Protocol(CHAP)
Data:也许需要传输一些附加数据
3.Quality-Protocol
协商使用链路质量检测(link quality monitoring)的方法,默认情况下链路质量检测不开启。
Type:值取4
Length:值≥4
Quality-Protocol:仅有一种协议,取值c025 Link Quality Report
Data:也许需要传输一些附加数据
4.Magic-Number
这个配置选项提供了一种方法用于检测回环或者其他的链路异常(This Configuration Option provides a method to detect looped-back links and other Data Link Layer anomalies)
默认情况下不协商,Magic-Number取0。
需要协商时,会随机生成一个数,尽量保证这个数唯一,所以通常会将机器序列号、MAC地址等数作为种子来生成这个随机数。
当收到的Configure-Request含有Magic-Number配置选项时,将这个Magic-Number和最后一个发出去的Configure-Request包中的Magic-Number比较,如果数字相同,则链路很有可能出现环路。为了进一步确认,必须再发一个Configure-Nak包,含有重新生成的Magic-Number,以确定是否有环路,在未确认前,Configure-Request包停止发送。所以如果存在环路,会陷入一直发送Configure-Nak包的死循环。
Echo-Request、Echo-Reply和Discard-Request包都有Magic-Number字段,如果Magic-Number已经产生,那么这些包发送时就必须将此填入。
Type:值取5
Length:值取6
Magic-Number:Magic-Number
5.Protocol-Field-Compression (PFC)
提供了PPP协议字段的压缩协商。
PPP包中的协议字段(Protocol)默认长度为2字节,通过协商可以减少到1字节。
具体方案参考最近标准。
Type:值取7
Length:值取2
6.Address-and-Control-Field-Compression (ACFC)
提供了数据链路层地址和控制字段的压缩协商。
这两个字段通常是固定的常数值,所以可以通过协商来压缩。
具体方案参考最近标准。
Type:值取8
Length:值取2