Как распределить розетки в квартире


Как разместить розетки и выключатели в квартире правильно и удобно

Наверх Перепланировки
  • Каталог домов
Рассылка С чего начать ремонт О проекте Реклама Контакты Facebook Vkontakte Odnoklassniki Instagram Pinterest Дизайн и декор
  • Квартира
  • Спальня
  • Кухня
  • Столовая
  • Гостиная
  • Ванная комната, санузел
  • Прихожая
  • Детская
  • Мансарда
  • Маленькие комнаты
  • Рабочее место
  • Гардеробная
  • Библиотека

c - Следует ли использовать несколько приемных сокетов для приема большого количества подключений?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Как закодировать клиент сокетов на основе epoll на C

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.Конфигурация распределенного коммутатора VMware

: пошаговое руководство

Блог NAKIVO> Администрирование и резервное копирование VMware> Распределенный коммутатор VMware: что, почему и как

11 ноября 2019

по Майкл Бозе

Виртуальный коммутатор - это программный аналог физического коммутатора, предназначенный для подключения виртуальных сетевых контроллеров виртуальной машины к сетям на втором уровне модели OSI.VSwitch - это виртуальный коммутатор, предоставляемый VMware для своих решений виртуализации. Стандартный виртуальный коммутатор - полезная функция, но в больших виртуальных средах виртуальные коммутаторы на каждом хосте ESXi обычно имеют идентичную конфигурацию vSwitch (группы портов, VLAN, подключенные сети и т. Д.). Однако, если вам нужно добавить новую группу портов, связанную с VLAN, для подключения виртуальных машин, работающих на хостах ESXi, к этой VLAN, вам потребуется настроить vSwitch на каждом хосте ESXi одинаково и выполнить настройку вручную, что может занять много времени.VMware учитывает эту ситуацию и разрабатывает распределенный виртуальный коммутатор, который можно настроить на vCenter Server один раз, без необходимости настраивать стандартные vSwitches на каждом хосте ESXi вручную. Сегодняшняя запись в блоге посвящена распределенному виртуальному коммутатору VMware, который также называется dvSwitch или VDS. Это сообщение в блоге состоит из следующих частей:

  • Что такое распределенный виртуальный коммутатор в vSphere?
  • Функции VDS, отсутствующие в стандартном коммутаторе vSwitch
  • Требования
  • Конфигурация распределенного коммутатора VMware
  • Создание распределенного коммутатора VMware
  • Добавление хостов ESXi к распределенному коммутатору VMware
  • Добавление адаптеров VMkernel
  • Проверка конфигурации VDS

Даже если вы используете кластеры и распределенные виртуальные коммутаторы, не забудьте выполнить резервное копирование виртуальных машин.NAKIVO Backup & Replication может помочь вам защитить все ваши данные, включая виртуальные машины и физические серверы. Получите базовую версию NAKIVO Backup & Replication и защитите свои бизнес-данные и приложения в течение всего года по специальной цене 99 долларов за сокет.

Что такое распределенный виртуальный коммутатор в vSphere?

Виртуальный коммутатор, во многом похожий на физический коммутатор, обеспечивает подключение к сети уровня 2. Распределенный виртуальный коммутатор - это логический коммутатор, который создается на vCenter Server и применяется ко всем хостам ESXi, добавленным к распределенному виртуальному коммутатору.Распределенный виртуальный коммутатор похож на шаблон, хранящийся в vCenter. Когда вы создаете распределенный виртуальный коммутатор в vCenter, идентичные скрытые стандартные vSwitches создаются на всех хостах ESXi, добавленных в конфигурацию VDS. Если вы создаете группу портов для VLAN на распределенном виртуальном коммутаторе, такая же группа портов будет создана на всех vSwitches хостов ESXi, связанных с этим VDS. Вам нужно создать группу портов только один раз, что является значительным преимуществом. Распределенный виртуальный коммутатор, созданный в vCenter, является плоскостью управления (используется для управления), а скрытые стандартные vSwitches на хостах ESXi - это плоскость ввода-вывода (отвечающая за работу сети).

После выполнения миграции виртуальной машины с одного хоста ESXi на другой виртуальная машина остается подключенной к тому же порту распределенного виртуального коммутатора (также называемого сетевым vMotion, который сохраняет согласованность сетевых подключений виртуальных машин). vCenter - это система управления средой vSphere, включая распределенный виртуальный коммутатор. Если по какой-либо причине vCenter Server недоступен, вы не сможете изменить конфигурацию распределенного коммутатора VMware, включая переподключение виртуальных машин к другим группам портов.Однако даже если vCenter отключен, сеть останется в рабочем состоянии, поскольку за работу сети отвечают скрытые стандартные vSwitches (плоскость ввода-вывода). Помните, что vCenter нельзя подключить к распределенному виртуальному коммутатору.

Конфигурация VDS находится на vCenter Server, и каждые пять минут локальная копия сохраняется на серверах ESXi по мере обновления кеша. Кэшированная конфигурация хранится в каталоге / usr / lib / vmware / bin / на хостах ESXi.

