IKcpSegment.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. namespace System.Net.Sockets.Kcp
  2. {
  3. /// <summary>
  4. /// Kcp报头
  5. /// https://zhuanlan.zhihu.com/p/559191428
  6. /// </summary>
  7. public interface IKcpHeader
  8. {
  9. /// <summary>
  10. /// 会话编号,两方一致才会通信
  11. /// </summary>
  12. uint conv { get; set; }
  13. /// <summary>
  14. /// 指令类型
  15. /// </summary>
  16. /// <remarks>
  17. /// <para/> IKCP_CMD_PUSH = 81 // cmd: push data 数据报文
  18. /// <para/> IKCP_CMD_ACK = 82 // cmd: ack 确认报文
  19. /// <para/> IKCP_CMD_WASK = 83 // cmd: window probe (ask) 窗口探测报文,询问对端剩余接收窗口的大小.
  20. /// <para/> IKCP_CMD_WINS = 84 // cmd: window size (tell) 窗口通知报文,通知对端剩余接收窗口的大小.
  21. /// </remarks>
  22. byte cmd { get; set; }
  23. /// <summary>
  24. /// 剩余分片数量,表示随后还有多少个报文属于同一个包。
  25. /// </summary>
  26. byte frg { get; set; }
  27. /// <summary>
  28. /// 自己可用窗口大小
  29. /// </summary>
  30. ushort wnd { get; set; }
  31. /// <summary>
  32. /// 发送时的时间戳 <seealso cref="DateTimeOffset.ToUnixTimeMilliseconds"/>
  33. /// </summary>
  34. uint ts { get; set; }
  35. /// <summary>
  36. /// 编号 确认编号或者报文编号
  37. /// </summary>
  38. uint sn { get; set; }
  39. /// <summary>
  40. /// 代表编号前面的所有报都收到了的标志
  41. /// </summary>
  42. uint una { get; set; }
  43. /// <summary>
  44. /// 数据内容长度
  45. /// </summary>
  46. uint len { get; }
  47. }
  48. public interface IKcpSegment : IKcpHeader
  49. {
  50. /// <summary>
  51. /// 重传的时间戳。超过当前时间重发这个包
  52. /// </summary>
  53. uint resendts { get; set; }
  54. /// <summary>
  55. /// 超时重传时间,根据网络去定
  56. /// </summary>
  57. uint rto { get; set; }
  58. /// <summary>
  59. /// 快速重传机制,记录被跳过的次数,超过次数进行快速重传
  60. /// </summary>
  61. uint fastack { get; set; }
  62. /// <summary>
  63. /// 重传次数
  64. /// </summary>
  65. uint xmit { get; set; }
  66. /// <summary>
  67. /// 数据内容
  68. /// </summary>
  69. Span<byte> data { get; }
  70. /// <summary>
  71. /// 将IKcpSegment编码成字节数组,并返回总长度(包括Kcp报头)
  72. /// </summary>
  73. /// <param name="buffer"></param>
  74. /// <returns></returns>
  75. int Encode(Span<byte> buffer);
  76. }
  77. public interface ISegmentManager<Segment> where Segment : IKcpSegment
  78. {
  79. Segment Alloc(int appendDateSize);
  80. void Free(Segment seg);
  81. }
  82. }