VPN通信协议—L2TP协议之L2tpv3和L2tpv2的协议状态机区别

1. 前言
协议状态机对协议的开发至关重要,开发者必须严格遵守RFC标准规定的状态机流程。本文主要讲解L2TP协议的L2tpv3和L2tpv2的协议状态机及二者的对比(专业术语见文末附录)。
L2TP状态机主要指控制层面的状态机,分为隧道管理状态机和会话管理状态机,分别对应隧道建立维护和会话建立维护部分。
L2TP协议支持两个对端设备之间多隧道多会话的建立,如果继续深入挖掘到数据层面,则还需要根据具体协议深挖如PPP会话的状态机关联到L2tpv2会话的状态机等。因而状态机的维护较为复杂,开发时需要详细分析。

2. 隧道和会话管理机制
状态机的核心就是隧道会话的管理和维护,L2tpv3和L2tpv2的隧道和会话管理机制基本相同,此处以L2tpv3为例进行讲解。

2.1 隧道管理
L2TP控制连接动态地处理L2TP会话和控制连接本身的建立、拆除和维护。
本节介绍典型的控制连接建立和断开交换。值得注意的是,在下面的图表中,可靠的控制消息传递机制独立于L2TP状态机而存在。例如,显式确认(ACK)消息可以在下面的交换中指出的任何控制消息之后发送,如果确认没有附带在后面的控制消息上。
在控制连接建立过程中,通过主机名AVP、路由器ID AVP或两者的组合来标识lcce。对等LCCE的身份对于为控制连接选择适当的配置参数(例如,Hello间隔,窗口大小等)以及确定如何在控制连接中建立相关会话,为控制连接认证查找密码,控制连接级别断开连接等都是至关重要的。

2.1.1 控制连接建立
控制连接的建立涉及到识别对等体及其能力的avp的交换。
三消息交换用于建立控制连接。下面是一个典型的消息交换:


2.1.2 控制连接断开
控制连接的断开可以由任何一个LCCE发起,并通过发送单个StopCCN控制消息来完成。作为可靠控制消息传递机制的一部分,StopCCN的接收方必须发送ACK消息以确认收到该消息,并保持足够的控制连接状态,以便在至少一个完整的重传周期内正确地接受StopCCN重传(以防ACK消息丢失)。完整重传周期的推荐时间至少为31秒。下面是一个典型的控制消息交换的例子:
通过发送StopCCN,实现可以关闭整个控制连接以及与控制连接相关的所有会话。因此,在拆除整个控制连接时,没有必要单独清除每个会话。


2.2 会话管理
控制连接建立成功后,可以创建单独的会话。每个会话对应于两个lcce之间的单个数据流。本节介绍典型的呼叫建立和拆除交换。

2.2.1 incoming call会话建立
使用三条消息交换来建立会话。下面是一个典型的事件序列:


2.2.2 outgoing call会话建立
使用三条消息交换来建立会话。下面是一个典型的事件序列:


2.2.3 会话断开
会话中断可以由LAC或LNS发起,并通过发送CDN控制消息来完成。在最后一个会话被清除后,控制连接也可能被断开(通常是这样)。下面是一个典型的控制消息交换的例子:


3. L2tpv2状态机 [RFC2661]
3.1 隧道管理状态机

LNS或LAC用于建立控制连接的状态为:
Idle
发起者和接收者都从这个状态开始。发起方发送SCCRQ,而接收方在收到SCCRQ之前一直处于空闲状态。
wait-ctl-reply
发起者检查是否从同一个对等端请求了另一个连接,如果是,就处理冲突情况。当收到SCCRP时,检查它是否兼容。如果应答的版本比请求中发送的版本低,则应该使用旧版本(低版本),只要该版本受支持。如果回复中的版本较早且受支持,则发起者将移动到已建立的状态。如果版本较低且不受支持,则必须向对端发送StopCCN,发起方清理并终止隧道。
wait-ctl-conn
这是等待SCCCN的地方;收到后,检查询问响应。隧道建立成功,如果检测到授权失败,隧道将被拆除。
established
已建立的连接可能因局部条件或接收到“停止控制连接”通知而终止。在本地终止的情况下,发起方必须发送一个停止控制连接通知并清理隧道。
如果发起方收到停止控制连接通知,它也必须清理隧道。

3.2 会话管理状态机
3.2.1 LAC Incoming Call状态机

