Как сделать новую розетку


Как установить розетку: подробная инструкция с фото и видео

1. Приготовьте необходимые инструменты и материалы

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

  • розетка — с заземлением или без, в зависимости от проводки;
  • монтажная коробка (подрозетник), совместимая с новой розеткой и подходящая для установки к типу стены;
Слева подрозетник для сплошных стен (кирпич, бетон и газобетон), а справа — для полых (гипсокартон). Отличие последнего в прижимных ушках / leroymerlin.ru
  • индикатор напряжения (тестер) — для определения фазы;
  • крестообразная и плоская отвёртки — для монтажа;
  • нож — для зачистки проводов;
  • кусачки — для обрезки;
  • алебастр или гипс — для фиксации подрозетника в сплошной стене.

2. Снимите крышку старой розетки

moikolodets.ru

Если вы не меняете розетку, а устанавливаете новую — переходите к следующему разделу.

Отвёрткой с изолированной рукояткой выверните крепёжный винт, который находится по центру, и снимите крышку.

YouTube-канал «Электрик в доме»

Не забывайте, что контакты розетки находятся под напряжением! Не касайтесь их отвёрткой и действуйте с особой осторожностью.

3. Проверьте провода

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

YouTube-канал «Электрик в доме»

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

Внешний вид типичных проводов для розеток: тройной — с заземлением, двойной — без / remotvet.ru

Когда проводов три, подключать их нужно строго в соответствии с маркировкой. Назначение легко определить по цвету:

  • земля (PE или Protective Earth) — жёлто-зелёный или жёлтый;
  • ноль (N или Null) — синий;
  • фаза (L или Lead) — коричневый, красный или белый.

4. Отключите электричество

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

Флажки взведены и виден красный индикатор — автомат находится во включённом состоянии / ac220.ru

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

5. Демонтируйте старую розетку

electry.ru

Если вы не меняете розетку, а устанавливаете новую — переходите к следующему пункту.

Ещё раз убедитесь в отсутствии напряжения. Поочерёдно дотроньтесь до контактов розетки индикаторной отвёрткой, касаясь большим пальцем металлической части на рукоятке, — контрольная лампа загораться не должна.

YouTube-канал «Электрик в доме»

Отвёрткой ослабьте зажимы контактов и вытащите проводники. Выверните винты крепёжных распорок и извлеките розетку из монтажной коробки.

6. Установите монтажную коробку

5domov.ru

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

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

YouTube-канал «Электрик в доме»

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

YouTube-канал «Электрик в доме»

Для сплошных стен используйте алебастр или гипс, замешанный с водой до густой кашицы. Смочите стену водой и нанесите смесь в отверстие. Затем проденьте провод через подрозетник и вставьте коробку, выровняв её относительно стены. Замажьте щели вокруг. Подождите несколько минут, пока алебастр или гипс застынут.

7. Зачистите провода

joinfo.ua

Если кабель слишком длинный, обрежьте его кусачками так, чтобы он выступал за пределы стены примерно на 5–7 см. Аккуратно снимите внешнюю оболочку и уберите 5–10 мм изоляции с каждого проводника.

YouTube-канал Remont5.ru

8. Подключите розетку

rozetkaonline.ru

Если розетка без заземления, провода можно подключать в любом порядке. Скорее всего, обозначений на ней не будет, но по правилам фаза должна быть справа, а ноль — слева.

В розетке с заземлением провода также допускается менять местами, но желательно располагать фазу к контакту L, а нулевой проводник — к контакту N.

Заземление обязательно следует подключать к контакту с обозначением ⏚ или PE! Если маркировки нет, то к центральному контакту, ведущему к характерным усикам внутри розетки.

YouTube-канал Borisov-Pro

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

9. Закрепите механизм

sibelektrika.ru

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

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

YouTube-канал Borisov-Pro

10. Установите крышку

alkiv.ua

Поставьте верхнюю крышку розетки и закрепите её с помощью винта. Если конструкцией предусмотрена декоративная панель, предварительно установите её.

YouTube-канал «Электрик в доме»

11. Включите электричество

ivd.ru

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

12. Проверьте розетку

kursremonta.ru

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

