• Каким образом узлы в p2p сетях обходят NAT?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, конечно, возможно.

    Часть сети имеет внешние IP и позволяет прямой коннект к ним. При простейшей реализации p2p коннект возможен только между участниками при условии наличия у одного из них внешнего IP. Если узел А хочет установить коннект с узлом Б без внешнего IP (с закрытым портом и прочее, то что в ed2k называлось LowId, в DC - passive mode - и всё такое подобное), то надо, чтобы Б получил информацию об А и установил с ним коннект сам.

    Например, в ed2k клиент с полноценным внешним IP и возможностью коннекта к нему получает HighId, одинаковый на всех серверах, а неполноценный клиент получает непостоянный уникальный в пределах сервера LowId. Чтобы установить коннект между собой, клиенты А и Б должны находиться на одном сервере, а дальше А просит сервер передать Б просьбу установить коннект. Совсем бессерверно (используя DHT) ed2k может работать только с HighId-клиентами.

    В некоторых сетях также поддерживается передача через посредников, в этом случае можно устроить обмен данными между любыми участниками сети. Иногда даже посредники обязательны, чтобы исключить прямую передачу данных и тем самым замаскировать реальные адреса участников сети.

    Самая большая проблема для децентрализованных сетей - это bootstrap при первом запуске, необходимость найти хотя бы одного участника сети, чтобы узнать адреса других. Для этого обычно бывает какой-то сервер с источником начального списка нод, который пользователь прописывает руками или который опрашивается при первом запуске автоматически.
    Ответ написан
    1 комментарий
  • Как присвоить переменной название ключа словаря в python?

    @zexer
    Если как вы говорите, вы заранее не знаете ключи словаря, то можно получить их таким образом.
    d = {'A': 1, 'B': 2}
    d_iterable = iter(d.keys())
    a = next(d_iterable)
    b = next(d_iterable)
    print(a, b)
    A B

    Еще можно сделать так:
    d = {'A': 1, 'B': 2}
    d_iterable = list(d.keys())
    print(d_iterable)
    ['A', 'B']
    Ответ написан
    2 комментария