文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

Cjdns是什么?

想象一下在一个互联网中每个包从源地址到目的地址被加密保护来对抗间谍和伪造,得到一个IP地址和生成一个密钥一样简单,核心的路由转移数据没有一个单独的内存可以查询,拒绝服务成为一个在历史书上读到的词语。最后,成为ISP不再受强大的电信限制,任何人可以通过管理一些线路或打开一个无线设备来实现。

这就是cjdns的愿景。

为什么需要Cjdns?

互联网建立在协议之上可以回溯到上世纪80年代或更早的时候。在一个无政府主义的学者和专家通过网络展示ITU开放标准关系时,它完全够了。然而随着时间的推移,网络变得越来越大,用户发现了新的需求。

第 1 段(可获 1.75 积分)

在包检查普遍存在的时代,安全缺失是司空见惯的事,加密完整性和机密性需求越来越明显。美国政府意识到了这种需求,一直在突破 IPSEC和 DNSSEC做出努力。

另一个因素是我们如何在一个全球的路由表世界里跟踪一个包,这个表太大任何一个路由器无法保存所有的内容。尽管核心网络引擎的英雄主义影响,全球路由表的成长看起来是在不断前进。Cisco路由器公司提出了一个计划叫做定位器/标识分离协议(LISP), LISP的目标是通过重新聚焦到路由表解决这个问题而不用强制人们改变他们以前的IP地址。对于这个问题,一个不同的看法是IP 地址分配,目前它由一个分配IP地址的中心机构完成,通过这种方式来尽可能减小路由表的规模。不幸的是这产生了一个通向ISP入口的障碍,因为有抱负的网络操作者必须在中心机构注册并且申请一个IP地址分配,同时证明IP地址不会被浪费。如果你已经有了一个网络,通常能更轻易的表明你需要IP地址。

第 2 段(可获 2.63 积分)

在不断扩大的网络中,拒绝服务,试图阻止合法用户连接服务1,同样是一个新的问题。据我所知,拒绝服务攻击没有普遍的解决方案。基于拒绝服务的包泛洪的解决方法通常是把服务托管到许多电脑上这样他们就可以处理大量的流量。

最后,现有的协议不易于使用,我们不能合理的分配职责给使用协议的人,这些协议大多数超过了三十年,展示出了一个我希望有一天能实现的技术层次。然而, 它花费三十年的代价让我们更好的使用,随着互联网的发展,变得更加复杂,典型路由器的管理员接口变成了一系列旋钮,按钮和开关来满足使用场景和失败模式的扩张。因此,网络操作成为一门学科,学生们了解许多旋钮和开发的使用方式之后可以获得学位和证书,同时,也像赛车的改装一样,成为了一种技术,有大师也有学徒,在邮件列表上分享。我只是想说,进入ISP领域的入口门槛太高了。用户,尤其是专用的无线网络竞技场,察觉到了传统路由的高门槛,开发了一个可选择的菜单,比如 自我识别协议有OSLRHSLSBATMAN

第 3 段(可获 3.08 积分)

这些问题已经解决了吗?

上面列出的问题不是每一个都已经有解决方法,并且即使已经有的,许多解决方法都建立在不兼容的技术之上。比如:OSLR被设计不是用来与IPSEC和LISP协作。甚至即使解决方法存在并且已经准备好部署了,他们仍然需要大量的技术依赖,并且他们不能提供显著的即时收益给现有的ISP。

这种不匹配是相当荒谬的。一方面有学生,工程师,硬件、软件设计者总计超过1000年的经验。有数学公式,定理,论文和规范文档;写下来,流传,在同一时代被检验然后再有新的写下来。另一方面你只有单一的志愿开发人员,一个空白的白板和一种没有什么不可能的态度。除非疯了,否则怎么会这样呢?

第 4 段(可获 1.69 积分)

在革命时代,过时的规范只会打垮你。

cjdns建立在现有的ISP和托管服务提供商不再以任何有意义的方式升级的想法之上,不是LISP,不是DNSSEC,甚至不是IPv6。建立新的系统和旧系统兼容来迎合大众是不可能的。要求现有的ISP为了公共利益而升级就是在要求他们承担没有即时利益的风险。cjdns正在抛弃这种规范,用另一种方式重新定义规范,这种规范将会是快速的, 安全的,最重要的是,下一代ISP易于部署和使用。

第 5 段(可获 1.41 积分)

什么是拒绝服务?

从大量受感染的“僵尸”机器向主机发送大量不需要的包,服务的使用会被打断。这被称为DDoS,一个每年都在恶化的问题,随着所有被感染结点在互联网上的上传速度和任何给定链接的下载速度成比例的增加。被病毒感染参与DDOS,对于受感染机器的所有者来说,尽管不是一件轻松的事,但也不是一个紧急事件。对于他们的ISP来说也不是一个紧急事件。DDOS通常是“他们的问题”...直到它袭击了你的网络。令人难过的是,数据中心通常的反应是停止加载有争议的内容,使DDOS成为了一个有效的审查工具并且鼓励实行。