Функции VDS, отсутствующие в стандартном коммутаторе vSwitch

Давайте посмотрим на список функций, которые доступны только для распределенного виртуального коммутатора и недоступны для стандартного vSwitch.

  • Управление вводом-выводом сети: формирование входящего трафика, резервирование полосы пропускания.
  • Зеркальное отображение портов: позволяет отправлять копии фреймов, обнаруженных на каком-либо порту виртуального коммутатора, на указанный порт другого коммутатора для мониторинга, анализа трафика и отладки.
  • Проверка работоспособности сети: Конфигурация, такая как настройки VLAN, MTU, объединение сетевых адаптеров, по умолчанию проверяется каждую минуту.
  • Поддержка протоколов: Private VLAN (PVLAN), Link Aggregation Control Protocol (LACP), NetFlow, Link Layer Discovery Protocol (LLDP).
  • Блокировка порта виртуальной машины: эта функция может использоваться в целях безопасности и позволяет блокировать отправку или получение данных на выбранном порте.
  • Network vMotion: сохраняет подключение виртуального сетевого адаптера виртуальной машины к тому же порту распределенного коммутатора VMware.
  • vNetwork switch API: предоставляет интерфейсы для реализации сторонних виртуальных коммутаторов.
  • Резервное копирование и восстановление конфигурации сети.

Требования

Распределенная коммутация VMware доступна только при использовании лицензии vSphere Enterprise Plus для хостов ESXi в vSphere. Если вы используете бесплатную пробную лицензию, все функции vSphere, включая распределенный виртуальный коммутатор, доступны в течение 60-дневного периода. Бесплатная версия ESXi не позволяет использовать распределенный виртуальный коммутатор.Подробнее о лицензировании vSphere в читайте в блоге .

Обратите внимание, что центр обработки данных должен существовать в инвентаре vCenter.

Конфигурация распределенного коммутатора VMware

Давайте рассмотрим, как создать и настроить распределенный коммутатор VMware в VMware vSphere 6.7. В нашем примере используется vCenter 6.7, а два хоста ESXi версии 6.7 управляются vCenter:

.

ESXi1 - 192.168.101.207 (IP-адрес интерфейса управления)

ESXi2 - 192.168.101.208

vCenter - 192.168.101.103

Шаг 1. Создание распределенного коммутатора VMware

Чтобы создать распределенный виртуальный коммутатор, откройте VMware HTML5 vSphere Client и перейдите в раздел Hosts and Clusters . Хосты ESXi должны находиться в центре обработки данных, который является логической организационной единицей в vCenter. В текущем примере хосты ESXi принадлежат Datacenter1 . Щелкните правой кнопкой мыши центр обработки данных и в контекстном меню выберите «Распределенный коммутатор »> «Новый распределенный коммутатор ».

Откроется мастер создания распределенного коммутатора.

1. Название и местонахождение . Укажите имя и расположение распределенного коммутатора. В этом примере имя - DSwitch01 , а расположение - Datacenter1 (поскольку мы щелкнули Datacenter1 , чтобы создать распределенный коммутатор VMware). Для продолжения нажимайте Далее на каждом шаге мастера.

2. Выберите версию . Для этого шага необходимо указать версию распределенного виртуального коммутатора.Поскольку все хосты, используемые в этом примере, работают под управлением ESXi 6.7, необходимо использовать последнюю версию распределенного коммутатора VMware (6.6.0). Если хотя бы один хост работает под управлением ESXi 6.0, вы должны использовать распределенный виртуальный коммутатор версии 6.0.0 для всех хостов (должна быть выбрана самая низкая версия). Функции, которые были выпущены с виртуальным коммутатором 6.5 и более поздних версий, не поддерживаются, если выбран распределенный виртуальный коммутатор версии 6.0.0. Старые версии обратно совместимы с новыми. Если возможно, попробуйте обновить свои хосты ESXi более старых версий до самой высокой версии хоста ESXi, используемой в вашей среде.

3. Настройте параметры . Укажите количество портов для восходящих каналов, установите Network I / O Control и отметьте Create a default port group checkbox to create the default port group. Введите имя группы портов, например, DPortGroup01 .

4. Готово к завершению . Проверьте свои настройки для нового виртуального распределенного коммутатора VMware и, если все в порядке, нажмите Finish , чтобы создать коммутатор.

Теперь распределенный виртуальный коммутатор создан. Вы можете перейти в Networking> Your datacenter> VM Network и увидеть свой распределенный виртуальный коммутатор (в данном случае DSwitch01 ). Выберите свой VDS и перейдите на вкладку Configure , чтобы изменить конфигурацию распределенного коммутатора VMware.

Шаг 2. Добавление хостов ESXi к распределенному коммутатору VMware