idle
LAC在其接口上检测incoming呼叫。通常,这意味着模拟线路正在振铃或ISDN TE检测到传入的Q.931 SETUP消息。LAC启动隧道建立状态机,进入等待隧道存在确认的状态。
wait-tunnel
在此状态下,会话正在等待控制连接打开或验证隧道是否已经打开。一旦指示隧道已经/被打开,会话控制消息就可以交换。第一个是incoming请求。
wait-reply
LAC收到CDN消息,表示LNS不愿意接受呼叫(一般错误或不接受),返回空闲状态;LAC收到Incoming-Call-Reply消息,表示接受呼叫,发送Incoming-Call-Connected消息,返回established状态。
established
数据通过隧道交换。清除呼叫的方法如下:
+被连接接口事件:LAC发送Call-Disconnect-Notify消息
+收到call - disconnect - notify消息:LAC进行清理,断开该呼叫。
+本地原因:LAC发送Call-Disconnect-Notify消息。

3.2.2 LNS Incoming Call 状态机

idle
接收到一个Incoming-Call-Request消息。如果不能接受,则向LAC发送Call-Disconnect-Notify, LNS保持空闲状态。如果Incoming-Call-Request消息被接受,则发送Incoming-Call-Reply消息。会话转移到等待连接状态。
wait-connect
如果LAC上仍有会话连接,则LAC向LNS发送“incoming - call connected”消息,LNS进入established状态。LAC可能会发送Call-Disconnect-Notify,表示无法连接incoming的呼叫者。例如,如果电话用户意外地向LAC发送标准语音呼叫,导致被呼叫的调制解调器握手失败,就可能发生这种情况。
established
当LAC收到Call-Disconnect-Notify消息或发送Call-Disconnect-Notify消息时,会话终止。不管启动器是什么,两边都要进行清理。

3.2.3 LAC Outgoing Call 状态机


idle
如果错误地接收到Outgoing-Call-Request,则响应Call-Disconnect-Notify。否则,分配物理通道,发送Outgoing-应答。放置外呼并移动到
wait-cs-answer状态。
wait-cs-answer
如果呼叫未完成或等待呼叫完成的计时器到期,则发送带有适当错误条件设置的call - disconnect - notify并进入空闲状态。如果建立了电路交换连接,并且检测到帧,则发送“Outgoing连接成功”并进入established状态。
established
如果LAC收到了call - disconnect - notify,必须通过适当的机制释放电信呼叫,并清理会话。如果呼叫被客户端或被叫接口断开,必须向LNS发送call - disconnect - notify消息。Call-Disconnect-Notify消息的发送方在消息发送完成后返回空闲状态。

3.2.4 LNS Outgoing Call 状态机

idle, wait-tunnel
当发起outgoing呼叫时,首先创建隧道,类似于LACincoming呼叫的idle和wait-tunnel状态。隧道建立成功后,向LAC发送Outgoing-Call-Request消息,会话进入wait-reply状态。
wait-reply
如果收到Call-Disconnect-Notify,则发生错误,会话将被清除并返回空闲状态。如果收到“Outgoing-Call-Reply”,表示呼叫正在进行,会话正在进行
wait-connect
如果收到call - disconnect - notify,则呼叫失败;会话被清理并返回空闲状态。如果接收到一个Outgoing连接,则呼叫已经成功,会话现在可以交换数据。
established
如果收到call - disconnect - notify,则呼叫由于结果和原因代码中所示的原因被终止;会话移回空闲状态。如果LNS选择终止会话,则先向LAC发送Call-Disconnect-Notify通知,然后清理并闲置会话。

4. L2tpv3状态机 [RFC3931]
4.1 隧道管理状态机
L2TP控制连接协议在两个lns之间没有区别,发起方和接受方之间有区别。发起对等体是第一个发起建立控制连接的对等体。由于LAC和LNS都可以作为发起方,因此可能发生冲突。请参阅RFC3931第5.4.3节,了解其解决方案。
用于建立控制连接的LCCE相关的状态如下:
Idle
发起者和接收者都从这个状态开始。发起方发送SCCRQ,而接收方在收到SCCRQ之前一直处于空闲状态。
wait-ctl-reply
发起者检查是否从同一对等端请求了另一个连接,如果是,则处理冲突情况。
wait-ctl-conn
等待SCCCN。如果SCCCN有效,则建立控制连接;否则,它被拆除(发送一个StopCCN与正确的结果和/或错误代码)。
Estabilished
已建立的连接可能因本地条件或接收到StopCCN而终止。在本地终止的情况下,发起者必须发送一个StopCCN并清理控制连接。如果发起者接收到一个StopCCN,它也必须清理控制连接。

