一、概述
L2TP是第二层隧道协议。隧道建立在LAC(L2TP客户端)和LNS(L2TP服务器)之间。隧道由一个控制连接和0-n个L2TP会话(用来传输PPP数据包的会话)组成。一对LAC和LNS之间可以有若干个隧道。L2TP由两种类型的报文,一种是控制报文一种是数据报文。控制报文用于隧道和通话的建立、维护和清除。数据报文封装PPP帧,并在隧道上传输。
形象点说是这样的,隧道是一条有N条车道的高速公路,一台拨号PC的数据流就是一条会话,占用了一条公路,这条公路上只能传输这台PC的报文,运载报文在隧道上跑的车就是L2TP的数据报文,建立、维护、清除隧道和会话的是L2TP的控制报文。
二、控制报文类型
- SCCRQ(Start-Control-Connection-Request):用来向对端请求建立控制连接。
- SCCRP(Start-Control-Connection-Reply):用来告诉对端,本端收到了对端的ACCRQ消息,允许建立控制连接。
- SCCCN(Start-Control-Connection-Connected):用来告诉对端,本端收到了对端的SCCRP消息,本端已完成隧道的建立。
- StopCCN(Stop-Control-Connection-Notification):用来通知对端拆除控制连接,本端已清除所有会话连接,将关闭隧道接口。StopCCN中携带了发送端控制连接拆除原因。
- ICRQ(Incoming-Call-Request):只有LAC才会发送;每当检测到用户的呼叫请求,LAC就发送ICRQ消息给LNS,请求建立会话连接。ICRQ中携带会话参数。
- ICRP(Incoming-Call-Reply):只有LNS才会发送;收到LAC的ICRQ,LNS就使用ICRP回复,表示允许建立会话连接。
- ICCN(Incoming-Call-Connected):只有LAC才会发送;LAC收到LNS的ICRP,就使用ICCN回复,表示LAC已回复用户的呼叫,通知LNS建立会话连接。
- CDN(Call-Disconnect-Notify):用来通知对端拆除会话连接,并告知对端拆除的原因。
- Hello:用来检测隧道的连通性。
- ZLB(Zero-Length Body):如果本端的队列没有要发送的消息时,发送ZLB给对端。在会话连接和控制连接的拆除过程中,发送ZLB还表示收到StopCCN或CDN。ZLB只有L2TP头,没有负载部分。
三、报文头
L2TP数据包用于控制信道和数据信道共享一个公共报头格式。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|T|L|x|x|S|x|O|P|x|x|x|x| Ver | Length (opt) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Tunnel ID | Session ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ns (opt) | Nr (opt) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset Size (opt) | Offset pad... (opt)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
T:报文类型。数据报文,设置为0。控制报文,设置为1。
L:如果L位为1,则存在长度字段。对于控制报文,L位必须设置为1。
X:保留位。
S:S位设置为1,表示存在Ns和Nr字段。控制报文的S位必须设置位1
O:O位设置为1,表示存在offset size字段。控制信息的O位必须设置为0
P:P位设置为1,表示这个数据报文被优先处理。所有的控制报文的P位设置为0
Version:L2TP的版本
Tunnel id:用来标识一条隧道。这个隧道ID是目的隧道ID
Session id:用来标识在隧道上一个会话
Ns:报文的序列号
Nr:希望下一个接收的报文的序列号
Offset Size:标识负载数据的大小,也就是AVP的大小
四、AVP格式
L2TP为了提高可扩展性,在L2TP中使用消息类型和消息体这种编码方式。这种编码被称为AVP(属性值对)
+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|M|H| rsvd | Length | Vendor ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attribute Type(两个字节) | Attribute Value...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[until Length is reached]... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
前六位是位掩码,描述了AVP的一般属性。rfc中定义了两个位,其余的为将来的扩展保留。保留位必须设置为0。接收到的保留位设置别的AVP为1的AVP必须视为无法识。
M:表示收到无法识别的AVP时如何处理这个AVP。M位被设置为1时,收到无法识别的AVP时会关闭隧道。M位被设置为0时,收到无法识别的AVP时会将这个AVP忽略。Rfc设置所有的消息类型M位必须为1。
H:表示是否隐藏AVP的属性值字段中的数据。将属性值字段的值不以明文传输
Length:记录这个AVP包含的字节数。这个长度大于等于6。Length这个字段本身是10位,单个AVP中最多是1023个字节。
Vendor id:供应商ID
Attritube type:属性类型。两个字节大小
Attribute value:属性值。有可能是一个或多个。长度不定
五、AVP
Note:小括号里的是这个属性会出现在那种控制报文中
1、所有的控制报文都必须有的属性
Control message AVP(所有的控制信息): Attribute Type 0,两个字节。标识控制报文的类型。必须是紧跟控制报文后的第一个属性
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2、random vecotr avp: Attribute Type 36 ,不定长。用于隐藏任意属性的属性值。如果H位为1,改控制报文中就会出现这个属性。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Random Octet String ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3、Result code avp:Attribute Type 1。(CDN,StopCCN)不定长,描述终止隧道或会话的原因。
Result code:两个字节的无符号整数。Error code:两个字节的无符号整数。Error Message:不定长的字符串。错误代码和错误信息不一定会存在,取决于AVP的长度,avp.length == 8,只有result code,avp.length == 10,有result code 和 error code,avp.length > 10,有result code ,error code 和 error message
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Result Code | Error Code (opt) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Error Message (opt) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4、Protocol Version AVP (SCCRP,SCCRQ):Attribute Type 2,标识发送方L2TP协议的版本
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver | Rev |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Ver和rev都是一字节的无符号整数
5、Framing Capabilities AVP(SCCRP,SCCRQ) :Attribute Type 3,32位掩码,定义了两位,标识接收或发送帧的类型。bit位A置1,标识支持帧异步;bit位S置1,标识支持帧同步。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved for future framing type definitions |A|S|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6、Beaer Capabilities AVP(SCCRP,SCCRQ) :Attribute Type 4,32位掩码,定义了两位,标识发送方用于outgong call的硬件接口类型。定义了两位,Bit位A置为1,标识支持模拟访问,bit位D置为1,标识支持数字访问。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved for future bearer type definitions |A|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7、Tie Breaker AVP(SCCRQ):Attribute Type 5,8字节。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Tie Break Value...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...(64 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
标识发送者希望在LAC和LNS之间只存在一个tunnel;如果LAC和LNS同时都发起了SCCRQ,那么需要选择一个单一的tunnel。接收到SCCRQ端检查自己是不是向对端发送了SCCRQ,如果已经发送了,就比较Tie Breaker值的大小,值小的继续tunnel建立,值大的必须放弃tunnel。如果两个值相等,都放弃。
8、Firmware Revision (SCCRP, SCCRQ):Attribute Type 6,2字节。标识运行L2TP机器的版本。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Firmware Revision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9、Host name AVP (SCCRP, SCCRQ):Attribute Type 7,不定长,标识发送端的主机名称。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Host Name ... (arbitrary number of octets)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10、 Vendor Name (SCCRP, SCCRQ):Attribute Type 8,不定长,标识客户端或服务器的供应商名称。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Vendor Name ...(arbitrary number of octets)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
......共32个属性