<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Module on 云淡风轻</title>
    <link>/tags/module/</link>
    <description>Recent content in Module on 云淡风轻</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>©2007</copyright>
    <lastBuildDate>Thu, 08 Jan 2026 11:00:00 +0800</lastBuildDate><atom:link href="/tags/module/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>TINC 源码解读 第四篇 - 模块依赖与数据流图</title>
      <link>/posts/20260108-tinc-modules-reference/</link>
      <pubDate>Thu, 08 Jan 2026 11:00:00 +0800</pubDate>
      
      <guid>/posts/20260108-tinc-modules-reference/</guid>
      <description>&lt;p&gt;本文是 TINC 源码解读系列的第四篇，提供一份快速参考指南，包含完整的模块依赖关系、数据流图、核心数据结构和代码模式。&lt;/p&gt;
&lt;h2 id=&#34;1-文件分类一览表&#34;&gt;1. 文件分类一览表&lt;/h2&gt;
&lt;h3 id=&#34;11-核心应用程序&#34;&gt;1.1 核心应用程序&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;行数&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;关键函数&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tincd.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~730&lt;/td&gt;
          &lt;td&gt;VPN 守护进程主程序&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;main()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tincctl.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~200+&lt;/td&gt;
          &lt;td&gt;控制工具客户端&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;main()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fsck.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~200+&lt;/td&gt;
          &lt;td&gt;VPN 一致性检查&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;fsck()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;info.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~200+&lt;/td&gt;
          &lt;td&gt;VPN 信息查询&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;info()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;12-协议处理模块&#34;&gt;1.2 协议处理模块&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;处理的消息&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;协议主处理&lt;/td&gt;
          &lt;td&gt;ID, ACK, ERROR, PING, PONG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_auth.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;认证握手&lt;/td&gt;
          &lt;td&gt;METAKEY, CHALLENGE, CHAL_REPLY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_edge.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;拓扑通告&lt;/td&gt;
          &lt;td&gt;ADD_EDGE, DEL_EDGE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_key.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;密钥交换&lt;/td&gt;
          &lt;td&gt;KEY_CHANGED, REQ_KEY, ANS_KEY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_subnet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子网通告&lt;/td&gt;
          &lt;td&gt;ADD_SUBNET, DEL_SUBNET&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_misc.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;其他消息&lt;/td&gt;
          &lt;td&gt;STATUS, TERMREQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_packet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;数据包转发&lt;/td&gt;
          &lt;td&gt;PACKET (UDP)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;13-连接与加密&#34;&gt;1.3 连接与加密&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;核心结构&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;connection.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;TCP 连接管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;connection_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sptps.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;SPTPS 握手/加密&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;sptps_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;control.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;控制接口&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;connection_t + control&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;14-节点与拓扑&#34;&gt;1.4 节点与拓扑&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;核心结构&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;node.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;节点管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;node_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;edge.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;链路管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;edge_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;subnet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子网管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;subnet_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;graph.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;拓扑算法 (Dijkstra)&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;route.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;路由决策&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;names.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;名称↔ID 映射&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;15-网络-io&#34;&gt;1.5 网络 I/O&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;主网络处理循环&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_socket.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;UDP 套接字 I/O&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_setup.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络初始化&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_packet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;数据包处理&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;16-设备驱动&#34;&gt;1.6 设备驱动&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;平台&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;device.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;通用&lt;/td&gt;
          &lt;td&gt;设备操作接口&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;linux/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Linux&lt;/td&gt;
          &lt;td&gt;TUN/TAP 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bsd/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;BSD&lt;/td&gt;
          &lt;td&gt;tun/tap 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bsd/darwin/tunemu.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;macOS&lt;/td&gt;
          &lt;td&gt;tunemu 模拟&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;solaris/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Solaris&lt;/td&gt;
          &lt;td&gt;TUN 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;windows/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Windows&lt;/td&gt;
          &lt;td&gt;TAP-win32 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dummy_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;测试&lt;/td&gt;
          &lt;td&gt;黑洞设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;raw_socket_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;原始套接字&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fd_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;文件描述符 I/O&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;multicast_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;组播&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;vde_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;VDE 交换机&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;17-密码学&#34;&gt;1.7 密码学&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;功能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cipher.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;对称加密 (AES, ChaCha20 等)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;digest.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;哈希函数 (SHA256, SHA512 等)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ecdsa.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ECDSA 数字签名&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ecdh.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ECDH 密钥交换&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;rsa.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;RSA 签名 (遗留)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;keys.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;密钥生成与管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;random.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;伪随机数生成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;openssl/*.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;OpenSSL 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;gcrypt/*.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;libgcrypt 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ed25519/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Ed25519/EdDSA 内置实现&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;chacha-poly1305/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ChaCha20-Poly1305 AEAD 内置实现&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;18-事件与控制&#34;&gt;1.8 事件与控制&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;event.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;事件循环核心&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;event_select.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;select() 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;logger.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;日志输出&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;script.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;脚本执行 (tinc-up/down)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;19-配置与工具&#34;&gt;1.9 配置与工具&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;conf.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置文件解析&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;conf_net.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络配置字段&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;proxy.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;SOCKS 代理支持&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;upnp.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;UPnP 端口映射&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;autoconnect.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;自动连接管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;address_cache.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;地址缓存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fs.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;文件系统操作&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pidfile.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;PID 文件管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sandbox.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;沙箱/安全限制&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ifconfig.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络接口配置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;netutl.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络工具函数&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;110-数据结构&#34;&gt;1.10 数据结构&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;list.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;双链表容器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;splay_tree.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;平衡树容器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;buffer.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;动态缓冲区&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;meta.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;元数据处理&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-模块依赖关系&#34;&gt;2. 模块依赖关系&lt;/h2&gt;
&lt;h3 id=&#34;21-依赖层级图&#34;&gt;2.1 依赖层级图&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Application Layer
|
+-- tincd.c (主程序)
+-- tincctl.c (控制工具)
+-- info.c (信息查询)
+-- fsck.c (一致性检查)
    |
    v
Control &amp;amp; Event Layer
|
+-- event.c (事件循环)
+-- logger.c (日志)
+-- script.c (脚本执行)
+-- control.c (控制接口)
    |
    v
Protocol &amp;amp; Connection Layer
|
+-- connection.c (连接管理)
+-- protocol*.c (协议处理)
+-- sptps.c (加密握手)
    |
    v
Topology &amp;amp; Routing Layer
|
+-- node.c (节点)
+-- edge.c (链路)
+-- subnet.c (子网)
+-- graph.c (Dijkstra)
+-- route.c (路由)
    |
    v
Network I/O Layer
|
+-- net.c (主循环)
+-- net_socket.c (UDP)
+-- net_packet.c (转发)
+-- net_setup.c (初始化)
    |
    v
Device &amp;amp; Platform Layer
|
+-- device.h (抽象接口)
+-- linux/device.c
+-- bsd/device.c
+-- windows/device.c
    |
    v
Cryptography Layer
|
+-- cipher.c (对称)
+-- digest.c (哈希)
+-- ecdsa.c (签名)
+-- ecdh.c (密钥交换)
+-- keys.c (密钥管理)
    |
    v
Utilities &amp;amp; Data Structures
|
+-- buffer.c, list.c, splay_tree.c
+-- conf.c, logger.c, random.c
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;22-模块间调用关系&#34;&gt;2.2 模块间调用关系&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tincd.c (入口)
  |
  +-- event_loop()
  |   |
  |   +-- accept_connection() -&amp;gt; connection.c
  |   +-- handle_timeout() -&amp;gt; protocol*.c
  |   +-- network_poll()
  |       |
  |       +-- receive_packet() -&amp;gt; net_packet.c
  |       |   |
  |       |   +-- decrypt() -&amp;gt; sptps.c
  |       |   +-- route_packet() -&amp;gt; route.c
  |       |
  |       +-- send_packet() -&amp;gt; net_socket.c
  |           |
  |           +-- encrypt() -&amp;gt; sptps.c
  |
  +-- graph_update()
  |   |
  |   +-- dijkstra() -&amp;gt; graph.c
  |   +-- update_routes() -&amp;gt; route.c
  |
  +-- handle_protocol_message()
      |
      +-- protocol_*.c (各消息处理)
          |
          +-- node_add() -&amp;gt; node.c
          +-- edge_add() -&amp;gt; edge.c
          +-- subnet_add() -&amp;gt; subnet.c
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-核心数据流图&#34;&gt;3. 核心数据流图&lt;/h2&gt;
&lt;h3 id=&#34;31-连接建立流程&#34;&gt;3.1 连接建立流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Client Node                         Server Node
    |                                   |
    +-- socket() ----TCP---&amp;gt;  accept()
    |
    +-- send_id()
    |   (PROT_MAJOR, PROT_MINOR)
    |   &amp;lt;--------- recv_id()
    |       (verify version)
    |
    +-- send_metakey()
    |   (cipher, digest, key)
    |   &amp;lt;--------- recv_metakey()
    |       (setup encryption)
    |
    +-- send_challenge()
    |   (hash = HMAC(...))
    |   &amp;lt;--------- recv_challenge()
    |       (compute hash)
    |
    +-- send_chal_reply()
    |   (hash reply)
    |   &amp;lt;--------- recv_chal_reply()
    |       (verify identity)
    |
    +-- send_ack()
    |   &amp;lt;--------- recv_ack()
    |
    v
Connection Established
Exchange Topology (ADD_EDGE, ADD_SUBNET)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;32-数据包转发流程&#34;&gt;3.2 数据包转发流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;VPN Data (IP Packet)
    |
    v
Write to Virtual Device (device.c)
    |
    v
tinc Network Layer (route.c)
    |
    +-- Query subnet owner
    |   (route_ipv4/route_ipv6)
    |
    v
Find Next Hop (graph.c)
    |
    +-- Check if direct or via relay
    |
    v
Encrypt Packet (sptps.c)
    |
    +-- HMAC + symmetric encryption
    |
    v
Choose Transport (UDP or TCP)
    |
    +-- If udp_confirmed and recent:
    |   +-- send_udppacket() (net_socket.c)
    |
    +-- Else:
    |   +-- send_tcppacket() (connection.c)
    |
    v
