Linux 优化链路状态路由协议 (OLSR) IPv6 HOWTO

Lars Strand

2004-04-23

修订历史
修订 1.02004-04-23修订者:EJH
最终审核完成。文档发布到 LDP 合集。
修订 0.62004-04-19修订者:LKS
感谢 Thomas Zimmerman <thomas (at) zimres net> 的语言审阅!更新到最新版本号,并添加了关于 OLSRd 中插件支持的章节。许可证改回 GFDL
修订 0.52004-03-08修订者:LKS
几乎完全重写。添加了 OLSRd (旧 uOLSR),更新至 RFC3626。移除了 NROLSR 和 CRCOLSR。转换为 XML Docbook。由于一些 GFDL 问题,许可证从 GFDL 更改为 OPL
修订 0.32003-08-05修订者:LKS
初始发布。

本文档描述了在 Linux 上设置和使用 优化链路状态路由协议 (OLSR) 与 IPv6 的软件和步骤。OLSR 用作移动 Ad-Hoc 网络 (MANET)(也称为 “自组网络”)的路由协议。


目录
1. 简介
1.1. 为什么选择 Ad-Hoc 网络?
1.2. 什么是 MANET?
1.3. 什么是优化链路状态路由 (OLSR)?
1.4. OLSR 如何工作?
1.5. IBSS(IEEE ad-hoc 模式)呢?
2. IPv6
3. Linux 的 OLSR
3.1. 安装 OLSRd
3.2. 使用 OLSRd
3.3. HNA 消息呢?
3.4. 插件支持
3.5. 可选 GUI
3.6. 其他 OLSR 实现
4. FAQ
5. 有用的资源
6. 版权、致谢和杂项
6.1. 版权和许可
6.2. 本文档是如何制作的
6.3. 反馈
6.4. 致谢
A. GNU 自由文档许可证
A.1. 序言
A.2. 适用性和定义
A.3. 逐字复制
A.4. 批量复制
A.5. 修改
A.6. 文档合并
A.7. 文档集合
A.8. 与独立作品的聚合
A.9. 翻译
A.10. 终止
A.11. 本许可证的未来修订
A.12. 附录:如何在您的文档中使用本许可证

1. 简介

本文档描述了在 Linux 上设置和使用优化链路状态路由协议 (OLSR) 与 IPv6 的软件和步骤。


1.1. 为什么选择 Ad-Hoc 网络?

ad-hoc 的英文翻译是 “为了特定目的(即兴的,临时组成的)”(来源:维基百科)。Ad-hoc 网络,或 “自组网络”,在处理无线设备时尤其有用,其中一些设备仅在通信会话期间成为网络的一部分,并且动态网络拓扑的需求迫在眉睫。“移动 Ad hoc 网络”通常称为 MANET


1.2. 什么是 MANET?

“MANET 由移动平台(例如,具有多个主机和无线通信设备的路由器)组成——本文中简称为 “节点”——它们可以任意自由移动。节点可能位于飞机、船舶、卡车、汽车中或之上,甚至可能位于人或非常小的设备上,并且每个路由器可能有多个主机。MANET 是移动节点的自治系统。该系统可以独立运行,也可以具有通往固定网络的网关并与之接口。” --- RFC2501:移动 Ad hoc 网络 (MANET),第 3 节(第 3 页)。


1.3. 什么是优化链路状态路由 (OLSR)?

“OLSR 是一种用于移动 ad hoc 网络的先验式路由协议。该协议继承了链路状态算法的稳定性,并具有路由在需要时立即可用的优势,这归功于其先验特性。OLSR 是对经典链路状态协议的优化,专为移动 ad hoc 网络量身定制。”

“OLSR 旨在以完全分布式的方式工作,并且不依赖于任何中央实体。该协议不需要可靠地传输控制消息:每个节点定期发送控制消息,因此可以承受某些此类消息的合理丢失。由于冲突或其他传输问题,这种丢失在无线电网络中经常发生。” --- RFC3626:OLSR,第 1.3 节(第 8 页)


1.4. OLSR 如何工作?

“优化链路状态路由协议 (OLSR) 是为移动 ad hoc 网络开发的。它作为表驱动的先验式协议运行,即定期与其他网络节点交换拓扑信息。每个节点选择一组其邻居节点作为 “多点中继” (MPR)。在 OLSR 中,只有被选为 MPR 的节点负责转发旨在扩散到整个网络的控制流量。MPR 提供了一种有效的机制来泛洪控制流量,从而减少所需的传输次数。” --- RFC3626:OLSR,第 1 节(第 4 页)


