序号 | 内容 |
---|---|
1 | 《教你动手写UDP协议栈-UDP协议栈格式》 |
2 | 《教你动手写UDP协议栈-DHCP报文解析》 |
3 | 《教你动手写UDP协议栈-OTA上位机》 |
4 | 《教你动手写UDP协议栈-DNS报文解析》 |
4 | 《教你动手写UDP协议栈-CoAP报文解析 |
+----------------------+
| Application |
+----------------------+
| Requests/Responses |
+----------------------+
| Messages |
+----------------------+
| UDP |
+----------------------+
+----------------------+
| Application |
+----------------------+
| Requests/Responses |
+----------------------+
| Messages |
+----------------------+
| DTLS |
+----------------------+
| UDP |
+----------------------+
2 2 4 8 16
+---+---+-----+----------------+---------------------------|
|ver| T | TKL | Code | Message ID |
+----------------------------------------------------------|
| Token(if any, TKL bytes)... |
+----------------------------------------------------------|
| Optons(if any)... |
+---------------+------------------------------------------|
|1 1 1 1 1 1 1 1| Payload(if any)... |
+----------------------------------------------------------|
字段 | 大小 | 说明 |
---|---|---|
ver | 2bit | 版本信息,当前必须写0x01 |
T | 2bit | 消息类型,包括CON,NON,ACK,RST.4种 |
TKL | 4bit | token长度,支持0~8Byte长度,其他长度保留将来扩张用。token对报文来说是非必须的 |
Code | 1byte | 分成前3bit(0~7)和后5bit(0~31),前3bit代表类型(class type), 后5bit代表细节码(detail code),为了方便描述写成c.dd结构 |
Message ID | 2byte | 报文编号,每个报文都有一个ID ,重发的消息ID不变 |
Token | 0~8byte | 可选,用于将响应与请求匹配。每个请求都带有一个客户端生成的token, 服务器在任何结果响应中都必须对其进行回应。token类似消息ID,用以标记消息的唯一性。token还是消息安全性的一个设置,使用全8字节的随机数,使伪造的报文无法获得验证通过。 |
Option | ~ | 请求消息 与回应消息都可以0~多个options。主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述,比如是否用到代理服务器,目的主机的端口等。 |
Payload | ~ | 实际携带数据内容,若有,前面加payload标识符“0xFF”,如果没有payload标识符,那么就代表这是一个0长度的payload。如果存在payload标识符但其后跟随的是0长度的payload,那么必须当作消息格式错误处理。 |
Client Server
| CON[0x7d34] |
+---------------->|
| ACK[0x7d34] |
+<----------------|
| |
Client Server
| NON[0x01a0] |
+---------------->|
| |
请求码 | 说明 |
---|---|
[0.01] | GET:用于获取某资源 |
[0.02] | POST:用于创建某资源 |
[0.03] | PUT:用于更新某资源 |
[0.04] | DELETE:用于删除某资源 |
请求码 | 说明 |
---|---|
[2.01] | Create:响应POST和PUT方法,不能缓存 |
[2.02] | Delete:响应POST和DELETE方法,不能缓存 |
[2.03] | Valid:用于响应request中Etag指定的response是有效的,不能包含payload |
[2.04] | Changed:响应POST和PUT方法,不能缓存 |
[2.05] | Content:响应GET方法,有缓存 |
请求码 | 说明 |
---|---|
[4.00] | Bad Request:请求错误,服务器无法处理。类似于HTTP 400 |
[4.01] | Unauthorized:没有范围权限。类似于HTTP 401 |
[4.02] | Bad Option:请求中包含错误选项 |
[4.03] | Forbidden:服务器拒绝请求。类似于HTTP 403 |
[4.04] | Not Found:服务器找不到资源。类似于HTTP 404 |
[4.05] | Method Not Allowed:非法请求方法。类似于HTTP 405 |
[4.06] | Not Acceptable:请求选项和服务器生成内容选项不一致。类似于HTTP 406 |
[4.12] | Precondition Failed:请求参数不足。类似于HTTP 412 |
[4.15] | Unsuppor Conten-Type:请求中的媒体类型不被支持。类似于HTTP 415 |
请求码 | 说明 |
---|---|
[5.00] | Internal Server Error:服务器内部错误。类似于HTTP 500 |
[5.01] | Not Implemented:服务器无法支持请求内容。类似于HTTP 501 |
[5.02] | Bad Gateway:服务器作为网关时,收到了一个错误的响应。类似于HTTP 502 |
[5.03] | Service Unavailable:服务器过载或者维护停机。类似于HTTP 503 |
[5.04] | Gateway Timeout:服务器作为网关时,执行请求时发生超时错误。类似于HTTP 504 |
[5.05] | Proxying Not Supported:服务器不支持代理功能 |
+--------------+---------------+
| option delta | option length | 1 byte
+------------------------------+
\ option delta \
/ (extended) / 0 ~ 2 byte
+------------------------------+
\ option length \
/ (extended) / 0 ~ 2 byte
+------------------------------+
/ /
\ option Value \ 0 or more bytes
/ /
+------------------------------+
NO. | C | U | N | R | Name | Format | Length | Default |
---|---|---|---|---|---|---|---|---|
1 | x | x | If-Match | opaque | 0~8 | (none) | ||
3 | x | x | - | Uri-Host | string | 1~255 | (see below) | |
4 | x | ETag | opaque | 0~8 | (none) | |||
5 | x | If-None-Match | enpty | 0 | (none) | |||
7 | x | x | - | Uri-Port | uint | 0~2 | (see below) | |
8 | x | Location-Path | string | 0~255 | (none) | |||
11 | x | x | - | x | Uri-Path | string | 0~255 | (none) |
12 | Content-Format | uint | 0~2 | (none) | ||||
14 | x | - | Max-Age | uint | 0~4 | 60 | ||
15 | x | x | - | x | Uri-Query | string | 0~255 | (none) |
17 | x | Accept | uint | 0~2 | (none) | |||
20 | x | Location-Query | string | 0~255 | (none) | |||
35 | x | x | - | Proxy-Uri | string | 1~1034 | (none) | |
39 | x | x | - | Proxy-Scheme | string | 1~255 | (none) | |
60 | x | Sizel | uint | 0~4 | (none) |
Media type | Encoding | ID | Reference |
---|---|---|---|
text/plain; | - | 0 | [RFC2026] [RFC3676] |
charset=utf-8 | [RFC5147] | ||
application/link-format | - | 40 | [RFC6690] |
application/xml | - | 41 | [RFC3023] |
application/octet-stream | - | 42 | [RFC2045] [RFC2046] |
application/exi | - | 47 | [RFC-exi-20140211] |
application/json | - | 50 | [RFC7159] |
Client Server
| GET | Header:GET(T=CON, Code=0.01, MID=0x1234)
+--------->| Uri-Path: "temp"
| 2.05 |
+<---------| Header: 2.05 Content (T=ACK, Code=2.05, MID=0x1234)
| | Payload: "22.3 C"
/* Client -> Server */
2 2 4 8 16
+---+---+-------+----------------+---------------------------|
| 1 | 0 | 0 | GET=1 | MID=0x1234 |
+------------------------------------------------------------|
| 11 | 4 | "temp"(4byte) |
+---------------+--------------------------------------------|
/* Server -> Client */
2 2 4 8 16
+---+---+-------+----------------+---------------------------|
| 1 | 2 | 0 | 2.05=59 | MID=0x1234 |
+------------------------------------------------------------|
|1 1 1 1 1 1 1 1| "22.3 C"(6byte) |
+---------------+--------------------------------------------|
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!