-
udp可靠传输 kcp协议
网络通畅下,kcp比tcp慢
这里直接看课件图片, 延迟ack比非延迟减少应答包数量,但是慢
-
kcp 讲解
kan代码ikcp.c
按照readme指南编译一下!!
mkdir build cd build cmake .. make
第一遍报错,再编译一遍就好了
本来老师要讲kcp源码,但是太难懂,so 主要掌握会用kcp
直接在vscode 里ctrl+` 然后拆分终端,开三个,在里面操作
先服务端运行 最右 ./chat_server 0.0.0.0 10001 客户端运行 中间 ./chat_client 192.168.1.28 10001 中间客户端发:hacyon来了 但是我这里显示收不到
-
kcp 名词讲解
mtu, rto, cwnd, rwnd, snd_buf, snd_nxt, snd_una 了解
-
使用
乱七八糟的 看吐了
-
client和server都要先创建映射,ikcp_create(conv), conv由client产生,可能会一样的id,用uuid算法生成不重复的,
-
update:在线程中更新 状态,互相独立
ikcp.h里看ikcp_update函数
while是一个场景,里面先休息,然后for来调度kcp们, 如果不调度,可能多个客户端就死掉了,一个可以
-
ikcp_send
只是先放在内部,等待kcp_update调度,没发出去,最终是要调sendto接口
-
ikcp_input, ikcp_recv收数据
默认支持报文模式,因为基于udp的; 也支持(字节)流模式
-
kcp配置模式
跳了,工作时查,调参数
-
kcp协议头
kcp是udp, 是无连接的,conv用来识别client哪一个,对连接的一种替代;这里稍微看看吧,基本没仔细看,反正记不住,这个以后再看吧
大部分协议设计原则:header+body
-
kcp发送数据过程
粗略过一遍原理, 源码的话粗看 不看stream流模式,只看报文模式
发送队列:send第一步,第二步 发送缓存:ikcp_update调度用缓存, 发送窗口
struct里和协议头 不对应的, 要对齐?
今天好棒,晚上固定搞这个 这三个月,白天穿插(算法+八股 )+ 论文 (主要)
ikcp_flush调度发送data
发送窗口 跳了
-
kcp接收数据
snd_buf删除已经收到的确认的分片,没仔细听,晕啊太罗嗦了这里
-
kcp确认包 跳
-
kcp快速确认 跳
fastack,fastresend
-
ikcp_input逻辑
这里逻辑再看
-
acklist应答列表
收到data包以后,自己组织acklist回发,自己解析acklist
-
流量控制 拥塞控制 跳
-
使用 官方自带的,看完还是不知道怎么用
-
聊天室:chat_server.cc 和chat_client.cc
见kcp_server.h里对session的封装,这里都看看就行,源码再看吧
见kcp_client.cc 每一个客户端有一个session handle_message调用子类 处理业务
可以TRACE(内容) 打印内容看看是什么 代码不算太复杂 一百多行 还行!!!
-
-
asio_kcp的官方项目 可以参考
课后作业
-
quic协议
有的公司专门优化这部分,做网络协议的
why 在应用层实现,在内核改影响很大比较麻烦
quic tcp对比
quic比kcp可能严谨一些
ngtcp2 二次开发 quic开源库 应用,多个服务器的级联,国内很多是基于开源库需改的, 中小厂(比如深信服之类的)不建议跟进这个,做不了
总结!
测试没做