1.5. IBSS(IEEE ad-hoc 模式)呢?

IEEE 802.11 标准定义了两种模式

IEEE 802.11 标准

  1. 基础设施模式: 无线网络至少由一个连接到有线网络的接入点 (AP) 和一组无线节点 (WN) 组成。此配置称为基本服务集 (BSS)。扩展服务集 (ESS) 是两个或多个 BSS(多个小区)的集合。

  2. Ad hoc 模式: 也称为 “IEEE ad-hoc 模式”“对等模式”。此配置称为独立基本服务集 (IBSS),适用于建立无线基础设施不存在或不需要服务的网络。

那么,当我们可以使用 “IEEE ad-hoc 模式” 时,为什么还要使用 OLSR 呢?IEEE ad-hoc 模式不支持多跳。 请参阅下面的

“IEEE 8102.11 Ad hoc” 模式支持多跳,而 OLSR 支持。


2. IPv6

IP 版本 6 (IPv6) 是互联网协议的新版本,旨在作为 IP 版本 4 (IPv4) [RFC-791] 的继任者。从 IPv4 到 IPv6 的更改主要分为以下几类

有关 IPv6 的更多信息,请访问 IETF 的 IPv6 工作组


3. Linux 的 OLSR

Linux 有几种 OLSR 实现,但并非所有实现都支持 IPv6。您应该知道如何在 Linux 上启用和使用 IPv6。Peter Bieringer 编写了一篇出色的 Linux IPv6 HOWTO

有一种 OLSR 实现正在成为 “标准” 和最广泛使用的实现。它的描述性名称为 “OLSRd”(旧 Unik-OLSR)。

OLSRd 是基于 INRA C 代码的实现,但几乎已完全重写,因此原始 INRA 代码几乎没有剩余(这意味着它几乎是 GPL)。OLSRd 也处于非常快速的开发中,如果您报告错误,通常会在几个小时内修复。

OLSRd 完全符合 OLSR RFC,支持插件,并且它具有可选的 GUI 界面(用于查看正在发生的事情)。该实现还有一个内容丰富的 “最新” 网页,其中包含指向邮件列表和论文的链接。


3.1. 安装 OLSRd

每个月都有多个 OLSRd 新版本发布,因此请查看 OLSRd 网站 以获取最新版本。

  1. 截至撰写本文时,最新版本为 0.4.3,但当您阅读本文时,几乎可以肯定会有新版本发布。从 http://www.olsr.org/index.cgi?action=download 获取最新版本。

  2. 解压、编译并安装源代码

          # tar jxvf uolsrd-x.y.z
          # cd unik-olsrd-x.y.z
          # make
          # make install
        
  3. Theolsrd安装到/usr/bin/以及默认配置文件olsrd.conf可以在/etc

下找到查看/etc/olsrd.confolsrd配置文件,并更改值以适合您的系统。此文件中的所有值都可以通过命令行选项覆盖

    # Debug level(0-9)
    # If set to 0 the daemon runs in the background
    DEBUG           1
    # IP version to use (4 or 6)
    IPVERSION       6
    # A list of whitespace separated interface names
    INTERFACES      eth1
    

. 主要要更改的选项是0稍后,当您知道 OLSRd 配置正确时,您可以将 “DEBUG” 设置为1使其在后台运行。然后您也可以将其添加到您的 init 脚本中。但为了首先测试一切,请至少将其设置为


(将其设置得更高将在 APM、转发、配置文件解析等方面产生更多信息消息)

3.2. 使用 OLSRd

3.2.1. 在一台主机上

      # olsrd
    

当 OLSRd 安装并配置完成后,可以使用以下命令以 root 身份启动它查看中的所有设置

      # olsrd -i eth1 -ipv6 -d 1
    

都可以通过命令行选项覆盖olsrd将启动在接口上监听eth1

使用 IPv6 和调试消息。

    # olsrd -i eth1 -d 1 -ipv6

       *** UniK olsrd-0.4.3 ***   

    hello interval = 2.00       hello int nonwireless: = 4.00 (1)
    tc interval = 5.00          polling interval = 0.10 
    neighbor_hold_time = 6.00   neighbor_hold_time_nw = 12.00 
    topology_hold_time = 15.00  tos setting = 16 
    hna_interval = 15.00         mid_interval = 5.00
    Willingness set to 3 - next update in 20.000000 secs
    Using IP version 6
    Using multicast address ff05::15

     ---- Interface configuration ---- 

     eth1:                                          (2)
	    Address: fec0:106:2700::10
	    Multicast: ff05::15
	    Interface eth1 set up for use with index 0


     Main address: fec0:106:2700::10                (3)

     NEIGHBORS: l=linkstate, m=MPR, w=willingness   

     Thread created - polling every 0.10 seconds    (4)
     neighbor list: 11:43:17.214807
     neighbor list: 11:43:19.194967                
     neighbor list: 11:43:21.395046
     neighbor list: 11:43:23.604800
     neighbor list: 11:43:25.694875
     
