CoAP学习笔记(1)CoAP报文结构

CoAP报文结构

CoAP基于UDP的应用层协议,报文结构如下
CoAP学习笔记(1)CoAP报文结构

  • Ver 版本号占2bit,固定为01
  • T 报文类型,占2bit,CoAP中有4种报文类型,如下
类型 描述 T值
CON报文 Confirmable,需要被确认的报文 T=00
NON报文 Non-Confirmable,不需要被确认的报文 T=01
ACK报文 Acknowledgement,应答报文 T=10
Reset报文 复位报文 T=11
  • TKL标签长度指示,占4bit用于指示后面的Token占几个字节,可以取值为0000、0001、0010、0100,分贝表示没有Token,Token占1字节、Token占2字节、Token占4字节

  • Code,占8bit,其中前3bit为Class部分,后5bit为Detail部分,采用c.dd形式来描述。在CoAP请求报文种Code表示请求方法,在CoAP响应报文种Code表示响应状态。

Code值 CoAP请求方法
0.01 GET方法
0.02 POST方法
0.03 PUT方法
0.04 DELETE方法
Code值 CoAP响应状态
0.00 空报文
2.xx 正确响应
4.xx 表示客户端错误
5.xx 表示服务器错误
  • Messages ID,报文序号,占2字节,大段格式,一组对应的CoAP请求和响应使用相同的报文序号
  • Token,标签,长度由TKL标签长度指示确定,与是资源的"身份证",CoAP有3种不同的请求/响应模式:携带模式、分离模式,非确认模式,Token在分离模式起重要作用,携带模式可以忽略。
  • Options,选项,后续细讲
  • 分隔符 0xFF,占1字节
  • Payload ,负载
T 报文类型

CON:请求必须要接收者发送ACK或者RST确认,如果发送者规定时间内内有收到ACK或者RST,则会重发。

NON:不要求接收者确认。

ACK:用于确认Messages ID一致的CON报文,ACK的payload可能为空(在分离模式)

RST:用于对应无法处理CON的报文,Messages ID需要与CON一致,且payload一定为空。

请求/响应模式
  • 携带模式
    ACK的payload部分包含响应负载,最少2包得到数据
    CoAP学习笔记(1)CoAP报文结构

  • 分离模式
    客户端同样发CON请求,服务器立刻会意ACK,但是ACK种没有payload,而是过段时间后服务器再回应CON,其中这个CON的Token要与客户端之前发送CON的Token一致,该CON还包含payload,客户端收到后用ACK回应。至少需要4个报文。
    CoAP学习笔记(1)CoAP报文结构

  • 非确认模式
    这种客户端发送NON报文,不需要服务器回应
    CoAP学习笔记(1)CoAP报文结构

CoAP重传机制

重传涉及3个参数

  • ACK_TIMEOUT 响应等待超时时间,典型值 2秒
  • ACK_RANDOM_FACTOR 随机系数 ,典型值1.5
  • MAX_RETRANSMIT 最大重传次数,典型值 4
    如果客户端在首次发送CON报文后,在ACK_TIMEOUT到ACK_TIMEOUT*ACK_RANDOM_FACTOR之间还没有收到ACK、或RST报文,则重发CON报文,下一次的超时等待时间计算中,ACK_RANDOM_FACTOR时上次的2倍。一个报文最多会被发1+MAX_RETRANSMIT 次
CoAP方法
  • GET
    查询资源
  • POST
    要求请求中的资源描述内容被服务器处理,比如创建(返回2.01 create)、修改(返回2.04 changed)、删除(返回2.02 delete)
  • PUT
    要求服务器根据请求中的URI和payload更新服务器指定资源,比如创建(返回2.01 create)、修改(返回2.04 changed)
  • DELETE
    要求根据请求中的URI删除服务器指定资源内容,返回删除(返回2.02 delete)
选项Options

选项Options由选项偏移量(Option Delete)、选项长度(Option Length)和选项值(Option Value)组成。CoAP不是直接确定选项值,而是用累加选项偏移量(Option Delete)的方式确定。
CoAP学习笔记(1)CoAP报文结构

  • 选项偏移量(Option Delete)
    4bit无符号整数,0~12指示选项偏移量,13、14、15特殊意义
    13:Option Delete占8位无符号整数,此时选项偏移量为 该8位无符号整数+13
    14:Option Delete占16位无符号整数,此时选项偏移量为 该16位无符号整数+269
    15,保留

  • 选项长度(Option Length)
    4bit无符号整数,0~12指示选项偏移量,13、14、15特殊意义
    13:Option Length占8位无符号整数,此时选项偏移量为 该8位无符号整数+13
    14:Option Length占16位无符号整数,此时选项偏移量为 该16位无符号整数+269
    15,保留

  • 选项定义
    上面的选项偏移量(Option Delete)累加起来查这张表就时对应的选项名称
    CoAP学习笔记(1)CoAP报文结构

1.URI选项
比如coap://wsncoap.org:5683/device/1234CDEF?limit=10&offest=20
Uri-Host 定义服务器域名,上面示例Uri-Host就是wsncoap.org
Uri-Port 定义端口,上面示例Uri-Port就是5683
Uri-Path定义路径,上面例子是2个Uri-Path,分别为device1234cdefUri-Path不会出现/这类分隔符
Uri-Query定义参数,上面例子是2个Uri-Query,分别为limit=10offest=20,Uri-Query不会出现? &这类分隔符
下面是
coap://wsncoap.org:5683/device/1234CDEF?limit=10的例子
CoAP学习笔记(1)CoAP报文结构

下面是选项长度扩展例子Uri-Path为16字节
CoAP学习笔记(1)CoAP报文结构

2.Content-Format选项
Content-Format选项指示CoAP负载payload媒体类型,用无符号整数表示,如二进制负载编号42,json负载编号50
3.Accept选项
Accept选项表示客户端期望接受到的payload媒体类型,编号定义与Content-Format选项编号定义相同
CoAP学习笔记(1)CoAP报文结构
下面是媒体类型编号

媒体类型 编号
text/plain 0
application/link-format 40
application/xml 41
application/octet-stream 42
application/exi 47
application/json 50
application/cbor 60

4.Etag选项
Etag选项作为标记实体资源的 "新旧"程度,当客户端的Etag和服务器中实体资源Etag一致时,服务器会回应2.03Valid,无响应内容。如下
CoAP学习笔记(1)CoAP报文结构
5.If-Match选项
If-Match选项是CoAP条件请求,一般用于更新服务器资源,和Etag组合使用,当服务器收到待更新资源的Etag和If-Match的Etag相同则更新资源,返回2.04(changed),否则不更新,返回4.12(Precondition Failed),如下图
CoAP学习笔记(1)CoAP报文结构
6.If-None-Match选项
If-None-Match选项,一般用于在服务器上创建新资源
CoAP学习笔记(1)CoAP报文结构