5.2.2 单独响应
不是所有的消息都能将响应附带在ACK中回传。举个例子,一个服务端可能需要一段时间(比ACK超时时间更长)来获取资源表现,因此不需要冒险让客户端反复的重传请求信息(参见4.8.2节中PROCESSING_DELAY的讨论)。当请求是携带在NON中时,响应总是和ACK分离的(因为NON不需要ACK)。
服务端产生单独响应的时机是,服务端在获得资源表现过程中,ACK定时器超时。如果服务端提前知道不会有附带响应,服务端也可能马上发一个ACK。在这两个情况中,ACK都表示请求将马上执行。
当服务器最终获得了资源表现后,它发送这个响应。服务器希望消息不丢失,它会选择一个新的Message ID,发送CON到客户端,并需要客户端回复一个ACK(可能也会发送NON,参见5.2.3)。
当服务端选择使用单独响应,它会发送空的ACK给CON请求。只要服务端回复了空的ACK,即使客户端重传另一个同样的请求,它也不能再回复附带响应。如果收到一个重传的请求(可能是因为原有的ACK延迟了),服务端发送另一个空的ACK,所有的响应都必须发送单独响应。
如果这个服务端接着发了一个CON的单独响应,客户端回复这个响应的ACK也必须是空的信息(不携带请求和响应的消息)。收到ACK后,服务端在所有匹配的ACK(忽略任何响应码和payload)和RST消息中停止重传该响应。
实现注意:由于底层数据报传输可能是无序的,因此,单独响应的CON消息可能在请求的空ACK前到达客户端。为了避免重传,这个CON消息也作为ACK来处理。也要注意,虽然CoAP协议本身不做任何特殊的要求,但应用可能期望响应会在一个时间期限内到达。因为底层传输没有keep-alive机制,请求者可能要建立一个超时时间(与CoAP重传时间无关)以防服务端出问题或者不能响应。
最后更新于
这有帮助吗?