网络泛洪

鸟巢仅仅可以邻居通信的事实,极大地减少了这个网络的实用性。

为了将信息广播到整个网络,一种解决方案是设置一种自动转发给邻居的请求。 然后这些邻居转发给它们的邻居,直到整个网络收到这个消息。

  1. import {everywhere} from "./crow-tech";
  2. everywhere(nest => {
  3. nest.state.gossip = [];
  4. });
  5. function sendGossip(nest, message, exceptFor = null) {
  6. nest.state.gossip.push(message);
  7. for (let neighbor of nest.neighbors) {
  8. if (neighbor == exceptFor) continue;
  9. request(nest, neighbor, "gossip", message);
  10. }
  11. }
  12. requestType("gossip", (nest, message, source) => {
  13. if (nest.state.gossip.includes(message)) return;
  14. console.log(`${nest.name} received gossip '${
  15. message}' from ${source}`);
  16. sendGossip(nest, message, source);
  17. });

为了避免永远在网络上发送相同的消息,每个鸟巢都保留一组已经看到的闲话字符串。 为了定义这个数组,我们使用everywhere函数(它在每个鸟巢上运行代码)向鸟巢的状态对象添加一个属性,这是我们将保存鸟巢局部状态的地方。

当一个鸟巢收到一个重复的闲话消息,它会忽略它。每个人都盲目重新发送这些消息时,这很可能发生。 但是当它收到一条新消息时,它会兴奋地告诉它的所有邻居,除了发送消息的那个邻居。

这将导致一条新的闲话通过网络传播,如在水中的墨水一样。 即使一些连接目前不工作,如果有一条通往指定鸟巢的替代路线,闲话将通过那里到达它。

这种网络通信方式称为泛洪 - 它用一条信息充满网络,直到所有节点都拥有它。

我们可以调用sendGossip看看村子里的消息流。

  1. sendGossip(bigOak, "Kids with airgun in the park");