После создания распределенного виртуального коммутатора необходимо добавить хосты ESXi в конфигурацию VDS, чтобы распределенная коммутация VMware работала.В разделе Networking щелкните правой кнопкой мыши распределенный коммутатор VMware и в контекстном меню выберите Добавить и управлять хостами .

Откроется мастер Добавить и управлять хостами .

1. Выберите задачу . Поскольку вам нужно добавить хосты, выберите Добавить хосты (первый вариант).

2. Выберите хосты . Нажмите кнопку New hosts (кнопка со значком зеленого плюса), чтобы добавить хосты ESXi.

Во всплывающем окне установите флажки и выберите хосты ESXi, которые должны быть задействованы при распределенной коммутации VMware. Нажмите OK , чтобы применить ваш выбор. Проверьте совместимость в последнем столбце.

Хосты ESXi теперь выбраны, и их статус - «Подключен».

3. Управление физическими адаптерами . Вы можете выбрать необходимые физические сетевые адаптеры (контроллеры сетевого интерфейса - сетевые адаптеры) и назначить им восходящие каналы.На скриншоте ниже также отображается стандартный виртуальный коммутатор, созданный на каждом хосте ESXi после установки ESXi по умолчанию ( vSwitch0 ).

4. Управление адаптерами VMkernel . На этом этапе вы можете назначить адаптеры VMkernel распределенному коммутатору. Вы можете видеть, что vmk0 - это адаптер VMkernel по умолчанию, который используется стандартным (по умолчанию) vSwitch каждого хоста ESXi в качестве сетевого интерфейса управления. В этом примере адаптеры vmk0 VMkernel остаются подключенными к vSwitch0 на каждом хосте.

5. Перенести виртуальную машину в сеть . Если вам нужно перенести виртуальные машины или другие сетевые адаптеры на распределенный виртуальный коммутатор, вы можете сделать это на этом этапе. В текущем примере сетевые адаптеры не переносятся на VDS.

6. Готово к завершению . Просмотрите свою конфигурацию и, если нечего менять, нажмите Finish .

Теперь хосты ESXi добавлены в конфигурацию распределенного коммутатора VMware.Вы можете добавить сетевые адаптеры VMkernel в группу портов распределенного виртуального коммутатора для использования различных функций, например vMotion. Давайте добавим адаптер VMkernel в группу портов, которая будет использоваться для подключения к vMotion.

Шаг 3 - Добавление адаптеров VMkernel

В разделе Network vCenter выберите распределенный коммутатор VMware и группу портов (в данном случае DPortGroup01 ). Щелкните правой кнопкой мыши имя группы портов и в контекстном меню выберите Добавить адаптеры VMkernel .

Откроется мастер Add VMkernel Adapters .

1. Выберите хосты . Нажмите кнопку Attached hosts (кнопка со значком зеленого плюса), чтобы выбрать хосты ESXi.

2. Настройте адаптер VMkernel . Вы можете изменить MTU для группы портов с 1500 до 9000 байтов для использования Jumbo-кадров. По умолчанию значение MTU наследуется из настроек распределенного виртуального коммутатора. Выберите доступные службы, такие как vMotion, Provisioning, Fault Tolerance logging или Management.Выберем vMotion.

3. Настройки IPv4 . На этом шаге вы должны установить IP-адреса для адаптеров VMkernel хостов ESXi. Для серверов обычно рекомендуется использовать статические IP-адреса. В текущем примере новая конфигурация VMkernel следующая:

ESXi1 (192.168.101.207) - 192.168.105.207

ESXi2 (192.168.101.208) - 192.168.105.208

Последний октет остается прежним для дополнительного удобства.

Сеть vMotion будет 192.168.105.0 / 24

Шлюз 192.168.105.1 соответственно.

4. Готово к завершению . Проверьте свою конфигурацию и нажмите Finish , если все в порядке.

Шаг 4 - Проверка конфигурации VDS

После настройки адаптеров VMkernel выберите распределенный коммутатор VMware, перейдите к Configure> Settings> Topology и просмотрите графическое представление топологии VDS.

Как вы помните, распределенный виртуальный коммутатор можно рассматривать как шаблон, применяемый ко всем хостам ESXi, добавленным в конфигурацию VDS.Вы можете проверить конфигурацию виртуальных коммутаторов на каждом хосте ESXi после создания и настройки распределенного виртуального коммутатора в vCenter. Давайте откроем клиент хоста VMware и проверим конфигурацию сети первого хоста ESXi (192.168.101.207).

На скриншоте ниже видно, что новый виртуальный коммутатор и группа портов уже созданы (в навигаторе перейдите в раздел Networking и выберите вкладку Port groups ). После этого выберите имя вашего распределенного виртуального коммутатора и посмотрите топологию.Графическое изображение топологии идентично изображению топологии VDS, показанному выше.

Если вы войдете на второй хост ESXi (192.168.101.208 в нашем примере) с помощью клиента хоста VMware, вы увидите идентичную схему топологии.

