A most elegant TCP hole punching algorithm
2 months ago
- #TCP
- #Networking
- #NAT
- TCP打洞技术通过知晓彼此的WAN IP和外部端口,并同时发起连接,实现NAT路由器后计算机的直连
- 该算法采用确定性方法,仅需单个参数即可推导元数据,无需依赖固定基础设施
- 通过Unix时间戳、最大时钟误差和最小运行窗口计算'桶'值,实现双方无通信同步
- 端口选择使用桶值作为伪随机数生成器种子,确保双方生成相同的端口列表
- TCP打洞的关键套接字选项包括SO_REUSEADDR和SO_REUSEPORT,用于强制复用套接字地址
- 推荐使用非阻塞套接字配合select轮询,以便精确控制SYN数据包交换的时序
- 算法采用领导者-跟随者模型选择有效连接,领导者通过发送单个字符进行确认
- 整个过程完全确定性,仅需目标IP且无需主机间交换额外元数据
- 可通过在10秒窗口内运行命令进行本地测试,模拟实际打洞过程