第 6 段(可获 1.64 积分)

拒绝服务的另一种更阴险的方式是冒充法院威胁的恐吓行为。这种拒绝服务的方式尤其有效,由于大多数人从他们的ISP那里得到了他们的IP地址,当他们的ISP受到威胁的时候,为了索赔的有效性,他们需要拨打审判电话,他们(犯罪分子)通常扮演为法官和陪审团,分隔开一个客户为了避免冲突。那些有分配给他们们自己的IP地址的人,基本上可以做他们自己的ISP,与许多其他的ISP同等,这使得恐吓除他们以外的任何人非常困难。

第 7 段(可获 1.36 积分)

什么是路由表?为什么它一直在变大?

互联网的另一个技术问题,一个许多人都没有意识到的问题,是地址空间解聚簇。每一台电脑需要一个地址来连接到互联网,地址是用来识别它的一串唯一的数字,附加到每条被发送到另一台台电脑的数据上。沿着它在互联网上的经过的每一站,包(数据单元)有它自己的地址文件,它会被路由器检查来决定包接下来被发往哪条线路。如果地址都在一个大的区块内这样路由器会更轻松,这样路由器可以快速查看地址里的第一部分数字来识别地址,比如,一个地址肯定是在中国的某地,虽然不准确但是足够知道发往哪条线路。人们当然想在尽可能小的区块内得到尽可能多的地址,这样他们就可以独立地控制(买入或卖出)这些区块。已经公布的地址区块越小,路由表就变得越大,为了向正确的方向发送一个包互联网核心路由器的工作就越多。有人试图重新聚集地址成为组但是收效甚微,全球路由表里的小公告的数量每年都在增加。

第 8 段(可获 3.05 积分)

为了处理不断扩大的路由表,Cisco提出了一个新的协议叫做定位器/标识分离协议(LISP), LISP的想法是从路由器使用的地址中分离出人们使用的地址,就像一个低版本的DNS。LISP允许外围ISP和用户看到他们想看到的互联网,由于政治原因被分解成小碎片,允许路由器看到它想看到的互联网,从任意中心结点发出的集中的分层的地址金字塔。由于它们的设计是为了用全球唯一的地址来获取包同时在表里查找地址,所以这种设计在现有的路由器中运行的很好。这是大家熟知的一个设计特色但是LISP在它的发展愿景中是受限的,如果有人在追踪一个包之前必须查找服务器“真实的定位”,为什么不查找最快的路径?

第 9 段(可获 1.9 积分)

我不在乎,是他们的问题

这些问题中每一个都是公共问题的悲剧。感染病毒的计算机用户被鼓励省钱而不是购买一个产品或服务使他们的计算机摆脱感染。尽管有解决方案比如出口过滤可以减少这种问题 ,但是ISP被鼓励实施的时候尽可能少的考虑安全因为他们不直接受影响。拒绝服务,不管是由包泛洪引起还是由伪造的合法行为引起,都会使能隐藏真相的攻击者或危害服务的提供者受益,包括提供DoS相关服务的组织也会受益。受害者除了经常发布消息满足揭露真相的需求,只能遭受这种攻击的危害,他们是最不可能阻止攻击的人。地址空间解聚有利于在网络组织方面可以有更大灵活性的边缘ISP,但是以核心ISP为代价,他们只通过“我们不经过它”来防御,这无疑会带来边缘ISP的反抗。

第 10 段(可获 2.46 积分)

这些问题使每一方都受到伤害。由于每次控诉必须回顾,对它的有效性评估,DDoS迫使ISP超额配置他们的线路,拒绝服务通过伪造的合法行为增加运营社区网站或ISP的成本,地址空间解聚意味着每个人必须在他们的包路由上花费更多使他们的包通过增强的大功率路由器, 操作一个路由器和得到一个IP区块的困难损害了ISP之间的竞争,导致价格持续增长,阻碍进步。

Cjdns如何工作?

Cjdns是由三个主要的组件相互交织而成的。有一个交换机,一个路由器,和一个CryptoAuth模块。完全忽视OSI七层模型,每个模块内在依靠于其他模块。路由器不经过由交换机构成的小世界不能工作,交换机没有路由器的指令是盲目的,没有路由器和交换机, CryptoAuth没有什么需要保护的

第 11 段(可获 2.05 积分)

交换机

他不考虑他的行为;他们从他的核心流出。

