Peer-to-Peer Protocols" href="http://ssben.damnprettypinkpussy.com/feed//concerts/and.htm" />
Peer-to-Peer
Protocols
Peer-to-Peer
Protocols由一台主机发给其他机器的,最基本的序列是HELLO,用于声明它在网络上存在。 HELLO的接收者返回PING,确认那台主机确实可达。 PING的接收者返回PONG,确认可接收。
随后,任何一方发送给另一方一个加密了SETKEY的PING消息,启动一个连接。 接收者用另一个SETKEY确认,其中包含新的PING,已及和先收到的PING对应的PONG应答。 同样,这个PING以加密的PONG回答。 如果没有收到PONG,任意一方可以发送另一个SETKEY和PING。 如果在短时间内收到重复的SETKEY,密钥不应更换。 这个序列和启动TCP的三次握手非常相似。
下图表示一种可能的消息序列:
节点随后交换特定应用消息。 必须用NOISE使各分组大小一致。 MTU决定于传输层,并在HELLO消息中广告。 任何节点都可以用HANGUP终止连接。 长时间(约15分钟)不活动连接也被认为是终止连接。 HANGUP既不需要确认也不是必需的,但行为规范的节点都应实现它。
GNUnet主机之间交换的分组可以包含任意数目的消息(仅受制于传输层MTU大小)。
除加密消息外,GNUnet核心也是用附加信息扩展每个消息。 GNUnet核心添加校验和、带宽限制信息和序列信息,以避免重复处理消息。 加密、解密、校验由GNUnet核心完成,应用程序和传输代码都不需要关心这些。 由GNUnet核心给每个消息添加的消息头的格式如下:
| GNUNET_TransportPacket_HEADER | ||||
|---|---|---|---|---|
| 偏移 | 比特(bit)位 | |||
| 0-7 | 8-15 | 16-23 | 24-31 | |
| 0 | 纯文本的散列值(SHA-512) | |||
| 64 | 序列好,0代表纯文本(11) | |||
| 68 | 时间戳(秒)(NBO) | |||
| 72 | 带宽限制(字节每分钟)(NBO) | |||
头后面紧跟各个消息。 再次说明,发送者标识也必须传送,以便核心可以选择正确的密钥解密。 然而,如何做随不同的传输层而不同。
HELLO分组用于参与节点通过GNUnet广播信息。 每个GNUnet节点通过它的公钥K标识。 通过GNUnet,节点的公钥一般简化为K的散列值,简称为H(K)。
HELLO分组是节点传播其他节点公钥的方法。 此外,节点的标识和地址是绑定的。 如何定义地址依赖于底层所使用的传输机制。 例如,UDP服务使用IP和UDP端口号。 SMTP传输实现可能选择使用电子邮件地址。 GNUnet可以有多个地址,并且可以在任何时候切换地址,例如,如果IP是动态设定的,象DHCP或拨号的情况。 HELLO消息用于通知其他主机地址的改变。
安全考虑 恶意节点可能通过虚假地址干扰GNUnet。 在节点续传其他节点的HELLO消息时,恶意节点可以用无效地址替换原始节点地址。 为防止这种情况,HELLO消息的地址部分必须使用私钥签名。 为阻止恶意节点续传过时的地址,HELLO消息的签名部分也要包含时间辍,以声明HELLOd的有效期。 节点的管理员可以定义HELLO的有效期;管理员是判断地址有效期的最佳人选。
另外的安全问题在于那些主机使用非参与机器发送有效的、签名的HELLO消息。 这种攻击可以用流量淹没非参与主机(使GNUnet陷入执行攻击的境地),也因为接收者依赖于HELLO,使其很难在地址的海洋中找到有效的GNUnet主机。 GNUnet防止这种攻击的办法是发送PING到可信的主机,并且只信任接收到PONG的HELLO。 因此,恶意主机发送假冒HELLO将不会诱使GNUnet试图不断连接非参与节点。
接收者必须验证HELLO的签名,并检查HELLO没有过期。
节点应该删除已经失效很长时间的HELLO。
失效不久的HELLO可以属于重现的节点。
GNUnet节点可以试着连接这些节点,但它们的HELLO不应该再广播。
在没有建立加密连接的情况下,HELLO 可以发送到主机(以明文)。
这是需要的, 因为HELLO和SETKEY
rDamn Damn Pretty Concerts And GNUnet Documentation: The
Peer-to-Peer
Protocolsx t Pink
eDamn Damn Pretty Concerts And GNUnet Documentation: The
Peer-to-Peer
Protocolsf Pussy Damn Pink