PPPoE 在以太网上传输PPP的方法( 二 )


Discovery阶段保持无状态(stateless)直到建立起一个PPP会话 。一旦PPP会话建立,主机和访问集中器两者都必须为一个PPP虚拟接口分配资源 。
4.净载数据
这里定义了下面所示的数据包格式 。payload的内容将在Discovery和PPP的章节中描述 。
以太网的帧格式如下所示:
0
1
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
DESTINATION_ADDR
(6个字节)
SOURCE_ADDR
(6个字节)
ETHER_TYPE(2个字节)
payload......
CHECKSUM
DESTINATION_ADDR域是一个以太网单播目的地址或者以太网广播地址(0xffffffff) 。对于Discovery数据包来说,该域的值是在Descovery章节中定义的单播或者多播地址 。对于PPP会话流量来说,该域必须是Descovery阶段已确定的通信对方的单播地址 。
SOURCE_ADDR域必须包含源设备的以太网MAC地址 。
ETHER_TYPE设置为0x8863(Discovery阶段)或者0x8864(PPP会话阶段) 。
PPPoE的以太网payload如下所示:
0
1
2
3
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
VER
TYPE
CODE
SESSION_ID
LENGTH
payload......
VER域为4位,PPPoE规范的本版本必须设置为0x1 。
TYPE域为4位,PPPoE规范的本版本必须设置为0x1 。
CODE域为8位,其定义在后面的Discovery和PPP会话章节分别指定 。
SESSION_ID域为16位,是一个网络字节序的无符号值 。其值在后面Discovery数据包中定义 。对一个给定的PPP会话来说该值是一个固定值,并且与以太网SOURCE_ADDR和DESTINATION_ADDR一起实际地定义了一个PPP会话 。值0xffff为将来的使用保留,不答应使用 。
LENGTH域为16位 。该值(网络字节序)表明了PPPoE的payload长度 。不包括以太网头部和PPPoE头部的长度 。
5.Discovery阶段
Discovery阶段由4个步骤组成 。完成之后通信双方都知道了PPPoESESSION_ID以及对方以太网地址,它们共同定义了唯一的PPPoE会话 。这些步骤包括:主机广播一个(会话)发起数据包(以请求建立链路),一个或多个访问集中器发送提供(服务)数据包,主机发送单播会话请求数据包以及选中的访问集中器发送确认数据包 。当主机接收到该确认数据包后,它就可以进入PPP会话阶段 。访问集中器发送确认数据包后,它就可以进入到PPP会话阶段 。
Discovery阶段所有的以太网帧的ETHER_TYPE域都设置为0x8863 。
PPPoE的payload部分包含0个或多个TAG 。一个TAG是一个TLV(type-length-value)结构,定义如下:
0
1
2
3
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
41
2
3
4
5
6
7
8
9
0
1
TAG_TYPE
TAG_LENGTH
TAG_VALUE......
TAG_TYPE域为16位值(网络字节序),附录A列出了各种TAG_TYPE和TAG_VALUE 。
TAG_LENGTH域为16位,是无符号值(网络字节序),表明TAG_VALUE的字节数 。
假如收到的discovery数据包中包含未知的TAG_TYPE,则必须忽略掉该TAG,除非本文档非凡指出 。这样规定是为了在增加新的TAG时保持向后兼容 。假如增加强制使用的TAG,则版本号(version)将会提高 。
附录B中有一些Discovery数据包的例子 。
5.1PPPoEActiveDiscoveryInitiation数据包(PADI)
主机发送DESTINATION_ADDR为广播地址的PADI数据包,CODE域设置为0x09,SESSION_ID域必须设置为0x0000 。

推荐阅读