SOCKS5 UDP ASSOCIATE 建立 UDP 轉發關係後,客戶端需向服務器指定的 UDP 端口發送帶有 SOCKS5 UDP 請求頭的數據報。本文詳細說明 UDP 請求頭結構、分片機制、封裝規則及緩存要求。
UDP 請求頭結構
RSV FRAG ATYP DST.ADDR DST.PORT DATA
2 1 1 Variable 2 Variable
- RSV:保留,固定
0x0000。
- FRAG:分片序號,
0x00 表示獨立數據報;1~127 表示分片位置,值越大越接近尾端。
- ATYP:地址類型(
0x01=IPv4, 0x03=域名, 0x04=IPv6)。
- DST.ADDR / DST.PORT:目標地址與端口(網絡字節序)。
- DATA:用戶負載數據。
關鍵規則
- 服務器不發送任何通知給客戶端,無法投遞的數據報直接丟棄。
- 回應數據報必須加上相同 UDP 請求頭並按協商方法封裝。
- 服務器僅接受來自協商 IP 的數據報,其他來源直接丟棄。
- 分片重組隊列需在 5 秒內完成,超時或收到更小 FRAG 值時重置隊列。
- 不支援分片的實現必須丟棄所有 FRAG≠0 的數據報。
緩存空間預留
SOCKS 感知 UDP 編程接口需報告可用緩存小於系統實際值:
- ATYP=0x01:預留 10+method_dependent 字節
- ATYP=0x03:預留 262+method_dependent 字節
- ATYP=0x04:預留 20+method_dependent 字節