(1)
我们启动 olsrd查看这显示了 OLSRd 正在使用的所有设置。您可以通过在配置文件 (
(2)
) 中指定或在命令行中指定来覆盖这些设置。阅读 OLSR RFC 以了解所有这些设置的含义。
(3)
OLSRd 找到了我们的接口。如果您正在使用具有多个接口的 OLSRd,则会生成 “多接口声明” (MID) 消息。
(4)
如果您正在使用具有多个接口的 OLSRd,它将选择指定的第一个接口作为 “主” 地址。

由于没有其他主机运行 OLSRd,因此此列表为空。

    # route -A inet6
    Destination:   Next Hop   Flags  Metric  Ref  Use Iface
    ...
    ff05::15/128   ff05::15   UAC    0       1    1   eth1
    ...
    

另一个值得注意的事情是,路由表中添加了一个条目


这是 OLSR 用于与其他运行 OLSR 的节点通信的 IPv6 多播地址。

3.2.2. 添加其他主机

  neighbor list: 12:55:14.733586
  neighbor list: 12:55:18.803585
  Willingness for fec0:106:2700::11 changed from 0 to 3 - UPDATING  (1)
  neighbor list: 12:55:22.763585
  fec0:106:2700::11:l=0:m=0:w=3[2hlist:]                            (2)
  neighbor list: 12:55:26.833589
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:]
  Willingness for fec0:106:2700::12 changed from 0 to 2 - UPDATING  (3)
  neighbor list: 12:55:30.903585
  fec0:106:2700::12:l=0:m=0:w=2[2hlist:]
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:]
  neighbor list: 12:55:34.863585
  fec0:106:2700::12:l=0:m=0:w=2[2hlist:]
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:]
  neighbor list: 12:55:39.153586
  fec0:106:2700::12:l=1:m=0:w=2[2hlist:fec0:106:2700::11:]          (4)
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:fec0:106:2700::12:]          (5)
  neighbor list: 12:55:43.443605
  fec0:106:2700::12:l=1:m=0:w=2[2hlist:fec0:106:2700::11:]
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:fec0:106:2700::12:]
  
(1)
仅在一个节点上使用 OLSRd 没有意义,因此我们添加一些节点。然后您将看到 “邻居列表” 得到更新检测到另一个节点(节点 B)。这指定了节点为其他节点携带和转发流量的意愿。这里的新节点fec0:106:2700::11
(2)
愿意转发流量。电池电量低的host可能不愿意转发大量流量,- 因此它将声明较低的意愿值(基于电源状态的路由作为插件提供)。该节点已添加到我们的路由表中。我们(尚未)无法通过此节点到达任何其他节点,因为 2 跳邻居列表 ([2hlist:]
(3)
) 为空。2 跳邻居是邻居听到的节点。
(4)
这是运行 OLSRd 的第三个节点(节点 C)。该节点已添加到我们的路由表中。我们(尚未)无法通过此节点到达任何其他节点,因为 2 跳邻居列表 (在短时间后,当所有节点都已更新并且路由已计算出来时,我们也可以通过另一个节点到达任何其他节点。2 跳邻居列表 () 已填充:我们可以通过C到达节点.
(5)
B到达节点C) 已填充:我们可以通过.

在这里我们可以到达节点

    # route -A inet6
    Destination:           Next Hop   Flags  Metric  Ref  Use Iface
    ...
    fec0:106:2700::11/128  ::         UH     1       0    0   eth1
    fec0:106:2700::12/128  ::         UH     1       0    0   eth1
    ...
  

您还将看到路由表已使用新主机更新


OLSR 的真正魅力在于当您添加一堆节点并四处移动它们时。您仍然可以直接(如果它们很近)或通过其他节点到达每个节点。

3.2.3. 移动