4.2 会话管理状态机
4.2.1 ICRQ Sender状态机
ICRQ由LCCE生成,通常用于响应传入呼叫或本地事件。一旦LCCE发送ICRQ,它就等待对等端响应。然而,它可以选择推迟呼叫的建立(例如,接听呼叫,启动电路),直到对端用ICRP表示它将接受呼叫。例如,如果没有足够的资源来处理额外的会话,对等端可以选择不接受呼叫。
如果对端选择接受呼叫,它将以ICRP回应。当本地LCCE收到ICRP时,它尝试建立呼叫。从本地LCCE向对端发送最终呼叫连接消息ICCN,指示两个LCCE的呼叫状态都应进入established状态。如果呼叫在对端接受之前被终止,本地LCCE将发送CDN来指示此情况。
当呼叫转移到“断开”或“down”状态时,呼叫正常清除,本地LCCE发送CDN。类似地,如果对等端希望清除呼叫,则发送CDN并清除其会话。
与ICRQ发送方相关的状态如下:
Idle
LCCE在它的一个接口上检测到传入呼叫(例如,模拟PSTN线路振铃,或配置了ATM PVC),或发生了本地事件。LCCE启动其控制连接建立状态机,并移动到等待确认存在控制连接的状态。
wait-control-conn
在此状态下,会话等待打开控件连接,或者等待验证控件连接是否已经打开。一旦收到控制连接已打开的指示,就可以交换会话控制消息。第一个消息是ICRQ。
wait-reply
ICRQ发送方收到(1)表示对端不愿意接受呼叫(一般错误或不接受)的CDN并移回空闲状态,或(2)表示呼叫被接受的ICRP。在后一种情况下,LCCE发送ICCN并进入已建立的状态。
Established
数据在会话中交换。+被连接接口上的事件:LCCE发送CDN。+接收CDN: LCCE清理,断开呼叫。+本地原因:LCCE发送CDN。

4.2.2 ICRQ Recipient状态机
与ICRQ接收方相关的状态如下:
Idle
收到ICRQ。如果请求不能被接受,CDN将被发送回对端LCCE,而本端LCCE将保持空闲状态。如果ICRQ可以接受,则发送ICRP。会话转移到等待连接状态。
wait-connect
日志含义本地LCCE正在等待对端发来的ICCN。在收到ICCN后,本地LCCE转移到既定状态。
Established
通过发送CDN或从对端接收CDN来终止会话。不管启动器是什么,两边都要进行清理。

4.2.3 OCRQ Sender状态机
outgoing call呼叫指示LAC发起呼叫。outgoing call有三种消息:OCRQ、OCRP和OCCN。LCCE首先向LAC发送OCRQ请求呼出。一旦LAC确定有适当的设施可以发起呼叫,并且该呼叫在管理上得到了授权,它必须用一个OCRP响应OCRQ。一旦外呼成功,LAC会向对端发送OCCN,表示呼叫的最终结果。

与OCRQ发送方相关的状态如下:
Idle,wait-control-conn
当发起outgoing call呼叫请求时,如果控制连接还不存在,则按照上面所述创建控制连接。控制连接建立后,向LAC发送OCRQ,会话进入等待-应答状态。
wait-reply
如果收到CDN,会话将被清理并返回空闲状态。如果收到OCRP,表示呼叫正在进行,会话转入等待连接状态。
wait-connect
如果收到CDN,会话将被清理并返回空闲状态。如果接收到OCCN,则呼叫成功,会话现在可以交换数据。
Estabilished
如果收到CDN,会话将被清理并返回空闲状态。如果LCCE选择终止会话,则向LAC发送CDN,清理会话,并将会话移至空闲状态。

4.2.4 OCRQ Recipient (LAC) 状态机

