Claude Code Plugins

Community-maintained marketplace

Feedback
4
0

协议设计技能。设计和实现新的传输协议适配器,遵循统一的 ProtocolAdapter 接口。关键词:协议、适配器、TCP、UDP、WebSocket、QUIC、KCP。

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name protocol-design
description 协议设计技能。设计和实现新的传输协议适配器,遵循统一的 ProtocolAdapter 接口。关键词:协议、适配器、TCP、UDP、WebSocket、QUIC、KCP。
allowed-tools Read, Write, Edit, Grep, Glob, Bash

协议设计技能

目标

设计和实现符合 Tunnox 架构的传输协议适配器。

协议适配器接口

// internal/protocol/adapter/adapter.go
type ProtocolAdapter interface {
    // 启动监听
    Start(ctx context.Context) error

    // 停止监听
    Stop() error

    // 接受连接 (服务端)
    Accept() (Connection, error)

    // 建立连接 (客户端)
    Dial(ctx context.Context, addr string) (Connection, error)

    // 获取监听地址
    Addr() net.Addr

    // 获取协议类型
    Protocol() string
}

// 连接抽象
type Connection interface {
    Read(b []byte) (n int, err error)
    Write(b []byte) (n int, err error)
    Close() error
    LocalAddr() net.Addr
    RemoteAddr() net.Addr
    SetDeadline(t time.Time) error
    SetReadDeadline(t time.Time) error
    SetWriteDeadline(t time.Time) error
}

实现模板

1. 适配器结构

// internal/protocol/adapter/xxx_adapter.go
package adapter

import (
    "context"
    "tunnox-core/internal/core/dispose"
    coreerrors "tunnox-core/internal/core/errors"
)

type XXXAdapter struct {
    *dispose.ServiceBase
    config   XXXConfig
    listener XXXListener  // 具体协议的监听器
}

type XXXConfig struct {
    Address    string
    // 协议特定配置
}

func NewXXXAdapter(parentCtx context.Context, config XXXConfig) *XXXAdapter {
    a := &XXXAdapter{
        ServiceBase: dispose.NewService("XXXAdapter", parentCtx),
        config:      config,
    }
    return a
}

2. 启动和停止

func (a *XXXAdapter) Start(ctx context.Context) error {
    // 1. 创建监听器
    listener, err := xxx.Listen(a.config.Address)
    if err != nil {
        return coreerrors.Wrap(err, coreerrors.ErrorTypeNetwork, "xxx listen failed")
    }
    a.listener = listener

    // 2. 启动接受循环 (如果需要)
    go a.acceptLoop()

    return nil
}

func (a *XXXAdapter) Stop() error {
    // 1. 关闭监听器
    if a.listener != nil {
        return a.listener.Close()
    }
    return nil
}

func (a *XXXAdapter) acceptLoop() {
    for {
        select {
        case <-a.Ctx().Done():
            return
        default:
        }

        conn, err := a.listener.Accept()
        if err != nil {
            if a.IsClosed() {
                return
            }
            continue
        }

        // 处理连接
        a.handleConnection(conn)
    }
}

3. 连接管理

func (a *XXXAdapter) Accept() (Connection, error) {
    if a.IsClosed() {
        return nil, coreerrors.New(coreerrors.ErrorTypeNetwork, "adapter closed")
    }

    conn, err := a.listener.Accept()
    if err != nil {
        return nil, coreerrors.Wrap(err, coreerrors.ErrorTypeNetwork, "accept failed")
    }

    return &xxxConnection{conn: conn}, nil
}

func (a *XXXAdapter) Dial(ctx context.Context, addr string) (Connection, error) {
    conn, err := xxx.DialContext(ctx, addr)
    if err != nil {
        return nil, coreerrors.Wrap(err, coreerrors.ErrorTypeNetwork, "dial failed")
    }

    return &xxxConnection{conn: conn}, nil
}

4. 连接包装

// 包装底层连接,实现 Connection 接口
type xxxConnection struct {
    conn xxx.Conn
}

func (c *xxxConnection) Read(b []byte) (int, error) {
    return c.conn.Read(b)
}

func (c *xxxConnection) Write(b []byte) (int, error) {
    return c.conn.Write(b)
}

func (c *xxxConnection) Close() error {
    return c.conn.Close()
}

func (c *xxxConnection) LocalAddr() net.Addr {
    return c.conn.LocalAddr()
}

func (c *xxxConnection) RemoteAddr() net.Addr {
    return c.conn.RemoteAddr()
}

// ... 其他方法

已实现协议参考

TCP 适配器

文件: internal/protocol/adapter/tcp_adapter.go
特点:
- 最基础的实现
- 标准 net.Listener
- 无额外依赖

WebSocket 适配器

文件: internal/protocol/adapter/websocket_adapter.go
特点:
- HTTP 升级握手
- 帧协议封装
- 支持 TLS
依赖: gorilla/websocket

KCP 适配器

文件: internal/protocol/adapter/kcp_adapter.go
特点:
- 基于 UDP
- ARQ 重传机制
- 低延迟优化
依赖: xtaci/kcp-go

QUIC 适配器

文件: internal/protocol/adapter/quic_adapter.go
特点:
- 多路复用
- 0-RTT 连接
- 内置加密
依赖: quic-go/quic-go

新协议检查清单

设计阶段

  • 确定协议库选择
  • 分析连接模型(单连接/多路复用)
  • 确定配置参数
  • 评估性能特性

实现阶段

  • 嵌入 dispose.ServiceBase
  • 实现 ProtocolAdapter 接口
  • 实现 Connection 包装
  • 添加错误处理
  • 添加日志记录

测试阶段

  • 单元测试
  • 连接建立测试
  • 数据传输测试
  • 并发测试
  • 性能基准测试

集成阶段

  • 更新 adapter factory
  • 更新配置解析
  • 更新文档
  • 更新 CLI 选项

性能考量

缓冲区管理

// 使用 sync.Pool 复用缓冲区
var bufPool = sync.Pool{
    New: func() interface{} {
        return make([]byte, 64*1024)
    },
}

连接复用

// 对于多路复用协议 (如 QUIC)
type MultiplexAdapter struct {
    session QuicSession  // 单个会话
    streams sync.Map     // 多个流
}

超时控制

// 合理的超时设置
const (
    DialTimeout      = 10 * time.Second
    ReadTimeout      = 30 * time.Second
    WriteTimeout     = 30 * time.Second
    KeepAliveTimeout = 60 * time.Second
)

输出

完成新协议实现后,输出:

## 协议实现报告

**协议名称**: XXX
**库依赖**: github.com/xxx/xxx

### 文件变更

| 文件 | 操作 | 说明 |
|------|------|------|
| adapter/xxx_adapter.go | 新建 | 适配器实现 |
| adapter/xxx_adapter_test.go | 新建 | 单元测试 |
| adapter/factory.go | 修改 | 添加工厂方法 |

### 配置示例

```yaml
server:
  protocols:
    xxx:
      enabled: true
      port: 8000
      # 协议特定配置

使用示例

./bin/client -s 127.0.0.1:8000 -p xxx -anonymous

性能数据

指标 结果
连接延迟 X ms
吞吐量 X Mbps
并发连接 X