素材巴巴 > 程序开发 >

PPP中的LCP(Link Control Protocol)

程序开发 2023-09-02 17:54:13

(内容整理自RFC1661,其中笔者觉得可能不精确的表达会用橙色贴出原文)

 

目录

简介

LCP包格式

1. 连接配置包(Link Configuration packets)

Configure-Request

Configure-Ack

Configure-Nak

Configure-Reject

2.连接终止包(Link Termination packets)

Terminate-Request & Terminate-Ack

3.连接维护包(Link Maintenance packets)

Code-Reject

Protocol-Reject

Echo-Request & Echo-Reply

Discard-Request

LCP配置选项

1.Maximum-Receive-Unit (MRU)

2.Authentication-Protocol

3.Quality-Protocol

4.Magic-Number

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开启下一个状态。

PPP状态图

LCP功能涉及自动协商封装格式选项(automatically agree upon the encapsulation format options)、数据包大小限制、检测回环链路和配置错误以及终结连接(terminate the link)。

具体LCP协商机制就是不同的报文交换,也就是LCP Packets就决定了LCP的协商过程。


LCP包可以分为三类:

1. 连接配置包(Link Configuration packets)

用于建立和配置连接,包括

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)

用于终止连接,包括

  1. Terminate-Request
  2. 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),包括

  1. Code-Reject
  2. Protocol-Reject
  3. Echo-Request
  4. Echo-Reply
  5. 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


配置选项(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


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。