Для этого возьмите индикаторную отвёртку и поочерёдно коснитесь всех контактов. Контрольная лампа должна загораться только на правом. На левом контакте и на усиках заземления огонёк индикатора светиться не должен.

Читайте также 🔧💡🔑

Использование сокетов и потоков сокетов

В этой статье объясняется, как работать с сокетами и потоками сокетов на различных уровнях, от POSIX до Foundation.

Важно: В этой статье описаны способы создания соединений через сокеты, полностью контролируемые вашей программой. Большинство программ лучше обслуживаются высокоуровневыми API, такими как NSURLConnection . Чтобы узнать больше об этих высокоуровневых API, прочтите Обзор сети .

API, описанные в этой статье, следует использовать только в том случае, если вам необходимо поддерживать какой-либо протокол, отличный от протоколов, поддерживаемых встроенными функциями Cocoa или Core Foundation.

Практически на каждом уровне сети программное обеспечение можно разделить на две категории: клиенты (программы, которые подключаются к другим приложениям) и службы (программы, к которым подключаются другие приложения). На высоком уровне эти линии ясны. Большинство программ, написанных с использованием API высокого уровня, являются исключительно клиентами. Однако на более низком уровне линии часто размыты.

Программирование сокетов и потоков обычно попадает в одну из следующих широких категорий:

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

    При пакетной связи единственные различия между клиентами и серверами заключаются в содержимом пакетов, которые каждая программа отправляет и получает, и (предположительно) в том, что каждая программа делает с данными. Сам сетевой код идентичен.

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

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

Эта глава разделена на разделы, основанные на перечисленных выше задачах:

Выбор семейства API

API, который вы выбираете для соединений на основе сокетов, зависит от того, выполняете ли вы соединение с другим хостом или получаете соединение от другого хост.Это также зависит от того, используете ли вы TCP или какой-либо другой протокол. Вот несколько факторов, которые следует учитывать:

  • В OS X, если у вас уже есть сетевой код, который используется совместно с платформами, отличными от Apple, вы можете использовать сетевые API POSIX C и продолжать использовать свой сетевой код как есть (на отдельный поток). Если ваша программа основана на цикле выполнения Core Foundation или Какао (Foundation), вы также можете использовать API Core Foundation CFStream для интеграции сетевого кода POSIX в вашу общую архитектуру в основном потоке.В качестве альтернативы, если вы используете Grand Central Dispatch (GCD), вы можете добавить сокет в качестве источника отправки.

    В iOS использование сетей POSIX не рекомендуется, поскольку они не активируют сотовую радиосвязь или VPN по запросу. Таким образом, как правило, вы должны отделить сетевой код от любых общих функций обработки данных и переписать сетевой код, используя API более высокого уровня.

    Примечание: Если вы используете сетевой код POSIX, вы должны знать, что сетевой API POSIX не зависит от протокола (вы должны самостоятельно уладить некоторые различия между IPv4 и IPv6).Это API подключения по IP, а не API подключения по имени, что означает, что вам нужно проделать много дополнительной работы, если вы хотите достичь той же производительности и надежности при начальном подключении, которые предоставляют вам высокоуровневые API. бесплатно. Прежде чем вы решите повторно использовать существующий сетевой код POSIX, обязательно прочтите статью «Избегайте разрешения DNS-имен перед подключением к хосту» в Networking Overview .

  • Для демонов и служб, которые прослушивают порт, или для подключений без TCP, используйте сетевые API-интерфейсы C. POSIX или Core Foundation ( CFSocket ).

  • Для клиентского кода в Objective-C используйте сетевые API Foundation Objective-C. Foundation определяет классы высокого уровня для управления URL-соединениями, потоками сокетов, сетевыми службами и другими сетевыми задачами. Это также основная платформа Objective-C, не связанная с пользовательским интерфейсом, в OS X и iOS, предоставляющая процедуры для циклов выполнения, обработки строк, объектов коллекции, доступа к файлам и т. Д.

  • Для клиентского кода на C используйте сетевые API-интерфейсы Core Foundation C. Фреймворк Core Foundation и фреймворк CFNetwork являются двумя основными фреймворками языка C в OS X и iOS.Вместе они определяют функции и структуры, на которых построены сетевые классы Foundation.

    Примечание: В OS X CFNetwork является подфреймворком структуры Core Services; в iOS CFNetwork - это фреймворк верхнего уровня.

