3、 L2TP报头格式 L2TP使用两种类型的消息:控制消息和数据消息。控制消息用于隧道和呼叫的建立、维护和清除,它使用L2TP内的可靠控制通道来保证传送。数据消息用于封装隧道传输的PPP帧,当发生包丢失时不再传送数据消息。 PPP帧先由L2TP报头封装,再由一种包传输机制(如UDP、帧中继、ATM等)封装之后在一个不可靠的数据通道上传输。但是,控制消息在一个可靠的L2TP控制通道上传送,这个控制通道在同一包传输机制上传送包。在所有的控制消息中都需要有序列号,序列号还用于提供控制通道上的可靠传送。数据消息可以使用序列号来重新排序数据包和检测包的丢失。 控制通道和数据通道的L2TP数据包的报头格式相同(如图2所示)。在该报头格式中,当一个可选字段未被选中时,在消息中不为这个字段预留空间。注意:当数据消息的可选项Ns在消息中出现(即被选中)则可选项Nr必须出现在所有控制消息中。 T:消息类型,1 bit。 0 数据消息;1 控制消息。 L:长度字段出现,1 bit,可选。 如果设置了这一位,则长度字段出现。控制消息中必须设置这一位。 S:序列号出现,1 bit。 如果设置了这一位,则Ns和Nr字段出现。控制消息中必须设置这一位。 O:偏移字段出现,1 bit。 如果设置了这一位,则 Offset Size字段出现。控制消息中必须设置这一位。 P:优先权,1 bit。 这一特征只是对数据消息而言,控制消息都必须设置这一位。如果设置了这一位,则在本地排队和传输中将优先处理这个数据消息。 Version:4 bits。 指明L2TP协议的版本,必须被设置为2。保留值1用作允许对L2F数据包的检测,判断是否与L2TP数据包一起到达。当接收到一个版本值未知的数据包时,必须丢弃这个数据包。 Length:16 bits。 指明消息的总长度,用字节表示。 Tunnel ID:16 bits。指明控制连接的标识符。L2TP遂道由只有本地意义的标识符命名;即,同一隧道在隧道的每一端都有不同的Tunnel IDs。每一个消息中的Tunnel ID 都是预定接收者而不是发送者的Tunnel ID。在隧道创建期间,Tunnel IDs的选择和交换都是作为Assigned Tunnel ID AVPs(Attribute-Value Pair)进行的。 Session ID,16 bits。 指明一个隧道内的一次会话的标识符 。L2TP 会话由只有本地意义的标识符命名;即,同一个会话在会话的每一端有不同的Session IDs。每一个消息中的Tunnel ID 都是预定接收者而不是发送者的Session ID。在会话创建期间,Session IDs的选择和交换都是作为AssignedSession ID AVPs进行的。 Ns:16 bits,可选。 指明数据消息或控制消息的序列号。从0开始每发送一个消息加1。 Nr:16 bits,可选。 表明所要收到的下一个控制消息中"预定"的序列号0。因此,Nr被设为所接收到的最后一个消息的Ns加1。若在数据消息中保留Nr,则接收时必须忽略。 Offset Size:16 bits,可选。 如果出现,则指定了L2TP报头之后的字节数,因为载荷数据从这里开始(即载荷数据的字节数)。如果offset字段出现,则L2TP header在offset padding的最后一个字节之后结束。 Offset Pad:偏移填充,可变长度,可选。 Data:可变长度。 4、 相关技术与应用 4.1 用L2TP控制消息维护隧道 与PPTP不同,L2TP隧道的维护不在独立的TCP连接上进行。L2TP呼叫控制和管理业务在L2TP客户和服务器之间以UDP消息的形式发送。在Windows 2000中,L2TP客户和服务器都使用UDP端口1701。值得注意的是,Windows 2000的 L2TP服务器也支持使用的其他UDP端口(UDP端口不为1701)的L2TP客户。 IP上的 L2TP控制消息以UDP数据包的形式发送。在 Windows 2000实现中,这样的L2TP控制消息作为IPSec ESP的加密载荷发送, 如图3所示:
因为没有使用TCP连接,L2TP使用消息序列确保L2TP消息的传输。L2TP控制消息中,Nr和Ns字段都用于保持控制消息的次序,违反次序的数据包将被丢弃。Nr和Ns字段也可用于隧道数据的顺序传送和流控制。 L2TP的每一个隧道都支持多个呼叫。L2TP控制消息和报头中有隧道数据的Tunnel ID--用于指定隧道和Call ID--用于指定这个隧道中的一次呼叫。 4.2 L2TP数据的隧道传输 L2TP数据的隧道传输是通过多级封装实现的。图4为IPSec隧道数据进行L2TP封装之后产生的结构。
其中,Data-Link Layer封装是为了在LAN或 WAN 连接上传送,IP数据包用数据链路层的报头和报尾封装。例如,以太网接口上发送的IP数据报用以太网报头和报尾封装。当IP数据报在点到点WAN链路(如模拟电话线或 ISDN)上传送时,IP数据报用一个PPP报头和报尾来封装。 接收到L2TP封装的IPSec隧道数据后,L2TP客户或L2TP服务器将进行L2TP的分离处理,过程如下: 处理并剥去数据链路层报头和报尾; 处理并剥去IP header; 使用IPSec ESP Auth trailer认证IP载荷和IPSec ESP报头; 使用IPSec ESP header解密数据包的加密部分; 处理UDP header并将L2TP数据包发给L2TP; L2TP使用L2TP header 中的Tunnel ID和Call ID确定特定的L2TP遂道; 使用PPP header确定PPP载荷,并将它转发给适当的协议驱动器进行处理。 4.3 在Windows 2000网络体系结构中利用L2TP技术实现VPN 图5说明了隧道传输数据在Windows 2000网络体系结构中从一个VPN客户使用一个模拟MODEM在远程访问VPN经过的过程:
一个IP数据报、IPX 数据报、或NetBEUI帧由适当的协议发送到虚拟接口上,使用NDIS(网络驱动器接口标准)表示VPN连接。 NDIS向NDISWAN提交一个数据包(可以是压缩过的)并提供一个只包含PPP协议ID字段的PPP报头,不添加Flag和FCS字段。 NDISWAN向L2TP协议驱动器提供PPP帧,由L2TP协议驱动器用一个L2TP报头封装PPP帧。在L2TP报头中,将Tunnel ID和Call ID设置成适当的值以确定L2TP隧道。 然后L2TP协议驱动器向TCP/IP协议驱动器提交产生的数据包,同时还要提交将L2TP数据包以UDP消息形式从UDP端口1701发送到UDP端口1701,同时提交的还有VPN客户和服务器的IP地址。 TCP/IP协议驱动器用适当的IP报头和UDP报头构建一个IP数据包;然后IPSec分析这个IP数据包找出与之相匹配的 IPSec。IPSec根据这个策略的设置,使用适当的ESP 报头和报尾封装和加密IP数据包中的UDP消息部分;将Protocol字段设为50的源IP header添加到ESP数据包前面。 然后TCP/IP协议驱动器向使用UDIS表示到本地ISP的拨号连接的接口提交所产生的数据包。 NDIS向NDISWAN提交这个数据包。 NSIDWAN提供PPP报头和报尾,并将产生的PPP帧提交给适当的、表示拨号硬件的WAN miniport驱动器。 应当注意到,拨号连接可以和ISP协商一个加密的PPP连接,但是不必要也不推荐这样做,因为所发送的专用数据或隧道传输的PPP帧已经用IPSec加密了,不需要其他层的加密,而且这些加密会影响性能。 5、 结束语 目前,L2TP的标准化进程已接近尾声,几家大公司的相关产品也进行了互通测试。L2TP定义了利用公共网络基础设施(如IP网络、ATM和帧中继网络)封装传输链路层PPP帧的方法。现在,Internet中的拨号网络只支持IP协议,而且必须使用注册IP地址,而L2TP可以让拨号用户支持多种协议,如IP、IPX、AppleTalk,且可以使用保留网络地址,包括保留IP地址。可见,L2TP的应用前景广泛,尤其是在VPN建设方面。