五、L2TP的Tunnel和Session建立过程
 
L2TP协议笔记2---L2TP主要协议报文分析_L2TP 
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建立完成。
 

六、其它主要控制消息了解

控制报文: 0(reserved)
                       1(SCCRQ)
                       2(SCCRP)
                       3(SCCCN)
                       4(STOPCCN)Stop-Control-Connection-Notification
                       由LAC或LNS发出,通知对端tunnel将要停止,控制链接将要关闭。另外,所有活动的会话都会悄悄的被清除,原因会显示在Result Code AVP中。
                       5(reserved)
                       6(HELLO)
 
会话报文:
                        8(OCRP)Outgoing-Call-Reply
                        9(OCCN)Outgoing-Call-Connected
                        10(ICRQ)
                        11(ICRP)
                        12(ICCN)
                        13(reserved)
                        14(CDN)Call-Disconnect-Notify
                        由LAC或LNS发出,通知对端session将要停止。
 
错误报告报文:15(WEN)WAN-Error-Notify
 
PPP链接控制报文:16(SLI)Set-Link-Info
7(OCRQ)Outgoing-Call-Request                                       LNS发向LAC用来设置PPP协商的选项,这些选项在call的生存周期中可以随时变化,因此LAC有能力在活动的PPP session上更新内部的呼叫信息和行为。
 

 
七、L2TP报文头格式
 
L2TP协议笔记2---L2TP主要协议报文分析_L2TP协议_02
 
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:如果值存在的话,标识有效载荷数据的偏移。
 

 
八、 AVP介绍及其格式
 
1、AVP介绍
    控制消息中要携带的相关参数,使用AVP(Attribute Value Pair,属性值对)的形式来表示,使协议具有很好的扩展性。
 
2、AVP格式
L2TP协议笔记2---L2TP主要协议报文分析_L2TP报文_03
 
● 开始的6个bit是一个位掩码,用来描述AVP的普通属性,RFC2661定义了前2位,其余被保留。
● (M)命令位:用来控制收到不认识的AVP时必须执行的动作。如果在一个关联特殊的会话消息中M位被置为不认识的AVP,这个会话一定会被终止。如果在一个关联全部通道的消息中M位被置为不认识的AVP,整个通道包括通道内的会话一定会被终止。如果M为没有被设置,这个不认识的AVP会被忽略掉。 
● (H)隐藏位:用来识别一个AVP的属性域里的隐藏数据。 
● 保留位一定要置0,收到一个保留位为1的AVP,会把收到的AVP当做不认识。

 
九、部分主要AVP含义
 
(1)   Control Connection Management AVP
(2)   Protocol Version AVP :标识L2TP协议的版本。
(3)   Framing Capabilities AVP :倒数第二bit位A置1,标识支持帧异步;倒数第二bit位S置1,标识支持帧同步。
(4)   Beaer Capabilities AVP :

L2TP协议笔记2---L2TP主要协议报文分析_L2TP协议_04

(5)   Tie Breaker AVP
标识发送者希望在LAC和LNS之间只存在一个tunnel;如果LAC和LNS同时都发起了SCCRQ,那么需要选择一个单一的tunnel。接收到SCCRQ端检查自己是不是向对端发送了SCCRQ,如果已经发送了,就比较Tie Breaker值的大小,值小的继续tunnel建立,值大的必须放弃tunnel。如果两个值相等,都放弃。
(6)   Host name AVP :标识发送端的主机名称。
(7)   Assigned Tunnel ID :本端(发送端)分配的tunnel ID。
(8)   Receive Window Size :
标识接收窗口的大小:如果没有发送这个AVP,对端必须假设接收窗口是4,远端在发送指定数量的控制消息后,必须等待对方确认。
(9)   Challenge :标识发送端希望对tunnel对端进行CHAP认证。
(10) Challenge Response :对接收到Challenge的响应。
(11) Assigned Session ID :
本端分配的Session ID,当LAC检测到用户呼叫的时候,向LNS发送ICRQ,请求在已经
存在的tunnel中建立session链接,LAC在本端为需要建立的session分配一个session ID,这个session ID只具有本地意义。LNS接收ICRQ后回应ICRP,在ICRP中也包含了LNS为这个session分配的一个具有本地意义的session ID。通过ICRQ和ICRP,本地就可以获得对端为这条session分配的session ID了。
注意:在L2TP包头中的session ID是指对端对session分配的session ID。
(12)Minimum BPS :标识呼叫链接可接受的最低的连接速率。
(13)Maximum BPS :标识呼叫链接可接受的最高的连接速率。
(14)Bearer Type :标识呼叫连接的是模拟信道还是数字信道。
(15)Framing Type :标识支持帧同步还是帧异步,如果A和S都置位说明都支持或者是不清除。
(16)Called Number :被呼叫方的电话号码。
(17)Calling Number :呼叫方的电话号码。
(18)Rx Connect Speed :LAC的接收速率,可能和发送速率是不对称的。
(19)Private Group ID :LAC用来标识客户属于某个特定的组织。