当每个节点都可以到达每个其他节点时,就不好玩了。让我们开始移动节点,以便节点 “A”“B” 彼此超出(无线电)范围。因此,当我们移动节点 “A” 足够远以至于它无法听到节点 “C” 时,所有流量都必须通过节点 “B”我们移动我们的三个节点,以便节点A到达节点) 已填充:我们可以通过必须通过节点

C才能相互到达。提示:您可以不实际移动节点,而是使用

   # ip6tables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP
  

ip6tables

  neighbor list: 13:22:35.693587
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]  (1)
  neighbor list: 13:22:40.093588
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  neighbor list: 13:22:44.053594
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  neighbor list: 13:22:48.233594
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  neighbor list: 13:22:52.193605
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  
(1)
。您可以使用 MAC 地址丢弃所有数据包。您只需要在一个节点上阻止) 已填充:我们可以通过主机 A 上 OLSRd 的输出然后是) 已填充:我们可以通过我们可以直接到达节点到达节点.

C我们移动我们的三个节点,以便节点,并且通过节点到达节点B) 已填充:我们可以通过:

    # route -A inet6
    Destination:             Next Hop           Flags  Metric  Ref  Use Iface
    ...
    fec0:106:2700::11/128    ::                 UH      1      1    0   eth1
    fec0:106:2700::12/128    fec0:106:2700::11  UGH     2      0    0   eth1 
    ...
 

我们可以到达节点

A

路由表也得到了更新。对于节点

A

要到达节点C,它必须通过节点查看:

    # HNA IPv6 routes
    # syntax: netaddr prefix
    # Example Internet gateway
    HNA6 :: 0
    

B3.3. HNA 消息呢?“为了提供将外部路由信息注入到 OLSR MANET 中的能力,具有此类非 MANET 接口的节点定期发出主机和网络关联 (HNA) 消息,其中包含足够的信息供接收者构建适当的路由表。”

    ...
    Sending HNA (48 bytes)...
    ...
    

“这种情况的一个示例可能是节点配备有固定网络(例如,以太网),该固定网络连接到更大的网络以及运行 OLSR 的无线网络接口。” --- RFC3626:OLSR,第 12 节(第 51 页)。

      # route -A inet6
      Destination:             Next Hop           Flags  Metric  Ref  Use Iface
      ...
      ::/0                     fec0:106:2700::1   UG     1       0    0   eth1 
      ...
    

带有网关 (GW) 的 OLSR,发送 HNA 消息。所有其他节点都可以访问 “互联网”


要使一个节点充当网关并发送 HNA 消息,您必须更改

HNA6


当您启动OLSRd时,您将看到该节点定期发送 HNA 消息

     # cd front-end
     # make
     # make install
    

Note

当其他节点收到 HNA 消息时,它们会更新其路由表您还可以在 MANET 中使用多个节点充当网关(发送 HNA 消息)。然后,每个移动节点都使用最近的网关。3.4. 插件支持从 0.4.3 版本开始,OLSRd 也支持插件。插件可用于在 MANET 中添加扩展功能。如果只有一部分节点知道如何解释消息类型,它将通过 “默认转发算法”(参见 OLSR RFC 中的第 3.4.1 节)由所有节点转发。这样,某些节点可以在 OLSR 中添加特殊功能。,它必须通过节点查看截至撰写本文时,OLSRd 版本中包含两个示例插件。其中一个插件添加了基于电源状态的路由。如果一个节点的电池电量低,它可以降低其意愿,并且流量可以通过其他节点路由。

3.5. 可选 GUI


OLSRd 还有一个可选的 GUI,可以显示可用节点列表并捕获数据包。要编译 GUI 前端,您必须安装 GTK2。在

unik-olsrd-x.y.z


目录中执行

记住使用


-ipc

开关启动 OLSRd 或设置


IPC-CONNECT yes

以使 GUI 能够与 OLSRd 通信。


要查看 GUI 使用的一些示例,请查看 http://www.olsr.org/index.cgi?action=gui

3.6. 其他 OLSR 实现


还有其他 OLSR 实现,但没有一个像 OLSRd 那样受欢迎,并且没有一个(除了 QOLSR?)完全符合 RFC 标准。

3.6.1. INRIA