Написание клиента на основе TCP

Способ создания исходящего соединения зависит от того, какой язык программирования вы используете, от типа соединения (TCP, UDP и т. Д.) И от того, пытаетесь ли вы делиться кодом с другими платформами (не Mac и iOS).

  • Используйте NSStream для исходящих соединений в Objective-C.

    Если вы подключаетесь к определенному хосту, создайте объект CFHost (, а не , NSHost - они не имеют бесплатного моста), затем используйте CFStreamCreatePairWithSocketToHost или CFStreamCreateToHost, подключенный к open aopenCreatePair8 с хост и порт и свяжите с ним пару объектов CFStream . Затем вы можете преобразовать их в объект NSStream .

    Вы также можете использовать функцию CFStreamCreatePairWithSocketToNetService с объектом CFNetServiceRef для подключения к службе Bonjour. Прочтите Обнаружение и Рекламу сетевых услуг в Обзор сети для получения дополнительной информации.

    Примечание: Метод getStreamsToHost: port: inputStream: outputStream: для NSNetService недоступен в iOS и не рекомендуется в OS X по соображениям производительности. В частности, NSNetService требует, чтобы вы создали экземпляр NSHost .При создании объекта поиск выполняется синхронно. Таким образом, создавать объект NSHost в основном потоке приложения небезопасно. Подробнее см. NSNetService и Автоматический подсчет ссылок (ARC) .

  • Используйте CFStream для исходящих соединений в C.

    Если вы пишете код, который не может включать Objective-C, используйте CFStream API. Он легче интегрируется с другими API-интерфейсами Core Foundation, чем CFSocket , и включает сотовое оборудование на iOS (если применимо), в отличие от lowe

.HOWTO по программированию сокетов

- документация Python 3.3.7

Аннотация

Розетки используются почти везде, но являются одними из самых неправильно понятые технологии вокруг. Это обзор розеток на 10 000 футов. На самом деле это не учебник - вам еще нужно поработать, чтобы оперативный. Он не затрагивает тонкости (а их очень много), но Я надеюсь, что это даст вам достаточно знаний, чтобы начать их прилично использовать.

Розетки

Я буду говорить только об INET (т.е. IPv4), но на них приходится не менее 99% используемые розетки. И я буду говорить только о сокетах STREAM (т. Е. TCP) - если только вы знать, что вы делаете (в этом случае этот HOWTO не для вас!), вы получите лучшее поведение и производительность от сокета STREAM, чем что-либо еще. Я буду попытаться раскрыть тайну того, что такое сокет, а также дать несколько советов о том, как работа с блокирующими и неблокирующими розетками. Но я начну с разговора о блокировка розеток. Вам нужно знать, как они работают, прежде чем начинать неблокирующие розетки.

Отчасти проблема с пониманием этих вещей состоит в том, что «сокет» может означать количество неуловимо разных вещей, в зависимости от контекста. Итак, сначала давайте сделаем различие между «клиентским» сокетом - конечной точкой разговора и «Серверная» розетка, которая больше похожа на коммутатор оператора. Клиент приложение (например, ваш браузер) использует исключительно «клиентские» сокеты; то веб-сервер, с которым он разговаривает, использует как «серверные», так и «клиентские» сокеты.

История

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

Они были изобретены в Беркли как часть разновидности BSD Unix. Они распространяются как лесной пожар с Интернетом. Не зря - комбинация розеток. с INET делает разговор с произвольными машинами по всему миру невероятно простым (по крайней мере, по сравнению с другими схемами).

Создание сокета

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

 # создать INET, STREAMing сокет s = розетка.сокет (socket.AF_INET, socket.SOCK_STREAM) # теперь подключаемся к веб-серверу через порт 80 - обычный http порт s.connect (("www.python.org", 80)) 

Когда соединение завершится, сокет s может использоваться для отправки в запросе текста страницы. Тот же сокет будет читать ответить, а затем быть уничтоженным. Правильно, уничтожено. Клиентские сокеты обычно используются только для одного обмена (или небольшого набора последовательных обмены).