交换机的设计不像IP或以太路由器,它不需要知道网络中全球唯一的终端。像ATM交换,包头部在每一跳会改变,在反向路径上的终端或任何节点能推导出,但是与ATM不同,交换机不需要存储激活的连接,没有连接建立。

定义

  • 接口(Interface): 到另一个cjdns交换机的点对点连接。 这可以由以太网帧,UDP包或其他手段来模拟。

  • 自接口(Self Interface): 每个交换机中的特殊接口,向此接口发送的数据包适用于此交换机所属的节点。数据包在到达其路径中的最终跳时,通过自接口,使其可以由节点的下一层来处理。

  • 导引(Director): 任意大小的二进制字节码,当由交换机接收时,指示包发送给给定接口。

  • 路由标签(Route Label):描述网络中的路径的一组有序的导引。

  • 编码方案(Encoding Scheme): 交换机将其内部接口ID(例如:数组索引)之一转换为导引并将导引转换回其内部表示的方法。 编码方案可以是固定宽度或可变宽度,但是在可变宽度的情况下,宽度必须是自描述的,因为导引在路由标签中连接而没有任何种类的边界标记。

  • 编码形式(Encoding Form): 用于编码导引的单一表示形式。 对于给定的编码形式,只有一种可能的方式来表示给定接口的导引。 可变宽度编码方案将具有多个编码形式,而固定宽度编码方案只有一个。

  • 导引前缀(Director Prefix):对于使用可变宽度编码的交换机,导引的最低有效位称为引导前缀,用于确定引导的宽度。 注意由于路由标签从最低有效位读到最高有效位,因此,引导前缀实际上是导引右侧最远的位。

第 12 段(可获 4.73 积分)

操作

当一个数据包进入交换机时,交换机使用其编码方案来读取路由标签的最低有效位,以便确定导引继续沿着路径发送包。 路由标签向右移位导引的位数,有效地删除导引,并显示路径中下一个交换机的导引。 在发送数据包之前,交换机使用其编码方案来创建一个导引表示数据包的来源,对该导引进行按位取反,并将其放置在路由标签左侧先前移位空出的空间中 。 以这种方式,交换机构建返回标签的镜像,允许终端或沿着路径的任何跳通过简单的逐位取反来推导出返回路径,而不需要知道其他任何节点使用的编码方案。

第 13 段(可获 2.06 积分)

实例

假设Alice想发送一个包给Fred,途中经过Bob, Charlie, Dave 和Elinor,她会发送一条的信息给她的交换机,这条消息带有第一个导引引导她的交换机发送她的接口给Bob。第二个导引引导Bob的交换机发送给Charlie,依此类推。

注意: 位之间的空格仅用于说明,路由标签在导引之间没有边界标记,交换机不知道导引占用多少位,除非这个导引是他自己的。

在进入交换机之前,Alice的原始路由标签:

0000000000000000000000000 0001 101011 011010 100101101 10111 0100011
^^^-- unused space --^^^^                                    ^^^^^^^-- Alice's Director Interface(Alice->Bob).
第 14 段(可获 1.16 积分)

到达Bob时的路由标签:

1000000 0000000000000000000000000 0001 101011 011010 100101101 10111
^^^^^^^                                                        ^^^^^-- Bob's Director for Interface(Bob->Charlie).
      ^-- Alice's Director for her Self Interface (reversed)

到达Charlie时的路由标签:

11001 1000000 0000000000000000000000000 0001 101011 011010 100101101
^^^^^ ^^^^^^^                                              ^^^^^^^^^-- Charlie's Director for Interface(Charlie->Dave).
  ^^^       ^-- Alice's Director for her Self Interface (reversed)
    ^-- Bob's Director for Interface(Bob->Alice), bit-reversed.
第 15 段(可获 0.15 积分)

到达Dave时的路由标签:

110110011 11001 1000000 0000000000000000000000000 0001 101011 011010
^^^^^^^^^ ^^^^^ ^^^^^^^                                       ^^^^^^-- Dave's Director for Interface(Dave->Elinor).
   ^^^^^^   ^^^       ^-- Alice's Director for her Self Interface (reversed)
      ^^^     ^-- Bob's Director for Interface(Bob->Alice) (reversed).
        ^-- Charlie Director for Interface(Charlie->Bob) (reversed).

假设Dave不能转发数据包,需要发送一个错误,他不知道Charlie的导引在哪里结束和Bob的导引在哪里开始,所以他不能把他们重新排序,但是因为他们是按位取反,所以他可以通过将整个路由标签按位取反颠倒他们的顺序。

第 16 段(可获 0.69 积分)

按位取反后的路由标签:

010110 110101 1000 0000000000000000000000000 0000001 10011 110011011
                                             ^^^^^^^ ^^^^^ ^^^^^^^^^-- Charlie's Director for Interface(Charlie->Bob).
                                                ^^^^ ^-- Bob's Director for Interface(Bob->Alice).
                                                   ^ Alice's Director for her Self Interface.

