CoAP学习笔记(1)CoAP报文结构
CoAP报文结构
CoAP基于UDP的应用层协议,报文结构如下
- 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包得到数据 -
分离模式
客户端同样发CON请求,服务器立刻会意ACK,但是ACK种没有payload,而是过段时间后服务器再回应CON,其中这个CON的Token要与客户端之前发送CON的Token一致,该CON还包含payload,客户端收到后用ACK回应。至少需要4个报文。 -
非确认模式
这种客户端发送NON报文,不需要服务器回应
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)的方式确定。
-
选项偏移量(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)累加起来查这张表就时对应的选项名称
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,分别为device
和1234cdef
Uri-Path不会出现/
这类分隔符
Uri-Query定义参数,上面例子是2个Uri-Query,分别为limit=10
和offest=20
,Uri-Query不会出现?
&
这类分隔符
下面是
coap://wsncoap.org:5683/device/1234CDEF?limit=10的例子
下面是选项长度扩展例子Uri-Path为16字节
2.Content-Format选项
Content-Format选项指示CoAP负载payload媒体类型,用无符号整数表示,如二进制负载编号42,json负载编号50
3.Accept选项
Accept选项表示客户端期望接受到的payload媒体类型,编号定义与Content-Format选项编号定义相同
下面是媒体类型编号
媒体类型 | 编号 |
---|---|
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,无响应内容。如下
5.If-Match选项
If-Match选项是CoAP条件请求,一般用于更新服务器资源,和Etag组合使用,当服务器收到待更新资源的Etag和If-Match的Etag相同则更新资源,返回2.04(changed),否则不更新,返回4.12(Precondition Failed),如下图
6.If-None-Match选项
If-None-Match选项,一般用于在服务器上创建新资源