CoAP协议学习

CoAP(Constrained Application Protocol)协议是为资源受限情况(功率、存储空间等)下定义使用的网络传输协议。对于CoAP的底层协议,目前RFC文档中使用UDP,可以采用DTLS加密处理,加密是UDP端口5684,非加密时端口为5683,同样可以通过SMSTCPSCTP传输,而UDP-liteUDP zero checksum目前协议不支持。而CoAP的协议方式定义和HTTP类似,所以可以采用代理服务器进行协议间转换。
消息结构
CoAP协议学习
协议对消息的总长度做了一些定义,主要期望数据在下面协议层次封装时不需要拆包出来,所以消息的总长度,依赖于下层协议的数据包的总长度。
Version (Ver)
占用2bits,携带版本号信息,目前设置为1,其它值留于后续协议扩展使用。
Type (T)
占用2比特,指示消息类型,消息分为:confirmable(CON)-0Non-Confirmable(NON)-1Acknowledgement(ACK)-2Reset(3)UDP传输不提供可靠传输,在CoAP层添加了机制可选择用于保证传输的可靠,当然对于流程也需要更多控制,包括拥塞控制、重传间隔、重传次数、定时器等等。
Token Length (TKL)
占用4比特,指示token占用长度,其值目前定义为0-8有效,9-15目前不使用。
Token
占用长度0-8字节,其真实长度由Token Length的值获得。Token主要用来关联对应RequestResponse消息。
Code
占用8比特,其中3个比特用于分类指示,剩余的5比特用于指示详细的编码类型,指示请求或者回应具体编码格式内容,具体为请求的方法及出错标志的回复等。表示方式等级.详细指示,0.00则表示为空消息(Empty)。类型分为0-a request2-a success response4-a client error response5-a server error response。具体如下
CoAP协议学习
关于Request的四个方法GetPostPutDelete的不同,Get类似读取动作,而PostPut请求创建、修改资源,Delete请求删除资源。关于PostPut的具体不同,两者的定义The PUT method requests that the resource identified by the request URI be updated or created with the enclosed representation. The POST method requests that the representation enclosed in the request be processed.理解上PutPost操作类似,而Put需要对具体的资源进行操作,所以说明上强调URI,而Post可以对资源集合操作。
Message ID
占用16比特,按照一定次序要求的消息编号,能够用来区分不同的消息。主要用来进行消息重复传输判断、ACK/Reset和对应消息的关联等处理。
Option
Option包含三部分内容Option Numberthe length of option valueoption valueOption Number的表现形式不是绝对值,而是填写的与前一个Option Number的差值Option Delta,第一个Option Delta基于初始Option Number0基础上运算。Option的格式定义如下:
CoAP协议学习
Option Delta (extended)Option Length (extended)的长度为0-2字节,而Option Value的长度通过Option Lengthextended值指示,Option DeltaOption Length分别占用4比特,当取值为0-12时可直接使用,而13是表示使用一个字节扩展表示(使用时需要将真实值减去13),而14则表示使用两个字节的扩展表示(使用时需要将真实值减去269)Option Delta15不使用,用于避免和有效负载前的0xFF冲突,而Option Length15保留,目前未使用。Option value可以为0长度、opaque类型、unsigned int类型及String类型。
CoAP定义了多种Options,这些option可以定义目标地址表示类型、携带信息表示类型等,既可以使用在requests中,也可以使用在responses中。Options分成criticalelective类型,区别在于接收端处理相应option出错时是否需要返回”Bad option” critical是需要返回错误的,而elective可以选择忽略相应optionOption的类型是在其number中表示的,奇数表示为critical类型,偶数表示为elective类型,同样在number中携带的还有代理安全模式及秘钥类型配置。
消息及其类型对应关系
CoAP协议学习
1表示可使用,0表示不能使用,x表示在RST时可用。Response可以和ACK一起发送,这种情况称为Piggybacked,也可以采用独立发送separate模式。
参考协议
rfc7252 The Constrained Application Protocol (CoAP)