Comments 389
Правильный веб 2.0?
Только на днях начал ковырять comet-технологию, а тут такое.
Будем-с ждать :)
Только на днях начал ковырять comet-технологию, а тут такое.
Будем-с ждать :)
Я тоже в серьез присматривался к Comet и Beyeux для одного проекта, но нашел WebSockets. На мой взгляд, эта технология на голову или даже 2 выше! Но еще очень свежая.
Пока она еще появится повсеместно…
Очень-очень свежая.
Например, не совсем ясно, если у комета проблемы с принудительным закрытием злыми проксями долго висящих соединений, то почему таких же проблем не будет у websockets?
Например, не совсем ясно, если у комета проблемы с принудительным закрытием злыми проксями долго висящих соединений, то почему таких же проблем не будет у websockets?
Я начал ковырять Google Gears, а через неделю узнал что Google будет от нее отказываться в пользу HTML5.
Вау! Занятно
UFO just landed and posted this here
Это именно тот случай, когда можно заставлять ставить браузер. Это платформа веб приложений.
Не закончится.
Я думаю, что MS поддержит идею, пусть даже не сразу, но ждать долго не заставит.
Я думаю, что MS поддержит идею, пусть даже не сразу, но ждать долго не заставит.
Да и IE8 не такой уж и плохой браузер. Хоть я им и не пользуюсь из за пары плагинов в FF. Но я то не %USERNAME% — мне они как воздух.
Если бы не они — пользовался бы IE8.
"… да, знаю, грусть, злоба и осадок на душе остаётся после нескольких лет разработки под IE6.
Но я уже отпустил IE6 и простил его. Пусть отходит с миром. Всё будет хорошо."
Если бы не они — пользовался бы IE8.
"… да, знаю, грусть, злоба и осадок на душе остаётся после нескольких лет разработки под IE6.
Но я уже отпустил IE6 и простил его. Пусть отходит с миром. Всё будет хорошо."
IE8 может и неплохой браузер (во сколько раз он отстает по скорости js от ФФ? а от хрома?), но если MS не захочет — поддержки сокетов в IE не будет. А зачем бы им делать эту поддержку, сдавая лишние козыри гуглу?
В «интернетах» гугл практически вездесущ, по этому может просто взять, да и придавить его некоторыми ресурсами, без которых уже юзер не сможет. На пример гугло-почтой.
Как-то раз на какой-то конференции (не помню, но точно слышал) у дядьки с гугля спросили «а когда же это всё зарботает в IE?» на что он ответил «IE? я не знаю такого браузера» (или как-то так) — вот такая политика.
И БАМ! в IE8 всё работает.
если допустим пользователи gmail не смогут заходить на свою почту (а её часто в последнее время оказывается именно gmail) то от IE они откажутся.
Со времён IE6 политика MS значительно изменилась. Я бы даже сказал, что они существенно поумнели.
Как-то раз на какой-то конференции (не помню, но точно слышал) у дядьки с гугля спросили «а когда же это всё зарботает в IE?» на что он ответил «IE? я не знаю такого браузера» (или как-то так) — вот такая политика.
И БАМ! в IE8 всё работает.
если допустим пользователи gmail не смогут заходить на свою почту (а её часто в последнее время оказывается именно gmail) то от IE они откажутся.
Со времён IE6 политика MS значительно изменилась. Я бы даже сказал, что они существенно поумнели.
А им деваться будет некуда. Как-то Билл Гейтс говорил что интернетом они заниматься не будут, а будут продвигать сеть АОЛ, но потом пришлось забить на АОЛ, заняться интернетом и сделать свой браузер.
Охохо…
Вот этого я жду с содроганием. МС опять окажется в роли догоняющего, а значит реализует в спешке и криво — значит будет брешь в системе. Через нее пойдет большой поток вирусов. Что негативно скажется на мнении о самой технологии, хотя тут она совершенно не виновата. Начнут повсеместно отключать, резать на корпоративных проксях и так далее. Быть может помните, на заре веба была проблема с куков?
В итоге все проиграют: и пользователи, затормозится развитие технологий, и рейтинг самого МС опустится еще ниже плинтуса.
Вот этого я жду с содроганием. МС опять окажется в роли догоняющего, а значит реализует в спешке и криво — значит будет брешь в системе. Через нее пойдет большой поток вирусов. Что негативно скажется на мнении о самой технологии, хотя тут она совершенно не виновата. Начнут повсеместно отключать, резать на корпоративных проксях и так далее. Быть может помните, на заре веба была проблема с куков?
В итоге все проиграют: и пользователи, затормозится развитие технологий, и рейтинг самого МС опустится еще ниже плинтуса.
Не пророчьте апокалипсис! %USERNAME% и так в страхе живёт ;)
Я думаю таки что-то изменилось, и тактупить в МС уже не станут. Тем более, что не так уж будет и сложно сделать поддержку WebSocket без багов, как по мне.
Всё будет хорошо ;)
Я думаю таки что-то изменилось, и так
Всё будет хорошо ;)
форсируется поддержка нормальных браузеров имхо, и все. Прокси тоже обычно ставят не дураки, а такие же люди как мы с вами, которые знают про альтернативные браузеры. Хотя конечно хз как оно еще повернется
даже если МС и не затупит с реализацие в новых версиях, все равно останется проблема со старыми версиями ИЕ. А пользователи экплорера наиболее инертны в плане обновлений. Так что широкодоступной эта технология станет ой как не скоро.
Что именно отправлять, разработчики полностью оставили на ваше усмотрение: хотите XML, хотите AJAX, да хоть стихи Пушкина.
Под AJAX вы имели ввиду JSON? :)
В первом скрипте в строке 10 опечатка: не «onopen» там должно стоять.
>Теперь уже нет клиента и сервера
…
>Если браузер это устраивает, то он просто оставляет _TCP-соединение_ открытым
>Теперь уже нет клиента и сервера
ммм? что?
…
>Если браузер это устраивает, то он просто оставляет _TCP-соединение_ открытым
>Теперь уже нет клиента и сервера
ммм? что?
Я имел ввиду, что различие между браузером и сервером теперь в одном — что браузер инициирует соединение, а дальше они уже работают на равных: нет четко выраженного разделения на «спрашивающий» и «отвечающий».
>нет четко выраженного разделения на «спрашивающий» и «отвечающий»
простите, но ОТВЕЧАЮЩИЙ — любом случае сервер. или сервер может САМОСТОЯТЕЛЬНО инициировать подключение к клиенту?
простите, но ОТВЕЧАЮЩИЙ — любом случае сервер. или сервер может САМОСТОЯТЕЛЬНО инициировать подключение к клиенту?
Нет, сервер не может. Инициатива всегда исходит от клиента.
Я немного запутал вас в терминологии.
Но возможен такой сценарий: клиент установил подключение до сервера и молчит. Когда серверу потребовались данные — например ФИО пользователя — он сам направляет клиенту асинхронное сообщение. Клиент показывает какую-то форму пользователю, принимает данные и отсылает их на сервер.
В таком варианте вроде бы как сервер спрашивающая сторона. :)
Вот еще важный момент! Поскольку соединение асинхронное то правильнее о нем думать не как о сессии «вопрос-ответ», а как «репликах в воздух».
Я немного запутал вас в терминологии.
Но возможен такой сценарий: клиент установил подключение до сервера и молчит. Когда серверу потребовались данные — например ФИО пользователя — он сам направляет клиенту асинхронное сообщение. Клиент показывает какую-то форму пользователю, принимает данные и отсылает их на сервер.
В таком варианте вроде бы как сервер спрашивающая сторона. :)
Вот еще важный момент! Поскольку соединение асинхронное то правильнее о нем думать не как о сессии «вопрос-ответ», а как «репликах в воздух».
смысл фразы в том, что _сейчас_ бравзер является исключительно клиентом — и «в большом» (первоначальное подключение) и «в малом» (небольшие транзакции в рамках одного подключения, например AJAX-запросы).
Веб-сокеты позволят реализовать равноправность «в малом», сохранив разделение «в большом».
Веб-сокеты позволят реализовать равноправность «в малом», сохранив разделение «в большом».
* AJAX-запросы в том смысле, что чтобы это работало клиент (бравзер) должен сам регулярно опрашивать сервер «а не появилось ли у тебя чего-нибудь новенького». Сервер же вообще никак не может обратиться к клиенту кроме как по запросу от него.
Вы очень хорошо и понятно описали :)
Подскажите, текущая реализация Ajax держит TCP подключение или создает его каждый раз, когда javascript отправляет запрос на сервер (обычный или long poll)? Что-то меня вот этот комментарий смутил: habrahabr.ru/blogs/webdev/79038/#comment_2318372
м, вроди бы AJAX это принцип, а не конкретная реализация =)
К несчастью, я не очень хорошо разбираюсь в особенностях существующих механизма запросов (про аякс, асинхронность и прочее я выводы получил совсем через другие размышления).
Погуглив, нашел статейку на ангельском — вроди в ней есть указания на нужные сведения (и, заодно, о технологии, которой товарисч козырял).
К несчастью, я не очень хорошо разбираюсь в особенностях существующих механизма запросов (про аякс, асинхронность и прочее я выводы получил совсем через другие размышления).
Погуглив, нашел статейку на ангельском — вроди в ней есть указания на нужные сведения (и, заодно, о технологии, которой товарисч козырял).
Не AJAX, а XHR. Пока клиент не закрыл соединение оно идет в рамках одного TCP соединения.
> хаках, а не стандартых
очепяточку поправьте плз. И большое спасибо за интересный материал.
ЗЫ Интересно, если бы такая смелая затея вышла не из гугла, а из чего-то масштабом помельче — прошло бы?
очепяточку поправьте плз. И большое спасибо за интересный материал.
ЗЫ Интересно, если бы такая смелая затея вышла не из гугла, а из чего-то масштабом помельче — прошло бы?
Тут дело не в гугле — самой идее больше года — www.w3.org/TR/websockets/ Гугл — лишь первый, кто ее реализовал.
Опять повторился сценарий «волшлебного пендаля», как было с Хромом. Вышел браузер с быстрым яваскриптом и инкогнито-режимом — вроде бы ничего нового — но все тут же подтянулись.
Опять повторился сценарий «волшлебного пендаля», как было с Хромом. Вышел браузер с быстрым яваскриптом и инкогнито-режимом — вроде бы ничего нового — но все тут же подтянулись.
Сча я напишу модуль для phpDaemon. Будет опупенно.
Ждем! :)
Кинул в закладки ваше заявление ;)
Всё будет хорошо. Я гарантирую это.
Всё будет хорошо. Я гарантирую это.
Набросок тут — тут. Протокол реализован. Осталось сделать API внутри самого демона.
API тоже готово. Пример приложения вот тут — ExampleWebSocket.php. Оно отвечает 'pong' на фрейм 'ping'. Вот тут — тестовая страничка.
Теперь еще Google Protobuf под Javascript портировать и будет совсем сказка в плане снижения объема передаваемых данных
Но впрочем я это за одну только асинхронность готов любить. Web от client-server становится площадкой общения равноправных игроков — это замечательно
Но впрочем я это за одну только асинхронность готов любить. Web от client-server становится площадкой общения равноправных игроков — это замечательно
Можно. Но с другой стороны надо ли?
WebSockets по скорости и эффективности передачи данных практически равен чистому TCp-соединению. Здесь не надо слишком сильно оптимизировать, потому мы имеем дело с открытой системой — то есть чтобы все кто угодно могли с ней легко взаимодействовать. Здесь лучше оставить некоторую абстрактность и гибкость.
Protobuf — это чисто гугловая вещь, а WebSockets — общественный стандарт планируемый для широкого использования.
WebSockets по скорости и эффективности передачи данных практически равен чистому TCp-соединению. Здесь не надо слишком сильно оптимизировать, потому мы имеем дело с открытой системой — то есть чтобы все кто угодно могли с ней легко взаимодействовать. Здесь лучше оставить некоторую абстрактность и гибкость.
Protobuf — это чисто гугловая вещь, а WebSockets — общественный стандарт планируемый для широкого использования.
WebSockets это транспорт, Protobuf это эффективная инкапсуляция — не путайте. Стандарт никак не описывает в каком именно виде вы данные будете гонять.
>> WebSockets по скорости и эффективности передачи данных практически равен чистому TCp-соединению.
WebSockets это фактически TCP over HTTP, так что оверхед есть и немалый.
WebSockets это фактически TCP over HTTP, так что оверхед есть и немалый.
Кстати да, возможно есть смысл попробовать их объединить.
UFO just landed and posted this here
XHTTPRequest больше ненужен? Уря товарищи!
Да ну. Сокеты полезны, если нужно постоянный коннект держать. А если у нас добавление/изменение записей в БД или та же проверка доступности логина при регистрации, то зачем постоянное соединение держать?
Всему своё место. Сокеты будут нужны для динамически изменяющейся информации, например, чаты, новостные ленты и т.п.
Всему своё место. Сокеты будут нужны для динамически изменяющейся информации, например, чаты, новостные ленты и т.п.
ну в общем-то логичный поворот. всё идёт к тому что в браузере по сути будет выполняться полноценное приложение, использующее HTML для прорисовки интерфейса и javascript внутри. Эдакий контейнер вроде старой доброй JVM, только с юзерфрендли-фронтендом ввиде табов.
Подход впринципе правильный т.к. если JAVA и ActiveX шли с десктопа в веб со всеми своими дырками в основном из доступа к локальной фс, javascript идёт наоборот из веба на десктоп и дырки в нём специально делать никто не станет.
Подход впринципе правильный т.к. если JAVA и ActiveX шли с десктопа в веб со всеми своими дырками в основном из доступа к локальной фс, javascript идёт наоборот из веба на десктоп и дырки в нём специально делать никто не станет.
Да. WebSockets входят в WebApplication.
Я думаю для интерфейсов даже HTML отомрет, будут прямо на канвасе интерфейс рисовать со всеми кнопочками и ляляками.
UFO just landed and posted this here
просто данное решение позволяет вам выбрать самому6 использовать HTML или просто загрузить исполняемый код на машину клиенту.
гммм, я уже вижу какие вирусы будут этим летом расти )))
короче чем интереснее технология тем важнее в ней верификация сторон учавствующих в обмене.
гммм, я уже вижу какие вирусы будут этим летом расти )))
короче чем интереснее технология тем важнее в ней верификация сторон учавствующих в обмене.
А какой смысл? Думаю то, что предусмотренно в HTML через него сделать проще (и браузером будет обрабатываться быстрее). Кнопки же в HTML как правило не делают картинками с обработчиком (если нет каких-то сильно необычных требований)
Вообще, во многих web application, да и на многих обычных сайтах кнопки делают в виде ссылок с картинкой (это не повод к холивару о том, правильно ли это, но тем не менее это факт).
А DOM в браузерах ооочень медленный. Особенно в FF и IE.
А DOM в браузерах ооочень медленный. Особенно в FF и IE.
Ставят. Но, на мой взгляд, это скорее недоработка HTML — невозможность через него сделать картинку кнопкой. Как и многое другое.
DOM, конечно, медленный. Но не думаю, что canvas, управляемый js, будет работать быстрее. С чего бы? DOM все-таки львиную часть работы по отрисовке отдает скомпилированному коду. Canvas — нет.
DOM, конечно, медленный. Но не думаю, что canvas, управляемый js, будет работать быстрее. С чего бы? DOM все-таки львиную часть работы по отрисовке отдает скомпилированному коду. Canvas — нет.
DOM помимо отрисовки выполняет ещё множество вещей, связанных с определением правильного положения элементов, их размеров и т.п. Кроме того, я не знаю никакой возможности хоть как-то буферизовать изменения свойств узлов дерева. Например, я меняю свойства для 10 элементов в DOM'е… и на каждое изменение каждого из свойств, браузер(по-крайней мере IE точно) будет пытаться перестраивать и перерисовывать дерево.
Мне кажется, что канвас на специфических задачах навороченного и очень динамического GUI вполне может оказаться быстрее. Тем более, что скрипты сейчас чуть ли не в нативный код компилируются.
Мне кажется, что канвас на специфических задачах навороченного и очень динамического GUI вполне может оказаться быстрее. Тем более, что скрипты сейчас чуть ли не в нативный код компилируются.
В специфических — безусловно. Но думаю, что все-таки с простой ссылкой работа будет быстрее, чем с нарисованным в canvas текстом и обработчиком на нем.
Вопрос в том, сколь сложные задачи лучше решать с помощью canvas. Реализовывать сложную работу с графикой через всевозможные хитрые манипуляции — глупо. Но и простое отображение текста через canvas — тоже. Где-то в промежутке есть задача, которую одинаково сложно делать как на HTML, так и с cavnas.
Вопрос в том, сколь сложные задачи лучше решать с помощью canvas. Реализовывать сложную работу с графикой через всевозможные хитрые манипуляции — глупо. Но и простое отображение текста через canvas — тоже. Где-то в промежутке есть задача, которую одинаково сложно делать как на HTML, так и с cavnas.
Ставьте родительскому элементу св-во display: none на время модификации, будет вам буферизация. Довольно известный трюк.
Да, трюк известный, но, судя по результатам профилирования в IE, использование его не оказало существенного влияния на количество и скорость производимых IE операций по рендерингу. Возможно где-то была ошибка, но т.к. производительность нашего приложения в IE6 и без этого на достаточно высоком уровне, глубоко я не копал. Может быть на предстоящих выходных поэкспериментурую с этим.
Вот несколько неплохих советов по оптимизации от Оперы, хотя насколько они помогут в случае с IE ручаться не могу.
dev.opera.com/articles/view/efficient-javascript/?page=3
dev.opera.com/articles/view/efficient-javascript/?page=3
> невозможность через него сделать картинку кнопкой.
Не очень понял вас, а как же <input type=«button» ...>?
Не очень понял вас, а как же <input type=«button» ...>?
/>
Покажите мне браузер, который это не поддерживает.
врядли отомрёт скорее расширится. многие и под десктопные оси предпочитают интерфейс на HTML рисовать ибо просто, быстро и легко найти верстальщика
Вот только потому, что верстальщика просто найти…
Для верстки текста — согласен HTML рулит.
А для интерфейса типа MS Office, HTML получится сложный и тяжелый
Мне кажется у канваса, в перспективе скорость и легкость (нет dom, стилей и пр....).
Договориться, как отображать HTML гораздо сложнее чем как рисовать на канвасе.
Описание стандарта будет тупо больше, поэтому и сложее. А значит место для разночтений и ошибок.
Сравните стандарт по HTML+CSS и по канвасу.
А строить интерфейсы все равно будут через либы типа ExtJS
Для верстки текста — согласен HTML рулит.
А для интерфейса типа MS Office, HTML получится сложный и тяжелый
Мне кажется у канваса, в перспективе скорость и легкость (нет dom, стилей и пр....).
Договориться, как отображать HTML гораздо сложнее чем как рисовать на канвасе.
Описание стандарта будет тупо больше, поэтому и сложее. А значит место для разночтений и ошибок.
Сравните стандарт по HTML+CSS и по канвасу.
А строить интерфейсы все равно будут через либы типа ExtJS
Как пример bespin.mozilla.com/ Полностью на canvas рисуется.
о_О Зашёл, открыл firebug, поинспектил элементы — html как он есть.
Может быть я куда-то не туда посмотрел, но «полностью на canvas рисуется» не увидел.
Может быть я куда-то не туда посмотрел, но «полностью на canvas рисуется» не увидел.
Ну насколько я понимаю речь идёт не о сайте https://bespin.mozilla.com/, а об их продукте Bespin, для просмотра которого нужна регистрация (она ещё и с оперой не дружит, при этом не даёт продолжить на свой страх и риск).
Если я ничего не перепутал, этот их продукт — онлайновый html-редактор.
Зарегистрировался, посмотрел под фаерфоксом — опять же, никакого намёка даже на «только canvas» не обнаружил.
Зарегистрировался, посмотрел под фаерфоксом — опять же, никакого намёка даже на «только canvas» не обнаружил.
Это весьма странно. Я тоже зарегистрировался и тоже смотрю под фаерфоксом, и, насколько я вижу, сам редактор — это всё-таки canvas. Прочие вспомогательные элементы интерфейса, вроде кнопок сохранения, всё-таки html.
Выглядит красиво :) Ждем полноценной поддержки всеми браузерами и серверами :)
Я что-то не понял, оно держит открытым соединение? Если это так, то полный ахтунг, это же какие нагрузки!
А какие нагрузки от неактивного соединения?
Как раз постоянное подключение-отключение создаст большую нагрзку.
Как раз постоянное подключение-отключение создаст большую нагрзку.
UFO just landed and posted this here
Максимально возможное количество соединений ограничивается ядром, в данном случае оно должно будет быть увеличено, что строго говоря не есть гуд.
А с longpoll/comet сейчас не так? И в чем не гуд? Если надо, то надо чтобы было гуд, патчи там и тп, если сейчас что-то мешает: )
Оно настраивается.
Вот пример сервера, который поддерживает 1 миллион коннектов, да не просто поддерживает, а работает с ними: www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1
Вот пример сервера, который поддерживает 1 миллион коннектов, да не просто поддерживает, а работает с ними: www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1
Не больше чем от открытой ICQ.
Как же давно я этого ждал!
Теперь смогу графики и логи в браузере смотреть в реальном времени.
Теперь смогу графики и логи в браузере смотреть в реальном времени.
Вышеприведённый скрипт демонстрирует, как клиент слушает сервер.
А вот ws.send('. . .') не показан, например.
А вот ws.send('. . .') не показан, например.
Надо попросить Сысоева добавить поддержку проксирования таких приложений. Не выделять же под это отдельный IP-шник…
Половина дороги пройдена, ура.
А когда и на другом конце вместо сервера сможет быть браузер,то тогда такой P2P начнётся!..
А когда и на другом конце вместо сервера сможет быть браузер,
UFO just landed and posted this here
Браузеры, как правило, за проксями и натами всякими.
Откройте для себя adobe flash:)
флеш позволяет создать приложение-сервер (подключение клиента к другим клиентам)? можно пример, ссылку или место в документации?
Флеш умеет использовать как свои сокеты www.adobe.com/livedocs/flex/3/langref/flash/net/Socket.html
так и p2p
livedocs.adobe.com/flash/9.0/ActionscriptLangRefV3/flash/net/NetConnection.html
так и p2p
livedocs.adobe.com/flash/9.0/ActionscriptLangRefV3/flash/net/NetConnection.html
Flash обременяет разработчика средством разработки, а пользователя необходимостью это flash установить. И всё это при том, что как средство разработки, так и плагин производятся одной фирмой и не имеют альтернатив.
ps про gnash знаю
ps про gnash знаю
Будучи ламером и параноиком, спрошу: а не даст ли это серверам злоумышленников возможность как-либо серьезно портить жизнь пользователям?
я не очень понял, что помешает криво настроенным проксям/антивирусам обрубать или тормозить соединения websocket, раз уж они так сильно похожи на обычные http-запросы?
и касательно ограничения одновременных соединений — вы уверены, что оно прописано именно в стандарте HTTP? Почему тогда у каждого браузера своё ограничение?
и касательно ограничения одновременных соединений — вы уверены, что оно прописано именно в стандарте HTTP? Почему тогда у каждого браузера своё ограничение?
> я не очень понял, что помешает криво настроенным проксям/антивирусам обрубать или тормозить
> соединения websocket, раз уж они так сильно похожи на обычные http-запросы?
В споре кривизны с прямизной, однозначно победит кривизна :)
С проксями получается такая ситуация:
— если прокся официальная (прописана в браузере), то она должна поддерживать метод CONNECT — с помощью которого браузер работает по HTTPS — ведь там тоже используется передача бинарных данных.
— если это NAT — то он просто завернет подключение и никто этого не заметит.
— самый сложный случай будет в случае «прозрачной прокси», когда все текущее на 80 порт заворачивается на сквид или другой прокси-сервер — здесь уже как он отработает. Впрочем я не исключаю, что в скором времени они научатся поддерживать веб сокеты.
> и касательно ограничения одновременных соединений — вы уверены, что оно прописано именно в
> стандарте HTTP? Почему тогда у каждого браузера своё ограничение?
Могу путать, но где-то проскавала цифра 2 или 4.
Конечно, это не жесткое ограничение — никто не мешает на своем фаерфоксе поставить цифру побольше. Однако есть некоторое официально рекомендованное значение, чтобы вы ненароком сервер не уронили.
> соединения websocket, раз уж они так сильно похожи на обычные http-запросы?
В споре кривизны с прямизной, однозначно победит кривизна :)
С проксями получается такая ситуация:
— если прокся официальная (прописана в браузере), то она должна поддерживать метод CONNECT — с помощью которого браузер работает по HTTPS — ведь там тоже используется передача бинарных данных.
— если это NAT — то он просто завернет подключение и никто этого не заметит.
— самый сложный случай будет в случае «прозрачной прокси», когда все текущее на 80 порт заворачивается на сквид или другой прокси-сервер — здесь уже как он отработает. Впрочем я не исключаю, что в скором времени они научатся поддерживать веб сокеты.
> и касательно ограничения одновременных соединений — вы уверены, что оно прописано именно в
> стандарте HTTP? Почему тогда у каждого браузера своё ограничение?
Могу путать, но где-то проскавала цифра 2 или 4.
Конечно, это не жесткое ограничение — никто не мешает на своем фаерфоксе поставить цифру побольше. Однако есть некоторое официально рекомендованное значение, чтобы вы ненароком сервер не уронили.
Подскажите мне, неспециалисту, а чем это принципиально отличается от того, что сейчас реализовано во Flash? Насколько я понимаю (поправьте, если ошибаюсь), Flash уже давно может устанавливать асинхронные TCP соединение? YouTube, Augmented reality, игрушки всякие?
тем, что это будет работать даже на тех устройствах, о которых не подозревают менеджеры Adobe
UFO just landed and posted this here
Рискну уйти глубоко в минус по рейтингу, но можете чуть поподробнее почему флэш является хаком? Я, к сожалению, больше по desktop решениям, но websockets даже для них открывает широчайшие перспективы :).
Да, мы делали транспортную часть между Javascript-приложением на flash. В итоге от неё отказались по двум причинам:
Разумеется, кроме флэша была и другая реализация двустороннего обмена данными.
- — Из-за глюков flash раз в неделю падал весь браузер с SIGSEGV (или как оно в винде называется?), что сильно расстраивало пользователей.
- — У кого есть флэш, обычно включен флэшблок. То есть включить наш, естественно, невидимый, флэш он не сможет.
Разумеется, кроме флэша была и другая реализация двустороннего обмена данными.
> Пока я не нашел открытых веб-сокет сервисов
www.mibbit.com/
> качать на свой компьютер демо-пример вебсокетов на php
А еще есть Jetty, Cometd, Orbited, Lightstreamer
Полный список технологий и серверов есть тут: cometdaily.com/maturity.html
www.mibbit.com/
> качать на свой компьютер демо-пример вебсокетов на php
А еще есть Jetty, Cometd, Orbited, Lightstreamer
Полный список технологий и серверов есть тут: cometdaily.com/maturity.html
Это всё таки суррогаты, а не полноценные сокеты
> www.mibbit.com/
А где оно там используется? Сходу не заметил
> А еще есть…
Вы правы — сейчас появится много серверов с поддержкой WebSockets — некоторые команды уже реализовали ее.
А где оно там используется? Сходу не заметил
> А еще есть…
Вы правы — сейчас появится много серверов с поддержкой WebSockets — некоторые команды уже реализовали ее.
А как будет происходить проверка на целостность пакетов?
WebSockets — гвоздь в гроб IE.
Не уверен, что другие компании действительно быстро подтянутся. Хром заставил зашевелиться остальных из-за того, что при переходе на него пользователь сразу получал существенные преимущества.
Для использования же WebSockets веб-приложения должны писаться в рассчете на них. Пока эта технология не будет поддерживаться браузерами большинства пользователей — этого не будет. Пока не будет достаточно большого количества таких приложений — производителям других браузеров беспокоиться смысла нет.
Получится ситуация в чем-то аналогичная связанной с IE6: из-за его популярности его все (почти) поддерживают, а то, что в нем работает большинство сайтов поддерживает его популярность.
Если 95% сайтов перестанут поддерживать IE6 — его популярность мгновенно упадет почти до нуля. Если 95% сайтов будут требовать WebSockets — браузеры, его не поддерживающие, очень быстро потеряют пользователей.
Но конкретный сайт, не поддерживающий IE6 из-за этого потеряет посетителей. Конкретный сайт, требующий WebSockets — тоже.
Возможно, некоторым компромиссом будет реализация двух вариантов — с сокетами и без них (или использование того же web-socket-js).
Но:
1. Это сложнее, чем сделать что-то одно.
2. Такая ситуация мало чем угрожает браузерам, не поддерживающим сокеты.
Разве что в браузерах, поддерживающих сокеты, можно будет делать что-то существенно лучшее, чем без них.
Чем ситуация будет принципиально отличаться от, скажем, canvas? Он уже работает во всех основных браузерах, кроме IE. И часто его встретишь где-то кроме демонстрационных страничек?
Для использования же WebSockets веб-приложения должны писаться в рассчете на них. Пока эта технология не будет поддерживаться браузерами большинства пользователей — этого не будет. Пока не будет достаточно большого количества таких приложений — производителям других браузеров беспокоиться смысла нет.
Получится ситуация в чем-то аналогичная связанной с IE6: из-за его популярности его все (почти) поддерживают, а то, что в нем работает большинство сайтов поддерживает его популярность.
Если 95% сайтов перестанут поддерживать IE6 — его популярность мгновенно упадет почти до нуля. Если 95% сайтов будут требовать WebSockets — браузеры, его не поддерживающие, очень быстро потеряют пользователей.
Но конкретный сайт, не поддерживающий IE6 из-за этого потеряет посетителей. Конкретный сайт, требующий WebSockets — тоже.
Возможно, некоторым компромиссом будет реализация двух вариантов — с сокетами и без них (или использование того же web-socket-js).
Но:
1. Это сложнее, чем сделать что-то одно.
2. Такая ситуация мало чем угрожает браузерам, не поддерживающим сокеты.
Разве что в браузерах, поддерживающих сокеты, можно будет делать что-то существенно лучшее, чем без них.
Чем ситуация будет принципиально отличаться от, скажем, canvas? Он уже работает во всех основных браузерах, кроме IE. И часто его встретишь где-то кроме демонстрационных страничек?
Можно было букв поменьше
:-)
Исходя из общеизвестной страсти MS к Google, проигнорирует ли MS данную инициативу?
Если да, то прекрасное так и останется далеко…
:-)
Исходя из общеизвестной страсти MS к Google, проигнорирует ли MS данную инициативу?
Если да, то прекрасное так и останется далеко…
Учитывая ещё, что в половине сайтов простой Javascript глючит :)
Для использования же WebSockets веб-приложения должны писаться в рассчете на них. Пока эта технология не будет поддерживаться браузерами большинства пользователей — этого не будет
С Гугла станется наплевать на поддержку и начать внедрять вебсокеты с graceful fallback до обычных Ajax/Comet. Тут опять же пользователи браузеров с поддержкой WS окажутся в выигрыше.
Продвигают в массы технологии, нужные для Google Wave :D
Я что-то не нашел в этом ssl…
Теперь рекламу пользователю будут вдувать еще и через сокеты.
Я думаю, что это мрачное пророчество ещё не скоро сбудется.
Чего-то я не видел, например, баннеров, нарисованныхна холсте <canvas> для обхода Adblock Plus.
Чего-то я не видел, например, баннеров, нарисованных
Я думаю после внедрения веб сокетов и полноценного HTML5 и CSS3 то Google Wave выстрелит так как будет менее ресурсоемкое и более шустрое, да и по идее вебсокеты будут жрать меньше ресурсов сервера да и юзера
Если бы еще по дефолту все бы жалось в gzip…
Если бы еще по дефолту все бы жалось в gzip…
Не каждый сервер выдержит столько соединений одновременно поддерживать
За-ме-ча-тель-но!
Буквально с неделю назад крепко думал, что из-за намеренной неравноправности клиентов и серверов, появившейся черте-когда на тогдашних основаниях и причинах, нынче приходится пользовать какие-то убогие костыли. Рад, что гугл со мной солидарен :D
Буквально с неделю назад крепко думал, что из-за намеренной неравноправности клиентов и серверов, появившейся черте-когда на тогдашних основаниях и причинах, нынче приходится пользовать какие-то убогие костыли. Рад, что гугл со мной солидарен :D
Манипулируя где? Эти заголовки нужны для защиты от сайтов злоумышленников, открываемых пользователем в том же браузере. А за корректностью этих заголовков будет следить сам браузер пользователя.
Поэтому, чтобы манипулировать этими заголовками нужно или вмешаться в код браузера, или в поток данных между пользователем и сервером… но если вы можете это сделать, то зачем вам заниматься такой ерундой, как подделка заголовков, если вы и так имеете доступ ко всем данным пользователя?)
Поэтому, чтобы манипулировать этими заголовками нужно или вмешаться в код браузера, или в поток данных между пользователем и сервером… но если вы можете это сделать, то зачем вам заниматься такой ерундой, как подделка заголовков, если вы и так имеете доступ ко всем данным пользователя?)
например какой то forex.com отдает какую то статистику только для своего домена, что будет мне мешать получать эту статистику?
За 5 мин напишу промежуточный модуль который будет получать эти данные подменяя Origin, и после получения данных выводить информацию непосредственно уже на свой сайт.
Клиент -> Мой сервер -> подмена Origin -> forex
forex -> Мой сервер -> Клиент
И не нужно никого взламывать и ломать.
За 5 мин напишу промежуточный модуль который будет получать эти данные подменяя Origin, и после получения данных выводить информацию непосредственно уже на свой сайт.
Клиент -> Мой сервер -> подмена Origin -> forex
forex -> Мой сервер -> Клиент
И не нужно никого взламывать и ломать.
>И еще один «камень в ботинке» AJAX-разработчика — проблемы с кросс-доменными приложениями. Да, и для них тоже придумана масса хаков. Помашем им ручкой и смахнем скупую слезу. WebSockets не имеет таких ограничений. Ограничения вводятся не по принципу «из-того-же-источника», а из «разрешенного-источника», и определяются не на клиенте, а на сервере. Думаю, внимательные уже заметили новый заголовок Origin.
БЕЗОПАСНОСТЬ ВПЕРДЕ!
БЕЗОПАСНОСТЬ ВПЕРДЕ!
Где-где безопасность?
ВПЕРДЕ!
Что определит сервер, если клиент окажется злоумышленным и подсунет некорректный Origin?
Что определит сервер, если клиент окажется злоумышленным и подсунет некорректный Origin?
О чем и речь.
Особенно если подсунет корректный Origin :-(
Работать это будет только если «разрешенный источник» будет знать про данный конкретный Origin. Иными словами домены по вопросу данного клиента должны между собой перепихнутся. И чем этот перепих лучше тупого проксирования?
Особенно если подсунет корректный Origin :-(
Работать это будет только если «разрешенный источник» будет знать про данный конкретный Origin. Иными словами домены по вопросу данного клиента должны между собой перепихнутся. И чем этот перепих лучше тупого проксирования?
По-моему, это слишком похоже на нынешний Referer. Те, кто пытается ограничивать людей только по этому признаку — теряют посетителей из поисковиков и сливают достаточно тупым ботам, не получив никакой выгоды в замен. Видимо, эта хрень тоже будет использоваться только в сочетании с дополнительными обвязками.
Да, Origin присылается браузером, то есть потанциально его можно сфабриковать.
Но тут такая картина — из яваскрипта его изменить нельзя, браузер сам пришет что нужно. Если вы взломали браузер — то вы сможете слать что угодно — здесь уже не до проверки Origin-a. То есть такая схема не добавляет новой уязвимости, но дает больше возможностей.
Но тут такая картина — из яваскрипта его изменить нельзя, браузер сам пришет что нужно. Если вы взломали браузер — то вы сможете слать что угодно — здесь уже не до проверки Origin-a. То есть такая схема не добавляет новой уязвимости, но дает больше возможностей.
Нее. У меня нету :)
Может быть, я не понимаю чего-то связанного с AJAX — но чем такая модель хуже нынешней? Браузер, думаю, не должен позволять менять Origin, а своими средствами в любом случае можно отправить какие угодно заголовки куда угодно
>Браузер, думаю, не должен позволять менять Origin
а еще браузер не должен позолять троллям троллить, а детям качать порно.
а еще браузер не должен позолять троллям троллить, а детям качать порно.
Разве? Так как эти ограничения невозможно сформулировать достаточно строго, то их невозможно реализовать, а значит браузер и не обязан этого делать.
Браузер же обязан не позволять перезагружать компьютер или подключаться с помощью XHTTPRequest к другим доменам?
Браузер же обязан не позволять перезагружать компьютер или подключаться с помощью XHTTPRequest к другим доменам?
Про троллей это Вы хорошо сказали
а при большой нагрузке, увеличение количества запросов, сервер разве не положат?
UFO just landed and posted this here
Почему квази? С лонгполом реальный реалтайм — есть данные, тут же и получаешь.
Для этого специальные сервера используются, не те, где тред на соединение. Вот к примеру nginx — благодаря тому, что один поток в нем обслуживает множество клиентов, он и скромен в потребностях.
Уверены, что тред а не процесс? Насколько я знаю nginx создает мало процессов, но сами процессы генерируют треды. А создание процесса — как раз и есть ресурсоемкая операция, в отличие от треда.
Не совсем, Nginx не создает ни процессов, ни потоков для соединения. Потому что при большом кол-ве соединений, обе эти операции очень быстро съедят все ресурсы системы. Вместо этого он в рабочем процессе хранит дескрипторы всех соединений и опрашивает их. Подробнее описано в методе epoll.
Вы уверены? Даже в случае с epoll основной тред не сможет читать сразу из большого числа соединений. Операция чтения из буфера, конечно, быстрая, но не когда у тебя, скажем 500 буферов получили данные. Могу ошибаться.
Почему не сможет? Разве это большая нагрузка прочитать в цикле 500 дескрипторов?
Весь вопрос в том, с чем это сравнивать. Если вы разобьете приложение на 500 тредов, то все равно у вас будет 500 буферов, которые надо прочитать, то есть объем работы это никак не уменьшит. Но наоборот добавится работа по шедулингу (пардон за слово, не подскажете нормальный русский перевод?) всех этих тредов. Плюс возрастут расходы памяти на всевозможные таблицы для хранения служебной информации и т.п. То есть нагрузка серьезно возрастет.
Тредами и даже процессами можно делать, если они сами «дешевые» и легкие. Например, в Erlang VM процессы отъедают меньше 1400 байт для хранения одного процесса в таблице. Такие процессы быстро запускаются и работают, они смогут без проблем держать тысячи соедиений. В более привычных языках есть аналоги green threads в java, taskets в python.
Весь вопрос в том, с чем это сравнивать. Если вы разобьете приложение на 500 тредов, то все равно у вас будет 500 буферов, которые надо прочитать, то есть объем работы это никак не уменьшит. Но наоборот добавится работа по шедулингу (пардон за слово, не подскажете нормальный русский перевод?) всех этих тредов. Плюс возрастут расходы памяти на всевозможные таблицы для хранения служебной информации и т.п. То есть нагрузка серьезно возрастет.
Тредами и даже процессами можно делать, если они сами «дешевые» и легкие. Например, в Erlang VM процессы отъедают меньше 1400 байт для хранения одного процесса в таблице. Такие процессы быстро запускаются и работают, они смогут без проблем держать тысячи соедиений. В более привычных языках есть аналоги green threads в java, taskets в python.
Да, в итоге не понятно, в чём отличие от обычного Comet, кроме дополнительного заголовка и готового js-api.
Хотя бы в том, что соединение не переоткрывается после отправки сообщения.
1) WebSockets заявляется как элемент стандарта HTTP, а Comet — нет.
2) comet — более собирательный термин. en.wikipedia.org/wiki/Comet_(programming) даёт 6 вариантов имплементации
2) comet — более собирательный термин. en.wikipedia.org/wiki/Comet_(programming) даёт 6 вариантов имплементации
Т.е. это седьмой вариант имплементации. Пока не очень понятен номер версии стандарта HTTP, в который попадают WebSockets ;-)
WebSockets — часть HTML5, не HTTP.
UFO just landed and posted this here
Супер :) Пошёл ковырять.
Осталось дать клиентам возможность слушать соединения, и можно делать P2P-Интернет.
Opera unite. Если сделают поддержку websockets то это будет… у-у-у-у… O_O
Я имею в виду именно JS-команду «слушать порт».
Например, открывая YouTube клиент получает JS со списком пиров и ф-цией проверки хеша, пытается соединиться с пирами, качает контент, проверяет хеш. Если соединиться быстро не получается — запрос на видео отправляется самому YouTube.
Например, открывая YouTube клиент получает JS со списком пиров и ф-цией проверки хеша, пытается соединиться с пирами, качает контент, проверяет хеш. Если соединиться быстро не получается — запрос на видео отправляется самому YouTube.
Это должны было быть еще с начала существования протокола, я все время удивлялся почему не так, когда появился Аякс стало легче, а теперь только сделают по человечески.
Очень крутая новость для разработчиков streaming-платформ, отличная технология на замену Reverse-AJAX с фреймом, яхуу :)
Вот, делал для себя, Websockets Protocol для Twisted
bitbucket.org/rushman/tx-websockets/src/
bitbucket.org/rushman/tx-websockets/src/
Скажите, чем это кардинально отличается от server-side events, которые появились в Opera 9?
my.opera.com/WebApplications/blog/show.dml/438711
my.opera.com/WebApplications/blog/show.dml/438711
кардинальное отличие только одно — web socket это скорее транспортный уровень, он не определяет формат данных внутри пакета, а server-side events в некоторой степени определяют
В server-side events передаются произвольные данные.
если мне не изменяет память, там описан приблизительно такой формат:
event: test-event
data: lorem ipsum
data: lorem ipsum
data: lorem ipsum
это немного более подробное описание, чем у вебсокета
кроме того, вроде бы SSE не позволяет передавать бинарные данные
event: test-event
data: lorem ipsum
data: lorem ipsum
data: lorem ipsum
это немного более подробное описание, чем у вебсокета
кроме того, вроде бы SSE не позволяет передавать бинарные данные
Кодировать никто не мешает. Делать escape/unescape, base64, чтоугодноещё.
ага, но это дополнительная нагрузка, увеличение объёма и прочие радости — никак не бинарные данные
в общем, на нижнем уровне возможностей у web socket побольше, а про верхний, где вызов обработчиков для события с конкретным именем, он ничего не говорит, но это легко эмулируется
в общем, я рад, что теперь уже два браузера (а скоро три, если сафари подтянется) нативно поддерживают серверные события
в общем, на нижнем уровне возможностей у web socket побольше, а про верхний, где вызов обработчиков для события с конкретным именем, он ничего не говорит, но это легко эмулируется
в общем, я рад, что теперь уже два браузера (а скоро три, если сафари подтянется) нативно поддерживают серверные события
JS, в общем виде, ещё мало что умеет делать с бинарными данные. Зачем они пока в браузере? Кроме того, экранировать надо всего ничего — несколько символов.
Не стал сюда примешивать Server-Sent Events, чтобы не раздувать статью.
Ключевое отличие в том, что SSE — это попытка «легализации» комета с лонг-поллингом — он работает поверх HTTP и имеет все те же проблемы, что его «родители». В частности даже официальная дока говорит о том, что прокси серверы могут закрывать неактивное соединение, поэтому периодически надо отправлять пустые сообщения. SSE — пассивный протокол, браузер «подписывается» на сообщения и дальше просто слушает, что ему пришлют. Самой интересной вещью в нем является контроль потока сообщений, если соединение вдруг разорвалось, то при возобновлении браузер передаст Last-Event-Id и передача начнется с того же места.
WebSockets же кардинально новая вещь — он работает как бы «сбоку» от HTTP на чистом TCP и ему ничего не мешает. Это протокол с 2 активными участниками — оба асинхронно обмениваются сообщениями. Вы можете не только получать сообщения, но и отправлять свои по тому же самому каналу.
С помощью WebSockets можно реализовать функционал SSE, причем работать это будет чуть ли не лучше оригинала. А вот наоборот не получится.
Поэтому, на мой взгляд, SSE уже потерял актуальность. Лично я не хочу тратить на него свое время.
Кстати, если говорить про реализацию в Опере 9, то она не идеальна — в стандарте предусмотрено название тега eventsource, а в опере тег называется event-source
Ключевое отличие в том, что SSE — это попытка «легализации» комета с лонг-поллингом — он работает поверх HTTP и имеет все те же проблемы, что его «родители». В частности даже официальная дока говорит о том, что прокси серверы могут закрывать неактивное соединение, поэтому периодически надо отправлять пустые сообщения. SSE — пассивный протокол, браузер «подписывается» на сообщения и дальше просто слушает, что ему пришлют. Самой интересной вещью в нем является контроль потока сообщений, если соединение вдруг разорвалось, то при возобновлении браузер передаст Last-Event-Id и передача начнется с того же места.
WebSockets же кардинально новая вещь — он работает как бы «сбоку» от HTTP на чистом TCP и ему ничего не мешает. Это протокол с 2 активными участниками — оба асинхронно обмениваются сообщениями. Вы можете не только получать сообщения, но и отправлять свои по тому же самому каналу.
С помощью WebSockets можно реализовать функционал SSE, причем работать это будет чуть ли не лучше оригинала. А вот наоборот не получится.
Поэтому, на мой взгляд, SSE уже потерял актуальность. Лично я не хочу тратить на него свое время.
Кстати, если говорить про реализацию в Опере 9, то она не идеальна — в стандарте предусмотрено название тега eventsource, а в опере тег называется event-source
WebSocket работает вполне себе на том же HTTP, никакого «боку», не вводите людей в заблуждение, это всего лишь расширение протокола.
В частности даже официальная дока говорит о том, что прокси серверы могут закрывать неактивное соединение, поэтому периодически надо отправлять пустые сообщенияЭто недостаток SSE? Но он же есть и в WebSockets. Или WebSockets соединения прокси почему-то не будут закрывать?
Поэтому, на мой взгляд, SSE уже потерял актуальность. Лично я не хочу тратить на него свое время.Вы как-то очень уж горячо взялись пропагандировать WebSockets и гнать от себя SSE. Вы знаете, что, например, существуют прокси и firewalls, которые режут незнакомые (да и некоторые знакомые, например, Accept-Encoding) заголовки? Как WebSockets будут чувствовать себя с таким софтом. Если мне не изменяет память, это около 10% всех подключений.
Кстати, если говорить про реализацию в Опере 9, то она не идеальна — в стандарте предусмотрено название тега eventsource, а в опере тег называется event-sourceСтандарт меняется. Это ещё не релиз.
> WebSocket работает вполне себе на том же HTTP, никакого «боку», не вводите людей в
> заблуждение, это всего лишь расширение протокола.
WebSockets использует HTTP только для коннекта дальше идет чистая TCP-сессия, SSE — на всем протяжении сессии для транспорта.
> Это недостаток SSE? Но он же есть и в WebSockets. Или WebSockets соединения прокси почему-
> то не будут закрывать?
WebSockets через прокси идет как бинарный трафик (метод CONNECT), SSE как чистый HTTP.
> Вы как-то очень уж горячо взялись пропагандировать WebSockets и гнать от себя SSE.
Возможно. SSE оригинальная технология, но это «половинчатое решение», по сути «легализация» уже существующего со всеми их проблемами. WebSockets — кардинальный шаг вперед — я выше описал.
Разработчики уделили пробиваемости проксей немало времени.
> Стандарт меняется. Это ещё не релиз.
Это серьезная проблема. Стандарт еще не готов, а уже устарел. Необходимость в нем уже отпала. Когда он выйдет, WebSockets захватит рынок.
> заблуждение, это всего лишь расширение протокола.
WebSockets использует HTTP только для коннекта дальше идет чистая TCP-сессия, SSE — на всем протяжении сессии для транспорта.
> Это недостаток SSE? Но он же есть и в WebSockets. Или WebSockets соединения прокси почему-
> то не будут закрывать?
WebSockets через прокси идет как бинарный трафик (метод CONNECT), SSE как чистый HTTP.
> Вы как-то очень уж горячо взялись пропагандировать WebSockets и гнать от себя SSE.
Возможно. SSE оригинальная технология, но это «половинчатое решение», по сути «легализация» уже существующего со всеми их проблемами. WebSockets — кардинальный шаг вперед — я выше описал.
Разработчики уделили пробиваемости проксей немало времени.
> Стандарт меняется. Это ещё не релиз.
Это серьезная проблема. Стандарт еще не готов, а уже устарел. Необходимость в нем уже отпала. Когда он выйдет, WebSockets захватит рынок.
WebSockets использует HTTP только для коннекта дальше идет чистая TCP-сессия, SSE — на всем протяжении сессии для транспорта.В любом случае, это протокол внутри HTTP, а не TCP.
WebSockets через прокси идет как бинарный трафик (метод CONNECT), SSE как чистый HTTP.prooflink?
Разработчики уделили пробиваемости проксей немало времени.Что они сделали для этого, я не увидел?
Это серьезная проблема. Стандарт еще не готов, а уже устарел. Необходимость в нем уже отпала. Когда он выйдет, WebSockets захватит рынок.Так часто бывает с вещами, которые вышли до окончательного принятия стандарта. Вы, видимо, просто не следите за реализациями в браузере вещей из WHATWG.
> В любом случае, это протокол внутри HTTP, а не TCP.
Протокол начинается как HTTP, а дальше работает по чистому TCP. Разработчики спецаиально сделали его похожим на HTTP, чтобы было проще использовать, и иметь меньше проблем с фаерволами, открытыми портами и всем прочим. Даже так скажу: изначально для него предполагался порт 81 (и 815 для шифрованного аналога WSS). Но в дальнейшем решили, что начинать надо по HTTP-шному, поэтому в текущей редакции выбраны 80 и 443 порты.
> prooflink?
Официальная дока: tools.ietf.org/html/draft-hixie-thewebsocketprotocol-68#section-4.1
Вот про SSE:
Значит надо готовить два «вантуза»: один 2-килобайтный, другой 15-секундный?
> Так часто бывает с вещами, которые вышли до окончательного принятия стандарта.
Да. Хотя я понимаю компании, им очень хочется быть первыми и объявить о новой фиче, чтобы привлечь пользователей. Но веб такая отрасль — здесь нельзя быть лучшим в одиночку. Весь веб — это взаимодействие участников на всех уровнях и во всех видах. Что толку от того, что кто-то поддерживает сверхмодный язык типа того же Jscript, если никто больше его не использует?
Протокол начинается как HTTP, а дальше работает по чистому TCP. Разработчики спецаиально сделали его похожим на HTTP, чтобы было проще использовать, и иметь меньше проблем с фаерволами, открытыми портами и всем прочим. Даже так скажу: изначально для него предполагался порт 81 (и 815 для шифрованного аналога WSS). Но в дальнейшем решили, что начинать надо по HTTP-шному, поэтому в текущей редакции выбраны 80 и 443 порты.
> prooflink?
Официальная дока: tools.ietf.org/html/draft-hixie-thewebsocketprotocol-68#section-4.1
EXAMPLE: For example, if the user agent uses an HTTP proxy
for all traffic, then if it was to try to connect to port 80
on server example.com, it might send the following lines to
the proxy server:
CONNECT example.com:80 HTTP/1.1
Host: example.com
If there was a password, the connection might look like:
CONNECT example.com:80 HTTP/1.1
Host: example.com
Proxy-authorization: Basic ZWRuYW1vZGU6bm9jYXBlcyE=
Otherwise, if the user agent is not configured to use a proxy,
then open a TCP/IP connection to the host given by /host/ and
the port given by /port/.
Вот про SSE:
As currently specified in
www.w3.org/html/wg/html5/#server-sent-events, HTTP proxies may buffer
fragments of the HTTP response, because they may legitimately assume that an
entire HTTP response is expected by the browser. This buffering behavior is
clearly bad for the end-to-end latency of message delivery and should be
avoided if possible.
7.2.5 Notes
Legacy proxy servers are known to, in certain cases, drop HTTP connections after a short timeout. To protect against such proxy servers, authors can include a comment line (one starting with a ':' character) every 15 seconds or so.
Значит надо готовить два «вантуза»: один 2-килобайтный, другой 15-секундный?
> Так часто бывает с вещами, которые вышли до окончательного принятия стандарта.
Да. Хотя я понимаю компании, им очень хочется быть первыми и объявить о новой фиче, чтобы привлечь пользователей. Но веб такая отрасль — здесь нельзя быть лучшим в одиночку. Весь веб — это взаимодействие участников на всех уровнях и во всех видах. Что толку от того, что кто-то поддерживает сверхмодный язык типа того же Jscript, если никто больше его не использует?
> Кстати, если говорить про реализацию в Опере 9, то она не идеальна — в стандарте предусмотрено название тега eventsource, а в опере тег называется event-source
знали бы вы, сколько раз стандарт переписывался с момента реализации в опере, не называли бы его стандартом; ) Собственно, этого и нельзя делать, потому что он ещё не принят
знали бы вы, сколько раз стандарт переписывался с момента реализации в опере, не называли бы его стандартом; ) Собственно, этого и нельзя делать, потому что он ещё не принят
Знаю :)
Поэтому считаю, что оперщики поспешили с реализацией. Легко может возникнуть такая ситуация, что кто-то такой же сверхбыстрый использует это в своем сервисе, который будет постоянно ломаться.
Поэтому считаю, что оперщики поспешили с реализацией. Легко может возникнуть такая ситуация, что кто-то такой же сверхбыстрый использует это в своем сервисе, который будет постоянно ломаться.
кстати, не напомните, разве в SSE есть возможность двустороннего обмена данными по одному каналу? в WS вроде есть, это тоже может сойти за кардинальное отличие
Нет, такой возможности нет. А в чём разница с практической точки зрения? Разве что скорость прохода команды. Но ведь у WebSocket есть огромный недостаток — он расширяет протокол HTTP, значит его будут резать некоторые прокси и firewallы (есть такие, которые режут всё незнакомое и часть знакомого), таких, кстати, около 10%.
скорость прохода команды, да, плюс уменьшение накладных расходов для постоянного потока команд
что касается злых фаерволов и проксей: они будут в любом случае, но сейчас они рвут соединения и буферизуют данные, а у WS будут резать лишние заголовки, так что шило меняется на мыло, и разницы большой нет
что касается злых фаерволов и проксей: они будут в любом случае, но сейчас они рвут соединения и буферизуют данные, а у WS будут резать лишние заголовки, так что шило меняется на мыло, и разницы большой нет
При этом SSE будет работать и тут, а WebSockets — нет.
если вспомнить двухкилобайтный буфер, то наверное лучше никак не работать, чем как SSE через такой буфер: )
вы станете спорить, что WS даёт больше возможностей ценой меньшей надёжности?
вы станете спорить, что WS даёт больше возможностей ценой меньшей надёжности?
Возможностей столько же. Просто получить их можно меньшей ценой. А вот то, что WS не будет работать у 10% всех пользователей — очень плохо.
вы недавно признали, что двустороннего обмена данными у SSE нет — и это означает, что у SSE возможностей меньше, а теперь говорите, что их столько же
Не приписывайте мне лишнего. Я признал, что двустороннего обмена по одному каналу нет.
arty: кстати, не напомните, разве в SSE есть возможность двустороннего обмена данными по одному каналу?
bolk: Нет, такой возможности нет.
bolk: Нет, такой возможности нет.
Именно это я и сказал — у SSE нет возможности двухстороннего обмена по одному каналу.
а по двум есть?
Если мы говорим о рамках именно SSE — то нет, просто открывается канал любым другим способом. Ограничений-то нет.
представьте, что я делаю многопользовательский шутер в браузере. Как мне передавать информацию о движениях пользователя 10 раз в секунду, не используя WS?
WebSockets тут тоже вряд ли подойдёт. Обрывы будут. Кроме того, я же не говорю, что WebSockets бесполезны. Я говорю, что их переоценили, а SSE недооценили.
в хороших условиях WS тут подойдёт. И именно поэтому я говорю, что у WS больше возможностей, но меньше надёжности. Вы продолжите утверждать, что возможностей у WS не больше, а столько же?
Я продолжаю утверждать, что достоинства WS перед SSE уравновешиваются недостатками.
то есть, вы согласны с моими словами многими комментариями выше, что WS даёт больше возможностей ценой меньшей надёжности? Я тогда не говорил, что эти новые возможности уравновешиваются меньшей надёжностью, но я с этим согласен.
Да.
Надеюсь, вы согласны, что SSE даёт больше надёжности, ценой меньшей возможности?
Надеюсь, вы согласны, что SSE даёт больше надёжности, ценой меньшей возможности?
конечно, согласен : )
к этому результату мы могли бы прийти намного раньше, если бы вы тогда не стали утверждать, что возможностей у SSE столько же, а просто сказали, что бо́льшая надёжность оправдывает SSE ; )
к этому результату мы могли бы прийти намного раньше, если бы вы тогда не стали утверждать, что возможностей у SSE столько же, а просто сказали, что бо́льшая надёжность оправдывает SSE ; )
Почему я тогда должен был так говорить? Я так считал.
В чем большая надежность SSE?
Last-Event-Id?
Его можно сделать с помощью WebSockets — просто в случае обрыва канала передать номер последнего сообщения и продолжить получать данные.
Last-Event-Id?
Его можно сделать с помощью WebSockets — просто в случае обрыва канала передать номер последнего сообщения и продолжить получать данные.
в неиспользовании новых http-заголовков
Вы имеете ввиду надежность сессии или вероятность проблем при ее установлении?
я имею в виду надёжность технологии, которая среди прочего включает в себя и вероятность проблем при установлении сессии
Что касается установления, то проблемы должны решаться со временем, когда больше проксей будет настраиваться под WS. Хотя разрабы протокола писали, что они оптимизировали его под большую «пробиваемость».
А сама сессия, тоже должна быть надежнее. Хотя бы из-за отсутствия необходимости в «вантузах» для пробивания проксей.
А сама сессия, тоже должна быть надежнее. Хотя бы из-за отсутствия необходимости в «вантузах» для пробивания проксей.
я не уверен, что время тут поможет, и полагаю, что за последние лет пять ситуация с проксями лучше не стала
Мне нравится, что разрабы об этом подумали заранее: через прокси сессия должна устанавливаться как бинарная (метод CONNECT – по аналогии с HTTPS) либо использовать SOCKS-прокси.
а у вебсокета есть .send()
Гм, и что тут оригинального? И какой с этом всего смысл, пока оно не станет поддерживаться всеми браузерами (а главное, серверами)?
Портов-то в системе не так и много, насколько я знаю, если проект высокопосещаемый и будет держать открытыми все коннекты — это ж сколько их потребуется?
А закрывать сервер соединение будет только если клиент пошлет определенный запрос? Ололо, заддосить сервера стало еще проще?
Да и как-то не считаю я это великим прогрессом, мир от этого сильно не изменится, просто программисты станут еще ленивее. Я лично хочу сам делать запросы, а не подходить к компьютеру и видеть, что сервер моему клиенту послал пару гигабайт не понятно чего, а клиент ему ответил еще большим :)
А закрывать сервер соединение будет только если клиент пошлет определенный запрос? Ололо, заддосить сервера стало еще проще?
Да и как-то не считаю я это великим прогрессом, мир от этого сильно не изменится, просто программисты станут еще ленивее. Я лично хочу сам делать запросы, а не подходить к компьютеру и видеть, что сервер моему клиенту послал пару гигабайт не понятно чего, а клиент ему ответил еще большим :)
Исходящих — 65к. Входящих на один и тот же порт — сколько угодно. У меня на тестах Windows Server 2008 миллион (!!!) входящих TCP подключений держал
Я могу что-то путать, но мне казалось все время что сервер получает запрос на 80 порт (к примеру), берет свободный порт и оттуда уже общается с клиентом. Разве нет?
Не совсем. Есть порты, есть сокеты. С точки зрения операционной системы все соединения идут на 80-й порт. Операционная система на каждое такое входящее подключение выделяет сокет — с ним сервер и работает. По сути, для берклевских сокетов сервер выглядит следующим образом: создаем сокет, говорим операционке — «этот сокет на 80-м порту. Жди на него входящих подключений». Как только к нам подключаются, операцонка нам извещает — «подключились. Вот вам сокет подключения». И этих сокетов на входящие подключения может быть очень много, от операцонки зависит.
Спасибо, надо будет почитать что-нибудь по сетям, а то что-то у меня с ними совсем туго, похоже :(
Нет, соединение идентифицируется по паре port-IP.
Так если вы открыли страницу с чужого сайта — то он уже может послать сколько хочет информации через ajax.
Программисты, конечно, станут ленивее. Многие новые технологии придумываются исключительно для удобства программистов. Взять хотя бы языки высокого уровня)
Программисты, конечно, станут ленивее. Многие новые технологии придумываются исключительно для удобства программистов. Взять хотя бы языки высокого уровня)
Правилом хорошего тона станет вопрос от сервера:
«Я тут вам гиг хочу прислать, можно?» :)
«Я тут вам гиг хочу прислать, можно?» :)
Я всегда говорил, что рано или поздно HTTP вместе с HTML/js будет постепенно заменен на более мощную штуку. И первым, кто осуществит этот переход, станет гугл. Сначала это будет преподнесено как некое усовершенствование HTTP 1.1, а затем появятся и принципиально новые решения. Пионером в поддержке этих новшеств призван стать google chrome.
Я вашего восторга не разделяю. Обычная обёртка над Comet, которому сто лет в обед. «Опера» в девятой версии сделал то же самое — server-side events, никто, я уверен, из комментирующих даже не слышал об этом.
Не обычная. Если вы про long polling — то там достаточно много весит HTTP-заголовок запроса. Передавать его на каждый чих во многих случаях очень накладно. Плюс, насколько я понимаю, long polling пересоздает TCP подключение после каждого получения данных с сервера. А пересоздание TCP подключения это длительный процесс.
UFO just landed and posted this here
То есть, вы считаете, у Гугла они есть?
«Опера» не придумала этот стандарт, это часть стандарта WHATWG: www.whatwg.org/specs/web-apps/current-work/#scs-server-sent
«Опера» не придумала этот стандарт, это часть стандарта WHATWG: www.whatwg.org/specs/web-apps/current-work/#scs-server-sent
зря вы так, я их даже использовал; )
Восторга, собственно, никакого и не испытываю. И про замену HTTP я говорил в более глобальном контексте развития web, скажем так.
прокси серверы идут лесом?
ну и файрволы, наты
UFO just landed and posted this here
Часть файрволов/проксей всё-таки идут (точнее их клиенты) — есть софт, который режет все незнакомые заголовки.
Масса проки знают, что HTTP висеть открытым не может и будут грохать его как зависший
Ровно как и в случае с WebSockets.
О том и речь. Есть большая вероятность, что WebSockets будет нормально работать только «в теплице» на стенде, а в вебе, где большинство каналов спроектированы на «раз-два-конец связи», долгоиграющие коннекшены либо спровоцируют переделку инфраструктуры, либо станут крайне неюзабельны в связи с низкой надежностью.
По этому поводу (MMO real-time action app в брайзере) у разработчиков ТанкиОнлайн отличный доклад есть.
По этому поводу (MMO real-time action app в брайзере) у разработчиков ТанкиОнлайн отличный доклад есть.
Очень важное замечание. А ссылочкой на доклад не поделитесь?
Вечером, хорошо? А то я счас не могу найти.
Еще мне интересно вот что: как в WebSockets будет реализован load-balancing? Ведь для для существующего веба это делается достаточно просто как раз потому, что он stateless или практически stateless.
Еще мне интересно вот что: как в WebSockets будет реализован load-balancing? Ведь для для существующего веба это делается достаточно просто как раз потому, что он stateless или практически stateless.
Спасибо.
Load balancing можно сделать на основе round robin, когда несколько машин будут принимать подключения, после этого, конечно, клиент «привязывается» к конкретному серверу.
Раскидывать подключения можно как с помощью железяки (ну это всегда будет работать), DNS, или же просто установить один приемник, который будет делать 302 редирект на конкретный сервер.
Load balancing можно сделать на основе round robin, когда несколько машин будут принимать подключения, после этого, конечно, клиент «привязывается» к конкретному серверу.
Раскидывать подключения можно как с помощью железяки (ну это всегда будет работать), DNS, или же просто установить один приемник, который будет делать 302 редирект на конкретный сервер.
Ответил тут: habrahabr.ru/blogs/webdev/79038/#comment_2318631
UFO just landed and posted this here
Странно, когда Opera сделала поддержку Server Sent Events, которые по-большому-то счёту тоже самое (но нужны два канала связи, а не один, тем не менее обе штуки из HTML5), то бомбы не случилось… Вебдевы странные — если новую фишку двигают вендоры из вне США, то никому она нафиг не нужна…
UFO just landed and posted this here
Это не совсем так, и SSE это не совсем то же самое, что и WebSockets, даже обсудили.
Я знаю про различия (: Фишка не в них, фишка в том, что у гугла хороший маркетинг, а люди не любят оперу. С SSE много чего интересного можно было сделать, но не прижилось. А насчёт сокетов — дык их сначала заимплементили в WebKit, потом решили вынести из HTML5 (я считаю правильно) и вырезали из вебкита. Сейчас вот обратно вернули.
В Хроме все изменения сделаны в WebKit — а значит очень скоро появится поддержка в Safari.WebKit — это движок рендеринга.
Вы ничего не перепутали?
Ну вот, а совсем недавно кое-кто представлял свое comet-решение… Успел :)
Товарищи, можно пару вопросов?
А когда появится расширение в браузере, которое будет WebSocket сервером? Тогда Opera Unite RIP?
Пасибо.
А когда появится расширение в браузере, которое будет WebSocket сервером? Тогда Opera Unite RIP?
Пасибо.
1) Ответ на вопрос «когда» не знаю, оттого что не онейромант, не телепат, не хиромант, не огнищанин, не чревогадатель, не авгур, не теург, и так далее.
2) Думаю, что в случае чего Opera Unite проапгрейдят, и тем невозбранно достигнут желаемого.
2) Думаю, что в случае чего Opera Unite проапгрейдят, и тем невозбранно достигнут желаемого.
Какое же всё-таки неудачное название — WebSocket. На WebSocket нельзя написать веб-сервер.
Кстати, не переживайте из-за совместимости ;-) Мы с товарищем скоро сделаем флешку в несколько килобайт, и API для Javascript полностью совместимое с оригинальным объектом WebSocket. Будет работать во всех броузерах где есть флеш.
С технической точки зрения сравнивать WebSocket и AJAX безграмотно. WebSocket это описание конкретного интерфейса взаимодействия. AJAX это не более, чем принцип, подход к написания веб приложения (Гаррет, автор данного термина, вообще не программер). Реализован он может быть через XHR, через iframe.
Поэтому если автор претендует все же на техническую статьи, а не маркетинговый пиар, то стоило бы подумать об изменении статьи. Не забивайте себе мозг неправильными мыслями, не забивайте ложными концепциями головы другим.
Поэтому если автор претендует все же на техническую статьи, а не маркетинговый пиар, то стоило бы подумать об изменении статьи. Не забивайте себе мозг неправильными мыслями, не забивайте ложными концепциями головы другим.
А чуть точнее, где именно логические ошибки?
Ну и данная статья — вводная.
Ну и данная статья — вводная.
Ну конкретно меня зацепила строка «На мой взгляд, через некоторое время останется только 2 технологии: чистый AJAX и WebSockets.» Ну и по изложения складывается впечатление, что автор вкладывает в термин AJAX «юзерско-маркетинговое» понимание. Бог с ними с манагерами, им бы продать только понавесив красивых ярлычков, но технически образованные люди не должны так писать.
Под «чистым AJAX-ом» я подразумею AJAX без всех Комет-наворотов типа лонг-поллинга, стриминга, мультипарта и прочего. Все, что пытается расширить его дальше задумки.
XHR — это способ реализации, но опять же не единственный.
Кстати, XHR обозначает XmlHttpRequest, но только XML-ем там давно не пахнет.
XHR — это способ реализации, но опять же не единственный.
Кстати, XHR обозначает XmlHttpRequest, но только XML-ем там давно не пахнет.
>Кстати, XHR обозначает XmlHttpRequest, но только XML-ем там давно не пахнет.
И это вы мне говорите?
Нет ни чистого ни грязного AJAX. Есть просто подход при котором обновляется только часть страницы. Причем люди с прямыми руками реализовывали это на iframe+html+javascript еще в конце девяностых прошлого века.
Нельзя сравнивать белое с пушистым, AJAX с WebSockets, подход к написанию приложения с конкретным примером реализации.
И это вы мне говорите?
Нет ни чистого ни грязного AJAX. Есть просто подход при котором обновляется только часть страницы. Причем люди с прямыми руками реализовывали это на iframe+html+javascript еще в конце девяностых прошлого века.
Нельзя сравнивать белое с пушистым, AJAX с WebSockets, подход к написанию приложения с конкретным примером реализации.
> И это вы мне говорите?
Да, вам это интереснее всего говорить :)
Иногда так бывает, что человек очень преуспеет на каком-то направлении, и все новое воспринимается через привычный инструмент, поэтому не понимается и не принимается. Для принятия надо немного перестроить сознание. Точно так же как создание асинхронных сайтов потребовало нового мышления с элементами асинхронности, конкуренции и ситуации гонки. Так же и теперь с полу-асинхронного взгляда на вещи надо перейти к полностью асинхронному. :)
Я с вами соглашусь, что люди делали тоже самое с помощью IFrame уже давно. Но по большому счету (с точки зрения предназначения HTML, Frame и тп.) — это хак — то есть использование инструментов не по назначению. В дальнейшем это было стандартизовано и снабжено доп. фичами в виде XmlHttpRequest. И предназначено для частичного обновления страницы. В дальнейшем возникла необходимость обновлять часто и в неизвестное для клиента время. Пошли лонг-поллинги и прочее.
Но опять же, асинхронность в них довольно однобокая. Например, вы можете отправить одновременно 2 запроса? А 5?
Проблема в том, что принцип «запрос-ответ» все равно лежит в основе всего этого: от ифрейма прошлого века, до новейшего XHR.
Теперь же предлагется честная асинхронность. Уже нет ни «запросов», ни «ответов» — каждый говорит когда ему надо. Поэтому WebSockets не просто новая технология или название яваскриптовых объектов на странице, но еще и новая идеология.
Да, вам это интереснее всего говорить :)
Иногда так бывает, что человек очень преуспеет на каком-то направлении, и все новое воспринимается через привычный инструмент, поэтому не понимается и не принимается. Для принятия надо немного перестроить сознание. Точно так же как создание асинхронных сайтов потребовало нового мышления с элементами асинхронности, конкуренции и ситуации гонки. Так же и теперь с полу-асинхронного взгляда на вещи надо перейти к полностью асинхронному. :)
Я с вами соглашусь, что люди делали тоже самое с помощью IFrame уже давно. Но по большому счету (с точки зрения предназначения HTML, Frame и тп.) — это хак — то есть использование инструментов не по назначению. В дальнейшем это было стандартизовано и снабжено доп. фичами в виде XmlHttpRequest. И предназначено для частичного обновления страницы. В дальнейшем возникла необходимость обновлять часто и в неизвестное для клиента время. Пошли лонг-поллинги и прочее.
Но опять же, асинхронность в них довольно однобокая. Например, вы можете отправить одновременно 2 запроса? А 5?
Проблема в том, что принцип «запрос-ответ» все равно лежит в основе всего этого: от ифрейма прошлого века, до новейшего XHR.
Теперь же предлагется честная асинхронность. Уже нет ни «запросов», ни «ответов» — каждый говорит когда ему надо. Поэтому WebSockets не просто новая технология или название яваскриптовых объектов на странице, но еще и новая идеология.
2? 5? Я могу.
Могу уверить, WebSockets как технология абсолютно не нова. Флеш спокойно позволяет держать сокеты. В обычном сетевом, не веб мире, долгие коннекты вполне себе банальное действо. Но вот оно доползло до HTTP и все, революция. Ничуть. Поэтому я все же настаиваю, что в данном случае WebSockets это не более, чем описание интерфейса для старой технологии созданное для веба. Да, меня как разработчика это не может не радовать, но я то отлично понимаю, что это не вопрос создания новой технологии, а просто вопрос того, сколько крупных игроков поддержит эту реализацию (XHR поддержали очень многие и это стало очень быстро развиваться) и она уйдет в массы. Не более. Написать свое расширение HTTP на самом деле не проблема, возьмем, к примеру, WebDAV, проблема в том, на сколько это будет поддержано другими игроками.
Могу уверить, WebSockets как технология абсолютно не нова. Флеш спокойно позволяет держать сокеты. В обычном сетевом, не веб мире, долгие коннекты вполне себе банальное действо. Но вот оно доползло до HTTP и все, революция. Ничуть. Поэтому я все же настаиваю, что в данном случае WebSockets это не более, чем описание интерфейса для старой технологии созданное для веба. Да, меня как разработчика это не может не радовать, но я то отлично понимаю, что это не вопрос создания новой технологии, а просто вопрос того, сколько крупных игроков поддержит эту реализацию (XHR поддержали очень многие и это стало очень быстро развиваться) и она уйдет в массы. Не более. Написать свое расширение HTTP на самом деле не проблема, возьмем, к примеру, WebDAV, проблема в том, на сколько это будет поддержано другими игроками.
В обычном сетевом, не веб мире, долгие коннекты вполне себе банальное действо.
Совершенно верно! TCP-протокол старше нас с вами! Это норма сетевого взаимодействия. А команде telnet, которая позволяет это все делать в консоли — «в обед сто лет». Здесь я не собираюсь с вами спорить, т.к. придерживаюсь той же самой точки зрения.
Но вот оно доползло до HTTP и все, революция. Ничуть.
Несмотря на то, что HTTP бегает поверх TCP, он разработан не для долгих сеансов, а чтобы подключиться, взять документ и освободить ресурсы. Именно в таком порядке: «запрос — ответ(ы)», и никак иначе. Я имею наглость утверждать, что HTTP в принципе синхронный протокол именно по этой причине. Даже в слове AJAX первая буква написана маркетологом. Асинхронный по отношению к чему? К загруженной страничке в браузере, к вызвавшему ява-скрипту, но не по отношению к серверу. Поэтому в аяксе асинхронность половинчатая. Все комет-технологии это только способ улучшить положение, приподнять степень асинхронности. И именно вот сюда — в сетевое взаимодействие сервер-клиент — веб-сокеты приносят честную асинхронность. Потому что все остальное (яваскрипт с коллбеками) уже готово и ждет.
Флеш спокойно позволяет держать сокеты.
Чуть выше уже выразили мнение, что флеш это хак. И оно имеет под собой почву. Флеш вещь немного инородная по отношению к браузеру, поэтому логично, что он имеет свои сокеты, свой XML-объект и так далее. Очень хорошо, что мы его можем использовать для исправления положения. Но когда мы сможем от него отказаться и использовать нативную поддержку веб-сокетов, будет лучше. Потому что иначе мы будем натыкаться на проблемы с проксями, баннерорезалками, корп. политиками и прочим — обратная сторона самостоятельности флеша.
Поэтому я все же настаиваю, что в данном случае WebSockets это не более, чем описание интерфейса для старой технологии созданное для веба.
А я возьму и соглашусь :) И даже выделю курсивом три последних слова в вашей фразе! :)
Мне тут попалось хорошее определение веб-сокетов, которое претендует на звание лучшего: «WebSockets — это TCP для Web».
это не вопрос создания новой технологии, а просто вопрос того, сколько крупных игроков поддержит эту реализацию
Согласен. Например, Мозилла уже поддержала эту инциативу, и, полагаю, в следующем фаерфоксе будет эта технология. Может где-то к лету.
(XHR поддержали очень многие и это стало очень быстро развиваться)
Да, хотя и там косяков было предостаточно, вплоть до разных название одного объекта в разных браузерах. Проблема в том, что там решение шло «снизу» — от конкретных разработчиков браузеров, а здесь «сверху» — от разработчиков стандартов. Понятно, что на самом деле это одни и те же люди :) Но в одном случае действуют сами по себе, а в другом — сообща.
Многие ли уже перешли на Google Protocol Buffers?
Это, наверное, и можно назвать web 2.0…
UFO just landed and posted this here
Товарищи! Меня опередили! Уже есть JS <-> Flash <-> WebSocket Server
http://github.com/gimite/web-socket-js
Так что все броузеры уже поддерживаются.
http://github.com/gimite/web-socket-js
Так что все броузеры уже поддерживаются.
Товарищъ TravisBickle!
Вы меня расстроили — ведь я даже указал ее в статье!
Вы меня расстроили — ведь я даже указал ее в статье!
А если нельзя, но очень хочется?
На этот случай придуман временный заменитель — библиотечка web-socket-js с помощью флеша эмулирующая веб-сокеты
Видимо, не с самого начала, я просто не перечитывал заново.
Спасибо за пост.
Буду готовить статью о демоне =)
Спасибо за пост.
Буду готовить статью о демоне =)
Будем ждать статью! :)
Спасибо!
Спасибо!
P.S. Кстати, предлагаю разместить в вашей статье ссылку на мою реализацию сервера, я кидал её в комментах.
Приведенный проект phpwebsocket производит стойкое впечатление убогой фигни, кривее написать трудно =)
Приведенный проект phpwebsocket производит стойкое впечатление убогой фигни, кривее написать трудно =)
> Приведенный проект phpwebsocket производит стойкое впечатление убогой фигни, кривее написать трудно =)
СОгласен. Это очень примитивный пример, который легко пощупать собственными руками на своем компе. Я смотрел разные реализации, но какие-то сделаны на Руби, какие-то на Erlang в конце концов выбрал ПХП — как язык, который более-менее всем знаком. А значит проще будет поковыряться.
Да, давайте размещу. Пришлите к ней небольшой коммент, как лучше написать про вашу реализацию.
СОгласен. Это очень примитивный пример, который легко пощупать собственными руками на своем компе. Я смотрел разные реализации, но какие-то сделаны на Руби, какие-то на Erlang в конце концов выбрал ПХП — как язык, который более-менее всем знаком. А значит проще будет поковыряться.
Да, давайте размещу. Пришлите к ней небольшой коммент, как лучше написать про вашу реализацию.
Google уже торт.
Все зависит от проксей. Пока прокси не начнут поддерживать эти соединения не будет вебсокетс нормального.
а как насчет аплоада бинарных данных (типа файлов из локальной фс)? так и будем невидимый флеш впихивать, управляемый яваскриптом?
Вообще WebSockets имеет честный бинарный транспорт, довольно компактный эффективный из-за отсутствия необходимости перекодирования в base64, так что здесь ситуация должна улучшиться. Но пока я все равно не представляю, как передать картинку яваскриптом. Сейчас разрабатывается возможность доступа к локальным файлам из скриптов страницы. Думаю, когда это реализуют, тогда мы сможем отправлять на сайт картинки в JS.
UFO just landed and posted this here
Возвращаемся в 90-е. Когда аплет открывал обычное TCP-соединение с сервером и использовал функциональность без всяких наворотов. ))))
> В отличие от HTTP веб-сокеты не имеют ограничений на время жизни в неактивном состоянии.
Теоретически. Реально в ОС практически всегда установлен Timeout по которому автоматически закрывается сокет.
> Это значит, что больше не надо периодически рефрешить соединение, т.к. его не вправе «прихлопывать» всякие прокси.
Опять теоретически. Когда это станет реальностью, пройдет еще лет 5. А пока что будьте уверены, если у вас корпоративный файрволл — через пару минут ваше соединение завершится.
> Значит, соединение может висеть в неактивном виде и не требовать ресурсов. Конечно, можно возразить, что на сервере будут забиваться TCP-сокеты.
И забьются моментально, т.к. клиент при закрытии соединения не посылает терминального пакета. Сокеты так и останутся висеть в неактивном состоянии.
Реально что приходится делать:
1. Сервер время от времени пингует клиентов, чтобы оборвать неактивные «висящие» сокеты.
2. Опционально клиент тоже может пинговать сервер, и например определять время пинга.
3. Поскольку надежность http-соединения не гарантирована (корпоративные прокси), приходится реализовать механизм автоматического реконнекта.
> В отличие от HTTP веб-сокеты не имеют ограничений на время жизни в неактивном состоянии.
Теоретически. Реально в ОС практически всегда установлен Timeout по которому автоматически закрывается сокет.
> Это значит, что больше не надо периодически рефрешить соединение, т.к. его не вправе «прихлопывать» всякие прокси.
Опять теоретически. Когда это станет реальностью, пройдет еще лет 5. А пока что будьте уверены, если у вас корпоративный файрволл — через пару минут ваше соединение завершится.
> Значит, соединение может висеть в неактивном виде и не требовать ресурсов. Конечно, можно возразить, что на сервере будут забиваться TCP-сокеты.
И забьются моментально, т.к. клиент при закрытии соединения не посылает терминального пакета. Сокеты так и останутся висеть в неактивном состоянии.
Реально что приходится делать:
1. Сервер время от времени пингует клиентов, чтобы оборвать неактивные «висящие» сокеты.
2. Опционально клиент тоже может пинговать сервер, и например определять время пинга.
3. Поскольку надежность http-соединения не гарантирована (корпоративные прокси), приходится реализовать механизм автоматического реконнекта.
> Возвращаемся в 90-е. Когда аплет открывал обычное TCP-соединение с сервером и использовал функциональность без всяких наворотов. ))))
А в том и соль эволюции технологий, что тоже самое (или чуть лучшее) достигается более простыми средствами, с большей надежностью, безопасносностью, сервисом и тп.
> А пока что будьте уверены, если у вас корпоративный файрволл — через пару минут ваше соединение завершится.
HTTP — да. Но прибивать любое TCP подключение просто через 2 минуты некорректно даже для корпоративного фаервола.
> И забьются моментально, т.к. клиент при закрытии соединения не посылает терминального пакета. Сокеты так и останутся висеть в неактивном состоянии.
Почему не посылает? Это предусмотрено стандартом TCP, если он не посылает, то он работает не по стандарту. Значит, он не клиент, а неведомая хрень.
Чтобы не забивалось надо иметь хорошую цифру в somaxconn и хороший мультиплексор.
> Реально что приходится делать:…
Да, на практике это надо будет сделать. Чтобы учеть даже такие банальные вещи, как случайный отруб инета у клиента (например, если у него модем или еще что-то). В таком случае, нам надо узнать, что он отвалился и дать ему возможность переконнектиться.
Но и это тоже легко реализуется в технологии вебсокетов:
1. Честное отключение вызовет закрытие сокета, которое можно обработать.
2. Если мы при отправке пакета получили ошибку, то сокет надо закрыть.
3. Если отправили пинг и клиент за установленное время не ответил — то так же надо закрыть.
Кстати, благодаря симметричности, логика обработки на серверной и клиентской стороне будет похожа, с той разницей, что клиент может инциировать переподключение.
А в том и соль эволюции технологий, что тоже самое (или чуть лучшее) достигается более простыми средствами, с большей надежностью, безопасносностью, сервисом и тп.
> А пока что будьте уверены, если у вас корпоративный файрволл — через пару минут ваше соединение завершится.
HTTP — да. Но прибивать любое TCP подключение просто через 2 минуты некорректно даже для корпоративного фаервола.
> И забьются моментально, т.к. клиент при закрытии соединения не посылает терминального пакета. Сокеты так и останутся висеть в неактивном состоянии.
Почему не посылает? Это предусмотрено стандартом TCP, если он не посылает, то он работает не по стандарту. Значит, он не клиент, а неведомая хрень.
Чтобы не забивалось надо иметь хорошую цифру в somaxconn и хороший мультиплексор.
> Реально что приходится делать:…
Да, на практике это надо будет сделать. Чтобы учеть даже такие банальные вещи, как случайный отруб инета у клиента (например, если у него модем или еще что-то). В таком случае, нам надо узнать, что он отвалился и дать ему возможность переконнектиться.
Но и это тоже легко реализуется в технологии вебсокетов:
1. Честное отключение вызовет закрытие сокета, которое можно обработать.
2. Если мы при отправке пакета получили ошибку, то сокет надо закрыть.
3. Если отправили пинг и клиент за установленное время не ответил — то так же надо закрыть.
Кстати, благодаря симметричности, логика обработки на серверной и клиентской стороне будет похожа, с той разницей, что клиент может инциировать переподключение.
Да уж запоздал WebSockets! Его бы года-два назад, кто ж сейчас будет переписывать сотни веб-приложений которые работают по принципу десктопных и с активным ajax-взаимодействия (гугл доксы, веб топы, гмейл, вейв, и пр)? Т.е. можно смело выделять бюджеты на переписывание веб-приложений ))
Но лучше поздно чем никогда!
Но лучше поздно чем никогда!
Кстати кто писал веб-приложения, в соответствии с канонами разработки, используя паттерны смогут возрадоваться! WebSockets еще раз доказал необходимость умного подхода к разработке — абстрагируйтесь от httprequest, comet и прочего.
что-то мне подсказывает, что если бы не real-time web, долго бы еще лежать этой технологии на полке!
Так часто бывает: возникла необходимость, а потом появилось решение. Точно так же было с самим аяксом — все тоже самое вначале делалось с помощью IFrame, долгогрузящийся скрипт и пр. Но это все были кривые решения, которые естественно вызывали разные проблемы с проксями, антивирусами и тп. XHR стандартизировал поведение и отправил всех своих предшественников на свалку истории. Та же ситуация сейчас с Comet — это ряд хаков, наросших на XHR. По этому они таким же образом будут заменены WebSockets-ами! И мы получим хорошее безглючное окружение.
Возможно пропустил, но интересно, как будет решаться проблема, по которой веб изначально и был асинхронным. Если я открываю коннект и не закрываю — как долго коннект будет висеть? А если открывать их очень быстро, в цикле и очень долго? Просто интересно.
Если нет заголовков, и де-факто самого протокола (т.е. веб-сокеты получаются очень низкоуровневым протоколом), то придется писать собственный протокол поверх веб-сокета, чтобы отслеживать юзеров (аналог куки), например. Предвкушаю появление библиотек реализующих протоколы поверх сокетов )
А вообще возможности открываются поистине безграничные, это радует.
Если нет заголовков, и де-факто самого протокола (т.е. веб-сокеты получаются очень низкоуровневым протоколом), то придется писать собственный протокол поверх веб-сокета, чтобы отслеживать юзеров (аналог куки), например. Предвкушаю появление библиотек реализующих протоколы поверх сокетов )
А вообще возможности открываются поистине безграничные, это радует.
> Если я открываю коннект и не закрываю — как долго коннект будет висеть?
По идее сколько угодно. Спецификация не оговаривает этот вопрос и оставляет на откуп разработчику прикладного приложения. На практике надо учесть таймауты, какие-нибудь промежуточные роутеры, обрывы соединения и прочее, что может закрыть его раньше.
> А если открывать их очень быстро, в цикле и очень долго?
Снова вам дана полная свобода действий. Как разработчик приложения вы можете решить, что для каждого блока данных вам нужно свое подключениее, а можете все гонять через одно подключение — как сделано в моем демо примере.
> Если нет заголовков, и де-факто самого протокола (т.е. веб-сокеты получаются очень низкоуровневым протоколом), то придется писать собственный протокол поверх веб-сокета, чтобы отслеживать юзеров (аналог куки), например.
С одной стороны да, протокол получается довольно низкоуровневым, а с другой масса проблем исчезает как класс. Например, отслеживать юзеров уже не нужно — потому что у вас постоянное подключение и на этапе его установления вы понимаете кто пришел. Дальше вам не нужно проверять его куку — потому что все, что пришло через данное подключение пришло от данного пользователя.
Если вам интересно, могу предложить посмотреть мой демо-пример: chat.websockets.ru/
— Работает на одном подключении: каждое сообщение имеет признак типа. Далее на клиенте JS разруливает что с ним делать.
— как только пользователь подключается или отклчючается моментально всем в чате присылается инфо об этом
— Реализован пинг — раз в 5 секунд идет обмен пингами для проверки живости. Но это из разряда улучшений — если вдруг где-то посередине бешеный роутер прихлопнет сообщение. Но это не очень обязательно.
— Весь обмен сообщениями в JSON — можно легко отдебагать.
— Есть авторизация: при установлении соединения пользователю назначается рандомный цвет ника, с которым он дальше ходит до тех пор, пока не закроется его подключение.
— Можно легко сделать проверку пароля — сейчас сделана проверка не непустой ник. Плюс — все проверки только один раз при подключении
— Масса вещей намеренно не оптимизировалась, чтобы посмотреть на скорость работы. Например, присылка истории чата — все сообщения присылаются по отдельности вместо общего пакета
По идее сколько угодно. Спецификация не оговаривает этот вопрос и оставляет на откуп разработчику прикладного приложения. На практике надо учесть таймауты, какие-нибудь промежуточные роутеры, обрывы соединения и прочее, что может закрыть его раньше.
> А если открывать их очень быстро, в цикле и очень долго?
Снова вам дана полная свобода действий. Как разработчик приложения вы можете решить, что для каждого блока данных вам нужно свое подключениее, а можете все гонять через одно подключение — как сделано в моем демо примере.
> Если нет заголовков, и де-факто самого протокола (т.е. веб-сокеты получаются очень низкоуровневым протоколом), то придется писать собственный протокол поверх веб-сокета, чтобы отслеживать юзеров (аналог куки), например.
С одной стороны да, протокол получается довольно низкоуровневым, а с другой масса проблем исчезает как класс. Например, отслеживать юзеров уже не нужно — потому что у вас постоянное подключение и на этапе его установления вы понимаете кто пришел. Дальше вам не нужно проверять его куку — потому что все, что пришло через данное подключение пришло от данного пользователя.
Если вам интересно, могу предложить посмотреть мой демо-пример: chat.websockets.ru/
— Работает на одном подключении: каждое сообщение имеет признак типа. Далее на клиенте JS разруливает что с ним делать.
— как только пользователь подключается или отклчючается моментально всем в чате присылается инфо об этом
— Реализован пинг — раз в 5 секунд идет обмен пингами для проверки живости. Но это из разряда улучшений — если вдруг где-то посередине бешеный роутер прихлопнет сообщение. Но это не очень обязательно.
— Весь обмен сообщениями в JSON — можно легко отдебагать.
— Есть авторизация: при установлении соединения пользователю назначается рандомный цвет ника, с которым он дальше ходит до тех пор, пока не закроется его подключение.
— Можно легко сделать проверку пароля — сейчас сделана проверка не непустой ник. Плюс — все проверки только один раз при подключении
— Масса вещей намеренно не оптимизировалась, чтобы посмотреть на скорость работы. Например, присылка истории чата — все сообщения присылаются по отдельности вместо общего пакета
а очень интересно будут работать xss с открытыми веб сокетами :) если не проверять, то встроенная сторонняя библиотека в сайт сможет сделать огого сколько всего
никто не спросил, я спрошу. такой ли уж выигрыш от изменяемого размера поля „длина данных“, если а) надо делать каждый раз перевод в формат поля на сервере, б) перевод поля из формата в инт на клиенте. длина более 2миб данных уже займут 4 байта. что-то как-то непонятно
Что такое 4 байта при размере данных в 2 МБ? Накладные расходы на заголовки будут занимать в сотни раз больше.
Выигрыш главным образом за счет отсутствия ограничений — надо вам передать гигабайт — пожалуйста, нужно будет потом несколько терабайт — тоже без проблем. Без необходимости обновления протокола. При этом для небольших данных (сотни байт) минимальный оверхед — всего 1-2 байта.
Выигрыш главным образом за счет отсутствия ограничений — надо вам передать гигабайт — пожалуйста, нужно будет потом несколько терабайт — тоже без проблем. Без необходимости обновления протокола. При этом для небольших данных (сотни байт) минимальный оверхед — всего 1-2 байта.
если за один раз можно отправить только один пакет данных размером N, то да, а если сокет не закрывается после отправки данных, то тогда непонятно. заголовок, я так понимаю, только один раз отправляется при установления соединения.
У меня сложилось впечатление, что вы путаете 1) установочные заголовки соединения — то есть те, которые отправляются только при открытии сокета, и 2) рабочие заголовки — то есть те, которые отправляются при каждом сообщении.
1) Это большой блок начинающийся с GET c Upgrade и прочим — это все будет отправлено только вначале и только 1 раз, на этапе установления соединения.
После чего сокет остается открытым.
2) После установления соединения, каждое сообщение имеет заголовок.
Если это текстовое сообщение, то вначале его идет байт 0х00, а в конце 0xFF.
Если это бинарное сообщение, то вначале его будет 0x80, потом то самое указание длины, а после тела сообщения ничего не будет.
После каждого сообщения сокет остается открытым и готовым передавать новые данные.
Пос
1) Это большой блок начинающийся с GET c Upgrade и прочим — это все будет отправлено только вначале и только 1 раз, на этапе установления соединения.
После чего сокет остается открытым.
2) После установления соединения, каждое сообщение имеет заголовок.
Если это текстовое сообщение, то вначале его идет байт 0х00, а в конце 0xFF.
Если это бинарное сообщение, то вначале его будет 0x80, потом то самое указание длины, а после тела сообщения ничего не будет.
После каждого сообщения сокет остается открытым и готовым передавать новые данные.
Пос
блин, ошибся веткой. ответ ниже habrahabr.ru/blogs/webdev/79038/#comment_3948167
не путаю. у меня конкретный вопрос про указание длины в странном формате, а не uint32 и даже не uint64 которые накладывает на обе стороны ещё дополнительные преобразования, занимающие время.
Так и не понял, что же вас смущает? Оверхед из-за того, что поле получается чуть длиннее, чем если записать в банальный uint32? Сложность обработки?
А благодаря этой технологии запреты на вконтакте можно будет обойти?
Если да, то как с этим бороться?
Если да, то как с этим бороться?
Не дать другим.
Просто на одном из сайтов видел комментарий, что вроде даст такую возможность.
Вот и возникли сомнения.
Просто на одном из сайтов видел комментарий, что вроде даст такую возможность.
Вот и возникли сомнения.
Что значит «нет таймаута»?!
Я вот смотрю на это дело с точки зрения сервера и немного не разделяю восторга.
Во-первых, каждый сокет стоит памяти, ядерной, не свопящейся памяти размером в TCP Window как минимум. Если взять 1500 байт (Ethernet фрейм), то 1 миллион открытых коннектов это 1,5 Gb памяти на сервере псу под хвост. И это на передачу только ping'ов! Чтобы качать большие данные нужны большие окошки.
Во-вторых, как сервер будет закрывать дохлые сокеты без таймаута? Очевидно, что связь рвётся и т.д., а открытые сокеты будут утекать. Явно будут таймауты на сервере, то есть обрабатывать их всё равно надо.
Ну и не понятно как это хозяйство отобразить на стандартные процессы/нити. Если как обычно, один запрос — одна нить, то не очевидно как делать серверный броадкаст. Да и пара тысяч одновременных (с точностью до миллисекунды) запросов к PHP может плохо кончится для сервера.
Я вот смотрю на это дело с точки зрения сервера и немного не разделяю восторга.
Во-первых, каждый сокет стоит памяти, ядерной, не свопящейся памяти размером в TCP Window как минимум. Если взять 1500 байт (Ethernet фрейм), то 1 миллион открытых коннектов это 1,5 Gb памяти на сервере псу под хвост. И это на передачу только ping'ов! Чтобы качать большие данные нужны большие окошки.
Во-вторых, как сервер будет закрывать дохлые сокеты без таймаута? Очевидно, что связь рвётся и т.д., а открытые сокеты будут утекать. Явно будут таймауты на сервере, то есть обрабатывать их всё равно надо.
Ну и не понятно как это хозяйство отобразить на стандартные процессы/нити. Если как обычно, один запрос — одна нить, то не очевидно как делать серверный броадкаст. Да и пара тысяч одновременных (с точностью до миллисекунды) запросов к PHP может плохо кончится для сервера.
0x00, <строка в кодировке UTF-8>, 0xFF
круто… получите string-zero в новой упаковке.
0x80, <длина — один или несколько байт>, <тело сообщения>
...Что значит «один или несколько байт»? Чтобы не создавать ограничений на длину передаваемого сообщения и в тоже время не расходовать байты нерационально, разработчики использовали очень хитрый способ указания длины тела сообщения. Каждый байт в указании длины рассматривается по частям: самый старший бит указывает является ли этот байт последним (0) либо же за ним есть другие (1), а младшие 7 битов содержат собственно данные. Обрабатывать можно так: как только вы получили признак бинарного дата-фрейма 0x80, вы берете следующий байт и откладываете его в отдельную «копилку», смотрите на следующий байт — если у него установлен старший бит, то переносите и его в «копилку», и так далее, пока вам не встретится байт с 0 старшим битом. Значит это последний байт в указателе длины — его тоже переносите в «копилку». Теперь из всех байтов в «копилке» убираете старшие биты и слепляете остаток. Вот это и будет длина тела сообщения. Еще можно интерпретировать как 7-битные числа без старшего бита.
Ну что за нафиг за шедевр инженерной мысли 21 века с псевдоэкономией байтов?
Нет бы отдали старт-коды с 0x80 по 0x87 под бинарные данные, где в старткоде в младших 3 битах хранится лог2 размера инт-числа хранящего длину бинарного сообщения?
80 значит длина 2^0 = 1 байт, читаем следующий байт и получаем длину сообщения от 0 до 255
81 — 2 байта — 0..65535
82 — 4 байта — до 4Гб
83 — 8 байт — до 17 млн терабайт
84-87 исключительно для маньяков, на вырост технологиям.
Что касается 3 байт или там 5 байт — бессмысленно при объёме сообщения 64Кб+ и тем более 4Гб+.
Плюс решения понятный — и размер переменной, хранящей длину сообщения, просто определяется — как 1 << (codebyte & 0x07), — и читать придётся круглое число последующих байт хранящих длину (байт, слово, двойное, четверное) в большинстве случаев прямо в регистр процессора (для ЯВУ — прямо в интовую переменную) без какой либо последующей обработки.
Сейчас конечно шашкой махать по вебсокетам уже не время, но быть может и коммент в дебрях Хабра позволит будущим разработчикам создавать чуть больше правильного кода.
Возможно, разработчики всеми силами хотели избежать ловушки «точно хватит для всех» — то есть задавать какое бы то ни было ограничение, пусть даже нереально огромное.
Когда-то казалось, что IPv4 содержит достаточно адресов. В общем так оно и есть и даже с огромным запасом — если считать только военные компьютеры. Никто не знал, как будет развиваться интернет, что он станет частью обычной гражданской жизни.
Разработчики заложили еще 127 вариантов кодирования бинарных данных. Не исключено, кто когда-то добавят код 0x81, при этом в следующем байте будет ln2 следующих байт длины, дальше сама длина. Итого, можно будет задавать значения до 22255. Теперь точно должно хватить. Но вдруг через 5-10-20 лет появится межгалактический интернет? Количество атомов во Вселенной оценивается величинами порядка 1080 ≈ 2266. Но, возможно, наша оценка размеров Вселенной будет кардинально пересмотрена? Или, что более вероятно, инструмент будет использоваться каким-то совсем другим способом и опять не хватит.
Когда-то казалось, что IPv4 содержит достаточно адресов. В общем так оно и есть и даже с огромным запасом — если считать только военные компьютеры. Никто не знал, как будет развиваться интернет, что он станет частью обычной гражданской жизни.
Разработчики заложили еще 127 вариантов кодирования бинарных данных. Не исключено, кто когда-то добавят код 0x81, при этом в следующем байте будет ln2 следующих байт длины, дальше сама длина. Итого, можно будет задавать значения до 22255. Теперь точно должно хватить. Но вдруг через 5-10-20 лет появится межгалактический интернет? Количество атомов во Вселенной оценивается величинами порядка 1080 ≈ 2266. Но, возможно, наша оценка размеров Вселенной будет кардинально пересмотрена? Или, что более вероятно, инструмент будет использоваться каким-то совсем другим способом и опять не хватит.
Сорри за некропост, но если делать так: «как только вы получили признак бинарного дата-фрейма 0x80, вы берете следующий байт и откладываете его в отдельную «копилку», смотрите на следующий байт — если у него установлен старший бит, то переносите и его в «копилку», и так далее, пока вам не встретится байт с 0 старшим битом.»
то при вот таком фрейме: 0x80, 0x2B, |тело сообщения|
первый байт (и возможно следующие) тела сообщения попадет в рассчет длины — что будет некорректно.
У 0x2b тоже должен быть проверен 7 бит, т.е. сразу после 0x80 ненадо откладывать в копилку. Надо проверить 7 бит, и только потом откладывать.
то при вот таком фрейме: 0x80, 0x2B, |тело сообщения|
первый байт (и возможно следующие) тела сообщения попадет в рассчет длины — что будет некорректно.
У 0x2b тоже должен быть проверен 7 бит, т.е. сразу после 0x80 ненадо откладывать в копилку. Надо проверить 7 бит, и только потом откладывать.
Приветствую. Только сейчас заметил ваш коммент )
Возможно, надо было расставить скобки, чтобы читалось более однозначно.
В этом цикле должен быть не только перенос следующего байта, но и проверка нового байта на конец повторения.
Здесь имелся ввиду примерно такой псевдокод «как только вы получили признак бинарного дата-фрейма 0x80, do { берете следующий байт, делаете ему & 0x7f и переносите его 7 младших битов в «копилку», } unless ( у текущего байта 0 старший бит.) »
Возможно, надо было расставить скобки, чтобы читалось более однозначно.
В этом цикле должен быть не только перенос следующего байта, но и проверка нового байта на конец повторения.
Здесь имелся ввиду примерно такой псевдокод «как только вы получили признак бинарного дата-фрейма 0x80, do { берете следующий байт, делаете ему & 0x7f и переносите его 7 младших битов в «копилку», } unless ( у текущего байта 0 старший бит.) »
Привет из 2022 года! Технология вебсокетов полностью созрела и можно начинать пользоваться!
WebSockets — полноценный асинхронный веб