INRIA 是 OLSR 的最早实现之一(?) http://hipercom.inria.fr/olsr/#code。他们的网站已经很久没有更新了,您可以下载的 OLSR 代码仅符合 draft-ietf-manet-olsr-03.txt(现在是 RFC)。应该还有另一个更新版本的 INRIA olsr,但我没有找到。INRIA OLSR 不支持 IPv6。
3.6.2. NROLSR
“美国海军研究实验室” (NRL) 也有一个 OLSR 实现。它是用 C++ 编写的,并且支持 IPv6。 http://pf.itd.nrl.navy.mil/projects/olsr/
3.6.3. CRCOLSR
CRCOLSR 是基于法国 INRIA 代码的实现。据称由加拿大的 “通信研究中心” (CRC) 维护。但截至撰写本文时,自 2003 年 4 月 3 日以来一直没有新版本发布。 http://pf.itd.nrl.navy.mil/projects/olsr/

3.6.4. QOLSR

QOLSR 旨在在无线移动 ad hoc 网络中提供 “服务质量” 路由。在撰写本文时,尚无 QoS 支持,并且对 ipv4/ipv6 的支持在编译时触发。用 C++ 编写。

4. FAQ

其中一些问题/答案来自 OLSRd 网站。

4.1. OLSRd 是否完全符合 RFC3626?

  • 是的。它甚至实现了一些 RFC 中提到的额外功能。有关完整列表,请参阅 RFC 合规性 部分。

  • 4.2. 我可以混合使用站点本地和全局 IPv6 地址吗?

  • 是的。但请记住,它们的设计初衷不是同时使用。如果您开始使用这两种地址,网络拓扑可能会非常 “混乱”4.3. GUI 前端编译失败...为什么? 您可能没有安装 GTK2.0 开发库。4.4. 如果存在多个网关,移动节点如何断定使用最近的网关? 当检测到新网关时,移动节点会检查到此新发现的网关的距离(跳数),并与当前网关进行比较。如果距离更短,则此新网关将成为当前(默认)网关。请参阅 OLSR RFC (RFC3626) 中的第 12.6.2 节


4.5. 我启动并运行了 OLSRd - 但节点似乎没有 “听到” 彼此!

  1. 大多数情况下,这是配置错误:检查以下内容

  2. 如果使用 WLAN 接口,请确保 ESSID/密钥匹配。

  3. 确保网卡设置为 “ad-hoc” 模式而不是 “managed” 模式。

  4. 确保您没有阻止 UDP/698。如果使用 netfilter,请运行

  5. ip6tables -L

  6. 作为 root 用户查看设置了哪些规则。

  7. ip6tables -F

  8. 刷新所有规则。

  9. 5. 有用的资源

  10. OLSRd(旧 uOLSR) http://www.olsr.org

  11. 优化链路状态路由协议 (OLSR) RFC3626 http://www.ietf.org/rfc/rfc3626.txt

  12. 移动 Ad hoc 网络 (MANET) RFC2501 http://www.ietf.org/rfc/rfc2501.txt


移动 Ad-hoc 网络 (manet) 工作组 (IETF) http://www.ietf.org/html.charters/manet-charter.html

开放最短路径优先 IGP (ospf) http://www.ietf.org/html.charters/ospf-charter.html

Protean Forge - OLSR 软件 (CRC 和 NRL) http://pf.itd.nrl.navy.mil/projects/olsr/

INRIA OLSR http://hipercom.inria.fr/olsr/


QOLSR http://qolsr.lri.fr/

IPv6 工作组 (IETF) http://www.ietf.org/html.charters/ipv6-charter.html

RFC2460 互联网协议,版本 6 (IPv6) 规范 http://www.ietf.org/rfc/rfc2460.txt

Peter Bieringer 的 Linux IPv6 HOWTO (英文) http://ldp.linux.no/HOWTO/Linux+IPv6-HOWTO/


联网应用程序的 IPv6 支持的当前状态 http://www.deepspace6.net/docs/ipv6_status_page_apps.html

6. 版权、致谢和杂项

6.1. 版权和许可

根据 GNU 自由文档许可证 1.2 版或自由软件基金会发布的任何更高版本条款,授予复制、分发和/或修改本文档的许可;不包含不变部分、封面文本和封底文本。许可证副本包含在题为“GNU 自由文档许可证”的部分中。


6.2. 本文档是如何制作的

本文档最初使用 Emacs 以 LaTeX 编写。HTML 版本使用 latex2html 创建。后来它被转换为 DocBook XML。

本文档的最新版本可以在以下位置找到

HTML: http://www.tldp.org/HOWTO/OLSR-IPv6-HOWTO/index.html

6.3. 反馈

欢迎提出建议、更正、添加内容。欢迎贡献者并致谢。不欢迎谩骂。


总是可以通过以下方式联系到我

<lars at unik no>

主页: http://www.gnist.org/~lars/


6.4. 致谢

