Как многоадресная передача UDP ведет себя на Unix?

    Debian 7.7 (Хрипящий)
      Fluxbox 1.3.2-4
      KeePass2 2.28
      , моно 2.10.8.1-8
      xdotool 2.20110530.1
      gnupg2 2.0.19-2+deb7u2

    , По моему опыту, версия 2.28 KeePass2 первая, чтобы сделать автотипный снимок в терминальная или не-gui программа на Debian. Я могу автоматически ввести в ssh или pinentry-проклятия из KeePass 2.28. Автоматический тип не работает с pinentry-gtk-2, когда я его тестирую. Я не использую icedove, так что не могу проверить это.

    -121--56458-

    Я бы предположил, что самая слабая ссылка здесь - код SSHFS - остальная часть материала находится в ядре и довольно сильно используется, так что, вероятно, это нормально. Я никогда раньше не смотрел на какой-либо код FUSE, так что может быть что-то еще, что я пропустил, но согласно SSHFS исходный код , реализация SSHFS fsync () не делает целую кучу, он просто вызывает flush () в потоке ввода-вывода.

    static int sshfs_fsync(const char *path, int isdatasync,
                           struct fuse_file_info *fi)
    {
        (void) isdatasync;
        return sshfs_flush(path, fi);
    }
    

    На sshfs.c: 2551 видно, что функция sshfs _ flush () не отправляет какую-либо команду синхронизации на удаленную машину, которая принудительно выполняет fsync. Я полагаю, что флаг sshfs.sync _ write означает «ждать, пока команды отправятся на сервер перед возвращением из записи», а не «fsync на сервере при каждой записи», потому что это второе значение будет очень странным. Таким образом, измерение fsync выполняется медленнее, поскольку оно ограничено скоростью сети, а не скорости удаленного диска.

    static int sshfs_flush(const char *path, struct fuse_file_info *fi)
    {
        int err;
        struct sshfs_file *sf = get_sshfs_file(fi);
        struct list_head write_reqs;
        struct list_head *curr_list;
    
        if (!sshfs_file_is_conn(sf))
            return -EIO;
    
        if (sshfs.sync_write)
            return 0;
    
        (void) path;
        pthread_mutex_lock(&sshfs.lock);
        if (!list_empty(&sf->write_reqs)) {
            curr_list = sf->write_reqs.prev;
            list_del(&sf->write_reqs);
            list_init(&sf->write_reqs);
            list_add(&write_reqs, curr_list);
            while (!list_empty(&write_reqs))
                pthread_cond_wait(&sf->write_finished, &sshfs.lock);
        }
        err = sf->write_error;
        sf->write_error = 0;
        pthread_mutex_unlock(&sshfs.lock);
        return err;
    }
    

    Обратите внимание, что возможно, что удаленная реализация SFTP действительно выполняет синхронизацию записи, но я думаю, что это не то, что происходит. Согласно старому проекту стандарта SFTP (который является лучшим, что я могу найти), существует способ указать такое поведение:

    7.9. attrib-bits and attrib-bits-valid
    ...
    SSH_FILEXFER_ATTR_FLAGS_SYNC
           When the file is modified, the changes are written synchronously
           to the disk.
    

    , который подразумевает, что это не по умолчанию (так как это быстрее, чтобы не fsync). В соответствии с этим документом по стандартам нет способа запроса fsync в удаленном файле, но похоже, OpenSSH поддерживает это как расширение для SFTP

    /* SSH2_FXP_EXTENDED submessages */
    struct sftp_handler extended_handlers[] = {
        ...
        { "fsync", "fsync@openssh.com", 0, process_extended_fsync, 1 },
        ...
    };
    
    static void
    process_extended_fsync(u_int32_t id)
    {
        int handle, fd, ret, status = SSH2_FX_OP_UNSUPPORTED;
    
        handle = get_handle();
        debug3("request %u: fsync (handle %u)", id, handle);
        verbose("fsync \"%s\"", handle_to_name(handle));
        if ((fd = handle_to_fd(handle)) < 0)
            status = SSH2_FX_NO_SUCH_FILE;
        else if (handle_is_ok(handle, HANDLE_FILE)) {
            ret = fsync(fd);
            status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
        }
        send_status(id, status);
    }
    

    Я сомневаюсь, что будет трудно запросить это расширение и правильно поддерживать fsync в SSHFS, что кажется довольно разумным. Тем не менее, я думаю, что будет проще просто использовать поддержку сетевых устройств Linux, которая, я полагаю, поддерживает все это правильно (хотя я никогда не использовал его сам, так что это может быть ужасно).