outgoing call时LAC所关联的状态如下:
Idle
如果接收到错误的OCRQ,则使用CDN进行响应。否则,拨打呼叫,发送一个OCRP,并移动到wait-cs-answer状态。
wait-cs-answer
如果呼叫未完成或在等待呼叫完成时定时器过期,则发送带有适当错误条件设置的CDN,并进入空闲状态。如果电路交换连接建立成功,发送OCCN成功,进入established状态。
Estabilished
如果LAC收到对端发来的CDN,必须通过适当的机制释放该呼叫,并清除会话。如果由于电路切换到“断开”或“down”状态而导致呼叫断开,LAC必须向对端发送CDN,然后返回空闲状态。

5. 总结
综上所述,两个协议版本无论是隧道会话管理机制还是状态机都是大体相同的,小部分不同的地方需要结合具体业务进行区分。
最后,欢迎大家讨论交流,创作不易,喜欢的话记得点赞收藏,您的支持是我学习和分享的动力。
乘风起-xwm

附录 (专业术语)
术语    术语全名    说明
L2TP    Layer 2 Tunneling Protocol    第二层隧道协议
LAC    Link Aggregation Concentrator    L2TP访问集中器(LAC)。一个L2TP隧道终端的节点,是L2TP网络服务器(LNS)的对端。LAC位于LNS和一个远端系统,并在之间转发报文。从LAC发向LNS的报文需要使用L2TP协议封装。LAC提供对L2TP网络服务器(LNS)的访问。从LAC到远端系统的连接,也可以是本地(LAC客户端)或者一个PPP连接。
LNS    L2TP Network Server    L2TP网络服务器(LNS)。一个L2TP隧道终端的节点,是L2TP访问集中器(LAC)的对端。LNS是由LAC在远端系统封装的PPP会话的逻辑终止点。
NAS    Network Access Server    一种通过远程接入网络(如PSTN)向用户提供本地网络接入的设备。NAS可以同时作为LAC和LNS,也可以同时作为LAC和LNS。
AVP    Attribute Value Pair    属性值对(AVP):唯一属性(整数类型)可变长度的连接,包含由属性标识的实际的值。多个AVP组成用于建立,维持,拆除隧道连接的控制消息。
Analog Channel    -    在每个方向传输3.1kHz的音频的交换线路。
Call    -    在一个远端系统和一个LAC之间的一个连接(或者尝试连接),例如,一个通过PSTN的电话呼叫。相关联的L2TP会话在LAC和LNS建立好的隧道之上成功连接,一个Call(Incoming或者Outgoing)在一个远端系统和LAC的成功建立。
被叫号码    -    被叫号码: 一个Call中的接收者的ID,呼叫者用来联系接收者的电话号码。
呼叫号码    -    用于接收者标识呼叫者的电话号码。
Incoming Call    -    一个由LAC发起,发现LNS的Call。
Outgoing Call    -    一个由LNS发起的Call。
隧道    -    一个隧道存在于成对的LAC和LNS之间。隧道是由控制连接和0个以及以上的L2TP会话组成,隧道在LAC和LNS之间发送PPP封装和控制消息。
会话    -    一个被封装的PPP会话,也被称作一个Call。L2TP是面向连接的协议,LNS和LAC维持每个Call的状态,包括LAC发起或者应答的Call。当端到端的PPP连接在一个远端系统和LNS建立时,一个L2TP会话在LAC和LNS之间建立。PPP连接相关的报文在LAC和LNS之间发送。L2TP会话和Call之间是一对一的对应关系。
LCCE    L2TP Control Connection Endpoint    控制连接终点LCCE(L2TP Control Connection Endpoint):L2TP控制连接隧道任意一端的L2TP节点。它既可以是LAC,也可以是LNS。取决于在数据链路层还是在网络层处理隧道帧。若在数据链路层处理隧道帧,则LCCE是LAC;若在网络层处理隧道帧,则LCCE是LNS。
PW    Pseudowire    伪线PW(Pseudowire):一条从本地AC接口到对端AC接口之间的虚拟的、直接相连的数据通道,能够完成用户的二层数据透明传输。每个L2TPv3会话对应一条PW。
AC接口    -    连接用户侧设备的接口,用于接收和发送用户侧流量。
PW接口    -    连接对端LCCE的接口,用于LCCE接收和发送L2TPv3协议报文和网络侧数据报文。
静态隧道    -    静态隧道是指直接通过命令行配置指定本端和对端的参数,不需要经过报文协商过程就直接进行数据转发。一个接口下只有一个隧道,一个隧道只支持一个会话。不同的接口下可以配置多个隧道。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_45851865/article/details/138460072

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值