为了将其正确地转发到Bob,然后转发到Alice,Dave可以将包发送给Charlie,Charlie不需要知道它是什么。 如果数据包已经到达Fred,他可以使用对路由标签按位取反的相同技术来确定其来源。

第 17 段(可获 0.75 积分)

路由标签操作

尽管路由标签相对不透明,仍然有一些功能可以在标签上执行。

拼接

拼接操作使用一个从点A到点B的路由标签,将它与一个从点B到点C的标签连接,产生一个从点A到点C的路由标签。

拼接是通过将第二部分与1进行异或,并将其向左移动以2为底第一部分的对数,然后将结果与第一部分进行异或来完成的。

给定:

routeAB =        0000000000000000000000000000000000000000000001011101110101011001

routeBC =        0000000000000000000000000000000000000000000000000000110101010100
XOR 1            0000000000000000000000000000000000000000000000000000000000000001
equals           0000000000000000000000000000000000000000000000000000110101010101

shift left by the log base 2 of routeAB
                 0000000000000000000000000000000000110101010101000000000000000000
XOR  routeAB     0000000000000000000000000000000000000000000001011101110101011001
equals routeAC   0000000000000000000000000000000000110101010100011101110101011001
                                                              ^-- Note the overlap bit
第 18 段(可获 1.08 积分)

对数基数2表示从右开始的第一个设置位的索引。 这意味着通过对底数2移位使1位重叠,导致第一部分中的最高位被重写,这与第二部分(routeBC)与1的异或相关联。

逆拼接

拼接操作的逆操作将完整的路由标签转换为对路径上的节点有用的表示。 也就是说,从routeAC和routeAB派生出routeBC。

routeAC =        0000000000000000000000000000000000110101010100011101110101011001
routeAB =        0000000000000000000000000000000000000000000001011101110101011001

routeBC = routeAC shifted left by the log base 2 of routeAB

routeBC          0000000000000000000000000000000000000000000000000000110101010100
第 19 段(可获 1.09 积分)

路由通过

给定两个路由,可以确定一个路由是否是另一个的扩展,这类似于拼接操作的逆操作。 为了确定routeAC是否“路由通过”routeB的末端节点,只需删除routeAB中最重要的1,去掉routeAC的左侧部分,使两条路径长度相同,并比较结果。

routeAC =        0000000000000000000000000000000000110101010100011101110101011001

routeAB =        0000000000000000000000000000000000000000000001011101110101011001

Trimmed to the same length:

routeAC'         0000000000000000000000000000000000000000000000011101110101011001
routeAB'         0000000000000000000000000000000000000000000000011101110101011001
第 20 段(可获 0.89 积分)

结果表明routeAC“路由通过“routeAB末端的节点。

编码方案

因为交换机操作的条件可能不同,所以实际上编码方案是实现中的细节。一些交换机可能具有15个物理端口的设备,这时4位固定宽度编码方案是明智的,其他交换机可能在可到达的cjdns节点构成的无线网络中,因此接口的数量可以增加和减少。 这些设备可以优选可变宽度编码,以便节省标签空间而不需要牺牲可扩展性。然而,为了完成上述操作,对编码方法有一些限制。

 

第 21 段(可获 1.41 积分)

自接口导引

为了使路由标签能够拼接在一起,标签中的最高有效位必须始终为1,以便我们知道它在哪里结束。 由于每个路由以自接口结束,因此表示自接口的导引必须始终编码为具有3个或更多个前缀零的1。 此外,节点不得发送最高3位不为零的路由标签的数据包。 这很重要,可以使得路由器沿着路径的反向路由数据不会被误认为是额外的前向路由。

第 22 段(可获 1.26 积分)

最后,交换机应该将以0001结束的任何导引重命名为自接口导引。 例如:使用6位固定宽度编码方案的交换机必须将010001,100001和110001重命名为自接口导引000001。这样做的原因是因为不知情的路由器可能会使用标签的每个位的有效路径空间进行拼接,使得整个路由标签的最高有效三位为0001。在这种情况下,由第一个交换机添加的位将正好对应着自接口导引,而这可能被误认为是另一个前向导引。

第 23 段(可获 1.23 积分)

可变宽度编码

如果交换机使用可变宽度编码,很明显,一些接口将变为短的导引,而其他接口将被迫接受更长的导引。 不太明显的是当来自“小”接口的数据包发送到“大”接口时会发生什么。 交换机从大的导引移开,在左边留下一个大空间。 在该空间中只放置一个小导引将不起作用,因为在反向路由中会出现空间不足,这将导致沿着路径的下一个交换机处的故障。

