1.1 基本概念
UDPack
客户端通过 UDPack 实例连接服务端的 UDPack 实例。所以客户端与服务端要建立连接创建会话,需要分别创建 UDPack 对象。
Session
代表一个客户端与服务端之间的会话(类似于 TCP 中的 Socket),客户端与服务端首先需要通过握手建立 Session 后,才能互相发送数据。相同的客户端与服务器之间只需建立一个会话。
Stream
代表一个 Session 之上的双向数据流,必须在通信双方建立好 Session 之后,才能在当前 Session 上打开任意多个 Stream。
Session vs Stream
连接双方可以直接通过 Session 发送数据,相当于全局发送数据,由于要确保数据可靠且有序,发送的数据有固有的上下文关系。虽然发送数据时是并发的甚至乱序的,但是接收端必须按照数据包序号顺序接收,因此接收数据时是需要排队的。一般情况下,只是局部数据可能会有上下文的顺序要求,更多的数据是没有关系的,接收时不应该受到全局的顺序限制。此时最好采用 Stream 传输数据,通过在 Session 之上建立多个 Stream,每个 Stream 独立双向传输数据,可以做到互不影响,提高数据传输性能。
Packet
代表一个数据包,有唯一 ID 标识,封装上层应用数据传递进来的二进制数据,数据包的数据长度几乎是没有限制的,可以任意长。
Fragment
表示数据包分片,有唯一 ID 标识,封装一个数据包分片的二进制数据,数据分片的数据长度受限于 MTU。互联网拓扑结构是异常复杂且动态变化的,客户端与服务器之间可能跨过多个以太网或者其他类型的网络。根据木桶效应,MTU 取值决定于路径中最差的网络。
Packet vs Fragment
如果数据包 Packet 长度小于 MTU,则不需分片。否则就要被切分为多个 Fragment 分别发送出去,接收方在接收到所有分片后合并为完整的 Packet。