Вы можете экспортировать и импортировать конфигурацию распределенного коммутатора VMware, что сэкономит ваше время и позволит быстро восстановить конфигурацию VDS. Для экспорта конфигурации VDS выберите распределенный виртуальный коммутатор, нажмите Действия > Настройки> Экспорт конфигурации .В том же меню вы можете найти опцию Restore Configuration .

В дополнение к основным параметрам, описанным выше, вы можете изменить конфигурацию VDS и настроить агрегацию каналов, включить формирование трафика, выбрать протокол обнаружения, установить VLAN, привязку портов, распределение портов для групп портов и так далее. Также возможен переход со стандартных виртуальных коммутаторов, используемых на хостах ESXi, на распределенный коммутатор. Такой подход позволяет централизованно управлять всеми виртуальными коммутаторами в vSphere.

Заключение

Сегодняшний блог посвящен тому, что такое распределенный коммутатор в VMware vSphere. Распределенный коммутатор VMware предоставляет единый интерфейс для централизованного управления виртуальными коммутаторами на всех хостах ESXi, связанных с этим распределенным виртуальным коммутатором. Конфигурация распределенного коммутатора VMware похожа на шаблон, который применяется ко всем узлам ESXi, и аналогичные стандартные виртуальные коммутаторы создаются на этих узлах ESXi автоматически. Конфигурация VDS, которую вы редактируете в vCenter, представляет собой плоскость управления, а виртуальные коммутаторы, созданные на хостах ESXi, являются плоскостью ввода-вывода, которая реагирует на работу сети.Использование распределенных виртуальных коммутаторов удобно для больших виртуальных сред и кластеров vSphere, но не забывайте, что требуется лицензия vSphere Enterprise Plus.

Представляем распределенный коммутатор VMware: что, почему и как

4,9 (97,14%) 7 голосов .

Знакомство с Network.framework: современная альтернатива сокетам - WWDC 2018 - Видео

Скачать

Доброе утро.

Меня зовут Джош Грэссли, и я очень рад быть здесь сегодня утром, чтобы рассказать вам о Network.framework.

Network.framework - современная альтернатива розеткам.

Сегодня мы поговорим о модернизации транспортных API. Это поможет вам понять, что такое Network.framework, как он вписывается в систему и подходит ли это вашему приложению.

Мы познакомим вас с API, проведя вас через создание ваших первых подключений.

Мы поговорим о том, как вы можете использовать этот API, чтобы действительно оптимизировать передачу данных и выйти за рамки производительности всего, что вы можете делать с сокетами.

Мы поговорим о том, как этот API может помочь вам справиться с некоторыми сложными проблемами мобильности, и мы завершим информацию о том, как вы можете принять участие и начать внедрение.

Во-первых, я хотел бы поговорить немного о модернизации транспортных API.

Теперь, когда я говорю о транспортном API, я говорю о любом API, который позволяет отправлять и получать произвольные данные между двумя конечными точками в сети, и это довольно широкое определение, и есть много API, которые могут подпадать под это категория.

Пожалуй, самые распространенные - это розетки. Сокеты существуют в нас более 30 лет, и я не думаю, что будет преувеличением сказать, что сокеты изменили мир, но мир продолжает меняться.

И, как следствие, использовать сокеты для написания приложений для современного Интернета действительно сложно.

Есть три основных области, в которых очень трудно правильно использовать розетки.

Первый - установление соединения.

Существует целый ряд причин, по которым установка соединений с помощью сокетов может быть действительно сложной.

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

Я знаю, потому что у нас есть.

Как только вы преодолеете проблемы хоста с двойным стеком, вы столкнетесь с целым рядом других проблем.

В некоторых сетях используется так называемая автоматическая конфигурация прокси или PAC.

В этих сетях есть JavaScript, который вы получаете, и вы должны передать URL-адрес в JavaScript, а JavaScript запускается и выдает ответ, в котором говорится, что вы можете пойти напрямую или вам нужно использовать этот прокси-сервер SOCKS здесь или прокси-сервер HTTP-подключения.

И теперь ваше приложение должно поддерживать прокси-серверы SOCKS и прокси-серверы HTTP-соединения, и это может быть действительно сложно.

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

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

Это может стать настоящим испытанием.

Так что подключиться к розеткам действительно сложно.

Вторая проблема с сокетами - это передача данных.

Есть много причин, по которым передача данных с помощью сокетов может быть действительно сложной.

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

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

Когда вы используете неблокирующий режим, вы можете сказать ядру, что мне нужно 100 байт, и ядро ​​вернется и скажет: у меня есть 10 байт для вас, почему бы вам не вернуться позже.

И теперь вам нужно построить конечный автомат, чтобы отслеживать, сколько байтов вы читаете по сравнению с тем, сколько байтов вы хотите прочитать.

Это может потребовать много работы, и добиться ее хорошей работы может быть настоящей проблемой.

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

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

Здесь есть много действительно сложных вещей.

Наконец, мобильность с розетками может стать серьезной проблемой по разным причинам.

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

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

