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 提供支持
在本页

这有帮助吗?

3 消息格式

上一页2.4 资源发现下一页3.1 Option的格式

最后更新于3年前

这有帮助吗?

CoAP的消息格式是很紧凑的,默认运行在UDP上(每个CoAP消息都是UDP数据包中的数据部分)。CoAP也可以运行在DTLS协议上(见9.1节)和其它传输协议上,例如SMS,TCP或SCTP,这些不属于本文档的范畴(CoAP不支持UDP-lite和UDP zero checksum)。

CoAP消息用二进制格式进行编码。这个消息格式以一个固定4个字节的头部开始。此后是一个长度在0到8字节之间的Token。Token值之后是0个或多个Type-Length-Value(TLV)格式的选项(Option)。之后到整个数据报的结尾都是payload部分,payload可以为空。

|       0       |       1       |       2       |       3       |
|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver| T |  TKL  |      Code     |          Message ID           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Token (if any, TKL bytes) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options (if any) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 1 1 1 1 1 1 1|    Payload (if any) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                     图7 消息格式

头部字段定义如下:

  • 版本号(Ver):2-bit无符号整型,代表CoAP版本号。本文档的实现必须设置这个字段为0b01。其它的值为今后其它版本保留。对于带有未知版本号的消息,必须忽略。

  • 类型(T):2-bit无符号整型。代表这个消息的类型是:CON(0), NON(1), ACK(2),或RST(3)。这些消息类型的语义在第4章进行定义。

  • Token长度(TKL):4-bit无符号整型。表示变长的Token字段(0-8字节)的长度。长度9-15是保留的,不能设置长度为9-15。如果设置了长度为9-15,必须被当作消息格式错误来处理。

  • 代码(Code):8-bit无符号整型。拆分为3-bit的分类信息和5-bit详细信息。写作”c.dd”。c是3-bit长,可以是一个从0到7的数字,dd是5-bit长,它一个两位的数字,从00到31。分类信息c可以代表是一个请求(0),一个成功的响应(2),一个客户端错误响应(4),或者一个服务端错误响应(5)。所有其它的值都是保留的。代码0.00是一个特殊的情况,表示一个空的消息。当消息是一个请求时,Code字段表示请求方法。当响应时,Code字段代表响应代码。Code字段所有可取的值都在CoAP代码表(12.1节)中定义了。请求和响应的语义定义在第5章。

  • 消息ID(Message ID):16-bit无符号整型,网络字节序。用于检测消息重复以及匹配ACK/RST类型的消息和CON/NON类型的消息。生成消息ID和匹配消息的规则在第4章中讲述。

头部之后是Token值,可以有0到8个字节,由Token长度字段指定。这个Token值用于将某个请求和对应的响应关联。生成Token和关联请求与响应的规则在5.3.1节讲述。

头部和Token之后,是0个或多个选项(见3.1节)。一个选项之后,有可能是消息结束,也可能是另一个选项,也可能是payload标识符和payload部分。

在头部、token和选项之后,是payload部分(可以没有payload)。如果有payload,并且长度不为0,那么payload之前有一个固定长度为一个字节的payload标识符(0xFF),它标志着选项部分的结束和payload部分的开始。payload部分从标识符之后开始,一直到这个UDP数据报结束,也就是说,payload部分的长度可以根据UDP数据报的长度计算出来。如果没有payload标识符,那么就代表这是一个0长度的payload。如果存在payload标识符但其后跟随的是0长度的payload,那么必须当作消息格式错误处理。

实现注意:0xFF这个值有可能出现在一个选项的长度或选项的值中,所以简单的扫描0xFF来寻找payload标识符是不可行的。作为payload标识符的0xFF只可能出现在一个选项结束之后下一个选项有可能开始的地方。

[RFC3828]
[RFC6936]