本文档是作为安全通信互操作网络 (INSC 任务 6) 的一部分制作的

感谢 Andreas Hafslund (andreha [at] unik no) 的初步支持。还要感谢 UniK(大学研究生中心)http://www.unik.no 和 FFI(挪威国防研究机构)http://www.ffi.mil.no 的硬件支持。

还要感谢 Andreas Tønnesen (andreto [at] unik no) 在更新本 HOWTO 方面的技术帮助


还要感谢我引用的其他 HOWTO 作者的作品

Linux IPv6 HOWTO (英文) 作者:Peter Bieringer

A. GNU 自由文档许可证

版本 1.2,2002 年 11 月

版权所有 (C) 2000,2001,2002 自由软件基金会公司,地址:59 Temple Place, Suite 330, Boston, MA 02111-1307 USA。 每个人都被允许复制和分发本许可证文档的逐字副本,但不允许更改它。

A.1. 序言

本许可证的目的是使手册、教科书或其他功能性和有用的文档在自由意义上“自由”:确保每个人都拥有有效复制和再分发它的自由,无论是否对其进行修改,无论是商业用途还是非商业用途。其次,本许可证为作者和出版商保留了一种为他们的工作获得荣誉的方式,同时不被视为对他人所做的修改负责。

本许可证是一种“反版权”,这意味着文档的衍生作品本身必须在相同的意义上是自由的。它补充了 GNU 通用公共许可证,后者是为自由软件设计的反版权许可证。

我们设计本许可证是为了将其用于自由软件的手册,因为自由软件需要自由文档:自由程序应附带提供与软件相同自由度的手册。但是,本许可证不限于软件手册;它可以用于任何文本作品,无论主题是什么,也无论是否以印刷书籍的形式出版。我们主要推荐本许可证用于以指导或参考为目的的作品。

A.2. 适用性和定义

本许可证适用于任何手册或其他作品,以任何媒介形式,其中包含版权持有者放置的声明,表明它可以根据本许可证的条款分发。此类声明授予在全球范围内、免版税的许可,期限不受限制,以根据本文规定的条件使用该作品。“文档”(以下)是指任何此类手册或作品。公众的任何成员都是被许可人,并被称为“您”。如果您以根据版权法需要许可的方式复制、修改或分发作品,则您接受该许可。


文档的“修改版本”是指包含文档或其一部分的任何作品,无论是逐字复制,还是经过修改和/或翻译成另一种语言。

“次要部分”是文档的命名附录或前言部分,专门处理文档的出版商或作者与文档的总体主题(或相关事项)的关系,并且不包含任何可以直接归入该总体主题的内容。(因此,如果文档部分是数学教科书,则次要部分不得解释任何数学。)该关系可能是与主题或相关事项的历史联系,或关于它们的法律、商业、哲学、伦理或政治立场。

“不变部分”是某些次要部分,其标题在声明文档根据本许可证发布声明的通知中被指定为不变部分的标题。如果某个部分不符合上述次要部分的定义,则不允许将其指定为不变部分。文档可以包含零个不变部分。如果文档未标识任何不变部分,则不存在不变部分。


“封面文本”是在声明文档根据本许可证发布的通知中列出的某些简短文本段落,作为封面文本或封底文本。封面文本最多可以包含 5 个单词,封底文本最多可以包含 25 个单词。

文档的“透明”副本是指机器可读副本,以通用公众可用的规范格式表示,适用于使用通用文本编辑器(对于由像素组成的图像,则使用通用绘画程序;对于绘图,则使用一些广泛可用的绘图编辑器)直接修订文档,并且适用于文本格式化程序的输入或自动翻译成各种适用于文本格式化程序输入的格式。以其他透明文件格式制作的副本,其标记或缺少标记的目的是为了阻止或劝阻读者后续修改,则不是透明的。如果图像格式用于大量文本,则它不是透明的。非“透明”的副本称为“不透明”。

透明副本的合适格式示例包括没有标记的纯 ASCII、Texinfo 输入格式、LaTeX 输入格式、使用公开可用的 DTD 的 SGML 或 XML,以及符合标准的简单 HTML、PostScript 或 PDF,专为人工修改而设计。透明图像格式的示例包括 PNG、XCF 和 JPG。不透明格式包括专有格式,只能由专有文字处理器读取和编辑;DTD 和/或处理工具通常不可用的 SGML 或 XML;以及某些文字处理器为仅输出目的而生成的机器生成的 HTML、PostScript 或 PDF。