Sockets не поможет вам в этом.

Вы можете использовать сокеты маршрутизации, но это действительно очень сложно.

Мы считаем, что транспортный API должен работать лучше.

К счастью, на нашей платформе у вас как у разработчика приложений есть отличный API в URLSession.

URLSession решает все эти проблемы за вас.

Он действительно ориентирован на HTTP, но также имеет потоковую задачу, которая дает вам прямой доступ к соединениям TCP и TLS.

Теперь вы, возможно, смотрите на это, и, возможно, вы не обманули, посмотрев описание в приложении WWDC.

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

Но оказывается, что это не так. URLSession построен на основе того, что мы называем Network.framework.

URLSession действительно фокусируется на всех битах HTTP и разгружает большую часть транспортных функций в Network.framework.

Network.framework - это то, над чем мы работали в течение ряда лет, и, поддерживая URLSession, мы многому научились и многие из этих уроков перенесли в IETF.Некоторые наши инженеры регулярно участвуют в IETF и встречаются с инженерами из других компаний, и они обсуждали многое из того, что мы узнали в рабочей группе по транспортным услугам.

И в ходе этих обсуждений мы получили отличные отзывы, мы вернули их и улучшили Network.framework на их основе.

Мы очень рады объявить в этом году, что ваши приложения могут использовать преимущества этой же библиотеки прямо сейчас.

Теперь мы знаем, что одна из вещей, которые людям нравятся в сокетах, это то, что они дают им очень точный контроль практически над всем, и они действительно не хотят отказываться от этого.Поэтому, когда мы разрабатывали Network.framework, мы хотели убедиться, что он по умолчанию работает правильно так же, как сокеты, но он дает вам все ручки, которые делают сокеты.

У него есть градиент, поэтому чем больше ручек вы поворачиваете, тем сложнее становится.

Он дает вам всю необходимую мощность, но вам не нужно платить за сложность, если она вам действительно не нужна.

Network.framework имеет невероятно умное соединение.

Подходит для ящиков с двойным стеком.Он обрабатывает только сети IPv6. Он обрабатывает PAC. Он обрабатывает прокси.

Это поможет вам подключиться к сетям, с которыми иначе очень трудно справиться.

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

Имеет поддержку встроенной безопасности.

По умолчанию поддерживает TLS и DTLS.

Пользоваться очень просто.

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

Он доступен на iOS, macOS и tvOS как CAPI с автоматическим подсчетом ссылок, поэтому его легко использовать с Objective C, и он имеет невероятный Swift API.

На этом я хотел бы передать слово Томми Поли, чтобы он помог вам установить ваше первое соединение.

Спасибо.

Хорошо, всем привет.

Меня зовут Томми Поли, я работаю в группе по работе с сетями в Apple.

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

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

Но вам может быть интересно, какие соединения подходят для использования с Network.framework.

Каковы варианты использования? Итак, давайте сначала рассмотрим некоторые сценарии приложений, которые могут использовать сокеты сегодня и действительно выиграют от использования сети.рамки в будущем.

Итак, первое, что я хочу выделить, - это игровые приложения.

Игровые приложения часто используют UDP для передачи в реальном времени данных о состоянии игры между одним устройством и другим.

И они действительно заботятся об оптимизации задержки и обеспечении отсутствия задержек или чего-либо еще.

Если у вас есть подобное приложение, вам понравится, как Network.framework позволяет вам действительно оптимизировать ваш UDP, отправляя и получая его быстрее, чем когда-либо прежде, с минимальной возможной задержкой.

Другой тип приложений, в которых будет много преимуществ Network.framework, - это приложения для потоковой передачи в реальном времени.

Таким образом, для потоковой передачи в реальном времени в своих приложениях часто используется комбинация UDP и TCP, но ключевым моментом здесь является то, что они генерируют данные на лету. Если у вас есть новые видеокадры или звуковые кадры, вам необходимо убедиться, что они имеют хороший темп, и вы не подвергаетесь большой буферизации на устройстве или в сети.

Асинхронная модель для чтения и записи в сети.framework идеально подойдет для уменьшения этой буферизации.

И последний случай, который я хочу выделить, - это приложения для почты и обмена сообщениями.

Таким образом, они будут использовать гораздо более традиционные протоколы, только TLS поверх TCP.

Однако для таких приложений очень важно правильно обрабатывать сетевые переходы.

Часто, если у вас есть приложение для обмена сообщениями, ваш пользователь будет использовать ваше приложение, когда выходят из здания, отправляя текстовое сообщение своему другу, чтобы сообщить ему, что он уже в пути.

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

И это всего лишь три примера типов приложений, которые могут использовать такие низкоуровневые сети, как это.

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

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

У вас есть порт, к которому вы хотите подключиться, порт 993, и вы хотите использовать TLS, а также TCP. Так как же это будет выглядеть традиционно в сокетах? Что-то вроде этого для начала.

Вы бы взяли имя вашего хоста.

