- 主题:突然想夸耀一下自己的成就
我弄的 qtng 网络库,性能一般般。但是有一个功能算是比较炸裂的:实现了模块化的山寨 QUIC 协议。
这个山寨 QUIC 协议被我分成几部分:
1. 一个 KCP 的实现,能够在 UDP 上面建立低延迟的连接,实现 SocketLike 接口
2. DataChannel 把一条连接变成多个 steam,这些 steam 又可以继续分裂成多个 steam,每个 steam 都实现 SocketLike 接口
3. TCP 连接是 SocketLike
4. SSL 可以运行在任何 SocketLike 连接上,变成另一个 SocketLike
5. 还有个简单的对称流加密 ENC 运行在 SocketLike,变成另一个 SocketLike
6. HTTP 协议运行在 SocketLike 上面,能升级成 WebSocket
通过这个 SocketLike 接口,上面几个组件能够相互插接,比如:
KCP -> SSL # 运行在 UDP 上面的 SSL 连接
TCP -> SSL -> HTTP # 普通的 HTTPS
KCP -> SSL -> HTTP # 运行在 UDP 上面的 HTTPS
TCP -> DataChannel -> HTTP # 山寨 HTTP2
KCP -> DataChannel -> HTTP # 山寨 HTTP3
HTTP -> DataChannel -> HTTP # PROXY
HTTP -> SSL # 先明文 HTTP,再升级成 SSL
HTTP -> DataChannel -> SSL # 明文 HTTP,有些流升级成 SSL,有些不升级
KCP -> DataChannel # 视频会议
总之,我现在得到了一堆跑在 UDP 上面的 SOCKS5, HTTP, WebSocket 的实现。还有些奇奇怪怪的组合我也不知道能干啥。
之前打算把 KCP 整一整可以跑在 ICMP 上面。但是还没有完成。如果做到的话,我就能得到一个跑在 ICMP 上面的 HTTPS 服务器了。
--
修改:hgoldfish FROM 110.81.1.*
FROM 110.81.1.*
没有。。
【 在 capstone 的大作中提到: 】
: 碉堡了!有什么用途呢
--
FROM 110.81.1.*
不搞这个不搞这个。。
我的目标一直是做 IM 或者 P2P 协议,在 UDP 上面承载所有日常使用的协议。用一套协议实现文本传输、文件传输、语音视频通话所有功能。我弄的这个 KCP 子协议甚至还支持手机从 5G 网络切换到 WIFI 时不中断连接。
【 在 z16166 的大作中提到: 】
: 这是要和qiang对着干啊,哈哈
: 要写个杀手应用,才能火
--
FROM 110.81.1.*
不是的啊。我弄的是应用层协议。
KCP/UTP(BT) 都是已经定义好的协议。我也不是重新实现,只是做排列组合。
跑在 UDP 上的协议一般都是特殊场景使用。比如我弄的这个协议,主要目标在 UDP 上面弄多个流跑 HTTP 协议,同时还能跑语音视频应用。后者不用 UDP 不行,会卡顿。
TCP 有三个特性,差错控制、顺序、拥塞控制。但有些网络协议只要做到顺序就够了,差错控制和拥塞控制无所谓。
【 在 aqhistory 的大作中提到: 】
: 确认最后不是再来一套tcp
: 发自「今日水木 on Mi 10 Pro」
--
FROM 110.81.1.*
ICMP 这个另外说。其它的都是非常合法的用途。比如 KCP 早就是各种网络游戏的标配了。但是 KCP 只是模拟 TCP,在上面还需要有应用层。发送 ICMP 数据包需要 ROOT 权限,所以一般人也不会用上。
【 在 maomaogou 的大作中提到: 】
: 你这个只能用于非法用途吧?正经公司谁这么用啊?
: 发自「今日水木 on V2217A」
--
FROM 110.81.1.*
官方的 kcp 只有算法,实际使用都需要自行封装包结构。我也是照着官方来的。不过需要自行处理缓存区,还有缓存区存太多数据,调用者需要暂停之类的。
我的代码在 github 上面。因为是建立在协程之上的,对你估计没啥参考价值。和一般的 cpp 回调代码很不一样。
https://github.com/hgoldfish/qtnetworkng/blob/master/src/kcp.cpp
举个例子,这一段代码,估计用回调就不好实现:
bool ok = sendingQueueNotFull.tryWait();
if (!ok) {
return -1;
}
qint32 nextBlockSize = qMin<qint32>(static_cast<qint32>(kcp->mss), size - count);
int result;
{
ScopedLock<RLock> l(kcpLock);
result = ikcp_send(kcp, data + count, nextBlockSize);
}
bool ok = sendingQueueNotFull.tryWait();
第一行的意思是如果缓冲区是满了,就暂停当时协程。
ScopedLock<RLock> l(kcpLock);
这一行的意思是如果当前还有另外一个协程正在发送 kcp 包,就等待它发送完,免得交叉发送数据。
【 在 newre 的大作中提到: 】
: 大佬,开源吗?拜读一下代码。
: 我一直找一个kcp的cpp实现
: #发自zSMTH@如有雷同 纯属巧合
: ...................
--
修改:hgoldfish FROM 110.81.1.*
FROM 110.81.1.*
很简单啊。服务端接到请求后,就给这个连接分配一个随机 ID,下次都是通过这个 ID 来找连接,而不是通过 tuple(ip, port),同时更新一下对端的地址。发送响应的时候才不会发错。
这个特性只是基于 UDP 的协议一个简单应用。如果 TCP 就不行了。
但有趣的事,UDP 的协议需要注意路由。如果你的机器有两个出口带宽,比如你接了两条宽带,此时可能会一会儿用这个宽带发 UDP 包,一会儿用另外一个宽带发 UDP 包。如果路由配置出错,这时候就可能会带宽加倍,也可能会让对端搞不清楚状况。
【 在 leoli2011 的大作中提到: 】
: 如何做到从5G到wifi 不中断的,能分享一下代码吗
--
FROM 110.81.1.*