第 24 段(可获 1.25 积分)

为了使它工作,小接口需要能用大的导引表示。 对于任何尺寸,所有较小的尺寸都需要能被表示。

在另一个方向,来自大接口只有一个小的相邻导引的数据包必须丢弃(返回错误),因为返回路由根本不能表示。 为了防止这个问题,当大接口的远端节点查询一个小接口后面的节点时,路由标签中的第一个导引必须在发送数据包之前由路由器转换为大接口的格式。

第 25 段(可获 1.36 积分)

对于可变宽度编码,一个更微妙的问题是,节点A到节点B之间的路由标签可能根据到达节点A的方式而不同。 这将是使用路径推断有效路由算法的严重障碍,因此需要节点(通过路由器间通信)描述其如何对数字进行编码。

编码方案定义

为了使路由器能够从连接节点的图中连接路径,同时仍然保持可变宽度编码,节点需要将其编码方案向其他节点描述并且遵守一些规则,使导引转换成其他节点更宽的位宽。

第 26 段(可获 1.44 积分)

编码方案定义包括在该编码方案中允许的大量编码形式,每个编码形式具有以下三个字段:

  • 前缀长度(prefixLen): 导引前缀的位数, 用5位整数表示。

  • 位数(bitCount): 导引的位数,不包括导引前缀, 用5位整数表示。

  • 前缀(prefix): 在此编码形式中使用的导引前缀,用与前缀长度一样多的位数来表示。 这个值必须与在标签中导引的前缀相同,但由于它是不透明的,因此不定义特定的字节顺序。

第 27 段(可获 1.58 积分)

编码方案定义在形式上表现为编码形式的串联。 每个窗体都以与上面给出的顺序相反的顺序表示,前缀在最左边,然后是位数,然后是最右边的前缀长度。 它以小端字节顺序发送,以允许数据在从最低有效位向最高有效位解包时,缓冲器能被读取和写入。

编码形式转换

只是告诉其他节点如何编码不足以推断出路径。 当路由器将用于不同节点之间路径的路由标签连接在一起时,他们需要改变路由标签中路由的编码形式,以避免形成反向路径不可表达的路由标签。

第 28 段(可获 1.65 积分)

需要允许的两种类型的改变是扩展和截断。 给定节点X和节点Y之间的路由,节点必须能够将节点X的广播形式之一改变为另一种来扩展该路由中的第一个导引。 其中包括更改导引前缀,然后通过在左侧添加零位来扩展第一个导引的非前缀部分。 截断恰恰相反,通过改变导引前缀并从左侧截去零位,可以将导引从更宽的形式转换为更窄的形式。

第 29 段(可获 1.26 积分)

为了保持与这些优化兼容,交换机必须忽略其导引中最高有效零位数量的改变,在多字节导引的情况下,这可能影响字节顺序。 显然,交换机实现者必须设计它们的编码方案,使得导引是明确并且不能与数据的最低有效位混淆,但由于这是成功交换机实现的要求,所以不言而喻。

存储表示

虽然交换机协议固有地连接到底层载体,但在交换层上面的协议中存在交换头部在存储器中如何表示的期望。

第 30 段(可获 1.43 积分)

路由标签文件不出意料地保存8字节的路由标签,类型字段表明数据包的类型。 保留的数据包类型对于不透明数据为0,对于交换控制消息为1(例如错误)。 优先级字段被保留用于表明服务质量,在当前实现方案中它始终为零。

路由器

路由器有3个功能,定期搜索,响应搜索,转发报文。 路由器响应搜索时,响应它认为更接近目的地的节点。 响应不能带有在地址空间距离上远离响应节点而不是搜索目标的地址,也不能带有以到查询节点的路由相同接口开始的路由。 这两个简单的规则规定,没有搜索将进入循环,没有路由进入一个接口,只有被反弹。 虽然第二个规则只能由系统强制执行,但查询节点必须仔细检查第一个规则。 执行搜索的节点将新发现的节点添加到其路由表和搜索中,然后通过询问它们来继续搜索。

第 31 段(可获 2.44 积分)

在接收到包含自己的地址的搜索响应时,节点应该清除以该路由开始的表中所有条目。 这可以控制冗余路由的扩散。

任何两个给定地址之间的“地址空间距离”被定义为两个地址异或后相对旋转64位的结果,又被解释为大端整数。 所谓的“XOR meitric”是 Kademlia DHT系统工作的驱动,用于将数据包转发给可能知道到达目的地的整个路由的人。 结果的64位旋转用于提高性能,其中地址的第一位固定以避免IPv6空间中的冲突。

第 32 段(可获 1.6 积分)

从搜索响应中将节点添加到路由表中是通过将路由拼接到在响应中的节点来完成的,这个节点通过到达节点的路由询问得到,从而产生到达最终目的地的路由。