Вы должны вызвать некоторый DNS API для разрешения этого имени хоста.

Допустим, это getaddrinfo.

Вы получите обратно один или несколько адресов.

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

Вы вызовете сокет с соответствующим семейством адресов.

Вы зададите несколько вариантов розетки.

Допустим, вы хотите сделать свой сокет неблокирующим, как упоминал ранее Джош.

Затем вы вызываете connect для запуска TCP, а затем ждете доступного для записи события.

И это до того, как вы начнете что-либо делать с TLS, и это еще целый ряд других проблем.

Так как это выглядит в Network.framework? И мы надеемся, что он вам кажется очень знакомым, но немного проще.

Итак, первое, что вы делаете, это создаете объект подключения.

А объект подключения основан на двух вещах.

У вас есть конечная точка, которая определяет пункт назначения, к которому вы хотите добраться, и это может быть адрес, IP-адрес, который у вас был раньше, но обычно, как в этом примере, у нас есть имя хоста и порт, и так что нашей конечной точкой может быть просто имя хоста и порт.

Это также может быть сервис Bonjour, к которому я хочу подключиться.

А еще у меня есть параметры.

Параметры определяют, какие протоколы я хочу использовать, TLS, DTLS, UDP, TCP. Он определяет параметры протокола, которые мне нужны, а также пути, которые я хочу использовать для подключения.

Я хочу просто подключиться через что-нибудь или я хочу использовать только Wi-Fi? После того, как вы настроили свое соединение, вы просто вызываете start, чтобы начать работу, а затем ждете, пока соединение перейдет в состояние готовности.

И это все, что вам нужно сделать, чтобы установить полное TLS-соединение с вашим сервером.

И я думаю, вам понравится, как это выглядит в Swift.

Итак, вот что вы делаете.

Сначала вы импортируете сетевой модуль.

Затем вы создаете объект NWConnection.

Итак, соединение NWConnection в Swift или C является фундаментальным объектом для чтения и записи данных.

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

Это изображения. Так что я могу очень легко поместить это в Swift, но я также могу поместить туда любой другой числовой литерал.

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

Это может быть так же просто, как просто написать точечный TLS, и теперь у меня есть полноценное TLS-соединение.

Следующее, что я делаю, это указание обработчику обновления состояния для обработки всех переходов, через которые может пройти мое соединение.

Первое и самое важное состояние, которое вы хотите обработать, - это состояние готовности.

Готово означает, что ваше приложение готово к чтению и записи данных по этому соединению, оно полностью установлено, и если вы используете TCP и TLS, это означает, что рукопожатие TLS завершено.

Мы также сообщаем вам о состоянии ожидания.

Итак, в прошлом году в URLSession мы ввели ожидание подключения, и состояние ожидания NWConnection точно такое же.

И это всегда по умолчанию.

Итак, когда вы создаете свое соединение и когда вы его запускаете, если сеть недоступна, мы не потерпим неудачу, мы просто сообщим вам, что ждем, когда сеть станет доступной. Мы дадим вам полезный код причины, но вам не нужно больше ничего делать, чтобы самостоятельно отслеживать переходы в сети.

Мобильность - важная, важная часть этого API.

И мы также сообщим вам, если произойдет фатальная ошибка. Допустим, нам пришлось выполнить сброс с сервера или произошел сбой TLS, и мы сообщим вам это как событие сбоя.

Итак, как только вы это настроите, вы просто вызываете start и предоставляете очередь отправки, по которой вы хотите получать обратные вызовы. Итак, я хочу разобраться, что происходит, когда вы вызываете start. Что на самом деле происходит? Итак, вот небольшая машина состояний, внутренности NWConnection. Когда мы начинаем с состояния настройки и вызываем start, мы переходим в состояние подготовки.

Таким образом, состояние подготовки делает гораздо больше, чем просто вызывает соединение через сокет TCP.

Для сокета TCP, это просто отправит SYN-пакет на сервер, с которым вы пытаетесь связаться.

Но когда вы вызываете start для NWConnection, он фактически обрабатывает все то, о чем Джош упоминал ранее.

Он оценивает сеть, в которой вы находитесь, и пытается сделать для вас максимально быстрое соединение. Я хочу углубиться в это немного подробнее.

Итак, это то, что мы называем установлением интеллектуального соединения.

Итак, первое, что мы делаем, когда вы вызываете start, это то, что мы берем вашу конечную точку, а затем оцениваем, какие все сети в настоящее время доступны мне.

В данном случае у нас есть Wi-Fi и сотовая связь.

И, как правило, мы предпочитаем сеть Wi-Fi, потому что она дешевле для пользователя.

Итак, мы сначала рассмотрим это.

Затем проверяем, есть ли какие-то особые конфигурации в этой сети.

Есть ли VPN? Прокси есть? И мы оценим это для вас.

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

Итак, мы оценим оба этих варианта.

Мы проверим, нужно ли нам использовать прокси, подключимся к нему, создадим там TCP-соединение.

