5.2 发送分片(Fragment)

按照 Fragment 序号依次发送 data 帧出去,每个 data 帧传输一个 Fragment。

通过 Session 发送 Fragment data 帧格式

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
|        [id from client]       |        [id from server]       |
+-------------------------------+-------------------------------+
|                        timestamp ...                          |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                    ... timestamp [curent time]                |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|S|P|F| RSV |S|F|  RSV  |OPCODE |          Payload len          |
|T|A|R| [0] |L|I|  [0]  |[0x0]  |        [Payload.length]       |
|R|C|A|     |O|N|       |       |                               |
|E|K|G|     |W| |       |       |                               |
|0|1|1|     |0|0|       |       |                               |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|                      Packet Id [packId]                       |
+---------------------------------------------------------------+
|                     Fragment Id [fragId]                      |
+---------------------------------------------------------------+
:                    Payload [binary data]                      :
+---------------------------------------------------------------+

timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 0,PACK 字段设置为 1,FRAG 字段设置为 1,SLOW 设置为 0,如果是最后一个分片 FIN 设置为 1,否则设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x0,Payload len 字段设置为 Payload 数据实际长度。Packet Id 字段写入数据包序号(packId),Fragment Id 字段写入分片序号(fragId),最后把 Fragment 中的二进制数据写入 Payload 字段。

通过 Stream 发送 Fragment data 帧格式

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
|        [id from client]       |        [id from server]       |
+-------------------------------+-------------------------------+
|                        timestamp ...                          |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                    ... timestamp [curent time]                |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|S|P|F| RSV |S|F|  RSV  |OPCODE |          Payload len          |
|T|A|R| [0] |L|I|  [0]  |[0x0]  |        [Payload.length]       |
|R|C|A|     |O|N|       |       |                               |
|E|K|G|     |W| |       |       |                               |
|1|1|1|     |0|0|       |       |                               |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|              Stream Id [random id from client]                |
+---------------------------------------------------------------+
|                      Packet Id [packId]                       |
+---------------------------------------------------------------+
|                     Fragment Id [fragId]                      |
+---------------------------------------------------------------+
:                    Payload [binary data]                      :
+---------------------------------------------------------------+

timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 1,PACK 字段设置为 1,FRAG 字段设置为 1,SLOW 设置为 0,如果是最后一个分片 FIN 设置为 1,否则设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x0,Payload len 字段设置为 Payload 数据实际长度。Stream Id 字段写入当前流 ID,Packet Id 字段写入数据包序号(packId),Fragment Id 字段写入分片序号(fragId),最后把 Fragment 中的二进制数据写入 Payload 字段。