路由器消息作为正常的UDP / IPv6数据包发送,除了它们的UDP源和目的地端口号为零,IPv6报头中的跳限制(TTL)字段也被设置为零。 满足这些特性的任何数据包被认为是路由器消息,反之,不满足的数据包则不是。 至关重要的是路由器间通信本身而不是路由,因为它会打破搜索响应的标签拼接。

第 33 段(可获 1.43 积分)

路由器间消息的内容是 bEncoded 字典。 路由器发送带有密钥“q”的搜索查询,回复不具有该密钥。 路由器应该回复一个带有“q”条目的消息,但是如果没有的话,就不要回复,以免他们应答回复消息。 所有消息都有一个事务id号和一个cookie,cookie由包含任意字节的字符串组成,必须在回复中反映出。 最常见的查询是查找节点或“fn”查询。 “fn”查询对于节点正在寻找的目标地址有一个叫做“tar”的字段。 “fn”查询的响应该有一个叫“n”的字段,“n”字段是一个二进制字符串,其中包含32字节公钥和用于响应的8字节交换标签。

第 34 段(可获 1.64 积分)

JSON格式的fn查询例子:

{
    "q":    "fn",
    "tar":  "abcdefghhijklmno",
    "txid": "12345"
}

同样的查询路由器使用bEncoded:

d1:q2:fn3:tar16:abcdefghhijklmno4:txid5:12345e

JSON格式的fn回复例子: 注意: 这里的回复只显示返回的2个节点,这是为了插图方便,大多数情况下这个数字大约是特定的常数8.

{
    "n": "cdefghijklmnopqrstuvwxyzabcdefghi1234567qponmlkjihgzyxwvutsrstuvwxyzabcde2345678"
    "txid": "12345"
}

同样的回复使用bEncoded:

d1:n80:cdefghijklmnopqrstuvwxyzabcdefghi1234567qponmlkjihgzyxwvutsrstuvwxyzabcde2345678e
第 35 段(可获 0.58 积分)

fn应答中的节点从最差到最好排序,所以最好的回复是应答中的最后一个条目。

路由器选择节点以类似于应答搜索查询的方式转发数据包。 除非是只包含一个节点的情况,否则它们会从路由表中选择节点。 数据包通过与该节点相对应的CryptoAuth会话发送,用于获得它的标签在发送到交换机之前应该用于该数据包。 用于转发数据包的“搜索目标”是该数据包中的IPv6目的地址。

第 36 段(可获 1.29 积分)

CryptoAuth模块

CryptoAuth是一种用于包装接口的机制,你给它提供接口和可选的密钥,它会为你提供一个允许你向拥有该密钥的人发送数据包的新的接口。 像cjdns的其余部分一样,它的设计是为了更好的数据传输。 CryptoAuth握手基于在常规数据包顶部的捎带确认头部,当握手数据包中的流量被加密和认证用于对抗重放攻击时,并不是安全的,如果私钥被泄露继续向前就没有了保密性。 CryptoAuth头部向数据包添加了120字节的开销,造成了波动的MTU。

第 37 段(可获 1.41 积分)

有5种类型的CryptoAuth头部:

  1. Connect To Me - 过去常常用来发起一个不知道另一个节点公钥的会话。
  2. Hello Packet - 会话开始的第一条信息.
  3. Key Packet - 一个会话的第二条信息.
  4. Data Packet - 一个正常的流量数据包.
  5. Authenticated - 具有Poly1305认证的数据包.

除了4字节的Data Packet头部和20字节的Authenticated 头部,其余所有的CryptoAuth头部都是120字节长。 任何一个CryptoAuth头部的前4个字节是一个大端序号,用于确定其类型,这就是所谓的“会话状态”号。 如果是负数,那么它是Connect To Me头部,如果是0,那么它是Hello Packet头部,如果是1或2,那么它是Hello Packet头部或重复的Hello Packet头部,如果是3或4,那么它是Key Packet头部或重复的Key Packet头部。 如果是一个大于4的数字,那么它是Data Packet 头部或Authenticated头部,这取决于在握手期间是否请求认证。

第 38 段(可获 2.34 积分)

