3

假设我有一个客户端想要(同时)向服务器发送两个大请求。

假设第一个有效载荷是“ABCD”,第二个有效载荷是“WXYZ”。

第一个请求的第一个块有 messageID=1 和 token=0x1 有效载荷“AB”,

第二个请求的第一个块有 messageID=2 和 token=0x2 有效载荷“WX”,

第一个请求的第二个块有 messageID=3 和 token=0x3 有效载荷“CD”,

第二个请求的第二个块具有 messageID=4 和 token=0x4 有效负载“YZ”。

你可以看到我要去哪里。如果每个请求的 messageID 和 token 都不同,并且它们没有按照连续的顺序排列,那么服务器应该如何连接正确的块?

这是一个序列图:

   CLIENT                                                   SERVER
     |                                                        |
     | CON [MID=1,TOK=1], POST, /foo, 1:0/1/128, "AB" ------> |
     |                                                        |
     | <------   ACK [MID=1,TOK=1], 2.31 Continue, 1:0/1/128  |
     |                                                        |
     | CON [MID=2,TOK=2], POST, /foo, 1:0/1/128, "WX" ------> |
     |                                                        |
     | <------   ACK [MID=2,TOK=2], 2.31 Continue, 1:0/1/128  |
     |                                                        |
     | CON [MID=3,TOK=3], POST, /foo, 1:1/0/128, "CD" ------> |
     |                                                        |
     | <------   ACK [MID=3,TOK=3], 2.01 Created, 1:1/0/128   |
     |                                                        |
     | CON [MID=4,TOK=4], POST, /foo, 1:1/0/128, "YZ" ------> |
     |                                                        |
     | <------   ACK [MID=4,TOK=4], 2.01 Created, 1:1/0/128   |

问题出现在消息 3 上:服务器现在有两个不完整的有效负载,它如何可靠地将第三个请求映射到正确的有效负载?它怎么知道有效载荷应该是“ABCD”而不是“WXCD”?

分块传输的规范仅说明以下内容:

作为对代币的一般性评论,本文档中没有提及代币,因为区块传输处理代币就像任何其他 CoAP 交换一样。像往常一样,客户可以根据自己的喜好自由选择每个交易所的代币。

4

1 回答 1

4

你是对的,实际上块级规范突出显示了它并提出了一种解决方法(仅适用于 block2 选项):

Block2 选项无法让单个端点对同一资源执行多个同时进行的逐块响应有效负载传输(例如,GET)操作。这很少是必需的,但作为一种解决方法,客户端可以改变缓存键(例如,通过使用多个 URI 中的一个访问具有相同语义的资源,或者通过改变代理安全的可选选项)。

和:

Block1 选项无法让单个端点对同一资源执行多个同时进行的逐块请求有效负载传输(例如,PUT 或 POST)操作。开始对同一资源的新的逐块请求序列(在完成来自同一端点的旧序列之前)只会覆盖服务器可能仍保留的上下文。(在这种情况下,这可能正是人们想要的——客户端可能只是重新启动并丢失了对前一个序列的了解。)

于 2015-10-08T15:23:38.647 回答