如果您发布或分发超过 100 份不透明副本的文件,您必须随每份不透明副本附带一份机器可读的透明副本,或者在每份不透明副本中或随附声明一个计算机网络位置,以便使用通用网络的大众可以通过公共标准网络协议访问并下载该文件的完整透明副本,且不包含任何附加材料。如果您使用后一种选项,则在您开始大量分发不透明副本时,您必须采取合理谨慎的步骤,以确保该透明副本在所述位置保持可访问状态,直到您最后一次向公众(直接或通过您的代理商或零售商)分发该版本的至少一年后。

我们建议(但非强制要求)您在重新分发大量副本之前充分联系本文档的作者,以便他们有机会为您提供本文档的更新版本。


A.5. 修改

您可以根据上述第 2 节和第 3 节的条件复制和分发本文档的修改版本,前提是您完全按照本许可证发布修改版本,并使修改版本承担本文档的角色,从而将修改版本的发行和修改许可给任何拥有其副本的人。此外,您必须在修改版本中执行以下操作:

  1. 在扉页(以及封面,如果有的话)上使用与本文档标题不同的标题,并与先前版本的标题也不同(如果存在任何先前版本,则应在本文档的历史记录部分中列出)。如果先前版本的原始出版商允许,您可以使用与先前版本相同的标题。

  2. 在扉页上,将修改版本中修改的作者列为一位或多位个人或实体,并列出本文档的至少五位主要作者(如果主要作者少于五位,则列出所有主要作者),除非他们免除您的此项要求。

  3. 在扉页上声明修改版本的出版商名称作为出版商。

  4. 保留本文档的所有版权声明。

  5. 在其他版权声明旁边添加适用于您的修改的版权声明。

  6. 在版权声明之后立即包含许可证声明,以按照本许可证的条款授予公众使用修改版本的许可,格式如以下附录所示。

  7. 在该许可证声明中,保留本文档的许可证声明中给出的不变章节和要求的封面文本的完整列表。

  8. 包含本许可证的未修改副本。

  9. 保留标题为“历史记录”的章节,保留其标题,并在其中添加一项,至少说明扉页上给出的修改版本的标题、年份、新作者和出版商。如果本文档中没有标题为“历史记录”的章节,则创建一个,说明扉页上给出的本文档的标题、年份、作者和出版商,然后添加一项,描述修改版本,如前一句所述。

  10. 保留本文档中给出的用于公众访问本文档透明副本的网络位置,以及本文档中给出的其所基于的先前版本的网络位置。这些可以放在“历史记录”部分中。您可以省略在本文档本身之前至少四年发布的作品的网络位置,或者如果其引用的版本的原始出版商允许。

  11. 对于任何标题为“致谢”或“献词”的章节,保留该章节的标题,并保留该章节中给出的每位贡献者致谢和/或献词的所有实质内容和语气。

  12. 保留本文档的所有不变章节,其文本和标题均不得修改。章节编号或等效内容不被视为章节标题的一部分。

  13. 删除任何标题为“背书”的章节。修改版本中不得包含此类章节。

  14. 不要将任何现有章节重新命名为标题为“背书”或与任何不变章节标题冲突的名称。

  15. 保留任何保证免责声明。

如果修改版本包含符合辅助章节条件且未复制本文档材料的新扉页章节或附录,您可以选择将其中一些或全部章节指定为不变章节。为此,请将它们的标题添加到修改版本的许可证声明中的不变章节列表中。这些标题必须与任何其他章节标题不同。

您可以添加标题为“背书”的章节,前提是其中仅包含各方对您的修改版本的背书——例如,同行评审声明或文本已被某个组织批准为标准的权威定义。

您可以添加最多五个单词的段落作为封面文本,以及最多 25 个单词的段落作为封底文本,添加到修改版本中封面文本列表的末尾。任何一个实体(或通过其安排)只能添加一段封面文本和一段封底文本。如果本文档已经包含由您或由您代表的同一实体安排先前添加的同一封面的封面文本,则您不得添加另一个;但您可以替换旧的,但需获得添加旧封面的先前出版商的明确许可。

本文档的作者和出版商不通过本许可证授予使用他们的姓名进行宣传或声明或暗示对任何修改版本的认可的许可。


A.6. 合并文档

您可以根据上述第 4 节中针对修改版本的条款,将本文档与其他根据本许可证发布的文档合并,前提是您在合并作品中包含所有原始文档的所有不变章节,且未修改,并在其许可证声明中将它们全部列为合并作品的不变章节,并且您保留它们的所有保证免责声明。