握手数据包结构:

                      1               2               3
      0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   0 |                         Session State                         |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   4 |                                                               |
     +                                                               +
   8 |                         Auth Challenge                        |
     +                                                               +
  12 |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16 |                                                               |
     +                                                               +
  20 |                                                               |
     +                                                               +
  24 |                                                               |
     +                         Random Nonce                          +
  28 |                                                               |
     +                                                               +
  32 |                                                               |
     +                                                               +
  36 |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  40 |                                                               |
     +                                                               +
  44 |                                                               |
     +                                                               +
  48 |                                                               |
     +                                                               +
  52 |                                                               |
     +                     Permanent Public Key                      +
  56 |                                                               |
     +                                                               +
  60 |                                                               |
     +                                                               +
  64 |                                                               |
     +                                                               +
  68 |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  72 |                                                               |
     +                                                               +
  76 |                                                               |
     +                     Poly1305 Authenticator                    +
  80 |                                                               |
     +                                                               +
  84 |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  88 |                                                               |
     +                                                               +
  92 |                                                               |
     +                                                               +
  96 |                                                               |
     +                                                               +
 100 |                                                               |
     +          Encrypted/Authenticated Temporary Public Key         +
 104 |                                                               |
     +                                                               +
 108 |                                                               |
     +                                                               +
 112 |                                                               |
     +                                                               +
 116 |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     +        Variable Length Encrypted/Authenticated Content        +
     |                                                               |
第 39 段(可获 0.04 积分)

1) Connect To Me 数据包

如果“会话状态”为负数,则发送者正在请求接收者开始与他的连接,这是在连接的发起者不知道接收者密钥的情况下完成的。 如果整个头部不存在,则接收者必须丢弃数据包,在数据包中能读取的唯一字段是“永久公钥”字段,其他字段应当被忽略,换句话说,内容不能被传递,因为得不到验证。 如果没有建立连接,则数据包的接收者应当发送回“hello”数据包。 如果已经通过接口连接,收件人不应该响应,但允许连接超时更快。

第 40 段(可获 1.68 积分)

2) Hello Packet

如果“会话状态”字段为1或2,则该数据包为是Hello Packet或重复的Hello Packet。 如果连接不存在,可以建立一个连接,接收者可以发送作为响应的密钥数据包,但是建议接收者等待,直到他有数据发送。 发送Hello Packet的节点如果没有得到响应,而希望发送更多数据,必须通过更多(重复的)Hello Packet来发送该数据。 临时公钥和内容使用两个节点的永久公钥和头部中的“随机数”来加密和认证。 内容和临时密钥使用crypto_box_curve25519poly1305xsalsa20()函数进行加密和认证。

第 41 段(可获 1.61 积分)

3) Key Packet

如果“会话状态”字段为2或3,则数据包是Key Packet。 Key Packet对Hello Packets的响应,类似于Hello Packets,它们包含与数据一起被加密和认证的临时公钥。 一旦节点接收到Key Packet,就可以开始发送数据包。 已经接收到Hello Packet,但发送Key Packet的节点没有得到进一步的响应,而希望发送更多数据则必须通过更多(重复的)Key Packet发送该数据。

4) Data Packet

传统的Data Packet头部只有4个字节,这4个字节是用于构建密码的随机数,使用crypto_stream_salsa20_xor()函数对该数据包进行加密,转换为小端编码,将8字节的随机数复制到前四个字节需要用到 crypto_stream_salsa20_xor()函数,除非该节点是连接的发起者(hello packet 的发送者),在这种情况下,它被复制到空间的第二个四字节,从而允许单个会话处理 2 ^ 32个数据包。

第 42 段(可获 2.48 积分)

5) Authenticated Packet

如果在握手期间任一节点请求Poly1305身份验证,则发送Authenticated Packet。 与Data Packet一样,前4个字节用作随机数,在这种情况下,它是一个24字节的随机数,crypto_box_curve25519poly1305xsalsa20()用于加密和解密数据,方法是完全相同的。 如果一个数据包没有经过认证,它必须被丢弃。

ReplayProtector

启用数据包认证时,需要检查数据包来应对重放攻击(有意或无意),重放攻击的保护方法是使用32位偏移和32位位字段来创建滑动窗口。当数据包进入时,随机数与偏移进行比较,如果它小于偏移,则丢弃。如果从偏移中减去随机数,结果小于或等于32,则结果左移1位,与位字段进行逐位与运算,如果不为0,则数据包是重复的,丢弃。如果为零,与位字段进行或运算来实现同样的位设置,数据包继续传递。如果减法结果大于32,则从中减去32,将该结果加到偏移量,位字段左移相加后的结果,以设置位字段中的最低有效位。这显然只有在数据包经过验证并提供了免受重放攻击和意外数据复制(例如:来自802.11的噪音)的安全保护的情况下可用。

第 43 段(可获 3.34 积分)

这种解决方案是有限制的,因为超过32个“空隙”的数据包将被丢弃。 但在某些情况下,这是有益的,因为在全力运行的网络中,丢弃比超时更好。

Authentication 字段:

这个字段允许节点使用密码或其他共享密钥进行连接,AuthType 字段指定使用密钥进行连接的方式。

                   1               2               3
   0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 |   AuthType    |                                               |
  +-+-+-+-+-+-+-+-+        AuthType Specific                      +
