COAP协议简介
Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252。COAP名字翻译来就是“受限应用协议”,顾名思义,使用在资源受限的物联网设备上。物联网设备的ram,rom都通常非常小,运行TCP和HTTP是不可以接受的。
COAP协议特点
1 COAP协议网络传输层由TCP改为UDP。
COAP协议层
2 它基于REST,server的资源地址和互联网一样也有类似url的格式,客户端同样有POST,GET,PUT,DELETE方法来访问server,对HTTP做了简化。
3 COAP是二进制格式的,HTTP是文本格式的,COAP比HTTP更加紧凑。
4 轻量化,COAP最小长度仅仅4B,一个HTTP的头都几十个B了。
5 支持可靠传输,数据重传,块传输。 确保数据可靠到达。
6 支持IP多播, 即可以同时向多个设备发送请求。
7 非长连接通信,适用于低功耗物联网场景。
COAP协议消息类型
COAP协议有4种消息类型
CON—— 需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。这有点像TCP,对方必须给确认收到消息,用以可靠消息传输。
可靠消息传输
NON—— 不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。这适用于消息会重复频繁的发送,丢包不影响正常操作。这个和UDP很像。用以不可靠消息传输。
不可靠消息传输
ACK —— 应答消息,对应的是CON消息的应答。
RST —— 复位消息,可靠传输时候接收的消息不认识或错误时,不能回ACK消息,必须回RST消息。
COAP消息格式
coap消息格式
消息头(HEAD)
第一行是消息头,必须有,固定4个byte。
Ver : 2bit, 版本信息,当前是必须写0x01。
T: 2bit, 消息类型,包括 CON, NON. ACK, RST这4种。
TKL: 4bit,token长度, 当前支持0~8B长度,其他长度保留将来扩展用。
Code:8bit,分成前3bit(0~7)和后5bit(0~31),前3bit代表类型。 0代表空消息或者请求码, 2开头代表响应码,取值如下:
1 0.00 Indicates an Empty message
2 0.01-0.31 Indicates a request.
3 1.00-1.31 Reserved
4 2.00-5.31 Indicates a response.
5 6.00-7.31 Reserved
Message ID:16bit, 代表消息MID,每个消息都有一个ID ,重发的消息MID不变
token(可选)用于将响应与请求匹配。 token值为0到8字节的序列。 ( 每条消息必须带有一个标记, 即使它的长度为零)。 每个请求都带有一个客户端生成的token, 服务器在任何结果响应中都必须对其进行回应。token类似消息ID,用以标记消息的唯一性。token还是消息安全性的一个设置,使用全8字节的随机数,使伪造的报文无法获得验证通过。option(可选,0个或者多个)
请求消息 与回应消息都可以0~多个options。 主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述,比如是否用到代理服务器,目的主机的端口等。
payload(可选)
实际携带数据内容, 若有, 前面加payload标识符“0xFF”,如果没有payload标识符,那么就代表这是一个0长度的payload。如果存在payload标识符但其后跟随的是0长度的payload,那么必须当作消息格式错误处理。
COAP的请求码(requests)和响应码(responses)
【0.01】GET方法——用于获得某资源
【0.02】POST方法——用于创建某资源
【0.03】PUT方法——用于更新某资源
【0.04】DELETE方法——用于删除某资源
CoAP的URL
coap的url和HTTP的有很相似的地方,开头是“coap”对应“http”或者“coaps”对应“https”。
HTTP的默认端口是tcp 80,coap的默认端口是udp 5683(coaps是5684)。
URL里面的“/”“&”“.”
下面三个URL的地址是一样的。访问example.com这个域名,端口是udp 5683,访问的资源地址是~sensors/temp.xml。
coap://example.com:5683/~sensors/temp.xml
coap://EXAMPLE.com/%7Esensors/temp.xml
coap://EXAMPLE.com:/%7esensors/temp.xml
COAP的安全性
COAP的安全性是用DTLS加密实现的。DTLS的实现需要的资源和带宽较多,如果是资源非常少的终端和极有限的带宽下可能会跑不起来。DTLS仅仅在单播情况下适用。