合并作品只需包含本许可证的一份副本,多个相同的不变章节可以用一份副本替换。如果存在多个名称相同但内容不同的不变章节,则通过在其末尾添加(括号内)该章节的原始作者或出版商的名称(如果已知),或添加唯一编号,使每个此类章节的标题唯一。对合并作品的许可证声明中的不变章节列表中的章节标题进行相同的调整。

在合并中,您必须合并各种原始文档中标题为“历史记录”的任何章节,形成一个标题为“历史记录”的章节;同样合并任何标题为“致谢”的章节,以及任何标题为“献词”的章节。您必须删除所有标题为“背书”的章节。


A.7. 文档集合

您可以创建一个集合,其中包含本文档和其他根据本许可证发布的文档,并将各个文档中本许可证的单独副本替换为集合中包含的单个副本,前提是您在所有其他方面都遵循本许可证关于逐字复制每个文档的规则。

您可以从这样的集合中提取单个文档,并根据本许可证单独分发,前提是您在提取的文档中插入本许可证的副本,并在关于逐字复制该文档的所有其他方面都遵循本许可证。


A.8. 与独立作品的聚合

本文档或其衍生作品与其他单独和独立的文档或作品在存储或分发介质的卷中的汇编,如果汇编产生的版权不用于限制汇编用户的合法权利超出各个作品允许的范围,则称为“聚合”。当本文档包含在聚合中时,本许可证不适用于聚合中本身不是本文档衍生作品的其他作品。

如果第 3 节的封面文本要求适用于本文档的这些副本,则如果本文档小于整个聚合的一半,则本文档的封面文本可以放在将本文档括在聚合内的封面上,或者如果本文档是电子形式,则放在封面的电子等效物上。否则,它们必须出现在括住整个聚合的印刷封面上。


A.9. 翻译

翻译被视为一种修改,因此您可以根据第 4 节的条款分发本文档的翻译版本。用翻译版本替换不变章节需要其版权持有者的特别许可,但您可以除了包含这些不变章节的原始版本外,还包含部分或全部不变章节的翻译版本。您可以包含本许可证的翻译版本,以及本文档中的所有许可证声明和任何保证免责声明,前提是您还包含本许可证的原始英文版本以及这些声明和免责声明的原始版本。如果本许可证的翻译版本与原始版本或声明或免责声明之间存在分歧,则以原始版本为准。

如果本文档中的章节标题为“致谢”、“献词”或“历史记录”,则保留其标题(第 4 节)的要求(第 1 节)通常需要更改实际标题。


A.10. 终止

除非本许可证明确规定,否则您不得复制、修改、再许可或分发本文档。任何其他复制、修改、再许可或分发本文档的尝试均无效,并将自动终止您在本许可证下的权利。但是,根据本许可证从您处收到副本或权利的各方,只要这些各方保持完全合规,其许可证就不会终止。


A.11. 本许可证的未来修订

自由软件基金会可能会不时发布 GNU 自由文档许可证的新修订版本。此类新版本在精神上将与当前版本相似,但在细节上可能有所不同,以解决新的问题或疑虑。请参阅 https://gnu.ac.cn/copyleft/。

许可证的每个版本都给出了一个可区分的版本号。如果本文档指定本许可证的特定编号版本“或任何后续版本”适用于它,您可以选择遵循该指定版本或自由软件基金会已发布的任何后续版本(非草案)的条款和条件。如果本文档未指定本许可证的版本号,您可以选择自由软件基金会曾经发布的任何版本(非草案)。


A.12. 附录:如何在您的文档中使用本许可证

要在您撰写的文档中使用本许可证,请在文档中包含本许可证的副本,并将以下版权和许可证声明放在扉页之后:

版权所有 (c) 年份 您的姓名。 允许根据 GNU 自由文档许可证 1.2 版或自由软件基金会发布的任何后续版本的条款复制、分发和/或修改本文档;不包含不变章节、封面文本和封底文本。 许可证副本包含在标题为“GNU 自由文档许可证”的章节中。

如果您有不变章节、封面文本和封底文本,请将“with...Texts.”行替换为以下内容:

不变章节为“列出其标题”,封面文本为“列出”,封底文本为“列出”。

如果您有不变章节但没有封面文本,或者这三者的其他组合,请合并这两种备选方案以适应具体情况。

如果您的文档包含程序代码的非平凡示例,我们建议根据您选择的自由软件许可证(例如 GNU 通用公共许可证)并行发布这些示例,以允许在自由软件中使用它们。