4 |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8 |A|                      AuthType Specific                      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
第 44 段(可获 0.83 积分)

“A”标志用于告诉节点请求会话对其所有数据包使用Poly1305认证。 “AuthType Specific”字段用于指定身份验证类型。

AuthType Zero

AuthType Zero表示没有认证。 如果AuthType设置为零,则所有AuthType Specific字段将被忽略,并设置为随机数。

AuthType One

AuthType One是基于SHA-256的身份验证方法。

                   1               2               3
   0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 |   Auth Type   |                                               |
  +-+-+-+-+-+-+-+-+           Hash Code                           +
4 |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8 |A|        Derivations          |           Additional          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
第 45 段(可获 0.88 积分)

使用AuthType One,共享秘密(密码)进行一次哈希运算,结果被附加到curve25519密钥标量乘法的32字节输出中,这64字节被再次与SHA-256哈希进行一次哈希运算,生成的对称密钥用于会话。 AuthType One也会进行第二次次哈希运算,在设置AuthType字段之前将结果复制在认证头部的前8个字节。 效果是“Hash Code”字段包含2到8字节的密码哈希的哈希。 这个结果被用作用户名,以便另一端知道在握手中尝试使用哪个密码。

第 46 段(可获 1.44 积分)

如果Derivations字段非零,则包括附加步骤,密码散列的两个最高有效字节与Derivations字段的两个字节进行异或,在被包含在对称密钥的派生中之前再次使用SHA-256进行哈希运算。 值得注意的是,这种格式不用在Hash Code字段中。

这允许节点Alice向Charlie提供秘密,Charlie可以使用该秘密来与Bob开始CryptoAuth会话,而不会泄露Alice的共享秘密。 这允许节点通过可信连接生成,共享导出秘密,创建新的可信连接并使用它来共享更多的秘密,为在非对称密钥中发现的密码弱点增加了一定程度的前向保密性。

第 47 段(可获 1.6 积分)

组合到一起

数据包的旅程从用户接口设备(TUN或类似的)处开始。 用户发送一个进入TUN设备然后进入引擎的IPv6数据包,检查数据包确保其源地址和目的地址有效,然后在目的地址上查找路由。 cjdns地址是经过SHA-512计算的前16个字节的SHA-512运算结果。所有地址必须以0xFC开头,否则无效,直到得出0xFC开头的SHA-512计算结果后,密钥生成完成。

第 48 段(可获 1.33 积分)

在路由查找之后,节点将目的地址与下一个路由器的地址进行比较,如果它们相同,则跳过加密的内层。 如果它们不同,则将IPv6头部复制到安全的地方,并为目的地址选择CryptoAuth会话,如果没有则创建,通过会话传递报文内容。 IPv6头部被重新应用于内容的CryptoAuth头部之上,要注意的是,其中的数据包长度字段不改变以表达现在在它之下的头部。

第 49 段(可获 1.26 积分)

数据包现在准备发送到选定的路由器。 为了将数据包发送到路由器,沿着IPv6的头部,路由器的地址和数据包选择CryptoAuth会话。 交换头被应用于所得到的加密结构,向下发送到交换机用于路由。

交换机获取数据包并将它发送到网络模块,该模块使用另一个CryptoAuth会话对来自交换机头部的数据包进行加密和认证。 所得到的数据被封装在网络数据包中,被发送到下一个节点处的交换机。

第 50 段(可获 1.33 积分)

接收到数据包时,下一个节点通过CryptoAuth会话发送数据包,从而露出交换机头部,并将数据包发送到交换机。 交换机根据数据包标签的规定将数据包发送到另一个节点,也可以将其发送到路由器,最终数据包所针对的节点会接收它。

路由器在接收到数据包时检查数据包来确定是不是CryptoAuth的Connect To Me packet, Hello packet 或者 Key packet。 如果是其中之一,将插入从头部的公钥中导出的IPv6地址到哈希表中,以便通过交换机标签查找。否则它将执行查找操作。 如果地址在它的哈希表中找不到,它会尝试询问路由器是否知道一个节点有该标签,如果上述全部失败,该数据包将被丢弃。

第 51 段(可获 2.08 积分)

在IPv6地址中查找CryptoAuth会话或必要时创建一个会话,然后通过CryptoAuth会话传递不透明数据来获取解密的IPv6头部。

如果数据包的源地址与其来源的路由器公开密钥的SHA-512运算结果相同,则假设它没有内层加密,并且被原样写入TUN设备。 如果源地址不同,则通过基于源IPv6地址选择的CryptoAuth会话将其返回。 然后将IPv6头部向上移动以满足内容要求(进入CryptoAuth头部的位置),最终将数据包写出到TUN设备。

第 52 段(可获 1.61 积分)

文章评论