Network Transmission
    |
    v (Reverse on receiving side)
Receive Packet
    |
    +-- Decrypt (sptps.c)
    +-- Verify HMAC
    +-- Check sequence number
    |
    v
Route Decision (route.c)
    |
    +-- Local delivery?
    |   +-- Write to device
    |   +-- Application reads
    |
    +-- Forward to other node?
    |   +-- Send to next hop
    |
    v
Application Data
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;33-拓扑同步流程&#34;&gt;3.3 拓扑同步流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Node A                  Root/Relay                Node B
    |                      |                       |
    +-- ADD_EDGE ---------&amp;gt;|-- ADD_EDGE ----------&amp;gt;|
    |   (A, Root)          | (propagate)           |
    |                      |                       |
    |&amp;lt;-- ADD_EDGE ---------|&amp;lt;-- ADD_EDGE ----------+
    |   (B, Root)          | (propagate)           |
    |                      |                       |
    +-- ADD_SUBNET -------&amp;gt;|-- ADD_SUBNET --------&amp;gt;|
    |   (A, 172.16.1.0/24) |                       |
    |                      |                       |
    +-- REQ_KEY ----------&amp;gt;|-- REQ_KEY -----------&amp;gt;|
    |   (A wants B&amp;#39;s key)  |                       |
    |                      |&amp;lt;-- ANS_KEY -----------+
    |                      |   (B&amp;#39;s key)           |
    |&amp;lt;-- ANS_KEY ----------|                       |
    |   (B&amp;#39;s key)          |                       |
    |                      |                       |
    |-- UDP Probe --------------------------------&amp;gt;|
    |   (A-&amp;gt;B direct)      |                       |
    |                      |                       |
    |&amp;lt;-- UDP Reply &amp;lt;------------------------------+|
    |   (B-&amp;gt;A direct)      |                       |
    |                      |                       |
    v (thereafter: direct UDP communication)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-关键数据结构速查&#34;&gt;4. 关键数据结构速查&lt;/h2&gt;
&lt;h3 id=&#34;41-node_t-节点&#34;&gt;4.1 node_t (节点)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;name;                 &lt;span style=&#34;color:#75715e&#34;&gt;// 节点名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;node_id_t&lt;/span&gt; id;               &lt;span style=&#34;color:#75715e&#34;&gt;// ED25519 公钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 状态标志
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;node_status_t&lt;/span&gt; status;       &lt;span style=&#34;color:#75715e&#34;&gt;// 连接状态位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 网络地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; address;         &lt;span style=&#34;color:#75715e&#34;&gt;// 节点地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; socket_address;  &lt;span style=&#34;color:#75715e&#34;&gt;// UDP 地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;list_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;connections; &lt;span style=&#34;color:#75715e&#34;&gt;// TCP 连接列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;connection;   &lt;span style=&#34;color:#75715e&#34;&gt;// 主连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 拓扑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;splay_tree_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;subnets;      &lt;span style=&#34;color:#75715e&#34;&gt;// 子网树
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;splay_tree_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;edges;        &lt;span style=&#34;color:#75715e&#34;&gt;// 关联边树
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 路由
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;via;         &lt;span style=&#34;color:#75715e&#34;&gt;// 路由下一跳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;nexthop;     &lt;span style=&#34;color:#75715e&#34;&gt;// 直接下一跳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; distance;          &lt;span style=&#34;color:#75715e&#34;&gt;// Dijkstra 距离
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// UDP 直连相关
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;address_cache_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;address_cache; &lt;span style=&#34;color:#75715e&#34;&gt;// 地址缓存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; udp_confirmed;             &lt;span style=&#34;color:#75715e&#34;&gt;// UDP 已确认
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 加密
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;cipher_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cipher;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;digest_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;digest;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; outcipher, incipher;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 更多字段...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;42-edge_t-链路&#34;&gt;4.2 edge_t (链路)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;edge_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;from;        &lt;span style=&#34;color:#75715e&#34;&gt;// 源节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;to;          &lt;span style=&#34;color:#75715e&#34;&gt;// 目标节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; address;         &lt;span style=&#34;color:#75715e&#34;&gt;// 目标地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; weight;                 &lt;span style=&#34;color:#75715e&#34;&gt;// Dijkstra 权重
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; options;                &lt;span style=&#34;color:#75715e&#34;&gt;// 边选项
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;connection; &lt;span style=&#34;color:#75715e&#34;&gt;// 关联连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;edge_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;reverse;     &lt;span style=&#34;color:#75715e&#34;&gt;// 反向边指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; active;                &lt;span style=&#34;color:#75715e&#34;&gt;// 是否活跃
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;43-subnet_t-子网&#34;&gt;4.3 subnet_t (子网)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;owner;       &lt;span style=&#34;color:#75715e&#34;&gt;// 所有者
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_type_t&lt;/span&gt; type;         &lt;span style=&#34;color:#75715e&#34;&gt;// MAC/IPv4/IPv6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; weight;                 &lt;span style=&#34;color:#75715e&#34;&gt;// 优先级权重
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;time_t&lt;/span&gt; expires;             &lt;span style=&#34;color:#75715e&#34;&gt;// 过期时间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;union&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_mac_t&lt;/span&gt; mac;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_ipv4_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; in_addr address;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; prefixlength;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } ipv4;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_ipv6_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; in6_addr address;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; prefixlength;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } ipv6;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } net;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;44-connection_t-连接&#34;&gt;4.4 connection_t (连接)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;io_t&lt;/span&gt; io;                    &lt;span style=&#34;color:#75715e&#34;&gt;// I/O 事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;node;        &lt;span style=&#34;color:#75715e&#34;&gt;// 关联节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; address;         &lt;span style=&#34;color:#75715e&#34;&gt;// 远程地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; local_address;   &lt;span style=&#34;color:#75715e&#34;&gt;// 本地地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 缓冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;buffer_t&lt;/span&gt; inbuf, outbuf;     &lt;span style=&#34;color:#75715e&#34;&gt;// 输入/输出缓冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// SPTPS 加密
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_t&lt;/span&gt; sptps;              &lt;span style=&#34;color:#75715e&#34;&gt;// SPTPS 状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_status_t&lt;/span&gt; status; &lt;span style=&#34;color:#75715e&#34;&gt;// 连接状态位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 选项
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; options;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; protocol_version;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 其他
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; control;               &lt;span style=&#34;color:#75715e&#34;&gt;// 是否控制连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; initiate;              &lt;span style=&#34;color:#75715e&#34;&gt;// 是否主动连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;45-sptps_t-sptps-加密&#34;&gt;4.5 sptps_t (SPTPS 加密)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_state_t&lt;/span&gt; state;        &lt;span style=&#34;color:#75715e&#34;&gt;// KEX/KEX1/KEX2/OPEN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 回调
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;send_data_t&lt;/span&gt; send_data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;receive_record_t&lt;/span&gt; receive_record;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 密钥交换
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ecdh_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ecdh;               &lt;span style=&#34;color:#75715e&#34;&gt;// ECDH 参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 共享密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; shared_secret[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 会话密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; key[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;];            &lt;span style=&#34;color:#75715e&#34;&gt;// 对称密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; hmac_key[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;];       &lt;span style=&#34;color:#75715e&#34;&gt;// HMAC 密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 序列号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; inseq, outseq;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 缓冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;buffer_t&lt;/span&gt; inbuf, outbuf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-常见代码模式&#34;&gt;5. 常见代码模式&lt;/h2&gt;
&lt;h3 id=&#34;51-创建新节点&#34;&gt;5.1 创建新节点&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;new_node&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xstrdup&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;node_name&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;status.visited &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; false;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;status.reachable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; true;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;node_add&lt;/span&gt;(n);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;52-添加子网&#34;&gt;5.2 添加子网&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;subnet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;new_subnet&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;owner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SUBNET_IPV4;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;net.ipv4.address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ipv4_address;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;net.ipv4.prefixlength &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;24&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;subnet_add&lt;/span&gt;(node, subnet);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;53-发送协议消息&#34;&gt;5.3 发送协议消息&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;send_request&lt;/span&gt;(c, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;REQUEST_NAME&amp;#34;&lt;/span&gt;, arg1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 例如:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;send_request&lt;/span&gt;(c, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %s %s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ADD_EDGE&amp;#34;&lt;/span&gt;, node_a, node_b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;send_request&lt;/span&gt;(c, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %s %d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ADD_SUBNET&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;192.168.1.0/24&amp;#34;&lt;/span&gt;, weight);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;54-注册事件回调&#34;&gt;5.4 注册事件回调&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;io_t&lt;/span&gt; io;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;io_add&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;io, handle_new_connection, handle, IO_READ);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handle_new_connection&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; flags) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 处理 I/O 事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(flags &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; IO_READ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// 有数据可读
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;55-路由查询&#34;&gt;5.5 路由查询&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;via &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;route_ipv4&lt;/span&gt;(packet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    via &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; s&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;owner;      &lt;span style=&#34;color:#75715e&#34;&gt;// 目标节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 检查是否直连
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (via&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;status.direct) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;send_udppacket&lt;/span&gt;(via, packet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;send_via_relay&lt;/span&gt;(via, packet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;56-图算法-dijkstra&#34;&gt;5.6 图算法 (Dijkstra)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;graph&lt;/span&gt;();  &lt;span style=&#34;color:#75715e&#34;&gt;// 计算所有最短路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 结果存储在每个 node 的:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - node-&amp;gt;via (下一跳)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - node-&amp;gt;distance (距离)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - node-&amp;gt;indirect (是否间接)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 使用结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; node_tree&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;root; n; n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;next) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Node %s: distance=%d, via=%s&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name, n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;distance, n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;via&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-构建与运行&#34;&gt;6. 构建与运行&lt;/h2&gt;
&lt;h3 id=&#34;61-编译&#34;&gt;6.1 编译&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 基本编译&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 带特定后端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure --with-openssl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 发布版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;62-启动-vpn-节点&#34;&gt;6.2 启动 VPN 节点&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 初始化新 VPN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn init nodename
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 添加子网&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn add Subnet 172.16.1.0/24
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启动守护进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 查看状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn info
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;63-控制工具使用&#34;&gt;6.3 控制工具使用&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 获取节点信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn info
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 查看连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn edges
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 查看子网&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn subnets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 监控网络&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn top
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启用/禁用节点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn enable/disable &amp;lt;nodename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;7-关键编译标志&#34;&gt;7. 关键编译标志&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;标志&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_OPENSSL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;使用 OpenSSL 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LIBGCRYPT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;使用 libgcrypt 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LZO&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;启用 LZO 压缩&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LZ4&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;启用 LZ4 压缩&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DLOGGER_DEBUG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;调试日志输出&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LIBUPNP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;UPnP 支持&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LIBMINIUPNPC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;miniupnpc 支持&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-调试技巧&#34;&gt;8. 调试技巧&lt;/h2&gt;
&lt;h3 id=&#34;81-启用详细日志&#34;&gt;8.1 启用详细日志&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运行时设置日志级别&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn -d DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或运行时设置环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; tincd -n myvpn -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;82-数据包捕获&#34;&gt;8.2 数据包捕获&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 在 net_packet.c 中启用包转储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (debug_level &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; DEBUG_TRAFFIC) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fprintf&lt;/span&gt;(stderr, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Packet from %s: %d bytes&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            source_node&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name, packet_len);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;83-追踪连接&#34;&gt;8.3 追踪连接&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 监视 TCP 连接建立&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strace -e trace&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;socket,connect tincd -n myvpn -d DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 监视 UDP 包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump -i eth0 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;udp port 1194&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;84-性能分析&#34;&gt;8.4 性能分析&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运行性能基准&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sptps_speed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 性能分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;perf record -g tincd -n myvpn -d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;perf report
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;9-常见问题排查&#34;&gt;9. 常见问题排查&lt;/h2&gt;
&lt;h3 id=&#34;问题-1-节点无法连接&#34;&gt;问题 1: 节点无法连接&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;诊断步骤&lt;/strong&gt;:&lt;/p&gt;</description>
      <content>&lt;p&gt;本文是 TINC 源码解读系列的第四篇，提供一份快速参考指南，包含完整的模块依赖关系、数据流图、核心数据结构和代码模式。&lt;/p&gt;
&lt;h2 id=&#34;1-文件分类一览表&#34;&gt;1. 文件分类一览表&lt;/h2&gt;
&lt;h3 id=&#34;11-核心应用程序&#34;&gt;1.1 核心应用程序&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;行数&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;关键函数&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tincd.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~730&lt;/td&gt;
          &lt;td&gt;VPN 守护进程主程序&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;main()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tincctl.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~200+&lt;/td&gt;
          &lt;td&gt;控制工具客户端&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;main()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fsck.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~200+&lt;/td&gt;
          &lt;td&gt;VPN 一致性检查&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;fsck()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;info.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~200+&lt;/td&gt;
          &lt;td&gt;VPN 信息查询&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;info()&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;12-协议处理模块&#34;&gt;1.2 协议处理模块&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;处理的消息&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;协议主处理&lt;/td&gt;
          &lt;td&gt;ID, ACK, ERROR, PING, PONG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_auth.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;认证握手&lt;/td&gt;
          &lt;td&gt;METAKEY, CHALLENGE, CHAL_REPLY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_edge.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;拓扑通告&lt;/td&gt;
          &lt;td&gt;ADD_EDGE, DEL_EDGE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_key.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;密钥交换&lt;/td&gt;
          &lt;td&gt;KEY_CHANGED, REQ_KEY, ANS_KEY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_subnet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子网通告&lt;/td&gt;
          &lt;td&gt;ADD_SUBNET, DEL_SUBNET&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_misc.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;其他消息&lt;/td&gt;
          &lt;td&gt;STATUS, TERMREQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_packet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;数据包转发&lt;/td&gt;
          &lt;td&gt;PACKET (UDP)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;13-连接与加密&#34;&gt;1.3 连接与加密&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;核心结构&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;connection.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;TCP 连接管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;connection_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sptps.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;SPTPS 握手/加密&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;sptps_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;control.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;控制接口&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;connection_t + control&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;14-节点与拓扑&#34;&gt;1.4 节点与拓扑&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
          &lt;th&gt;核心结构&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;node.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;节点管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;node_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;edge.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;链路管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;edge_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;subnet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子网管理&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;subnet_t&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;graph.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;拓扑算法 (Dijkstra)&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;route.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;路由决策&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;names.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;名称↔ID 映射&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;15-网络-io&#34;&gt;1.5 网络 I/O&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;主网络处理循环&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_socket.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;UDP 套接字 I/O&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_setup.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络初始化&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_packet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;数据包处理&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;16-设备驱动&#34;&gt;1.6 设备驱动&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;平台&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;device.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;通用&lt;/td&gt;
          &lt;td&gt;设备操作接口&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;linux/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Linux&lt;/td&gt;
          &lt;td&gt;TUN/TAP 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bsd/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;BSD&lt;/td&gt;
          &lt;td&gt;tun/tap 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bsd/darwin/tunemu.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;macOS&lt;/td&gt;
          &lt;td&gt;tunemu 模拟&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;solaris/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Solaris&lt;/td&gt;
          &lt;td&gt;TUN 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;windows/device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Windows&lt;/td&gt;
          &lt;td&gt;TAP-win32 设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dummy_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;测试&lt;/td&gt;
          &lt;td&gt;黑洞设备&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;raw_socket_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;原始套接字&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fd_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;文件描述符 I/O&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;multicast_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;组播&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;vde_device.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;VDE 交换机&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;17-密码学&#34;&gt;1.7 密码学&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;功能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cipher.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;对称加密 (AES, ChaCha20 等)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;digest.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;哈希函数 (SHA256, SHA512 等)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ecdsa.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ECDSA 数字签名&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ecdh.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ECDH 密钥交换&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;rsa.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;RSA 签名 (遗留)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;keys.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;密钥生成与管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;random.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;伪随机数生成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;openssl/*.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;OpenSSL 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;gcrypt/*.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;libgcrypt 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ed25519/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Ed25519/EdDSA 内置实现&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;chacha-poly1305/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ChaCha20-Poly1305 AEAD 内置实现&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;18-事件与控制&#34;&gt;1.8 事件与控制&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;event.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;事件循环核心&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;event_select.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;select() 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;logger.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;日志输出&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;script.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;脚本执行 (tinc-up/down)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;19-配置与工具&#34;&gt;1.9 配置与工具&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;conf.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置文件解析&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;conf_net.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络配置字段&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;proxy.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;SOCKS 代理支持&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;upnp.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;UPnP 端口映射&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;autoconnect.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;自动连接管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;address_cache.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;地址缓存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fs.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;文件系统操作&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pidfile.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;PID 文件管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sandbox.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;沙箱/安全限制&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ifconfig.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络接口配置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;netutl.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络工具函数&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;110-数据结构&#34;&gt;1.10 数据结构&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;list.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;双链表容器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;splay_tree.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;平衡树容器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;buffer.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;动态缓冲区&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;meta.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;元数据处理&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-模块依赖关系&#34;&gt;2. 模块依赖关系&lt;/h2&gt;
&lt;h3 id=&#34;21-依赖层级图&#34;&gt;2.1 依赖层级图&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Application Layer
|
+-- tincd.c (主程序)
+-- tincctl.c (控制工具)
+-- info.c (信息查询)
+-- fsck.c (一致性检查)
    |
    v
Control &amp;amp; Event Layer
|
+-- event.c (事件循环)
+-- logger.c (日志)
+-- script.c (脚本执行)
+-- control.c (控制接口)
    |
    v
Protocol &amp;amp; Connection Layer
|
+-- connection.c (连接管理)
+-- protocol*.c (协议处理)
+-- sptps.c (加密握手)
    |
    v
Topology &amp;amp; Routing Layer
|
+-- node.c (节点)
+-- edge.c (链路)
+-- subnet.c (子网)
+-- graph.c (Dijkstra)
+-- route.c (路由)
    |
    v
Network I/O Layer
|
+-- net.c (主循环)
+-- net_socket.c (UDP)
+-- net_packet.c (转发)
+-- net_setup.c (初始化)
    |
    v
Device &amp;amp; Platform Layer
|
+-- device.h (抽象接口)
+-- linux/device.c
+-- bsd/device.c
+-- windows/device.c
    |
    v
Cryptography Layer
|
+-- cipher.c (对称)
+-- digest.c (哈希)
+-- ecdsa.c (签名)
+-- ecdh.c (密钥交换)
+-- keys.c (密钥管理)
    |
    v
Utilities &amp;amp; Data Structures
|
+-- buffer.c, list.c, splay_tree.c
+-- conf.c, logger.c, random.c
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;22-模块间调用关系&#34;&gt;2.2 模块间调用关系&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tincd.c (入口)
  |
  +-- event_loop()
  |   |
  |   +-- accept_connection() -&amp;gt; connection.c
  |   +-- handle_timeout() -&amp;gt; protocol*.c
  |   +-- network_poll()
  |       |
  |       +-- receive_packet() -&amp;gt; net_packet.c
  |       |   |
  |       |   +-- decrypt() -&amp;gt; sptps.c
  |       |   +-- route_packet() -&amp;gt; route.c
  |       |
  |       +-- send_packet() -&amp;gt; net_socket.c
  |           |
  |           +-- encrypt() -&amp;gt; sptps.c
  |
  +-- graph_update()
  |   |
  |   +-- dijkstra() -&amp;gt; graph.c
  |   +-- update_routes() -&amp;gt; route.c
  |
  +-- handle_protocol_message()
      |
      +-- protocol_*.c (各消息处理)
          |
          +-- node_add() -&amp;gt; node.c
          +-- edge_add() -&amp;gt; edge.c
          +-- subnet_add() -&amp;gt; subnet.c
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-核心数据流图&#34;&gt;3. 核心数据流图&lt;/h2&gt;
&lt;h3 id=&#34;31-连接建立流程&#34;&gt;3.1 连接建立流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Client Node                         Server Node
    |                                   |
    +-- socket() ----TCP---&amp;gt;  accept()
    |
    +-- send_id()
    |   (PROT_MAJOR, PROT_MINOR)
    |   &amp;lt;--------- recv_id()
    |       (verify version)
    |
    +-- send_metakey()
    |   (cipher, digest, key)
    |   &amp;lt;--------- recv_metakey()
    |       (setup encryption)
    |
    +-- send_challenge()
    |   (hash = HMAC(...))
    |   &amp;lt;--------- recv_challenge()
    |       (compute hash)
    |
    +-- send_chal_reply()
    |   (hash reply)
    |   &amp;lt;--------- recv_chal_reply()
    |       (verify identity)
    |
    +-- send_ack()
    |   &amp;lt;--------- recv_ack()
    |
    v
Connection Established
Exchange Topology (ADD_EDGE, ADD_SUBNET)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;32-数据包转发流程&#34;&gt;3.2 数据包转发流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;VPN Data (IP Packet)
    |
    v
Write to Virtual Device (device.c)
    |
    v
tinc Network Layer (route.c)
    |
    +-- Query subnet owner
    |   (route_ipv4/route_ipv6)
    |
    v
Find Next Hop (graph.c)
    |
    +-- Check if direct or via relay
    |
    v
Encrypt Packet (sptps.c)
    |
    +-- HMAC + symmetric encryption
    |
    v
Choose Transport (UDP or TCP)
    |
    +-- If udp_confirmed and recent:
    |   +-- send_udppacket() (net_socket.c)
    |
    +-- Else:
    |   +-- send_tcppacket() (connection.c)
    |
    v
Network Transmission
    |
    v (Reverse on receiving side)
Receive Packet
    |
    +-- Decrypt (sptps.c)
    +-- Verify HMAC
    +-- Check sequence number
    |
    v
Route Decision (route.c)
    |
    +-- Local delivery?
    |   +-- Write to device
    |   +-- Application reads
    |
    +-- Forward to other node?
    |   +-- Send to next hop
    |
    v
Application Data
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;33-拓扑同步流程&#34;&gt;3.3 拓扑同步流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Node A                  Root/Relay                Node B
    |                      |                       |
    +-- ADD_EDGE ---------&amp;gt;|-- ADD_EDGE ----------&amp;gt;|
    |   (A, Root)          | (propagate)           |
    |                      |                       |
    |&amp;lt;-- ADD_EDGE ---------|&amp;lt;-- ADD_EDGE ----------+
    |   (B, Root)          | (propagate)           |
    |                      |                       |
    +-- ADD_SUBNET -------&amp;gt;|-- ADD_SUBNET --------&amp;gt;|
    |   (A, 172.16.1.0/24) |                       |
    |                      |                       |
    +-- REQ_KEY ----------&amp;gt;|-- REQ_KEY -----------&amp;gt;|
    |   (A wants B&amp;#39;s key)  |                       |
    |                      |&amp;lt;-- ANS_KEY -----------+
    |                      |   (B&amp;#39;s key)           |
    |&amp;lt;-- ANS_KEY ----------|                       |
    |   (B&amp;#39;s key)          |                       |
    |                      |                       |
    |-- UDP Probe --------------------------------&amp;gt;|
    |   (A-&amp;gt;B direct)      |                       |
    |                      |                       |
    |&amp;lt;-- UDP Reply &amp;lt;------------------------------+|
    |   (B-&amp;gt;A direct)      |                       |
    |                      |                       |
    v (thereafter: direct UDP communication)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-关键数据结构速查&#34;&gt;4. 关键数据结构速查&lt;/h2&gt;
&lt;h3 id=&#34;41-node_t-节点&#34;&gt;4.1 node_t (节点)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;name;                 &lt;span style=&#34;color:#75715e&#34;&gt;// 节点名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;node_id_t&lt;/span&gt; id;               &lt;span style=&#34;color:#75715e&#34;&gt;// ED25519 公钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 状态标志
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;node_status_t&lt;/span&gt; status;       &lt;span style=&#34;color:#75715e&#34;&gt;// 连接状态位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 网络地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; address;         &lt;span style=&#34;color:#75715e&#34;&gt;// 节点地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; socket_address;  &lt;span style=&#34;color:#75715e&#34;&gt;// UDP 地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;list_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;connections; &lt;span style=&#34;color:#75715e&#34;&gt;// TCP 连接列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;connection;   &lt;span style=&#34;color:#75715e&#34;&gt;// 主连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 拓扑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;splay_tree_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;subnets;      &lt;span style=&#34;color:#75715e&#34;&gt;// 子网树
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;splay_tree_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;edges;        &lt;span style=&#34;color:#75715e&#34;&gt;// 关联边树
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 路由
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;via;         &lt;span style=&#34;color:#75715e&#34;&gt;// 路由下一跳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;nexthop;     &lt;span style=&#34;color:#75715e&#34;&gt;// 直接下一跳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; distance;          &lt;span style=&#34;color:#75715e&#34;&gt;// Dijkstra 距离
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// UDP 直连相关
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;address_cache_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;address_cache; &lt;span style=&#34;color:#75715e&#34;&gt;// 地址缓存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; udp_confirmed;             &lt;span style=&#34;color:#75715e&#34;&gt;// UDP 已确认
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 加密
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;cipher_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cipher;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;digest_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;digest;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; outcipher, incipher;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 更多字段...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;42-edge_t-链路&#34;&gt;4.2 edge_t (链路)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;edge_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;from;        &lt;span style=&#34;color:#75715e&#34;&gt;// 源节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;to;          &lt;span style=&#34;color:#75715e&#34;&gt;// 目标节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; address;         &lt;span style=&#34;color:#75715e&#34;&gt;// 目标地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; weight;                 &lt;span style=&#34;color:#75715e&#34;&gt;// Dijkstra 权重
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; options;                &lt;span style=&#34;color:#75715e&#34;&gt;// 边选项
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;connection; &lt;span style=&#34;color:#75715e&#34;&gt;// 关联连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;edge_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;reverse;     &lt;span style=&#34;color:#75715e&#34;&gt;// 反向边指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; active;                &lt;span style=&#34;color:#75715e&#34;&gt;// 是否活跃
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;43-subnet_t-子网&#34;&gt;4.3 subnet_t (子网)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;owner;       &lt;span style=&#34;color:#75715e&#34;&gt;// 所有者
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_type_t&lt;/span&gt; type;         &lt;span style=&#34;color:#75715e&#34;&gt;// MAC/IPv4/IPv6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; weight;                 &lt;span style=&#34;color:#75715e&#34;&gt;// 优先级权重
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;time_t&lt;/span&gt; expires;             &lt;span style=&#34;color:#75715e&#34;&gt;// 过期时间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;union&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_mac_t&lt;/span&gt; mac;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_ipv4_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; in_addr address;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; prefixlength;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } ipv4;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_ipv6_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; in6_addr address;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; prefixlength;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } ipv6;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } net;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;44-connection_t-连接&#34;&gt;4.4 connection_t (连接)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;io_t&lt;/span&gt; io;                    &lt;span style=&#34;color:#75715e&#34;&gt;// I/O 事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;node;        &lt;span style=&#34;color:#75715e&#34;&gt;// 关联节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; address;         &lt;span style=&#34;color:#75715e&#34;&gt;// 远程地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sockaddr_t&lt;/span&gt; local_address;   &lt;span style=&#34;color:#75715e&#34;&gt;// 本地地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 缓冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;buffer_t&lt;/span&gt; inbuf, outbuf;     &lt;span style=&#34;color:#75715e&#34;&gt;// 输入/输出缓冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// SPTPS 加密
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_t&lt;/span&gt; sptps;              &lt;span style=&#34;color:#75715e&#34;&gt;// SPTPS 状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_status_t&lt;/span&gt; status; &lt;span style=&#34;color:#75715e&#34;&gt;// 连接状态位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 选项
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; options;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; protocol_version;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 其他
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; control;               &lt;span style=&#34;color:#75715e&#34;&gt;// 是否控制连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; initiate;              &lt;span style=&#34;color:#75715e&#34;&gt;// 是否主动连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;45-sptps_t-sptps-加密&#34;&gt;4.5 sptps_t (SPTPS 加密)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_state_t&lt;/span&gt; state;        &lt;span style=&#34;color:#75715e&#34;&gt;// KEX/KEX1/KEX2/OPEN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 回调
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;send_data_t&lt;/span&gt; send_data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;receive_record_t&lt;/span&gt; receive_record;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 密钥交换
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ecdh_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ecdh;               &lt;span style=&#34;color:#75715e&#34;&gt;// ECDH 参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 共享密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; shared_secret[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 会话密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; key[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;];            &lt;span style=&#34;color:#75715e&#34;&gt;// 对称密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; hmac_key[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;];       &lt;span style=&#34;color:#75715e&#34;&gt;// HMAC 密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 序列号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; inseq, outseq;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 缓冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;buffer_t&lt;/span&gt; inbuf, outbuf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-常见代码模式&#34;&gt;5. 常见代码模式&lt;/h2&gt;
&lt;h3 id=&#34;51-创建新节点&#34;&gt;5.1 创建新节点&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;new_node&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xstrdup&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;node_name&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;status.visited &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; false;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;status.reachable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; true;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;node_add&lt;/span&gt;(n);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;52-添加子网&#34;&gt;5.2 添加子网&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;subnet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;new_subnet&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;owner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SUBNET_IPV4;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;net.ipv4.address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ipv4_address;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subnet&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;net.ipv4.prefixlength &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;24&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;subnet_add&lt;/span&gt;(node, subnet);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;53-发送协议消息&#34;&gt;5.3 发送协议消息&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;send_request&lt;/span&gt;(c, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;REQUEST_NAME&amp;#34;&lt;/span&gt;, arg1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 例如:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;send_request&lt;/span&gt;(c, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %s %s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ADD_EDGE&amp;#34;&lt;/span&gt;, node_a, node_b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;send_request&lt;/span&gt;(c, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s %s %d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ADD_SUBNET&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;192.168.1.0/24&amp;#34;&lt;/span&gt;, weight);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;54-注册事件回调&#34;&gt;5.4 注册事件回调&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;io_t&lt;/span&gt; io;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;io_add&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;io, handle_new_connection, handle, IO_READ);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handle_new_connection&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; flags) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 处理 I/O 事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(flags &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; IO_READ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// 有数据可读
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;55-路由查询&#34;&gt;5.5 路由查询&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;via &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;subnet_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;route_ipv4&lt;/span&gt;(packet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    via &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; s&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;owner;      &lt;span style=&#34;color:#75715e&#34;&gt;// 目标节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 检查是否直连
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (via&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;status.direct) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;send_udppacket&lt;/span&gt;(via, packet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;send_via_relay&lt;/span&gt;(via, packet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;56-图算法-dijkstra&#34;&gt;5.6 图算法 (Dijkstra)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;graph&lt;/span&gt;();  &lt;span style=&#34;color:#75715e&#34;&gt;// 计算所有最短路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 结果存储在每个 node 的:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - node-&amp;gt;via (下一跳)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - node-&amp;gt;distance (距离)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// - node-&amp;gt;indirect (是否间接)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 使用结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; node_tree&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;root; n; n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;next) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Node %s: distance=%d, via=%s&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name, n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;distance, n&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;via&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-构建与运行&#34;&gt;6. 构建与运行&lt;/h2&gt;
&lt;h3 id=&#34;61-编译&#34;&gt;6.1 编译&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 基本编译&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 带特定后端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure --with-openssl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 发布版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;62-启动-vpn-节点&#34;&gt;6.2 启动 VPN 节点&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 初始化新 VPN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn init nodename
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 添加子网&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn add Subnet 172.16.1.0/24
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启动守护进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 查看状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tinc -n myvpn info
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;63-控制工具使用&#34;&gt;6.3 控制工具使用&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 获取节点信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn info
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 查看连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn edges
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 查看子网&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn subnets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 监控网络&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn top
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启用/禁用节点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn enable/disable &amp;lt;nodename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;7-关键编译标志&#34;&gt;7. 关键编译标志&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;标志&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_OPENSSL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;使用 OpenSSL 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LIBGCRYPT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;使用 libgcrypt 后端&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LZO&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;启用 LZO 压缩&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LZ4&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;启用 LZ4 压缩&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DLOGGER_DEBUG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;调试日志输出&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LIBUPNP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;UPnP 支持&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-DHAVE_LIBMINIUPNPC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;miniupnpc 支持&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-调试技巧&#34;&gt;8. 调试技巧&lt;/h2&gt;
&lt;h3 id=&#34;81-启用详细日志&#34;&gt;8.1 启用详细日志&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运行时设置日志级别&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn -d DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或运行时设置环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; tincd -n myvpn -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;82-数据包捕获&#34;&gt;8.2 数据包捕获&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 在 net_packet.c 中启用包转储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (debug_level &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; DEBUG_TRAFFIC) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fprintf&lt;/span&gt;(stderr, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Packet from %s: %d bytes&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            source_node&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;name, packet_len);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;83-追踪连接&#34;&gt;8.3 追踪连接&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 监视 TCP 连接建立&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strace -e trace&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;socket,connect tincd -n myvpn -d DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 监视 UDP 包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump -i eth0 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;udp port 1194&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;84-性能分析&#34;&gt;8.4 性能分析&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运行性能基准&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sptps_speed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 性能分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;perf record -g tincd -n myvpn -d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;perf report
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;9-常见问题排查&#34;&gt;9. 常见问题排查&lt;/h2&gt;
&lt;h3 id=&#34;问题-1-节点无法连接&#34;&gt;问题 1: 节点无法连接&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;诊断步骤&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 检查配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn info
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 检查网络连通性&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ping &amp;lt;remote_ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3. 检查密钥文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la ~/.tinc/myvpn/hosts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4. 查看详细日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn -d DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;常见原因&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;防火墙阻止 TCP 655 或 UDP 1194&lt;/li&gt;
&lt;li&gt;密钥文件缺失或权限错误&lt;/li&gt;
&lt;li&gt;配置文件中 Address 字段错误&lt;/li&gt;
&lt;li&gt;DNS 解析失败&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;问题-2-高延迟&#34;&gt;问题 2: 高延迟&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;检查项&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;查看 Dijkstra 路由是否最优: &lt;code&gt;tinc -n myvpn edges&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查链路权重设置&lt;/li&gt;
&lt;li&gt;考虑使用 UDP 直连而非 TCP 中继&lt;/li&gt;
&lt;li&gt;检查 MTU 设置是否导致分片&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;问题-3-密钥签名错误&#34;&gt;问题 3: 密钥/签名错误&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 重新生成密钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tinc -n myvpn generate-keys
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 验证密钥对&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sptps_keypair
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 测试加密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sptps_test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;问题-4-内存占用持续增长&#34;&gt;问题 4: 内存占用持续增长&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;检查&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否存在内存泄漏 (valgrind)&lt;/li&gt;
&lt;li&gt;是否有断开但未清理的连接&lt;/li&gt;
&lt;li&gt;检查事件循环是否正确管理&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-性能优化点&#34;&gt;10. 性能优化点&lt;/h2&gt;
&lt;h3 id=&#34;关键优化&#34;&gt;关键优化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;UDP 直连&lt;/strong&gt;: 避免 TCP 元包开销 (5-10 倍吞吐量提升)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dijkstra 缓存&lt;/strong&gt;: 避免频繁重算拓扑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备选择&lt;/strong&gt;: TUN (L3) 比 TAP (L2) 更高效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加密算法&lt;/strong&gt;: ChaCha20 &amp;gt; AES-CBC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子网聚合&lt;/strong&gt;: 减少 ADD_SUBNET 广播&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事件循环&lt;/strong&gt;: epoll/kqueue &amp;gt; select&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址缓存&lt;/strong&gt;: 避免重复 DNS 查询&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;性能指标&#34;&gt;性能指标&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;指标&lt;/th&gt;
          &lt;th&gt;TCP 中继&lt;/th&gt;
          &lt;th&gt;UDP 直连&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;延迟&lt;/td&gt;
          &lt;td&gt;100-500ms&lt;/td&gt;
          &lt;td&gt;10-100ms&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;吞吐量&lt;/td&gt;
          &lt;td&gt;50-200 Mbps&lt;/td&gt;
          &lt;td&gt;200-1000+ Mbps&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;CPU 占用&lt;/td&gt;
          &lt;td&gt;中等&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;11-模块学习路径建议&#34;&gt;11. 模块学习路径建议&lt;/h2&gt;
&lt;h3 id=&#34;初学者路径&#34;&gt;初学者路径&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;第一阶段：了解主程序流程&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;阅读 &lt;code&gt;tincd.c&lt;/code&gt; - 理解主程序和事件循环&lt;/li&gt;
&lt;li&gt;阅读 &lt;code&gt;main()&lt;/code&gt; 函数和初始化流程&lt;/li&gt;
&lt;li&gt;理解配置加载、设备初始化、事件循环&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;第二阶段：理解数据结构&lt;/strong&gt;
3. 阅读 &lt;code&gt;node.c&lt;/code&gt;, &lt;code&gt;edge.c&lt;/code&gt;, &lt;code&gt;subnet.c&lt;/code&gt; - 核心数据结构
4. 理解节点、边、子网的关系
5. 理解拓扑树的组织方式&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三阶段：掌握网络逻辑&lt;/strong&gt;
6. 阅读 &lt;code&gt;net.c&lt;/code&gt;, &lt;code&gt;route.c&lt;/code&gt; - 网络处理和路由
7. 理解数据包的接收和转发流程
8. 理解路由决策和下一跳计算&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四阶段：学习协议实现&lt;/strong&gt;
9. 阅读 &lt;code&gt;protocol.c&lt;/code&gt; - 协议消息处理
10. 理解握手流程和消息类型
11. 理解连接生命周期&lt;/p&gt;
&lt;h3 id=&#34;进阶路径&#34;&gt;进阶路径&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;第五阶段：深入加密层&lt;/strong&gt;
12. 阅读 &lt;code&gt;sptps.c&lt;/code&gt; - SPTPS 握手和加密
13. 阅读 &lt;code&gt;cipher.c&lt;/code&gt;, &lt;code&gt;digest.c&lt;/code&gt; - 密码学原语
14. 理解密钥交换和会话建立&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第六阶段：掌握拓扑算法&lt;/strong&gt;
15. 阅读 &lt;code&gt;graph.c&lt;/code&gt; - Dijkstra 最短路径
16. 理解拓扑更新和路由重计算
17. 理解环检测和分割处理&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第七阶段：系统集成&lt;/strong&gt;
18. 阅读 &lt;code&gt;device.c&lt;/code&gt; - 设备抽象和平台适配
19. 阅读 &lt;code&gt;event.c&lt;/code&gt; - 事件循环实现
20. 理解跨平台兼容性&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第八阶段：高级特性&lt;/strong&gt;
21. 学习 UDP 打洞机制 (&lt;code&gt;net_socket.c&lt;/code&gt;)
22. 学习 MTU 探测和路径优化
23. 学习性能优化技巧&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;12-快速定位代码&#34;&gt;12. 快速定位代码&lt;/h2&gt;
&lt;h3 id=&#34;按功能查找&#34;&gt;按功能查找&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;我要修改 TCP 握手流程&amp;rdquo;&lt;/strong&gt;
→ 查看 &lt;code&gt;protocol_auth.c&lt;/code&gt;, &lt;code&gt;connection.c&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;我要添加新的 UDP 功能&amp;rdquo;&lt;/strong&gt;
→ 查看 &lt;code&gt;net_socket.c&lt;/code&gt;, &lt;code&gt;net_packet.c&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;我要优化路由算法&amp;rdquo;&lt;/strong&gt;
→ 查看 &lt;code&gt;graph.c&lt;/code&gt;, &lt;code&gt;route.c&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;我要调整加密参数&amp;rdquo;&lt;/strong&gt;
→ 查看 &lt;code&gt;cipher.c&lt;/code&gt;, &lt;code&gt;digest.c&lt;/code&gt;, &lt;code&gt;sptps.c&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;我要修改拓扑同步&amp;rdquo;&lt;/strong&gt;
→ 查看 &lt;code&gt;protocol_edge.c&lt;/code&gt;, &lt;code&gt;protocol_subnet.c&lt;/code&gt;, &lt;code&gt;graph.c&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;我要支持新平台&amp;rdquo;&lt;/strong&gt;
→ 查看 &lt;code&gt;device.h&lt;/code&gt;, &lt;code&gt;bsd/device.c&lt;/code&gt;, &lt;code&gt;linux/device.c&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;按数据结构查找&#34;&gt;按数据结构查找&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;node_t 相关代码&lt;/strong&gt;
→ &lt;code&gt;node.c&lt;/code&gt;, &lt;code&gt;node.h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;edge_t 相关代码&lt;/strong&gt;
→ &lt;code&gt;edge.c&lt;/code&gt;, &lt;code&gt;edge.h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;subnet_t 相关代码&lt;/strong&gt;
→ &lt;code&gt;subnet.c&lt;/code&gt;, &lt;code&gt;subnet.h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;connection_t 相关代码&lt;/strong&gt;
→ &lt;code&gt;connection.c&lt;/code&gt;, &lt;code&gt;connection.h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sptps_t 相关代码&lt;/strong&gt;
→ &lt;code&gt;sptps.c&lt;/code&gt;, &lt;code&gt;sptps.h&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;13-相关资源&#34;&gt;13. 相关资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;官网&lt;/strong&gt;: &lt;a href=&#34;https://www.tinc-vpn.org/&#34;&gt;https://www.tinc-vpn.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档&lt;/strong&gt;: &lt;a href=&#34;https://www.tinc-vpn.org/documentation-1.1/&#34;&gt;https://www.tinc-vpn.org/documentation-1.1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源码&lt;/strong&gt;: &lt;a href=&#34;https://github.com/gsliepen/tinc&#34;&gt;https://github.com/gsliepen/tinc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议规范&lt;/strong&gt;: PROTOCOL 文件 (项目内)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;TINC 的源码组织展现了大型系统软件的设计精髓：&lt;/p&gt;
&lt;h3 id=&#34;关键特点&#34;&gt;关键特点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;清晰的分层架构&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;应用层、控制层、协议层、网络层、系统层&lt;/li&gt;
&lt;li&gt;每层通过定义良好的接口相互通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;灵活的数据结构&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点、边、子网形成拓扑&lt;/li&gt;
&lt;li&gt;连接、SPTPS 管理通信状态&lt;/li&gt;
&lt;li&gt;事件、缓冲处理异步操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;高效的算法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dijkstra 最短路径&lt;/li&gt;
&lt;li&gt;MRU 地址缓存&lt;/li&gt;
&lt;li&gt;UDP 打洞和 MTU 探测&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;良好的可移植性&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设备层抽象支持多平台&lt;/li&gt;
&lt;li&gt;密码层支持多后端&lt;/li&gt;
&lt;li&gt;平台特定代码隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;学习建议&#34;&gt;学习建议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;从主程序入手&lt;/strong&gt; - 理解整体流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握核心数据结构&lt;/strong&gt; - 理解系统状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习协议实现&lt;/strong&gt; - 理解通信机制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深入加密和算法&lt;/strong&gt; - 理解安全性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;研究平台适配&lt;/strong&gt; - 理解可移植性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个项目是学习系统软件开发的极好范例！&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;系列预告&#34;&gt;系列预告&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第一篇：&lt;a href=&#34;../20260108-tinc-protocol-analysis&#34;&gt;TINC 协议深度解析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第二篇：&lt;a href=&#34;../20260108-tinc-module-architecture&#34;&gt;TINC 模块架构与代码组织&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第三篇：&lt;a href=&#34;../20260108-tinc-udp-holepunching&#34;&gt;UDP 打洞机制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第四篇：TINC 项目 - 模块依赖与数据流图&lt;/li&gt;
&lt;/ul&gt;
</content>
    </item>
    
    <item>
      <title>TINC 源码解读 第二篇 - 模块架构与代码组织</title>
      <link>/posts/20260108-tinc-module-architecture/</link>
      <pubDate>Thu, 08 Jan 2026 09:00:00 +0800</pubDate>
      
      <guid>/posts/20260108-tinc-module-architecture/</guid>
      <description>&lt;p&gt;本文是 TINC 源码解读系列的第二篇，重点分析 TINC 的整体架构和代码组织。TINC 采用清晰的分层架构，将系统分为 8 个层次，从应用层到工具层，每层都有明确的职责。&lt;/p&gt;</description>
      <content>&lt;p&gt;本文是 TINC 源码解读系列的第二篇，重点分析 TINC 的整体架构和代码组织。TINC 采用清晰的分层架构，将系统分为 8 个层次，从应用层到工具层，每层都有明确的职责。&lt;/p&gt;
&lt;h2 id=&#34;1-项目概述&#34;&gt;1. 项目概述&lt;/h2&gt;
&lt;p&gt;TINC 是一个点对点 (P2P) VPN 守护进程，支持任意数量节点的虚拟专用网络。通过指定 VPN 中几个节点的位置和公钥，TINC 能够自动发现所有其他节点并建立连接。当直接连接不可用时，数据通过中间节点转发。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;支持的工作模式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Router&lt;/strong&gt; (路由器模式) - 默认，每个节点关联 IPv4/IPv6 子网&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch&lt;/strong&gt; (交换机模式) - 虚拟以太网交换机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hub&lt;/strong&gt; (集线器模式) - 虚拟以太网集线器&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-分层架构概览&#34;&gt;2. 分层架构概览&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;+---------------------------------------------------------------------+
|                    Application Layer                                |
| +----------+----------+----------+--------+                         |
| | tincd.c  | tincctl  | info.c   | fsck.c |                         |
| | (daemon) | (control)| (query)  |(verify)|                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                      Control Layer                                  |
| +----------+----------+----------+--------+                         |
| | control  | command  | top.c    | script |                         |
| | (socket) | (handler)| (monitor)|(exec)  |                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                   Protocol &amp;amp; Comm Layer                             |
| +----------+----------+----------+                                  |
| | protocol | sptps.c  | connec   |                                  |
| | * files  | (crypto) | tion.c   |                                  |
| +----------+----------+----------+                                  |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                   Network &amp;amp; Routing Layer                           |
| +----------+----------+----------+--------+                         |
| | net*.c   | route.c  | graph.c  | proxy  |                         |
| | (I/O)    | (table)  | (topo)   |        |                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                   Data Structure Layer                              |
| +----------+----------+----------+--------+                         |
| | node.c   | edge.c   | subnet.c | names  |                         |
| | +--------+----------+----------+--------+                         |
| | | list   | splay    | hash     |        |                         |
| | | tree   | tree     | table    |        |                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                  Cryptography Layer                                 |
| +----------+----------+----------+--------+                         |
| | cipher   | digest   | ecdsa    | ecdh   |                         |
| | (sym)    | (hash)   | (sig)    | (kex)  |                         |
| | +--------+----------+----------+--------+                         |
| | | rsa    | ed25519  | OpenSSL  | gcrypt |                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                   Device &amp;amp; System Layer                             |
| +----------+----------+----------+--------+                         |
| | device.h | *_device | event.c  | conf.c |                         |
| | (intf)   | (impl)   | (loop)   |(config)|                         |
| | +--------+----------+----------+--------+                         |
| | | linux  | bsd      | solaris  | win    |                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
                            |
+---------------------------------------------------------------------+
|                    Utilities Layer                                  |
| +----------+----------+----------+--------+                         |
| | logger   | utils    | random   | buffer |                         |
| | (log)    | (tools)  | (prng)   | (mem)  |                         |
| | +--------+----------+----------+--------+                         |
| | | fs.c   | address  | autocon  | names  |                         |
| | |        | cache.c  | nect.c   |        |                         |
| +----------+----------+----------+--------+                         |
+---------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-模块详细说明&#34;&gt;3. 模块详细说明&lt;/h2&gt;
&lt;h3 id=&#34;31-应用层-application-layer&#34;&gt;3.1 应用层 (Application Layer)&lt;/h3&gt;
&lt;h4 id=&#34;tincdc---主守护进程&#34;&gt;&lt;code&gt;tincd.c&lt;/code&gt; - 主守护进程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: VPN 守护进程的主程序和事件循环&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;初始化配置和网络&lt;/li&gt;
&lt;li&gt;启动主事件循环&lt;/li&gt;
&lt;li&gt;处理信号和优雅关闭&lt;/li&gt;
&lt;li&gt;管理程序生命周期&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖&lt;/strong&gt;: &lt;code&gt;conf.h&lt;/code&gt;, &lt;code&gt;event.h&lt;/code&gt;, &lt;code&gt;protocol.h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;tincctlc---控制工具&#34;&gt;&lt;code&gt;tincctl.c&lt;/code&gt; - 控制工具&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 远程控制 tincd 的命令行工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;连接到 tincd 控制套接字&lt;/li&gt;
&lt;li&gt;发送/接收命令&lt;/li&gt;
&lt;li&gt;交互式命令处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖&lt;/strong&gt;: &lt;code&gt;control.h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;infoc-和-fsckc&#34;&gt;&lt;code&gt;info.c&lt;/code&gt; 和 &lt;code&gt;fsck.c&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;info.c&lt;/strong&gt;: 显示 VPN 节点信息、查询节点状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fsck.c&lt;/strong&gt;: VPN 配置和状态一致性验证&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;32-控制层-control-layer&#34;&gt;3.2 控制层 (Control Layer)&lt;/h3&gt;
&lt;h4 id=&#34;controlc---控制连接管理&#34;&gt;&lt;code&gt;control.c&lt;/code&gt; - 控制连接管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 管理与控制客户端的连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;建立和维护控制连接&lt;/li&gt;
&lt;li&gt;接收/处理控制命令&lt;/li&gt;
&lt;li&gt;返回状态信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键结构&lt;/strong&gt;: &lt;code&gt;connection_t&lt;/code&gt; (带 control 标志)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;scriptc---脚本执行&#34;&gt;&lt;code&gt;script.c&lt;/code&gt; - 脚本执行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 执行 VPN 生命周期脚本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;执行 &lt;code&gt;tinc-up/tinc-down&lt;/code&gt; 脚本&lt;/li&gt;
&lt;li&gt;设置虚拟网络接口&lt;/li&gt;
&lt;li&gt;执行自定义钩子函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境&lt;/strong&gt;: 通过环境变量传递配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;eventc---事件循环&#34;&gt;&lt;code&gt;event.c&lt;/code&gt; - 事件循环&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 异步事件处理引擎&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;I/O 事件（select/epoll/kqueue）&lt;/li&gt;
&lt;li&gt;超时处理&lt;/li&gt;
&lt;li&gt;信号处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回调类型&lt;/strong&gt;: &lt;code&gt;io_cb_t&lt;/code&gt;, &lt;code&gt;timeout_cb_t&lt;/code&gt;, &lt;code&gt;signal_cb_t&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;33-协议与通信层-protocol--communication&#34;&gt;3.3 协议与通信层 (Protocol &amp;amp; Communication)&lt;/h3&gt;
&lt;h4 id=&#34;protocolc---协议处理&#34;&gt;&lt;code&gt;protocol*.c&lt;/code&gt; - 协议处理&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职责&lt;/th&gt;
          &lt;th&gt;处理消息&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;主协议处理器&lt;/td&gt;
          &lt;td&gt;ID, ACK, ERROR&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_auth.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;认证&lt;/td&gt;
          &lt;td&gt;METAKEY, CHALLENGE, CHAL_REPLY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_edge.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;边通告&lt;/td&gt;
          &lt;td&gt;ADD_EDGE, DEL_EDGE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_key.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;密钥交换&lt;/td&gt;
          &lt;td&gt;KEY_CHANGED, REQ_KEY, ANS_KEY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_subnet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子网通告&lt;/td&gt;
          &lt;td&gt;ADD_SUBNET, DEL_SUBNET&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;protocol_misc.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;其他&lt;/td&gt;
          &lt;td&gt;PING, PONG, STATUS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_packet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;包转发&lt;/td&gt;
          &lt;td&gt;PACKET&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;协议版本&lt;/strong&gt;: PROT_MAJOR=17, PROT_MINOR=7&lt;/p&gt;
&lt;h4 id=&#34;sptpsc---安全协议握手&#34;&gt;&lt;code&gt;sptps.c&lt;/code&gt; - 安全协议握手&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 实现 Simple SPTPS 的点对点加密协议&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;密钥交换 (ECDH)&lt;/li&gt;
&lt;li&gt;会话建立&lt;/li&gt;
&lt;li&gt;记录加密/解密&lt;/li&gt;
&lt;li&gt;前向保密&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态机&lt;/strong&gt;: &lt;code&gt;SPTPS_KEX&lt;/code&gt; → &lt;code&gt;SPTPS_KEX1&lt;/code&gt; → &lt;code&gt;SPTPS_KEX2&lt;/code&gt; → &lt;code&gt;SPTPS_OPEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密钥派生&lt;/strong&gt;: 使用 SHA256/SHA512&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;connectionc---连接管理&#34;&gt;&lt;code&gt;connection.c&lt;/code&gt; - 连接管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 管理与其他节点的 TCP 连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;建立/关闭连接&lt;/li&gt;
&lt;li&gt;连接状态跟踪&lt;/li&gt;
&lt;li&gt;连接队列管理&lt;/li&gt;
&lt;li&gt;元包缓冲 (meta packets)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;io_t&lt;/span&gt; io;                    &lt;span style=&#34;color:#75715e&#34;&gt;// I/O event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;node_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;node;        &lt;span style=&#34;color:#75715e&#34;&gt;// associated node
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;buffer_t&lt;/span&gt; inbuf, outbuf;     &lt;span style=&#34;color:#75715e&#34;&gt;// input/output buffers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;sptps_t&lt;/span&gt; sptps;              &lt;span style=&#34;color:#75715e&#34;&gt;// SPTPS state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_status_t&lt;/span&gt; status; &lt;span style=&#34;color:#75715e&#34;&gt;// connection status
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#66d9ef&#34;&gt;connection_t&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;34-网络与路由层-network--routing&#34;&gt;3.4 网络与路由层 (Network &amp;amp; Routing)&lt;/h3&gt;
&lt;h4 id=&#34;netc---网络-io&#34;&gt;&lt;code&gt;net*.c&lt;/code&gt; - 网络 I/O&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;职责&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;主网络处理循环&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_socket.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;套接字操作 (UDP)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_packet.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;包处理 (接收/转发)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;net_setup.c&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网络初始化&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UDP 包接收/发送 (fast path)&lt;/li&gt;
&lt;li&gt;TCP 连接处理 (slow path)&lt;/li&gt;
&lt;li&gt;包加密/解密&lt;/li&gt;
&lt;li&gt;包转发&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;routec---路由管理&#34;&gt;&lt;code&gt;route.c&lt;/code&gt; - 路由管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 处理数据包路由决策&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作模式&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RMODE_ROUTER&lt;/code&gt; - 基于子网的路由 (默认)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RMODE_SWITCH&lt;/code&gt; - 以太网交换&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RMODE_HUB&lt;/code&gt; - 集线器 (广播)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;graphc---拓扑算法&#34;&gt;&lt;code&gt;graph.c&lt;/code&gt; - 拓扑算法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 计算网络拓扑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算法&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Dijkstra 最短路径&lt;/li&gt;
&lt;li&gt;Spanning Tree 构建&lt;/li&gt;
&lt;li&gt;连通性检查&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;确定最优转发路径&lt;/li&gt;
&lt;li&gt;检测网络分割&lt;/li&gt;
&lt;li&gt;计算中继节点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;proxyc---代理支持&#34;&gt;&lt;code&gt;proxy.c&lt;/code&gt; - 代理支持&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责&lt;/strong&gt;: 代理协议支持 (SOCKS4/SOCKS5)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;通过代理建立连接&lt;/li&gt;
&lt;li&gt;SOCKS 握手处理&lt;/li&gt;
&lt;li&gt;认证支持&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;35-数据结构层-data-structures&#34;&gt;3.5 数据结构层 (Data Structures)&lt;/h3&gt;
&lt;h4 id=&#34;核心数据结构&#34;&gt;核心数据结构&lt;/h4&gt;
&lt;h5 id=&#34;node_t-节点&#34;&gt;&lt;code&gt;node_t&lt;/code&gt; (节点)&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;node_t
|-- name: 节点名称
|-- id: 节点 ID (ED25519 pub key)
|-- status: 节点状态 flags
|-- address: 节点地址
|-- socket_address: UDP addr
|-- distance: Dijkstra distance
|-- via: routing next hop
|-- nexthop: direct next hop
|-- subnets: owned subnets tree
|-- keys: encrypt keys
+-- connections: TCP conn list
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;edge_t-边链路&#34;&gt;&lt;code&gt;edge_t&lt;/code&gt; (边/链路)&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;edge_t
|-- from: source node
|-- to: target node
|-- address: target address
|-- options: edge opts (flags)
|-- weight: path weight
|-- connection: TCP conn
+-- reverse: reverse edge
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;subnet_t-子网&#34;&gt;&lt;code&gt;subnet_t&lt;/code&gt; (子网)&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;subnet_t
|-- owner: owner node
|-- type: subnet type
|-- weight: priority weight
|-- expires: expire time
+-- net: subnet data
    |-- mac.address
    |-- ipv4.address/prefix
    +-- ipv6.address/prefix
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;connection_t-连接&#34;&gt;&lt;code&gt;connection_t&lt;/code&gt; (连接)&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;connection_t
|-- io: I/O event handle
|-- node: associated node
|-- address: remote address
|-- inbuf, outbuf: buffers
|-- sptps: SPTPS state
|-- status: connection state
|-- options: connection opts
|-- protocol_version: proto ver
+-- mst: in minimum tree?
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;容器结构&#34;&gt;容器结构&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;容器&lt;/th&gt;
          &lt;th&gt;用途&lt;/th&gt;
          &lt;th&gt;组织方式&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;splay_tree_t&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;有序集合 (nodes, subnets, edges)&lt;/td&gt;
          &lt;td&gt;平衡树&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;list_t&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;无序列表 (connections, events)&lt;/td&gt;
          &lt;td&gt;双链表&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;hash.h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;快速查找 (name→node mapping)&lt;/td&gt;
          &lt;td&gt;哈希表&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;36-密码学与安全层-cryptography&#34;&gt;3.6 密码学与安全层 (Cryptography)&lt;/h3&gt;
&lt;h4 id=&#34;对称加密&#34;&gt;对称加密&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;cipher.c&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AES, Blowfish, Camellia 等&lt;/li&gt;
&lt;li&gt;ECB, CBC, CFB, OFB, CTR 模式&lt;/li&gt;
&lt;li&gt;后端: OpenSSL 或 libgcrypt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;chacha-poly1305/&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChaCha20-Poly1305 AEAD 加密&lt;/li&gt;
&lt;li&gt;独立实现&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;哈希与消息摘要&#34;&gt;哈希与消息摘要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;digest.c&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SHA1, SHA256, SHA512&lt;/li&gt;
&lt;li&gt;MD5 (遗留)&lt;/li&gt;
&lt;li&gt;后端: OpenSSL 或 libgcrypt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;ed25519/sha512.h&lt;/code&gt;&lt;/strong&gt;: ED25519 自带 SHA512&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;非对称加密与签名&#34;&gt;非对称加密与签名&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ecdsa.c&lt;/code&gt;&lt;/strong&gt;: ECDSA 签名 (通过 libgcrypt 或 OpenSSL)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ecdh.c&lt;/code&gt;&lt;/strong&gt;: ECDH 密钥交换 (SPTPS 握手用)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rsa.c&lt;/code&gt;&lt;/strong&gt; (遗留): RSA 签名 (传统握手)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ed25519/&lt;/code&gt;&lt;/strong&gt;: EdDSA 实现&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;后端支持&#34;&gt;后端支持&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Cipher/Digest layers
    |
    +-- openssl/ (libssl/libcrypto)
    +-- gcrypt/  (libgcrypto)
    +-- ed25519/ (built-in)
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;密钥管理&#34;&gt;密钥管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;keys.c&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生成和加载密钥&lt;/li&gt;
&lt;li&gt;密钥文件 I/O&lt;/li&gt;
&lt;li&gt;密钥验证&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;prf.h&lt;/code&gt;&lt;/strong&gt;: 伪随机函数&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;37-设备与系统层-device--system&#34;&gt;3.7 设备与系统层 (Device &amp;amp; System)&lt;/h3&gt;
&lt;h4 id=&#34;虚拟网络设备&#34;&gt;虚拟网络设备&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;device.h&lt;/code&gt;&lt;/strong&gt;: 设备操作接口 (抽象)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;devops_t&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;setup_t&lt;/span&gt; setup;        &lt;span style=&#34;color:#75715e&#34;&gt;// initialize
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;cleanup_t&lt;/span&gt; cleanup;    &lt;span style=&#34;color:#75715e&#34;&gt;// clean up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;read_t&lt;/span&gt; read;          &lt;span style=&#34;color:#75715e&#34;&gt;// read packet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;write_t&lt;/span&gt; write;        &lt;span style=&#34;color:#75715e&#34;&gt;// write packet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#66d9ef&#34;&gt;devops_t&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;设备实现&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;平台&lt;/th&gt;
          &lt;th&gt;实现&lt;/th&gt;
          &lt;th&gt;文件&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Linux&lt;/td&gt;
          &lt;td&gt;TUN/TAP&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;linux/device.c&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;BSD&lt;/td&gt;
          &lt;td&gt;tun/tap&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;bsd/device.c&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS&lt;/td&gt;
          &lt;td&gt;tunemu&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;bsd/darwin/tunemu.c&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Solaris&lt;/td&gt;
          &lt;td&gt;TUN&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;solaris/device.c&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows&lt;/td&gt;
          &lt;td&gt;TAP&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;windows/device.c&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;其他设备&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dummy_device.c&lt;/code&gt; - 测试用 (黑洞)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fd_device.c&lt;/code&gt; - 文件描述符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raw_socket_device.c&lt;/code&gt; - 原始套接字&lt;/li&gt;
&lt;li&gt;&lt;code&gt;multicast_device.c&lt;/code&gt; - 组播&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vde_device.c&lt;/code&gt; - VDE 交换机&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;事件驱动&#34;&gt;事件驱动&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;event.c&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事件循环 (select/epoll/kqueue)&lt;/li&gt;
&lt;li&gt;I/O 复用&lt;/li&gt;
&lt;li&gt;超时和信号处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;event_select.c&lt;/code&gt;&lt;/strong&gt;: select() 后端&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;配置管理&#34;&gt;配置管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;conf.c&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置文件解析&lt;/li&gt;
&lt;li&gt;配置树管理&lt;/li&gt;
&lt;li&gt;配置查询&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;conf_net.c&lt;/code&gt;&lt;/strong&gt;: 网络配置字段&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;平台特定代码&#34;&gt;平台特定代码&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bsd/       - BSD 特定 (sandbox, tun)
linux/     - Linux 特定 (设备)
solaris/   - Solaris 特定
windows/   - Windows 特定
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id=&#34;38-实用工具层-utilities&#34;&gt;3.8 实用工具层 (Utilities)&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;模块&lt;/th&gt;
          &lt;th&gt;职责&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;logger.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;日志记录 (DEBUG/INFO/WARNING)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;utils.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;通用工具函数&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;random.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;伪随机数生成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;buffer.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;动态缓冲区&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;fs.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;文件系统操作&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;dropin.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;缺失函数替代&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;address_cache.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;节点地址缓存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;autoconnect.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;自动连接管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;names.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;名字↔ID 映射&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;netutl.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;网络工具&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ifconfig.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;网络接口配置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;pidfile.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;PID 文件管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;sandbox.c&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;沙箱/安全限制&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-模块依赖关系&#34;&gt;4. 模块依赖关系&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tincd/tincctl (Application)
    |
    v
control + event + logger (Control/Events)
    |
    v
protocol* + sptps + connection (Protocol)
    |
    v
node + edge + subnet + graph + route (Data/Topology)
    |
    v
net* + device + proxy (Network I/O)
    |
    v
cipher + digest + ecdsa + ecdh (Crypto)
    |
    v
buffer + list + splay_tree + hash (Containers)
    |
    v
utils + logger + random + conf (Utilities)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-关键工作流&#34;&gt;5. 关键工作流&lt;/h2&gt;
&lt;h3 id=&#34;51-连接建立流程&#34;&gt;5.1 连接建立流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. node.c: create node
    |
    v
2. connection.c: init TCP conn
    |
    v
3. protocol_auth.c: send ID
    |
    v
4. sptps.c: ECDH key exchange
    |
    v
5. protocol_key.c: exchange session key
    |
    v
6. net_packet.c: start forward UDP
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;52-数据包转发流程&#34;&gt;5.2 数据包转发流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. net_socket.c: receive UDP packet
    |
    v
2. net_packet.c: decrypt packet
    |
    v
3. route.c: routing decision
    |
    v
4. graph.c: compute forward path
    |
    v
5. connection.c / net_socket.c: forward or local
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;53-拓扑更新流程&#34;&gt;5.3 拓扑更新流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. protocol_edge.c: recv ADD_EDGE/DEL_EDGE
    |
    v
2. edge.c: update edge database
    |
    v
3. graph.c: recompute shortest path (Dijkstra)
    |
    v
4. route.c: update forward table
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-编译配置选项&#34;&gt;6. 编译配置选项&lt;/h2&gt;
&lt;p&gt;项目支持多个可选功能，通过编译标志控制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加密后端&lt;/strong&gt;: &lt;code&gt;HAVE_OPENSSL&lt;/code&gt; / &lt;code&gt;HAVE_LIBGCRYPTO&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;压缩&lt;/strong&gt;: &lt;code&gt;HAVE_LZO&lt;/code&gt; / &lt;code&gt;HAVE_LZ4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高级特性&lt;/strong&gt;: &lt;code&gt;HAVE_LIBUPNP&lt;/code&gt;, &lt;code&gt;HAVE_LIBMINIUPNPC&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平台特定&lt;/strong&gt;: &lt;code&gt;HAVE_LINUX&lt;/code&gt;, &lt;code&gt;HAVE_BSD&lt;/code&gt;, &lt;code&gt;HAVE_WINDOWS&lt;/code&gt; 等&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-统计信息&#34;&gt;7. 统计信息&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;核心代码文件:  60+ files
总代码行数:    15,000+ lines
支持平台:      Linux, BSD, macOS, Solaris, Windows
关键数据结构:  5+ (node, edge, subnet, connection, device)
密码算法:      10+
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;8-架构设计优势&#34;&gt;8. 架构设计优势&lt;/h2&gt;
&lt;h3 id=&#34;模块独立&#34;&gt;模块独立&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每个模块职责清晰&lt;/li&gt;
&lt;li&gt;最小化模块间耦合&lt;/li&gt;
&lt;li&gt;便于测试和维护&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;易于移植&#34;&gt;易于移植&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;设备层、密码层可替换&lt;/li&gt;
&lt;li&gt;平台特定代码隔离&lt;/li&gt;
&lt;li&gt;支持 5+ 个操作系统&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;可扩展&#34;&gt;可扩展&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;易于添加新协议&lt;/li&gt;
&lt;li&gt;易于添加新加密算法&lt;/li&gt;
&lt;li&gt;支持可选特性编译&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;性能优化&#34;&gt;性能优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;关键路径 (UDP fast path) 独立优化&lt;/li&gt;
&lt;li&gt;Dijkstra 缓存避免重复计算&lt;/li&gt;
&lt;li&gt;地址缓存防止 DNS 查询风暴&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-从-tinc-架构到代码实现&#34;&gt;9. 从 TINC 架构到代码实现&lt;/h2&gt;
&lt;h3 id=&#34;快速导航指南&#34;&gt;快速导航指南&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;入门代码&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主程序: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/tincd.c&#34;&gt;tincd.c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;节点定义: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/node.h&#34;&gt;node.h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;连接管理: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/connection.h&#34;&gt;connection.h&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;协议处理&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;协议分发: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/protocol.c&#34;&gt;protocol.c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;握手流程: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/protocol_auth.c&#34;&gt;protocol_auth.c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;数据转发&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;包接收: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/net_packet.c&#34;&gt;net_packet.c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;路由决策: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/route.c&#34;&gt;route.c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;拓扑算法&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最短路径: &lt;a href=&#34;https://github.com/gsauthof/tinc/blob/master/src/graph.c&#34;&gt;graph.c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;TINC 的分层架构展现了大型系统软件的设计哲学：&lt;/p&gt;
&lt;h3 id=&#34;核心原则&#34;&gt;核心原则&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;分层设计&lt;/strong&gt; - 将系统分为 8 个清晰的层次，每层通过定义良好的接口与其他层通信。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模块化&lt;/strong&gt; - 每个模块职责单一，相对独立，易于理解和测试。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可移植性&lt;/strong&gt; - 通过设备层、密码层等的抽象，支持多平台和多后端。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;高效性&lt;/strong&gt; - UDP 直接转发为 fast path，TCP 握手和控制走 slow path，最大化性能。&lt;/p&gt;
&lt;h3 id=&#34;代码启示&#34;&gt;代码启示&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;顶层应用&lt;/strong&gt; - 通过控制层与底层通信&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中层协议&lt;/strong&gt; - 实现握手、认证、拓扑交换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下层系统&lt;/strong&gt; - 提供跨平台的统一接口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具层&lt;/strong&gt; - 提供通用服务（日志、缓冲、随机数等）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种精心设计的架构使 TINC 成为一个既可靠又高效的 VPN 解决方案，也是学习大型系统软件架构的极好范例。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;系列预告&#34;&gt;系列预告&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第一篇：&lt;a href=&#34;../20260108-tinc-protocol-analysis&#34;&gt;TINC 协议深度解析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第二篇：TINC 模块架构与代码组织&lt;/li&gt;
&lt;li&gt;第三篇：&lt;a href=&#34;../20260108-tinc-udp-holepunching&#34;&gt;UDP 打洞机制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第四篇：&lt;a href=&#34;../20260108-tinc-modules-reference&#34;&gt;TINC 项目 - 模块依赖与数据流图&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </item>
    
  </channel>
</rss>
