一、CAPWAP协议背景介绍
在802.11 WLAN解决方案中,瘦AP模式下AP是无法单独工作的,AP需要和AC通信,要和AC配合使用,因此,需要有一套AP+AC之间的互联通信协议,保证他们可以相互之间的互联。为此,Cisco最早制定了首个AP-AC之间的隧道通信协议—轻型接入点协议LWAPP。接着,IEFE(互联网工程任务组)为了解决各厂商AP-AC间隧道协议的不兼容问题,在2005年成立了无线接入点与配置协议(CAPWAP),也就是我们下面会详细解析的协议内容。
图1 CAPWAP参考协议集合
二、CAPWAP协议解析
1、整个协议分为如下几大块内容:
- AP对AC的自动发现及AP&AC的状态机运行、维护。
- AC对AP进行管理,业务配置下发。
- STA数据封装CAPWAP隧道进行转发。
2、其隧道建立流程如下图所示:
图2 CAPWAP协议交互整体流程
1)DHCP/Discovery阶段
在初始建立连接过程中,根据AP发送的报文类型,分为DHCP或Discovery两种AC/AP发现机制类型:
- DHCP广播
AP发送discover广播报文,请求DHCP server响应,DHCP server 侦听到discover报文后,会响应一个offer报文,该报文会携带TCP/IP的信息以及租约期限的信息。
AP收到DHCP server的offer报文后,多个offer报文使用最先到达的,然后会向网络中发送DHCP request广播报文,告诉所有的offer,并重新发送DHCP,DHCP server将制定从哪一台服务提供的IP地址。同时AP还会发送一个免费ARP去验证地址有没有被使用过。
DHCP server收到request报文后,会向AP回复DHCP ACK报文,该报文包含了AP的IP地址,租约,网管,DNS等。
- Discovery单播
如果AP以单播方式发送“发送请求”报文试图关联AP,AC收到请求后,会发送一个单播discover response给AP,AP通过discover response中所带的AC优先级等信息,确定与哪个AC进行建立会话。
2)DTLS加密握手(非必须)
与AC建立连接后,AP根据此IP地址与AC 协商,AP接收到响应消息后开始与AC建立CAPWAP隧道,这个阶段可以选择CAPWAP隧道是否采用DTLS加密传输UDP报文。
3)Join阶段
完成DTLS握手后,开始建立控制隧道,在建立控制的交互过程中,AC回应的join response报文中会协议用户配置的升级版本号,握手报文间隔/超时时间,控制报文优先级等信息。AC会检查版本,如果版本不匹配,会自动升级,如果匹配,会进入configuration状态。
4) Image Data阶段
AP根据协商参数判断当前版本是否是最新版本,如果不是最新版本则AP将在CAPWAP隧道上开始更新软件。AP更新后会强制重启,重启后重新进入DHCP/Discovery流程。
5) Configure阶段
进入Configure状态后是为了做AP的现有配置和AC设定配置的匹配检查,AP发送configuration request到 AC,该信息中包含了现有AP的配置,当AP的当前配置与AC要求不符合时,AC会通过configuration response通知AP。
6) Data Check阶段
AP发送change state event reques报文,其中包含了radio,result,code等信息。当AC收到后开始回应。Data check完成后,隧道建立已经完成,进入run状态。
7) Run阶段
- Keepalive报文
AP发送keepalive报文到AC,AC收到keepalive后表示数据隧道建立,AC回应keepalive报文,AP进入normal开始正常工作。
- echo心跳报文
AP进入Run状态后,同时发送echo request 报文给AC,宣布建立好CAPWAP管理隧道并启动echo发送定时器和隧道检测超时定时器以检测管理隧道时的异常。当AC收到echo request报文后,同样进入Run状态,并回应echo response报文给AP,启动隧道超时定时器;到AP收到echo response报文后,会重设检验隧道超时的定时器。
三、CAPWAP报文格式
CAPWAP使用UDP端口的应用层协议报文格式,可承载两类数据消息,分别为数据消息和控制消息。其数据报文端口为UDP端口5247,控制报文端口为UDP端口5246。
控制消息报文中除discover request及discover response是明文传输外,其他强制使用DTLS保护;数据消息报文可选择是否使用 DTLS,具体两种报文格式如图所示。
四、CAPWAP部分代码片段分析
OPEN CAPWAP代码库中,AP部分核心部分代码如下,DHCP交互前置流程在脚本中已实现,此处不再详细描述。
1、Discovery阶段WTPDiscoveryState.c
CWStateTransition CWWTPEnterDiscovery() 函数管理Discovery全流程状态,其中gCWACList结构体重置AP中已存放的AC列表,第二个for循环遍历向AC发送Request报文;
如果未发现AC,则状态机重置为Discovery阶段,否则状态机切换至Join阶段,进入下一流程。
2、Join阶段WTPJoinState.c
CWWTPEnterJoin.c函数负责Join阶段的核心流程,并且通过判断DTLS会话选择数据面是否封装加密报文格式。
3、Configure阶段WTPConfigureState.c
此流程各向函数较为简单,其核心CWBool CWAssembleConfigureRequest函数负责封装AP的各项配置参数至报文中,通过隧道发送给AC进行交互。
4、run阶段WTPRunState.c
此阶段的核心目标为心跳报文的发送接收、超时定时器及状态机切换操作,通过CWBool CWStartHeartbeatTimer()函数,控制定时器回调函数CWWTPKeepAliveDataTimerExpiredHandler完成各项状态机切换,实现AP与AC之间的不间断通信。