coap协议RFC中文文档
main
main
  • Introduction
  • 1 简介
    • 1.1 特性
    • 1.2 术语解释
  • 2 受限应用协议CoAP
    • 2.1 消息模型
    • 2.2 请求响应模型
    • 2.3 中间人和缓存
    • 2.4 资源发现
  • 3 消息格式
    • 3.1 Option的格式
    • 3.2 Option Value的格式
  • 4 消息传递
    • 4.1 消息和端
    • 4.2 可靠的消息传输
    • 4.3 没有可靠性保障的消息传输
    • 4.4 消息之间的关联
    • 4.5 去除重复消息
    • 4.6 消息大小
    • 4.7 拥塞控制
    • 4.8 传输参数
      • 4.8.1 改变参数
      • 4.8.2 传输参数的衍生时间
  • 5 请求/响应的语意
    • 5.1 请求
    • 5.2 响应
      • 5.2.1 附带响应
      • 5.2.2 单独响应
      • 5.2.3 无需确认消息NON
    • 5.3 请求/响应的匹配
      • 5.3.1 令牌(token)
      • 5.3.2 请求响应的匹配规则
    • 5.4 选项(option)
      • 5.4.1 重要选项/非重要选项Critical/Elective
      • 5.4.2 代理不安全或安全转发和无缓存键
      • 5.4.3 长度
      • 5.4.4 默认值
      • 5.4.5 可重复选项
      • 5.4.6 选项编号
    • 5.5 Payload和表现
      • 5.5.1 表现
      • 5.5.2 诊断式的payload
      • 5.5.3 经由选择的表现
      • 5.5.4 内容协商
    • 5.6 缓存
      • 5.6.1 新鲜度模型
      • 5.6.2 校验模型
    • 5.7 代理
      • 5.7.1 代理操作
      • 5.7.2 正向代理
      • 5.7.3 反向代理
    • 5.8 方法定义
      • 5.8.1 GET
      • 5.8.2 POST
      • 5.8.3 PUT
      • 5.8.4 DELETE
    • 5.9 返回码定义
      • 5.9.1 成功2.xx
        • 5.9.1.1 2.01 Created
        • 5.9.1.2 2.02 Deleted
        • 5.9.1.3 2.03 Valid
        • 5.9.1.4 2.04 Changed
        • 5.9.1.5 2.05 Content
      • 5.9.2 客户端错误4.xx
        • 5.9.2.1 4.00 Bad Request
        • 5.9.2.2 4.01 Unauthorized
        • 5.9.2.3 4.02 Bad Option
        • 5.9.2.4 4.03 Forbidden
        • 5.9.2.5 4.04 Not Found
        • 5.9.2.6 4.05 Method Not Allowed
        • 5.9.2.7 4.06 Not Acceptable
        • 5.9.2.8 4.12 Precondition Failed
        • 5.9.2.9 4.13 Request Entity Too Large
        • 5.9.2.10 4.15 Unsupported Content-Format
      • 5.9.3 服务端错误5.xx
        • 5.9.3.1 5.00 Internal Server Error
        • 5.9.3.2 5.01 Not Implemented
        • 5.9.3.3 5.02 Bad Gateway
        • 5.9.3.4 5.03 Service Unavailable
        • 5.9.3.5 5.04 Gateway Timeout
        • 5.9.3.6 5.05 Proxying Not Supported
    • 5.10 Option定义
      • 5.10.1 Uri-Host,Uri-Port,Uri-Path,Uri-Query
      • 5.10.2 Proxy-Uri和Proxy-Scheme
      • 5.10.3 Content-Format
      • 5.10.4 Accept
      • 5.10.5 Max-Age
      • 5.10.6 ETag
        • 5.10.6.1 作为响应选项的ETag
        • 5.10.6.2 作为请求选项的ETag
      • 5.10.7 Location-Path和Location-Query
      • 5.10.8 条件请求选项
        • 5.10.8.1 If-Match
        • 5.10.8.2 If-None-Match
      • 5.10.9 Size1选项
  • 6 CoAP URI
    • 6.1 Coap URI scheme
    • 6.2 Coaps URI scheme
    • 6.3 标准化和比较规则
    • 6.4 将URI解码为选项
  • 7 发现
    • 7.1 服务发现
    • 7.2 资源发现
      • 7.2.1 ‘ct’特性
  • 8 多播CoAP
    • 8.1 消息层
    • 8.2 请求响应层
      • 8.2.1 Caching
      • 8.2.2 代理
  • 9 安全CoAP
    • 9.1 DTLS-Secured CoAP
      • 9.1.1 消息层
      • 9.1.2 请求响应层
      • 9.1.3 端点身份
        • 9.1.3.1 Pre-Shared Keys
        • 9.1.3.2 原始公钥证书
          • 9.1.3.2.1 配置
        • 9.1.3.3 X.509证书
  • 10 CoAP和HTTP的跨协议代理
    • 10.1 CoAP-HTTP代理
      • 10.1.1 GET
      • 10.1.2_PUT
      • 10.1.3 DELETE
      • 10.1.4 POST
    • 10.2 HTTP-CoAP代理
      • 10.2.1 OPTIONS and TRACE
      • 10.2.2 GET
      • 10.2.3 HEAD
      • 10.2.4 POST
      • 10.2.5 PUT
      • 10.2.6 DELETE
      • 10.2.7 CONNECT
  • 11 安全事项
    • 11.1 解析协议和处理URIs
    • 11.2 代理和缓存
    • 11.3 增幅的风险
    • 11.4 地址欺骗攻击
    • 11.5 跨协议攻击
    • 11.6 受限节点的注意事项
  • 12 互联网地址分配注意事项(IANA Considerations)
    • 12.1 CoAP代码注册
      • 12.1.1 方法码
      • 12.1.1 响应码
    • 12.2 CoAP选项码注册(CoAP Option Number Registry)
    • 12.3 CoAP内容格式注册(CoAP Cotent-Formats Registry)
    • 12.4 URI方案注册(URI Scheme Registration)
    • 12.5 安全URI规范注册表
    • 12.6 服务名称和端口号注册表
    • 12.7 安全服务名称和端口号注册表
    • 12.8 多播地址表
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 4 消息传递

