1 L2tp的协议消息
如下是LAC和LNS间的协议交互过程。其中,SCCRQ、SCCRP、SCCCN属于控制消息,用于l2tp隧道的建立,在此过程中,会分配tunnel id;ICRQ、ICRP、ICCN属于会话消息,用于用户会话的建立,在此过程中,分配session id。
隧道建立成功后,需要echo报文来维持隧道。
SCCRQ、SCCRP、SCCCN、ICRQ消息没有session id,报文上送时,走cp car通道。ICRP、ICCN消息有tunnel id 和session id,报文上送时,走host car通道。
① 1(SCCRQ)Start-Control-Connection-Request
控制链接发起请求,由LAC或LNS向对端发送,用来初始化LAC和LNS之间的tunnel,开始tunnel的建立过程。
② 2(SCCRP)Strat-Control-Connection-Reply
表示接受了对端的连接请求,tunnel的建立过程可以继续。
③ 3(SCCCN)Start-Control-Connection-Connected
对SCRRP的回应,完成tunnel的建立。
④ ZLB
零长度消息报文,一般为查询报文,LAC可以用Hello报文进行恢复,也可以直接丢弃。
⑤ 10(ICRQ)Incoming-Call-Request
当LAC检测到有用户拨入电话的时候,向LNS发ICRQ,请求在已建立的tunnel中建立session。
⑥ 11(ICRP)Incoming-Call-Reply
用来回应ICRQ,表示ICRQ成功,LNS也会在ICRP中标识L2TP session必要的参数。
⑦ 12(ICCN)Incoming-Call-Connected
用来回应ICRP,L2TP session建立完成。
在隧道和会话建立成功后,用户通过l2tp隧道,和lns进行ppp协商。ppp协商消息有tunnel id 和 session id,报文上送时,走host car通道。
PPP协商消息分为LCP(链路控制协议)、NCP(网络控制协议)。
1、隧道和会话的概念
在一个LNS和LAC对之间存在着两种类型的连接,一种是隧道(Tunnel)连接,一对LAC和LNS中可以有多个L2TP隧道;另一种是会话(Session)连接,它复用在隧道连接之上,用于表示承载在隧道连接中的每个PPP会话过程。
隧道由一个控制连接和一个或多个会话(Session)组成。会话连接必须在隧道建立(包括身份保护、L2TP版本、帧类型、硬件传输类型等信息的交换)成功之后进行,每个会话连接对应于LAC和LNS之间的一个PPP数据流。控制消息和PPP数据报文都在隧道上传输。
L2TP使用Hello报文来检测隧道的连通性。LAC和LNS定时向对端发送Hello报文,若在一段时间内未收到Hello报文的应答,该隧道连接将被断开。
L2TP报文头中包含隧道标识符(Tunnel ID)和会话标识符(Session ID)信息,用来标识不同的隧道和会话。隧道标识相同、会话标识不同的报文将被复用在一个隧道上,报文头中的隧道标识符与会话标识符由对端分配。
2、控制消息和数据消息的概念
L2TP中存在两种消息:控制消息和数据消息。
控制消息:用于隧道和会话连接的建立、维护以及传输控制;控制消息的传输是可靠传输,并且支持对控制消息的流量控制和拥塞控制。
数据消息:用于封装PPP帧并在隧道上传输;数据消息的传输是不可靠传输,若数据报文丢失,不予重传,不支持对数据消息的流量控制和拥塞控制。
控制消息和数据消息共享相同的报文头。
2 L2tp的报文结构
L2TP有两种报文:控制报文和数据报文。这两种报文都使用UDP封装,目的端口为1701,源端口不做限制
下图为L2TP报文头格式:
Type(T):标识消息的类型,0表示是数据消息,1表示控制消息。
Length(L):置1时,说明Length域的值是存在的,对于控制消息L位必须置1。
X bit:保留位,所有保留位均置0。
Sequence(S):置1时,说明Ns和Nr是存在的,对于控制消息S必须置1。
Offset(O):置1时,说明Offset Size域是存在的,对于控制消息O必须置0。
Priority(P):只用于数据消息,对于控制消息P位置0,当数据消息此位置1时,说明该消息在本列队和传输时应得到优先处理。
Ver:必须是2,表示L2TP数据报头的版本。
Length:标识整个报文的长度(以字节为单位)。
Tunnel ID:标识L2TP控制链接,L2TP Tunnel标识符只有本地意义,一个Tunnel两端被分配的Tunnel ID可能会不同,报头中的Tunnel是指接收方的Tunnel ID,而不是发送方的。本端的Tunnel ID在创建Tunnel时分配。通过Tunnel ID AVPs和对端交换Tunnel ID信息。
Session ID:标识Tunnel中的一个session,只有本地意义,一个session两端Session ID可能不同。
Ns:标识发送数据或控制消息的序号,从0开始,以1递增,到216再从0开始。
Nr:标识下一个期望接收到的控制消息。Nr的值设置成上一个接收到的控制消息的Ns+1。这样是对上一个接收到的控制消息的确认。数据消息忽略Nr。
Offset Size:如果值存在的话,标识有效载荷数据的偏移。
下图为L2TP报文的通用格式: