namespace System.Net.Sockets.Kcp { /// /// Kcp报头 /// https://zhuanlan.zhihu.com/p/559191428 /// public interface IKcpHeader { /// /// 会话编号,两方一致才会通信 /// uint conv { get; set; } /// /// 指令类型 /// /// /// IKCP_CMD_PUSH = 81 // cmd: push data 数据报文 /// IKCP_CMD_ACK = 82 // cmd: ack 确认报文 /// IKCP_CMD_WASK = 83 // cmd: window probe (ask) 窗口探测报文,询问对端剩余接收窗口的大小. /// IKCP_CMD_WINS = 84 // cmd: window size (tell) 窗口通知报文,通知对端剩余接收窗口的大小. /// byte cmd { get; set; } /// /// 剩余分片数量,表示随后还有多少个报文属于同一个包。 /// byte frg { get; set; } /// /// 自己可用窗口大小 /// ushort wnd { get; set; } /// /// 发送时的时间戳 /// uint ts { get; set; } /// /// 编号 确认编号或者报文编号 /// uint sn { get; set; } /// /// 代表编号前面的所有报都收到了的标志 /// uint una { get; set; } /// /// 数据内容长度 /// uint len { get; } } public interface IKcpSegment : IKcpHeader { /// /// 重传的时间戳。超过当前时间重发这个包 /// uint resendts { get; set; } /// /// 超时重传时间,根据网络去定 /// uint rto { get; set; } /// /// 快速重传机制,记录被跳过的次数,超过次数进行快速重传 /// uint fastack { get; set; } /// /// 重传次数 /// uint xmit { get; set; } /// /// 数据内容 /// Span data { get; } /// /// 将IKcpSegment编码成字节数组,并返回总长度(包括Kcp报头) /// /// /// int Encode(Span buffer); } public interface ISegmentManager where Segment : IKcpSegment { Segment Alloc(int appendDateSize); void Free(Segment seg); } }