L2TP协议笔记

一、概述

    L2TP是第二层隧道协议。隧道建立在LAC(L2TP客户端)和LNS(L2TP服务器)之间。隧道由一个控制连接和0-n个L2TP会话(用来传输PPP数据包的会话)组成。一对LAC和LNS之间可以有若干个隧道。L2TP由两种类型的报文,一种是控制报文一种是数据报文。控制报文用于隧道和通话的建立、维护和清除。数据报文封装PPP帧,并在隧道上传输。

形象点说是这样的,隧道是一条有N条车道的高速公路,一台拨号PC的数据流就是一条会话,占用了一条公路,这条公路上只能传输这台PC的报文,运载报文在隧道上跑的车就是L2TP的数据报文,建立、维护、清除隧道和会话的是L2TP的控制报文。

二、控制报文类型

  1. SCCRQ(Start-Control-Connection-Request):用来向对端请求建立控制连接。
  2. SCCRP(Start-Control-Connection-Reply):用来告诉对端,本端收到了对端的ACCRQ消息,允许建立控制连接。
  3. SCCCN(Start-Control-Connection-Connected):用来告诉对端,本端收到了对端的SCCRP消息,本端已完成隧道的建立。
  4. StopCCN(Stop-Control-Connection-Notification):用来通知对端拆除控制连接,本端已清除所有会话连接,将关闭隧道接口。StopCCN中携带了发送端控制连接拆除原因。
  5. ICRQ(Incoming-Call-Request):只有LAC才会发送;每当检测到用户的呼叫请求,LAC就发送ICRQ消息给LNS,请求建立会话连接。ICRQ中携带会话参数。
  6. ICRP(Incoming-Call-Reply):只有LNS才会发送;收到LAC的ICRQ,LNS就使用ICRP回复,表示允许建立会话连接。
  7. ICCN(Incoming-Call-Connected):只有LAC才会发送;LAC收到LNS的ICRP,就使用ICCN回复,表示LAC已回复用户的呼叫,通知LNS建立会话连接。
  8. CDN(Call-Disconnect-Notify):用来通知对端拆除会话连接,并告知对端拆除的原因。
  9. Hello:用来检测隧道的连通性。
  10. 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个属性

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值