0
03.05.2015, 19:12
1 ответ

Он не работает, поскольку time является ключевым словом оболочки. Существуют внешние двоичные файлы времени , но они не установлены. Это, скорее всего, сработает:

nohup bash -c 'time sleep 2'
-121--30850-

Обычно я сталкиваюсь с ними, когда нахожусь в сети. Если вы используете Firefox или один из его сводных детей, я рекомендую для этого подключаемый модуль Docs Online Viewer . Рядом с любым типом документа, который он может обработать, появляется небольшой значок глазного яблока. Просто нажмите на глазное яблоко, чтобы просмотреть.

Он обрабатывает: «PDF, DOC, DOCX, XLS, PPT, RTF, ODT, ODS, ODP, CSV и многие другие форматы»

Есть версия Chrome, но я не использовал ее.

-121--36289-

Я считаю, что здесь путаница терминов на работе. Фактически, как IP-уровень, так и канальный уровень работают вместе для обеспечения работы многоадресной передачи.

Для IPv4 и IPv6 IP-адреса многоадресной передачи сопоставляются MAC-адресам многоадресной передачи канального уровня. Существуют выделенные MAC-адреса, предназначенные только для многоадресной передачи. Для IPv4 MAC-адрес имеет вид 01:00: 5e: xx: yy: zz и для IPv6 MAC-адрес имеет вид 33:33: ww: xx: yy: zz .

Кадры, адресованные этим MAC-адресам, по умолчанию передаются на все порты в VLAN ethernet-коммутаторами, но в качестве оптимизации коммутаторы могут реализовать отслеживание IGMP для ограничения того, какие порты принимают кадры на основе того, какие порты фактически подписаны на группу многоадресной передачи.

Когда хост начинает прослушивать группу многоадресной передачи, его уровень MAC Ethernet программируется так, чтобы пропускать кадры, адресованные соответствующему MAC-адресу. В противном случае аппаратные средства Ethernet отбрасывают эти кадры, если они не находятся в неразборчивом режиме.

Как только хост получает кадр многоадресной передачи, потому что коммутатор Ethernet переадресовал его и потому что MAC-уровень впустил его, IP-уровень просматривает IP-адрес и направляет пакет в соответствующий сокет.

Подробные сведения о выделенных MAC-адресах многоадресной передачи

Использование различных MAC-адресов для различных адресов многоадресной передачи позволяет хосту легко принимать только кадры Ethernet, связанные с группами многоадресной передачи, на которые подписан хост (что означает наличие по меньшей мере одного активного сокета на хосте, подписанном на эту группу). Остальные будут эффективно отброшены аппаратными средствами либо собственной микросхемой Ethernet хостов, либо коммутатором Ethernet в сети.

Существует больше групп многоадресной передачи, чем выделенных MAC-адресов, поэтому фактически многие IP-адреса многоадресной передачи сопоставляются с одним и тем же MAC-адресом. Это означает, что вышеупомянутая фильтрация не является совершенной: когда аппаратные средства сконфигурированы для разрешения одного MAC-адреса, это фактически позволяет в пакетах, адресованных группе IP-адресов многоадресной передачи. Тем не менее, аппаратное обеспечение выполняет большую часть задания фильтрации, поэтому оно достаточно эффективно.

Для IPv4 существует 268435456 IP-адреса многоадресной рассылки и только 8388608 MAC-адреса, поэтому сопоставление имеет значение 32-1 (1 MAC-адрес на 32 IP-адресов). См. RFC 1112 раздел 6.4 .

Для IPv6 существует gazillion IP-адресов многоадресной рассылки и только 4294967296 MAC-адреса, поэтому отображение является lots-to-1. См. RFC 2464 раздел 7 . Было бы неплохо сделать это отображение хотя бы немного ближе к 1-к-1, но сам размер IPv6 адресного пространства делает это невозможным. Я устно слышал историю много лет назад, что даже резервирование MAC-адресов на 32 бита уже давило на него. История гласит, что с точки зрения схемы распределения MAC-адресов IEEE (IEEE отвечает за назначение MAC-адресов), это количество MAC-адресов соответствует 256 назначениям OUI, и IEEE потребовал бы 256-кратную денежную плату за распределение OUI; вопрос о том, чтобы IETF выплатил такую сумму денег IEEE, так что IETF вместо этого выбрал явно неиспользуемый блок нужного размера и выравнивания и приседал его.

4
28.01.2020, 02:20

Теги

Похожие вопросы