假设我有一个客户端想要向服务器发送两个大请求(同时)。
让我们说第一个有效载荷是" ABCD"第二个有效载荷是" WXYZ"。
第一个请求的第一个块有messageID = 1,令牌= 0x1,有效载荷" AB",
第二个请求的第一个块有messageID = 2,令牌= 0x2,有效载荷" WX",
第一个请求的第二个块有messageID = 3,令牌= 0x3,有效载荷" CD",
第二个请求的第二个块有messageID = 4,令牌= 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上:服务器现在有两个不完整的有效负载,它如何可靠地将第三个请求映射到正确的有效负载?它是如何知道有效载荷应该是&#34; ABCD&#34;而不是&#34; WXCD&#34;?
块状传输规范仅指出以下内容:
作为对令牌的一般评论,没有其他提及令牌 在本文档中,作为逐块传输处理令牌像任何一样 其他CoAP交换。像往常一样,客户可以自由选择令牌 每个交易所都可以。
答案 0 :(得分:3)
你是对的,实际上block-wise specs突出显示它并提出一个解决方法(仅限block2选项):
Block2选项无法让单个端点执行 多个同时进行的逐块响应有效载荷传输 (例如,GET)对同一资源的操作。这很少是 要求,但作为一种解决方法,客户端可能会改变缓存键 (例如,通过使用几个URI之一访问具有相同资源的资源 语义,或通过改变代理安全的选择性选项)。
和:
Block1选项无法让单个端点执行 多个同时进行的逐块请求有效载荷传输 (例如,PUT或POST)对同一资源的操作。开始新的 对同一资源的请求的逐块序列(在旧的之前) 来自同一端点的序列已完成)只是覆盖了 服务器可能仍在保留上下文。 (这可能就是这样 在这种情况下,人们想要什么 - 客户可能只是重新启动 并且失去了对先前序列的了解。)