4.2 可靠的消息传输

上一页4.1 消息和端下一页4.3 没有可靠性保障的消息传输

最后更新于3年前

这有帮助吗?

如果CoAP协议头部中T字段标识为CON类型,则说明其采用可靠传输。CON类型的消息一般携带请求或响应,除非它是想要发送空消息以引发RST。接收端接收到CON类型消息后,必须是以下两种情况之一:

  • 通过返回一个ACK消息确认已收到。回复的ACK必须带有和CON消息相同的Message ID,并且必须携带有响应(附带响应格式)或者为空消息(单独响应格式)。

  • 如果是因为该消息缺少上下文而无法被正确处理(例如消息为空、使用了保留的Code类别(1,6或7),或者消息格式错误),拒绝这个消息。通过回复对应的RST消息,或者直接忽略,接收端可以拒绝CON类型的消息。回复RST消息必须带有和CON消息相同的Message ID,并且必须为空消息。参看5.2.1节和5.2.2节。

如果接收端想要拒绝一个ACK消息或者RST消息(例如ACK消息携带有请求或者有保留的code类别,RST消息不为空消息等),只需要忽略即可。一般的,ACK和RST消息的接收端必须不应答ACK或RST消息。

注意:发送端重传消息的间隔以指数增长,直到它收到一个ACK或者RST消息,或者达到最大重传次数。

重传由超时时间和重传计数控制。对于每一个CON类型的消息,发送端必须一直维护超时时间和重传计数,直到收到对应的ACK或者RST。对于一个新的CON消息,初始的超时时间被设置为介于ACK_TIMEOUT和ACK_TIMEOUT*ACK_RANDOM_FACTOR)之间(参见4.8节)的随机值(通常不是整数秒),重传计数被设置为0。当超时发生,且重传计数的值小于MAX_RETRANSMIT,消息被重传,重传计数增加,超时时间变为原来的两倍。如果在超时发生的时候重传计数达到了MAX_RETRANSMIT,或者收到了一个RST消息,那么就会放弃消息的传输,由应用程序来处理这个传输失败;如果在超时之前收到了ACK,那么传输就被认为成功了。

这一机制并不强制要求精准的时钟来实现上述指数回退算法。具体的说,某个端可能由于它周期性的休眠而没有赶上某一个重传时间点,但它却赶上了下一个。然而,两次重传之间的最小时间间隔是ACK_TIMEOUT,并且整个传输和重传的过程必须在MAX_TRANSMIT_SPAN(见4.8.2节)之内,尽管这意味着发送者有可能会错过传输的机会。

发送CON消息的端有可能在重传计数到达MAX_RETRANSMIT之前就放弃重传。例如,应用程序取消了这一请求,因为它已经不再需要响应;或者有其它证据表明消息已经到达,比如该请求消息导致接收端产生了单独响应,这种情况下就很明显,丢失的仅仅是请求消息的ACK而已,重传这个请求消息毫无意义。然而,响应端必须不能依赖请求端这种跨层的行为,它必须维护状态,为这个(可能重复的)请求回复ACK。如果需要的话,即使源请求端确认了CON响应(单独响应的第2步),接收端也应该回复(源请求端重传的请求)ACK。

另一个放弃重传的原因可能是收到了ICMP错误。如果希望处理ICMP错误以减轻潜在的ICMP欺骗攻击的影响,那么在实现上,应该仔细检查产生ICMP消息的原始数据,包括端口号和CoAP头部信息,如Message type, code, Message ID和Token;如果由于UDP提供的接口API的限制而无法检查,那么就应该忽略ICMP错误。如果遵循了第4.6节中的“实现注意”,那么正常情况下不应该发生数据包过大错误(IPv4的"fragmentation neede and DF set" [RFC0792])RFC4443],因此应该被忽略。如果没有遵循,那么就应该进入一个路径MTU计算算法。Source Quench和Time Exceeded类型的ICMP错误应该被忽略。主机,网络,端口或协议不可达错误和参数错误有可能经过适当的审查后用于通知应用程序,消息发送失败。

[RFC4821]