Appearance
Appearance
kNet 是一种面向连接的网络协议,用于在网络主机之间传输应用程序自定义消息。这个页面适合在 Wireshark 中分析 kNet over UDP、TCP 或 SCTP 流量时,快速判断不同传输方式的特性、限制、示例文件和显示过滤器。
易混点:kNet 传输层只定义如何承载消息,不知道具体应用 payload 的业务语义。因此示例捕获中被 dissector 标为 unknown 的数据,可能只是应用程序自定义消息,而不一定表示抓包或解析错误。
原页记录 kNet 的官方源代码仓库托管在 https://bitbucket.org/clb/knet/,并说明当时尚无可下载的预构建包。该信息反映旧 Wiki 导入时的状态;仓库可用性、实现状态和默认端口应以当前项目资料和当前 Wireshark 版本为准。
| 层级 | 主要内容 | 适用场景 |
|---|---|---|
| Transport-level 规范 | 会话初始化、维护、关闭;数据字节传输;可靠消息;排序要求;大规模传输;流管理;拥塞控制。 | 只需要 kNet 传输能力,或希望替换应用层模型时。 |
| Application-level 规范与 C++ 参考实现 | 描述应用层协议集及传输参数;建模消息依赖关系和优先级;基于内容的延迟数据替换;数据序列化。 | 构建完整 server+client 应用程序时。 |
| 序列化库 | 参考实现公开内部序列化库,也可使用 boost serialization、CodeSynthesis XSD、Eet、gSOAP、MFC、Google protobuf、Qt QDataStream、s11n、Poco Serializer、Sweet Persist、tpl、xserial、yaml-cpp 或自定义方案。 | 需要与应用数据模型集成时。 |
| 传输方式 | 优势 | 限制或注意点 |
|---|---|---|
| UDP | 在无连接 UDP 上实现虚拟会话;支持可靠消息重传;支持有序消息;可合并多个应用层消息;传输开销较小;支持大消息分片和重组;可支持不可靠消息、乱序交付和 NAT Punchthrough。 | 可能被防火墙或 ISP 限制;需要应用正确处理可靠性、排序和拥塞相关行为。 |
| TCP | 更容易穿过限制性防火墙;避免某些网络把 UDP 当作 P2P 流量降级;沿用传统 TCP 拥塞控制。 | 不支持乱序消息传递;不支持不可靠 datagram;消息优先级处理更困难;不支持延迟数据选择;不支持多个虚拟通信通道或其他消息依赖建模方法;服务器无法在 stealth 模式运行。 |
| SCTP | 原页说明当前 kNet SCTP 与 kNet TCP 非常相似。 | TCP 部分中的信息同样适用于 SCTP;具体支持情况需以实现为准。 |
| 特性 | 说明 |
|---|---|
| 面向连接 | 在无连接 UDP 层之上实现虚拟会话。 |
| 可靠消息传递 | 标记为可靠的 datagram 会被重新传输,直到到达目的地。 |
| 有序消息传递 | 具有排序要求的消息会在接收端按正确顺序应用;应用程序可使用无、单个、多个有序传输通道,或任意依赖图。 |
| 消息合并 | 单个 UDP datagram 可以承载尽可能多的应用层消息,而不是简单的一包一消息。 |
| 字节高效 | 原页估计每个 datagram 平均开销 3–10 字节,每条消息平均开销 3–5 字节,适合大量小消息。 |
| 大消息传输 | 支持透明分片和重组,隐藏 UDP datagram 大小限制;原页称最大消息大小为 2^30 * 1400 字节。 |
| 不可靠消息 | 未标记为可靠的 datagram 不保证送达,可避免为实时有损内容浪费资源。 |
| 乱序消息 | 无排序要求的消息可在其他 frame 丢失时继续交付给应用。 |
| NAT Punchthrough | UDP 有助于两个 NAT 后客户端之间进行 peer-to-peer 通信;原页提到 RakNet 或 Jon Watte 相关资料。 |
基于 TCP 的 kNet 会以类似 UDP kNet 的方式实现 RTT 估算和分片传输,但两者特性不等价。原页特别说明,基于 TCP 的 kNet 不支持 InOrder Messages、Flow Control 或 Session Management 等 UDP 特性。
TCP stream 中的消息序列化格式与 UDP 对应格式略有不同:数据由 Message Block 字段逐个连接形成,直到连接关闭;stream 开头或 Message block 之间没有额外 header 或数据字节。
| 项目 | 说明 |
|---|---|
| 示例端口 | 原页示例流量来自端口 2350,需要在 Wireshark Preferences 中更改端口才能按该示例识别。 |
| 默认端口 | 原页记录默认端口为 2345,可在 Wireshark preferences 对话框中更改。 |
| UDP 示例 | kNet-UDP-Packets.pcap |
| TCP 示例 | kNet-TCP-Packets.pcap |
| SCTP 示例 | kNet-SCTP-Packets.pcap |
示例中包含大量被 kNet dissector 标为 unknown 的 packet。原页说明这些实际上是来自 realXtend Naali 的应用程序特定数据;这些消息未在 kNet 规范中指定,因此被视为 unknown/appdata。
| 目标 | 显示过滤器 |
|---|---|
| UDP 上的 kNet | udp and knet |
| TCP 上的 kNet | tcp and knet |
| SCTP 上的 kNet | sctp and knet |
导入自 https://wiki.wireshark.org/kNet ,时间为 2020-08-11 23:15:51 UTC