Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

kNet

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、TCP、SCTP 传输对比

传输方式优势限制或注意点
UDP在无连接 UDP 上实现虚拟会话;支持可靠消息重传;支持有序消息;可合并多个应用层消息;传输开销较小;支持大消息分片和重组;可支持不可靠消息、乱序交付和 NAT Punchthrough。可能被防火墙或 ISP 限制;需要应用正确处理可靠性、排序和拥塞相关行为。
TCP更容易穿过限制性防火墙;避免某些网络把 UDP 当作 P2P 流量降级;沿用传统 TCP 拥塞控制。不支持乱序消息传递;不支持不可靠 datagram;消息优先级处理更困难;不支持延迟数据选择;不支持多个虚拟通信通道或其他消息依赖建模方法;服务器无法在 stealth 模式运行。
SCTP原页说明当前 kNet SCTP 与 kNet TCP 非常相似。TCP 部分中的信息同样适用于 SCTP;具体支持情况需以实现为准。

UDP 传输特性

特性说明
面向连接在无连接 UDP 层之上实现虚拟会话。
可靠消息传递标记为可靠的 datagram 会被重新传输,直到到达目的地。
有序消息传递具有排序要求的消息会在接收端按正确顺序应用;应用程序可使用无、单个、多个有序传输通道,或任意依赖图。
消息合并单个 UDP datagram 可以承载尽可能多的应用层消息,而不是简单的一包一消息。
字节高效原页估计每个 datagram 平均开销 3–10 字节,每条消息平均开销 3–5 字节,适合大量小消息。
大消息传输支持透明分片和重组,隐藏 UDP datagram 大小限制;原页称最大消息大小为 2^30 * 1400 字节。
不可靠消息未标记为可靠的 datagram 不保证送达,可避免为实时有损内容浪费资源。
乱序消息无排序要求的消息可在其他 frame 丢失时继续交付给应用。
NAT PunchthroughUDP 有助于两个 NAT 后客户端之间进行 peer-to-peer 通信;原页提到 RakNet 或 Jon Watte 相关资料。

TCP 字节流说明

基于 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 上的 kNetudp and knet
TCP 上的 kNettcp and knet
SCTP 上的 kNetsctp and knet

导入自 https://wiki.wireshark.org/kNet ,时间为 2020-08-11 23:15:51 UTC

原始页面图片

kNet_UDP_Structure.png
kNet_UDP_Structure.png
kNet_TCP_Structure.png
kNet_TCP_Structure.png

相关 Wireshark Wiki 页面

网络分析技术档案