Coap blockwise transfer:如何将以下块映射到初始块/请求

时间:2015-10-08 14:37:36

标签: coap

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

让我们说第一个有效载荷是" 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交换。像往常一样,客户可以自由选择令牌   每个交易所都可以。

1 个答案:

答案 0 :(得分:3)

你是对的,实际上block-wise specs突出显示它并提出一个解决方法(仅限block2选项):

  

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

和:

  

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