前段时间写了一个PC上局域网音视频通话的程序,使用开源KCP来实现可靠UDP传输。 通过研究发现KCP在发包时,会在数据包前面加上它自己的头。如果数据包较小,KCP可能会把多个数据包
前段时间写了一个PC上局域网音视频通话的程序,使用开源 KCP 来实现可靠UDP传输。
通过研究发现KCP在发包时,会在数据包前面加上它自己的头。如果数据包较小,KCP可能会把多个数据包合成一个包发送,提高效率。
如下图所示。
kcp udp 包结构
28 bytes 4 bytes 4 bytes len1 28 bytes 4 bytes 4 bytes len2
├────────────┼────────┬────────┼────────┼────────────┼────────┬────────┼────────┤
│kcp header │ size1 │msg type│msg data│kcp header │ size2 │msg type│msg data│ ...
└────────────┴────────┴────────┴────────┴────────────┴────────┴────────┴────────┘
size1 = 8 + len1
size2 = 8 + len2
kcp头后面是程序里自定义的数据包结构,由有8字节数据包头和实际发送的数据包组成,8字节数据包头里前4字节是头和数据包的总长度,后4字节是消息类型。
查看kcp代码,由下面两个函数确定kcp头的结构
发送视频包时,直接以rtp视频包作为数据,程序里视频包的msg type值为4738。
下面以视频包为例写一个Wireshark kcp 解析器插件,最终效果图如下:
抓包文件和代码 微云 网盘地址:https://share.weiyun.com/5umD1au
未完待续...