То, что происходит на веб-сервере, немного сложнее.Во-первых, веб-сервер создает «серверный сокет»:

 # создать INET, STREAMing сокет serversocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # привязываем сокет к общедоступному хосту и известному порту serversocket.bind ((socket.gethostname (), 80)) # стать серверным сокетом serversocket.listen (5) 

Следует отметить пару вещей: мы использовали socket.gethostname (), чтобы сокет будет видно внешнему миру. Если бы мы использовали s.bind (('localhost', 80)) или s.bind (('127.0.0.1 ', 80)) у нас остался бы «серверный» сокет, но тот, который был виден только внутри той же машины. s.bind ((', 80)) указывает, что сокет доступен по любому адресу, с которым встречается машина имеют.

Второе, на что следует обратить внимание: порты с небольшим номером обычно зарезервированы для «хорошо известных» сервисы (HTTP, SNMP и т. д.). Если вы играете, используйте хорошее большое число (4 цифры).

Наконец, аргумент listen сообщает библиотеке сокетов, что мы хотим, чтобы поставьте в очередь до 5 запросов на соединение (нормальный максимум), прежде чем отказывать извне соединения.Если остальная часть кода написана правильно, этого должно быть достаточно.

Теперь, когда у нас есть «серверный» сокет, прослушивающий порт 80, мы можем ввести основной цикл веб-сервера:

, пока True: # принимать подключения извне (клиентский сокет, адрес) = serversocket.accept () # теперь что-нибудь сделаем с клиентским сокетом # в этом случае мы представим, что это многопоточный сервер ct = client_thread (клиентский сокет) ct.run () 

На самом деле существует 3 основных способа работы этого цикла - отправка поток для обработки клиентского сокета, создайте новый процесс для обработки clientocket или реструктурируйте это приложение, чтобы использовать неблокирующие сокеты, и мультиплексирование между нашим «серверным» сокетом и любыми активными клиентскими сокетами, использующими Выбрать.Подробнее об этом позже. Сейчас важно понять, это: это все «серверный» сокет. Он не отправляет никаких данных. Это не получать любые данные. Он просто производит «клиентские» сокеты. Каждый клиентский сокет создается в ответ на других «клиентских» сокетов, выполняющих соединение () с хост и порт, к которым мы привязаны. Как только мы создали этот клиентский сокет, мы вернитесь к прослушиванию для получения дополнительных подключений. Два «клиента» могут свободно общаться в чате. вверх - они используют некоторый динамически выделенный порт, который будет переработан, когда разговор заканчивается.

МПК

Если вам нужен быстрый IPC между двумя процессами на одной машине, вам следует изучить каналы или разделяемая память. Если вы решили использовать сокеты AF_INET, привяжите Сокет «server» на «localhost». На большинстве платформ это займет сократить несколько слоев сетевого кода и работать немного быстрее.

См. Также

Многопроцессорность интегрирует межплатформенный IPC в более высокий уровень API.

Использование розетки

Первое, что следует отметить, это то, что "клиентский" сокет веб-браузера и Интернет серверные «клиентские» сокеты такие же звери.То есть это «одноранговый» разговор. Или, другими словами, в качестве дизайнера вам придется решить, каковы правила этикета для разговора . Обычно Соединительный сокет начинает диалог, отправляя запрос, или возможно знак. Но это дизайнерское решение, а не розетки.

Теперь есть два набора глаголов, которые можно использовать для общения. Вы можете использовать send и recv, или вы можете превратить свой клиентский сокет в файлового зверя и используйте чтение и запись.Именно так Java представляет свои сокеты. Я не собираюсь здесь говорить об этом, но хочу предупредить, что вам нужно использовать заподлицо с розетками. Это буферизованные «файлы», и распространенной ошибкой является напишите что-нибудь, а затем прочтите, чтобы получить ответ. Без смыва там вы можете ждать ответа вечно, потому что запрос все еще может быть в ваш выходной буфер.

Теперь мы подошли к главному камню преткновения сокетов - работе send и recv. в сетевых буферах. Они не обязательно обрабатывают все передаваемые вами байты их (или ожидайте от них), потому что их основное внимание уделяется работе с сетью буферы.Как правило, они возвращаются, когда соответствующие сетевые буферы были заполнены (отправить) или опорожнены (recv). Затем они сообщают вам, сколько байтов они обработано. Это , ваша ответственность - позвонить им еще раз, пока ваше сообщение не будет полностью разобрались.

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

Протокол, такой как HTTP, использует сокет только для одной передачи. Клиент отправляет запрос, затем читает ответ. Это оно. Сокет отбрасывается. Это значит, что клиент может определить конец ответа, получив 0 байтов.

Но если вы планируете повторно использовать розетку для дальнейших передач, вам необходимо что нет EOT на розетке. Повторяю: если розетка send или recv возвращается после обработки 0 байтов, соединение было сломан.Если соединение , а не разорвано, вы можете подождать навсегда, потому что сокет , а не скажет вам, что больше нечего читать (пока). Если вы немного подумаете об этом, вы поймете, что Основная истина сокетов: сообщения должны иметь фиксированную длину (фу), или быть разделенными (пожать плечами), или указать их длину (намного лучше), или заканчиваться отключение соединения . Выбор полностью за вами, но некоторые способы правее других).

Если вы не хотите разрывать соединение, самым простым решением является фиксированный длина сообщения:

Класс
 mysocket: "" "только демонстрационный класс - закодировано для ясности, а не эффективности "" " def __ini 
.

Что такое розетка? (Учебники по Java ™> Пользовательские сети> Все о сокетах)

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

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

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

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

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


Определение:

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


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

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

Кроме того, java.net включает класс ServerSocket , который реализует сокет, который серверы могут использовать для прослушивания и приема соединений с клиентами. В этом уроке показано, как использовать классы Socket и ServerSocket .

Если вы пытаетесь подключиться к Интернету, класс URL и связанные классы ( URLConnection , URLEncoder ), вероятно, более подходят, чем классы сокетов.Фактически, URL-адреса являются относительно высокоуровневым соединением с Интернетом и используют сокеты как часть базовой реализации. Видеть Работа с URL-адресами для получения информации о подключении к Интернету через URL-адреса.

.

Как работают веб-сокеты? - Кевин Сукочефф

WebSocket - это постоянное соединение между клиентом и сервером. WebSockets обеспечивает двунаправленный полнодуплексный канал связи. который работает через HTTP через одно соединение сокета TCP / IP. На своем core протокол WebSocket упрощает передачу сообщений между клиентом и сервер. Эта статья представляет собой введение в WebSocket. протокол, в том числе проблемы, которые решают WebSockets, и обзор того, как WebSockets описываются на уровне протокола.

Почему именно WebSocket?

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

WebSockets, с другой стороны, позволяют отправлять данные на основе сообщений, аналогично UDP, но с надежностью TCP. WebSocket использует HTTP как начальный транспортный механизм, но поддерживает соединение TCP после получен ответ HTTP, чтобы его можно было использовать для отправки сообщений между клиентом и сервером. WebSockets позволяют нам создавать "в реальном времени" приложения без использования длительного опроса.

Обзор протокола

Протокол состоит из открывающего рукопожатия, за которым следует базовое сообщение. кадрирование, наложенное на TCP.

- RFC 6455 - Протокол WebSocket

WebSockets начинают свою жизнь как стандартный HTTP-запрос и ответ. Внутри этого цепочка ответов на запросы, клиент просит открыть соединение WebSocket, и сервер отвечает (если может). Если это первоначальное рукопожатие успешно, клиент и сервер согласились использовать существующий TCP / IP соединение, которое было установлено для HTTP-запроса как WebSocket подключение.Теперь данные могут передаваться через это соединение с использованием базового фреймового протокол сообщений. Как только обе стороны признают, что WebSocket соединение должно быть закрыто, TCP соединение разорвано.

Установление соединения WebSocket - Открытое рукопожатие WebSocket

WebSockets не используют схему http: // или https: // (потому что они не следовать протоколу HTTP). Вместо этого URI WebSocket используют новую схему ws: (или wss: для безопасного WebSocket).Остальная часть URI - это то же, что и HTTP URI: хост, порт, путь и любые параметры запроса.

  "ws:" "//" хост [":" порт] путь ["?" запрос] "wss:" "//" хост [":" порт] путь ["?" запрос]  

Соединения WebSocket могут быть установлены только для URI, следующих за этим схема. То есть, если вы видите URI со схемой ws: // (или wss: // ), тогда и клиент, и сервер ДОЛЖНЫ следовать соединению WebSocket. протокол в соответствии со спецификацией WebSocket.

подключений WebSocket установлено при обновлении пары HTTP-запрос / ответ. Клиент, который поддерживает WebSockets и хочет установить соединение, отправит HTTP запрос, который включает несколько обязательных заголовков:

  • Подключение: обновление
    • Заголовок Connection обычно определяет, сетевое соединение остается открытым после текущей транзакции отделка. Обычное значение для этого заголовка - keep-alive , чтобы убедитесь, что соединение является постоянным, чтобы разрешить последующие запросы на тот же сервер.Во время рукопожатия открытия WebSocket мы установили заголовок до Обновите , сигнализируя, что мы хотим сохранить соединение жив, и использовать его для запросов, отличных от HTTP.
  • Обновление: websocket
    • Заголовок Upgrade используется клиентами для запроса сервера на переключение к одному из перечисленных протоколов в порядке убывания предпочтения. Мы укажите здесь websocket , чтобы указать, что клиент хочет установить соединение WebSocket.
  • Sec-WebSocket-ключ: q4xkcO32u266gldTuKaSOw ==
    • Sec-WebSocket-Key - это одноразовое случайное значение (одноразовый номер) генерируется клиентом.Значение - это случайно выбранное 16-байтовое значение, имеющее был закодирован base64.
  • Sec-WebSocket-Версия: 13
    • Единственная допустимая версия протокола WebSocket - 13. Любая другая версия, указанная в этом заголовке, недействительна.

Вместе эти заголовки приведут к HTTP-запросу GET от клиент к URI ws: // , как в следующем примере:

  ПОЛУЧИТЬ ws: //example.com: 8181 / HTTP / 1.1 Хост: localhost: 8181 Подключение: Обновление Прагма: без кеширования Cache-Control: без кеша Обновление: websocket Sec-WebSocket-Версия: 13 Sec-WebSocket-ключ: q4xkcO32u266gldTuKaSOw ==  

Когда клиент отправляет начальный запрос на открытие соединения WebSocket, он ждет ответа от сервера.Ответ должен иметь код ответа HTTP 101 Switching Protocols . Ответ HTTP 101 Switching Protocols указывает, что сервер переключается на протокол, который клиент запрошен в заголовке запроса Upgrade . Кроме того, сервер должен включить заголовки HTTP, подтверждающие, что соединение было успешно улучшено:

  HTTP / 1.1 101 Протоколы коммутации Обновление: websocket Подключение: Обновление Sec-WebSocket-Accept: fA9dggdnMPU79lJgAE3W4TRnyDM =  
  • Подключение: обновление
    • Подтверждает, что соединение было обновлено.
  • Обновление: websocket
    • Подтверждает, что соединение было обновлено.
  • Sec-WebSocket-Accept : fA9dggdnMPU79lJgAE3W4TRnyDM = `
    • Sec-WebSocket-Accept имеет кодировку base64, хешированное значение SHA-1. Вы сгенерировать это значение путем объединения клиентов Sec-WebSocket-Key nonce и статическое значение 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 определено в RFC 6455. Хотя Sec-WebSocket-Key и Sec-WebSocket-Accept кажутся сложными, они существуют, так что оба клиент и сервер могут знать, что их коллега поддерживает WebSockets.Поскольку WebSocket повторно использует HTTP-соединение, там являются потенциальными проблемами безопасности, если любая из сторон интерпретирует WebSocket данные как HTTP-запрос.

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

Протокол WebSocket

WebSocket - это протокол с фреймами , что означает, что фрагмент данных (сообщение) делится на несколько дискретных частей, размер которых закодировано в кадре.Кадр включает тип кадра, длину полезной нагрузки, и часть данных. Обзор фрейма дан в RFC. 6455 и воспроизведено Вот.

  0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + - + - + - + - + ------- + - + ------------- + ----------------- -------------- + | F | R | R | R | код операции | M | Длина полезной нагрузки | Увеличенная длина полезной нагрузки | | I | S | S | S | (4) | A | (7) | (16/64) | | N | V | V | V | | S | | (если полезная нагрузка len == 126/127) | | | 1 | 2 | 3 | | K | | | + - + - + - + - + ------- + - + ------------- + - - - - - - - - - - - - - - - + | Увеличенная длина полезной нагрузки продолжается, если полезная нагрузка len == 127 | + - - - - - - - - - - - - - - - + ------------------------------- + | | Маскирующий ключ, если МАСКА установлена ​​в 1 | + ------------------------------- + ----------------- -------------- + | Маскирующий ключ (продолжение) | Данные полезной нагрузки | + -------------------------------- - - - - - - - - - - - - - - - - + : Данные полезной нагрузки продолжение...: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Данные полезной нагрузки продолжение ... | + ------------------------------------------------- -------------- +  

Я не буду здесь останавливаться на всех деталях протокола кадров. Обратитесь к RFC 6455 для получения полной информации. Скорее, Я расскажу о самых важных моментах, чтобы мы могли понять протокола WebSocket.

Ребро-бит

Первый бит заголовка WebSocket - это бит Fin.Этот бит устанавливается, если этот фрейм - последние данные для завершения этого сообщения.

Биты RSV1, RSV2, RSV3

Эти биты зарезервированы для использования в будущем.

код операции

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

Значение кода операции Описание
0x00 Этот кадр продолжает полезную нагрузку из предыдущего кадра.
0x01 Обозначает текстовый фрейм.Текстовые фреймы декодируются сервером в кодировке UTF-8.
0x02 Обозначает двоичный фрейм. Двоичные фреймы доставляются сервером без изменений.
0x03-0x07 Зарезервировано для использования в будущем.
0x08 Обозначает, что клиент хочет закрыть соединение.
0x09 Фрейм ping. Служит механизмом подтверждения связи, гарантирующим, что соединение все еще живо. Получатель должен ответить понгом.
0x0a Рамка для понга. Служит механизмом подтверждения связи, гарантирующим, что соединение все еще живо. Получатель должен ответить фреймом ping.
0x0b-0x0f Зарезервировано для использования в будущем.
Маска

Установка этого бита в 1 включает маскирование . WebSockets требует, чтобы все полезная нагрузка обфусцирована с использованием случайного ключа (маски), выбранного клиентом. Ключ маскировки объединяется с данными полезной нагрузки с помощью операции XOR. перед отправкой данных в полезную нагрузку.Эта маскировка предотвращает появление кешей. неверная интерпретация фреймов WebSocket как кэшируемых данных. Почему мы должны предотвращать кеширование данных WebSocket? Безопасность.

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

Длина полезной нагрузки

Поле Payload len и Extended payload length поле используются для кодировать общую длину данных полезной нагрузки для этого кадра. Если полезная нагрузка данные небольшие (менее 126 байт), длина кодируется в поле Payload len . По мере роста данных полезной нагрузки мы используем дополнительные поля для закодировать длину полезной нагрузки.

Маскирующий ключ

Как обсуждалось с битом MASK , все кадры, отправленные от клиента к серверы маскируются 32-битным значением, содержащимся в кадре. Это поле присутствует, если бит маски установлен в 1, и отсутствует, если бит маски установлен на 0.

Данные полезной нагрузки

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

Закрытие соединения WebSocket - рукопожатие закрытия WebSocket

Чтобы закрыть соединение WebSocket, отправляется закрывающий кадр (код операции 0x08 ). Помимо кода операции, закрывающий кадр может содержать тело, которое указывает причину закрытия. Если одна из сторон соединения получает закрывающий кадр, он должен отправить закрывающий кадр в ответ, и больше никаких данных должны быть отправлены через соединение. После получения кадра закрытия обеими сторонами разрывается TCP-соединение.Сервер всегда инициирует закрытие TCP-соединения.

Дополнительные ссылки

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

См. Также
.

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