Но если нам это не нужно, мы сделаем DNS от вашего имени напрямую, вернем все ответы на IP-адреса DNS и подключимся к ним один за другим, оставив их работать параллельно. Мы участвуем в гонках, чтобы обеспечить вам максимально быстрое соединение.

А затем, если что-то пойдет не так с Wi-Fi, скажем, качество Wi-Fi радио станет очень плохим, потому что вы уходите от здания, мы действительно можем воспользоваться функцией, называемой поддержкой WiFi, и плавно вернуться к сотовой сети , выполните там разрешение DNS и попробуйте подключения одно за другим.Таким образом, ваше соединение будет очень устойчивым, обрабатывает VPN, обрабатывает прокси-серверы и обеспечивает наилучшее возможное соединение. Теперь, конечно, вы можете не захотеть пробовать все эти варианты. Возможно, вы захотите ограничить действия, выполняемые при установлении соединения, и поэтому у нас есть много разных регуляторов и элементов управления, которые позволяют вам это делать, и сегодня я хочу выделить только три из них.

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

Таким образом, в параметрах вашего соединения есть опции для управления интерфейсами, которые вы используете.

Так что, если вы не хотите использовать сотовую связь, просто добавьте сотовую связь в список запрещенных типов интерфейсов.

Еще лучше вообще запретить дорогие сети, потому что это, скажем, также заблокирует использование личных точек доступа на Mac.

Другой способ ограничить установление соединения - это выбрать конкретное семейство IP-адресов, которое вы хотите использовать.

Итак, допустим, вам действительно нравится IPv6, потому что он быстрее и за ним будущее.

Вы вообще не хотите использовать IPv4 в своем соединении.

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

И это повлияет на ваше соединение, а также на разрешение DNS.

И, наконец, вы можете не захотеть использовать прокси для данного соединения. Возможно, ваше соединение не подходит для использования через прокси-сервер SOCKS.

В этом случае вы можете просто запретить использование прокси.

Вот что происходит в состоянии подготовки.

Я уже говорил, что что-то может пойти не так. У вас может не быть сети, когда вы пытаетесь установить, и что мы сделаем после подготовки, это если мы обнаружим, что нет хороших вариантов, сбой DNS, не было сети, возможно, вы находитесь в режиме полета, мы перейти в состояние ожидания и сообщить причину этого.

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

В конце концов, надеюсь, ваше соединение будет установлено.

На этом этапе мы перейдем в состояние готовности.

И состояние готовности, как я упоминал ранее, - это когда ваше соединение полностью установлено.Это все протоколы в вашем стеке, например, вплоть до TLS.

На этом этапе вы можете читать и писать, и здесь мы также даем вам обратные вызовы о сетевых переходах, через которые вы проходите.

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

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

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

Спасибо, Томми.

Я Эрик Киннер, тоже из сетевой группы здесь, в Apple, и я очень рад создать вместе с вами пример приложения, использующего сеть.фреймворк.

Мы собираемся использовать пример потоковой передачи в реальном времени, упомянутый ранее Томми, для создания приложения, которое может принимать входные данные камеры на одном устройстве и отправлять их по сети для отображения на другом устройстве.

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

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

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

Мы просто возьмем необработанные байты с камеры, отправим их по сети и отобразим на другой стороне.

Чтобы это произошло, нам нужно разделить эти кадры на более мелкие части, которые мы можем отправлять в UDP-пакетах.

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

Оттуда мы просто отменяем предыдущий процесс, повторно собирая видеокадры и отправляя их на дисплей, чтобы мы могли видеть их на экране.

Для простоты мы уже абстрагировались от камеры и функций дисплея, чтобы сосредоточиться только на тех частях, которые используют Network.framework.

Есть одна вещь, которую мы здесь еще не рассмотрели, и это слушатель.

Итак, мы займемся этим сейчас.

Функциональность прослушивателя обеспечивается классом NWListener, который можно создать, используя те же объекты параметров, которые вы использовали для настройки соединений.

Настроить слушателя для рекламы службы Bonjour очень просто.

В этом случае мы будем использовать camera.udp. Когда слушатель получает новое соединение, он передает это соединение блоку, который вы предоставляете как newConnectionHandler.

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

Итак, слушатели.

Если задуматься, мы только что реализовали эквивалент вызова listen на сокете UDP.

За исключением того, что прослушивание фактически не работает с сокетами UDP. Теперь мы готовы создать наше приложение в Xcode.

Итак, у нас есть наше приложение и куча файлов, которые уже обрабатывают камеру и функции отображения, поэтому мы собираемся сосредоточиться только на классе UDPClient и классе UDPServer.

UDPClient будет отвечать за создание соединения с другой стороной и отправку кадров.

Точно так же сервер отвечает за создание приемника, прием входящих подключений, чтение данных из этих подключений и отправку их на экран.

Начнем с клиента. У моего клиентского класса есть инициализатор, который принимает имя, которое представляет собой строку, описывающую имя bonjour, к которому мы хотим подключиться. Я создам свое соединение, просто вызвав NWConnection и передав конечную точку службы.

