Size: a a a

2020 July 02

b

basiliscos in Modern::Perl
Anton Petrusevich
я повторю вопрос: ты теоретизируешь? фреймы могут разбивать сообщение, да. это низкий уровень. то есть, ты говоришь "послать сообщение", а оно "подожди, ещё буфер не накопился для передачи"?
в том-то и дело что "отослать мессадж" и "отослать фрейм" = разные понятия. Когда ты говоришь отослать мессадж, то уже никаких "продожди, буффер не накопился для передачи...". А вот когда говоришь, "готов фрейм", то там, в буфере, вполне возможно уже что-то есть, а может и нет,  а может и есть, но мало, и т.п. Только когда ты шлёшь последний фрейм, тогда тебе точно весь буффер отдают (flush).
источник

b

basiliscos in Modern::Perl
Vadim Goncharov
ты только что описал распространенную ошибку в проектировании сетевых протоколов, её даже в телеге повторили
ну ты поясни, в чём ошибка-то?
источник

AP

Anton Petrusevich in Modern::Perl
basiliscos
в том-то и дело что "отослать мессадж" и "отослать фрейм" = разные понятия. Когда ты говоришь отослать мессадж, то уже никаких "продожди, буффер не накопился для передачи...". А вот когда говоришь, "готов фрейм", то там, в буфере, вполне возможно уже что-то есть, а может и нет,  а может и есть, но мало, и т.п. Только когда ты шлёшь последний фрейм, тогда тебе точно весь буффер отдают (flush).
фреймы — это низкий уровень, мессадж может быть разбит на фреймы, да, но это чисто изза ограничений размеров фреймов.
источник

VG

Vadim Goncharov in Modern::Perl
basiliscos
ну ты поясни, в чём ошибка-то?
в том, что если клиент у тебя отвалится и не пошлет пинг, ты об этом не узнаешь - и почти весь смысл пинга потерян
источник

AP

Anton Petrusevich in Modern::Perl
в любом случае, ты сначала жмёшь сообщение целиком, делаешь флаш и затем только на фреймы бьёшь
источник

AP

Anton Petrusevich in Modern::Perl
Vadim Goncharov
в том, что если клиент у тебя отвалится и не пошлет пинг, ты об этом не узнаешь - и почти весь смысл пинга потерян
он имел в виду, что клиенту тоже может хотеться знать, что сервер ещё жив
источник

b

basiliscos in Modern::Perl
Vadim Goncharov
в том, что если клиент у тебя отвалится и не пошлет пинг, ты об этом не узнаешь - и почти весь смысл пинга потерян
поэтому там таймер на tcp-активность ставится, а не на ws
источник

VG

Vadim Goncharov in Modern::Perl
Anton Petrusevich
он имел в виду, что клиенту тоже может хотеться знать, что сервер ещё жив
ну, в таком протоколе разрешить обоим пинговать друг друга
источник

AP

Anton Petrusevich in Modern::Perl
Vadim Goncharov
ну, в таком протоколе разрешить обоим пинговать друг друга
у жс-а нет ручки для этого
источник

VG

Vadim Goncharov in Modern::Perl
basiliscos
поэтому там таймер на tcp-активность ставится, а не на ws
и это еще одна встречающаяся ошибка проектирования
источник

VG

Vadim Goncharov in Modern::Perl
пинги должны обрабатываться на application level - затем, что ядро peer-машины может быть и живо, а вот в приложении логика сдохла
источник

AP

Anton Petrusevich in Modern::Perl
браузер отвечает на пинг автоматически, у жс-а нет апи узнать что такие пакеты приходили или самому отправить пинг
источник

VG

Vadim Goncharov in Modern::Perl
ну, до некоторой степени это всё равно валидно - у тебя мог повиснуть сам браузер
источник

VG

Vadim Goncharov in Modern::Perl
может, через минуту он даже вывалит попап юзеру "страница такая-то в бесконечном лупе", а может, и не раздуплится
источник

b

basiliscos in Modern::Perl
Vadim Goncharov
пинги должны обрабатываться на application level - затем, что ядро peer-машины может быть и живо, а вот в приложении логика сдохла
ну так WS-пинги и обрабатываются обработчиком WS, тут всё правильно.
источник

b

basiliscos in Modern::Perl
Vadim Goncharov
и это еще одна встречающаяся ошибка проектирования
а тут в чём ошибка?
источник

VG

Vadim Goncharov in Modern::Perl
basiliscos
а тут в чём ошибка?
источник

VG

Vadim Goncharov in Modern::Perl
собственно, поэтому TCP даже не пытается заниматься пингами, и у SO_KEEPALIVE по умолчанию такой большой интервал
источник

b

basiliscos in Modern::Perl
ну офигенно, полагаться на пинги - ну так себе, да ещё и в (конечном) приложении. На неактивность tcp как-то более общий подход (за исключением, когда пинги вводят в протокл) :  не ответили  по таймауту, закрываешь tcp . И какая разница на TCP не было ответа, или на пинг.
источник

VG

Vadim Goncharov in Modern::Perl
большая
источник