3.7.1.4 会话终止
当遇到以下所有情况时,CPE必须终止会话。
1、ACS不再有请求发给CPE,只有当最近的HTTP应答是空的CPE才能做出此结论;
2、CPE不再有请求发给ACS且已经发给ACS空的HTTP应答同时HoldRequests为0(HoldRequests为0 指的是CPE不再有请求发给ACS),如果这种情况没有遇到,CPE不再有请求或应答,它必须发出一个空的HTTP POST,这样就会满足该条件;
注意:HoldRequests SOAP包头元素是过时的,所以ACS不期望发送它。但是,ACS可能会发它,所以CPE仍然需要支持它。
3、CPE接收来源于ACS的所有outstanding 回应;
4、作为先前的请求的应答,CPE已经向ACS发送了所有outstanding回应
如果在等待至少30s后仍然没有收到ACS的回应,CPE认为该session不成功终止。如果CPE没有收到HTTP回应,CPE不能在同一个会话中重传相关HTTP请求。
如果CPE接收到带有错误代码的SOAP包(错误代码不包括8005,即retry request),CPE必须认为该session不成功结束;
如果CPE接收到的HTTP 应答的soap包不符合XML格式,或者SOAP的结果是无效的,或者是包括一个错误,或者CPE认为是违反协议的,CPE必须认为该session是不成功结束。
如果CPE接收到的HTTP应答中包含错误状态码(4**或者是5**),CPE必须认为该session是不成功结束。注意CPE允许含有401的错误码(401 Unauthorized)的HTTP 相应作为正常认证过程的一部分,当CPE随后尝试去认证时,如果结果的HTTP相应中包括401,CPE必须认为该session是不成功结束。
如果以上情况都没有遇到,CPE必须继续该session。
如果CPE接收到作为任何方法而不是Inform回应的带有错误代码8005的SOAP包应答,CPE必须继续改session,这种类型的错误回应不能引起session不成功中断。
注意:在错误的条件下,SOAP层的错误会导致ACS的重定向(不太理解,稍后查证),HTTP层的错误会引起session不成功中断。
如果在一个会话中信息的传输会引起CPE重启而来完成请求操作,CPE必须等到session完全结束后才能重启。
如果session毫无预期的中断,CPE必须重试发起连接,CPE需要在本地定义在这种情况下重试的次数。
3.7.2.4 会话终止
由于CPE促使HTTP连接到ACS,只有CPE负责连接的中断与建立。
当遇到以下所有情况后,ACS必须认为session结束
1、CPE不再有请求发给ACS,只有当ACS收到CPE的空的HTTP POST且HoldRequests为0才能做出此结论;
2、ACS不再有请求发给CPE,求ACS发给CPE最新的HTTP相应为空(为空来指示CPE,ACS不再有请求);
3、ACS已经给CPE发送了所有outstanding回应
4、ACS已经接收到了所有outstanding回应;
如果在ACS发送最后一个HTTP相应前遇到以上所有标准,那么ACS的最一个HTTP相应应该为空。
如果以上标准没有全部遇到,ACS在等待至少30后仍然没有接收到HTTP POST, 它会认为session结束。在这种情况下,ACS会用Connection Request尝试重连。
如果ACS接收到的HTTP POST的SOAP格式或者其中包含有错误,ACS必须用400错误状态码应答,同时必须把该session当做是不成功的终止,错误回应包中必须不能包括SOAP内容,但是可以包含一些具有可读性的对错误的解释。
如果ACS收到的请求过期,或者是ACS确定的与一些协议相悖的,或者是由ACS自由裁量的其他原因,ACS会发给CPE带有400状态码的HTTP来使会话不成功中断,这个HTTP不能包含SOAP内容,但是可以包含具有可读性的对错误的解释。
如果ACS接收到CPE的SOAP错误应答,ACS必须中断任何类似于9001(请求否认)未确认的错误码,可能会选择下面的行为:
1)ACS会强制终止使session中断失败,为此,ACS必须用HTTP 400 应答。这个HTTP不能包含SOAP内容,但是可以包含具有可读性的对错误的解释。这样结果会导致CPE重试会话。
2)ACS会尝试中断session使它成功终止,在这种情况下CPE会retry 会话。为此,ACS会给CPE发送更多的请求,并且会遵守以上终止会话的规则。
3) ACS会继续这个会话,给CPE发送额外的请求