Используя имя, которое мне предоставили, и камеру.udp как тип. Мы также передали параметры UDP по умолчанию.

Как упоминал Томми, мы можем использовать обработчик обновления состояния для проверки состояния готовности и отказа.

Здесь, когда наше соединение будет готово, мы вызовем sendInitialFrame, который мы реализуем через минуту. Поскольку мы используем UDP и нет другого рукопожатия, мы собираемся взять некоторые данные и отправить их по сети на другое устройство и дождаться, пока они отозвутся эхом, прежде чем мы начнем генерировать множество видеокадров и сбрасывать их. в сети.

Нам нужно не забыть вызвать start в нашем соединении, и мы предоставляем очередь, которую создали выше. Реализуем отправку исходного кадра.

Здесь мы возьмем буквальные байты hello и создадим с их помощью объект данных. Чтобы отправить контент по соединению, мы можем вызвать connection.send и предоставить этот объект данных в качестве контента.

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

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

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

Когда эти кадры сгенерированы, остальная часть приложения знает, что нужно вызвать send в нашем классе UDPClient и передать ему массив объектов данных, представляющих видеокадры, которые мы пытаемся отправить. Поскольку мы собираемся выполнять множество операций отправки в очень быстрой последовательности, мы собираемся выполнить их в блоке, который мы передали в связи.партия. В этом блоке мы собираемся просмотреть каждый кадр в этом массиве объектов данных и передать каждый из них в connection.send.

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

Вот и все.

У нас есть класс UDPClient, и мы готовы к работе. Посмотрим на сервер.

На стороне сервера нам нужен слушатель, который может принимать входящие соединения.

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

Начиная со слушателя, мы просто создаем NWListener, используя параметры UDP по умолчанию.

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

Но поскольку мы используем сервис Bonjour, нам этого делать не нужно.

Чтобы настроить эту службу, я собираюсь установить в свойстве службы прослушивателя объект службы типа camera.udp.

Обратите внимание, что я не передаю здесь имя, потому что хочу, чтобы система предоставила мне имя устройства по умолчанию.

Я также предоставляю блок для serviceRegistration UpdateHandler, который будет вызываться в любое время при изменении набора конечных точек, объявленных системой.

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

Я собираюсь установить новый обработчик соединения для слушателя, который будет вызываться каждый раз, когда слушатель получит новое входящее соединение.Я мог бы выполнить некоторую конфигурацию этих подключений, но настройки по умолчанию здесь подходят, поэтому я просто вызываю connection.start и передаю его в очередь. Здесь я уведомляю остальную часть приложения о том, что я получил входящее соединение, чтобы оно могло начать нагревать конвейер отображения и подготовиться к отображению видеокадров.

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

Мне нужно не забыть запустить мой слушатель, что я делаю, вызывая listener.start и передавая ему ту очередь, которую мы создали выше.

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

Здесь мы начинаем с вызова connection.receive и передачи его в обработчик завершения.

Когда данные поступают через это соединение, мы увидим, не подключились ли мы.

Если бы мы не были подключены, вероятно, это то рукопожатие, которое клиент начинает с отправки.Мы просто повернемся направо и вызовем connection.send, передав тот же контент обратно, чтобы он был передан клиенту.

Затем мы вспоминаем, что мы подключены, и при всех последующих полученных обратных вызовах мы просто сообщаем остальной части приложения, что мы получили этот кадр, и оно должно отправить его в конвейер отображения, чтобы мы могли его увидеть на экран. Наконец, если ошибок не было, мы снова вызываем прием, чтобы получать последующие кадры и отправлять их на дисплей, чтобы объединить видео для каждого из этих отдельных изображений.

Вот и все. У нас есть UDPClient, у нас есть UDPServer, давайте попробуем.

Я собираюсь запустить клиент на моем телефоне здесь, и я собираюсь запустить сервер на моем Mac, чтобы мы могли видеть его на большом экране.

Здесь только что появился сервер, и мы видим, что он рекламируется как Demo Mac, где я сказал остальной части системы просто дать мне имя.

Это у меня на телефоне. Если я нажму «Подключиться», я внезапно вижу видеокадры, передаваемые по сети через UDP Live.

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

На стороне сервера запущен прослушиватель Bonjour.

Он анонсировал службу, он принимал входящие соединения, отвечал на рукопожатие и отправлял их все на дисплей, чтобы мы могли их видеть.

А теперь, чтобы подробнее рассказать вам об оптимизации передачи данных, я хотел бы снова пригласить Томми на сцену.

Спасибо, Эрик.

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

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

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

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

Но в этом случае давайте поговорим о том, когда мы отправляем его через поток TCP, поток TCP, который может создавать резервные копии в сети, у которого есть определенное окно, которое он может отправлять.

Итак, как нам с этим справиться? Итак, вот функция для отправки одного кадра.

.

Смотрите также