4.2 发送数据包(Packet)
数据发送端创建 Packet 对象,自动分配数据包序号(packId),packId 是4字节长无符号整数,每个 Session 或者 Stream 的待发送数据包采用独立递增序号,从1开始。通信两端独立地为待发送数据包分配序号。待发送加密数据会被封装到 Packet 中,刚刚创建的 Packet 处于 INIT 状态,然后被放入 Session 或者 Stream 的待发送缓存中。Packet 中的数据通过 data 帧发送出去
通过 Session 发送 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|0| |0|0| | | |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
| Packet Id [packId] |
+---------------------------------------------------------------+
: Payload [binary data] :
+---------------------------------------------------------------+
timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 0,PACK 字段设置为 1,FRAG、SLOW、FIN 设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x0,Payload len 字段设置为 Payload 数据实际长度。Packet Id 字段写入数据包序号(packId),最后把加密后的二进制数据写入 Payload 字段。
通过 Stream 发送 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|0| |0|0| | | |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
| Stream Id [random id from client] |
+---------------------------------------------------------------+
| Packet Id [packId] |
+---------------------------------------------------------------+
: Payload [binary data] :
+---------------------------------------------------------------+
timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 1,PACK 字段设置为 1,FRAG、SLOW、FIN 设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x0,Payload len 字段设置为 Payload 数据实际长度。Stream Id 字段写入当前流 ID,Packet Id 字段写入数据包序号(packId),最后把加密后的二进制数据写入 Payload 字段。
数据帧通过 UDP 报文发送出去,然后更新 Packet 状态为 SENT,记录 Packet 发送时间。