[{"data":1,"prerenderedAt":1190},["ShallowReactive",2],{"$f1f28S1tURfGpSYT-MK4UBAIynweo7J0SrNX4xxp_04A":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":80,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":83,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":88,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":433,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":655,"mdc--ajwy9m-key":675,"mdc-twb5n1-key":687,"mdc-6yow9p-key":696,"mdc-pi5bnl-key":705,"mdc--z1n5ig-key":714,"mdc--z61qb4-key":740,"mdc-cplelh-key":748,"mdc-xkajpf-key":763,"mdc-2bgm76-key":778,"mdc--ujgfcg-key":786,"mdc--cb5f20-key":807,"mdc-9cswky-key":870,"mdc-cv76o0-key":878,"mdc-hmrmkl-key":1006,"mdc-cdk4gg-key":1182},{"content":4,"quizQuestionContent":50,"type":69,"pageMeta":70},[5,9,13,16,20,23,27,30,33,37,40,44,47],{"id":6,"value":7,"isTypeH1":8},"1900","Как браузер выбирает TCP или UDP для соединения",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4350","Теория: кто выбирает транспорт","theory-who-chooses-transport",{"id":14,"value":15,"isTypeParagraph":8},"10002","Браузер не “выбирает TCP или UDP” как взаимозаменяемые аналоги для одного и того же протокола, а следует стеку: прикладной протокол задаёт транспорт (например, HTTP/3 определён как отображение HTTP-семантики поверх QUIC).  \nQUIC, в свою очередь, определён как транспорт, пакеты которого переносятся в UDP-датаграммах, из-за чего “HTTP/3 = UDP” на практике означает “HTTP/3 = QUIC поверх UDP”. ",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"632","Разделение ответственности обычно выглядит так: приложение (браузер) выбирает прикладной протокол и включает механизмы обнаружения/согласования, а ядро ОС выполняет системные вызовы для TCP- или UDP-сокета в соответствии с тем, что требуется протоколом.",null,{"id":21,"value":22,"isTypeParagraph":8},"10003","Схема уровней (упрощённо):\n\n```\nбраузер (URL, политика безопасности, кэш Alt-Svc/HTTPS RR)\n↓\nHTTP/1.1 или HTTP/2 (поверх TCP)  |  HTTP/3 (поверх QUIC)\n↓                                  ↓\nTCP                                 QUIC\n↓                                  ↓\nIP                                  UDP\n↓                                  ↓\nсеть                                сеть\n```",{"id":24,"value":25,"anchor":26,"isTypeH2":8},"4351","Web-стек и примеры","web-stack-and-examples",{"id":28,"value":29,"isTypeParagraph":8},"10004","HTTP/2 исторически использовался преимущественно как “TLS поверх TCP”, а HTTP/3 определён как перенос HTTP-семантики на QUIC.  \nСпецификация HTTP/3 фиксирует поведение при проблемах связности уровня UDP: при неудаче установления QUIC (например, когда UDP блокируется) клиенту следует попытаться использовать TCP-версии HTTP.  \n\nТри наиболее частые ситуации в веб-разработке:\n\n- Обычная загрузка страниц и API через `https://...`: возможна попытка HTTP/3 (QUIC/UDP) при наличии сигналов обнаружения, иначе HTTP/2 или HTTP/1.1 по TCP.  \n- WebSocket (`ws://`, `wss://`): протокол является независимым TCP-ориентированным протоколом и концептуально является слоем поверх TCP, а связь с HTTP ограничена рукопожатием Upgrade.  \n- WebRTC: стек реального времени включает транспортные варианты (TCP и UDP) и компоненты вроде ICE/STUN/TURN; обзорные документы описывают транспортный слой как область, где фигурируют TCP и UDP, и указывают на обязательность набора транспортных протоколов в профиле WebRTC.  ",{"id":31,"description":32,"titleAlert":19,"isTypeAlertWarning":8},"686","Факт “UDP доступен” не гарантируется: UDP может блокироваться или ограничиваться сетевыми устройствами, поэтому механизмы отката (fallback) и/или “гонка” QUIC↔TCP встречаются в реальных реализациях и исследованиях производительности браузеров.",{"id":34,"value":35,"anchor":36,"isTypeH2":8},"4352","Как именно решается TCP/UDP","how-the-decision-is-made",{"id":38,"value":39,"isTypeParagraph":8},"10005","В HTTP/3 описано, что клиент может попытаться открыть QUIC-соединение к endpoint и использовать ALPN-токен `h3` в ходе TLS-рукопожатия, а наличие HTTP/3 endpoint может объявляться через Alt-Svc/ALTSVC с токеном `h3`.  \nAlt-Svc определяется как способ, которым origin может рекламировать альтернативные сервисы в ответах, при этом получатель может игнорировать Alt-Svc, а порядок значений отражает предпочтение сервера.  \n\nПоследовательность (типовая, упрощённая) для `https://site.example/`:\n\n1) Выполняется разрешение имени в адрес (обычно через ОС или встроенный резолвер).  \n2) Проверяется локальное знание об HTTP/3 для origin: кэш Alt-Svc или данные из DNS HTTPS/SVCB.  \n3) Если известен доступный HTTP/3 endpoint, выполняется попытка QUIC (UDP) и согласование приложения `h3` через ALPN во время рукопожатия.  \n4) Если QUIC не устанавливается из‑за проблем связности (например, блокировка UDP), выполняется попытка “TCP-based versions of HTTP” (например, HTTP/2 или HTTP/1.1).  \n\nПсевдокод логики (на уровне “как это выглядит концептуально”, не API браузера):\n\n```\nfunction connectForHttpsOrigin(origin):\n  hints = loadCachedAltSvc(origin) + loadHttpsSvcb(origin)\n  if hints.supports(\"h3\"):\n    if tryQuicUdp(origin, alpn=\"h3\") == success:\n      return transport=\"udp\", protocol=\"http3\"\n  return transport=\"tcp\", protocol=negotiateHttp1or2WithTlsAlpn(origin)\n```\n\nПример сигналов “сервер поддерживает HTTP/3”:\n\n```\nAlt-Svc: h3=\":443\"; ma=86400\n```\n\nПримеры DNS HTTPS RR (идея параметров ALPN показана в документах про HTTPS/SVCB, где встречается `alpn=h2,h3`):\n\n```\nalt.example. IN HTTPS 1 . alpn=h2,h3\n_8443._https.example.com. IN HTTPS 1 alt3.example. ( port=9443 alpn=h2,h3 )\n```\n\nКлючевой момент: DNS HTTPS/SVCB предназначены для передачи клиенту параметров, нужных для установления соединения к сетевому сервису, а также могут согласовываться по смыслу с уже закэшированным Alt-Svc.  ",{"id":41,"value":42,"anchor":43,"isTypeH2":8},"4353","Практика, таблица, подсказка","practice-table-and-hint",{"id":45,"value":46,"isTypeParagraph":8},"10006","Практическая проверка обычно делается инструментами разработчика (инициатор, протокол, наличие “h3”), либо внешними утилитами, потому что из JavaScript транспорт напрямую не выбирается.  \nДля HTTP/3 важно помнить, что обслуживание возможно на любом UDP-порту, но альтернативный сервис всегда указывает порт явно.  \n\nТаблица “прикладной протокол → транспорт”:\n\n| Сценарий в браузере | Прикладной протокол | Транспорт | Что влияет на выбор |\n|---|---|---|---|\n| Обычный `https://` | HTTP/1.1 или HTTP/2 | TCP | Согласование по TLS ALPN для HTTP/2, совместимость и политика клиента. |\n| Обычный `https://` при поддержке HTTP/3 | HTTP/3 | QUIC поверх UDP | Обнаружение endpoint через Alt-Svc/ALTSVC и/или DNS HTTPS/SVCB, затем ALPN `h3`. |\n| `ws://` / `wss://` | WebSocket | TCP | Протокол является TCP-ориентированным; HTTP нужен для Upgrade-рукопожатия. |\n| Видеосвязь/RTC | WebRTC suite | Обычно UDP (возможны TCP/TLS через реле) | ICE/STUN/TURN и транспортный профиль, где рассматриваются TCP и UDP. |",{"id":48,"value":49,"isTypeParagraph":8},"10007","Кратко: транспорт (TCP или UDP) в браузере определяется выбранным прикладным протоколом и результатами согласования/обнаружения; HTTP/3 работает как QUIC поверх UDP и при проблемах UDP выполняется откат на TCP-версии HTTP, тогда как WebSocket остаётся TCP-ориентированным, а WebRTC чаще опирается на UDP с механизмами обхода NAT.",{"id":51,"options":52,"hint":66,"solution":67,"description":68},"1139",[53,56,60,63],{"id":54,"label":55,"isCorrect":8},"4688","Выбор TCP или UDP определяется прикладным протоколом и механизмами согласования: для HTTP/1.1 и HTTP/2 применяется TCP, для HTTP/3 применяется QUIC поверх UDP; при невозможности UDP выполняется откат на TCP-версии HTTP.  ",{"id":57,"label":58,"isCorrect":59},"4689","Браузер открывает и TCP, и UDP к каждому сайту, затем оставляет то соединение, где средняя задержка меньше; транспорт может меняться в ходе одной и той же загрузки без участия HTTP/TLS.  ",false,{"id":61,"label":62,"isCorrect":59},"4690","Браузер выбирает TCP или UDP по номеру порта: “стандартные” порты означают TCP, “нестандартные” — UDP; поэтому HTTPS на 443 всегда только TCP, а HTTP/3 работает лишь на отдельных UDP-портах.  ",{"id":64,"label":65,"isCorrect":59},"4691","Выбор TCP или UDP задаётся из JavaScript через параметры `fetch()`/`XMLHttpRequest`, где можно указать желаемый транспорт; браузер создаёт UDP-сокет при наличии такого флага.","Следует начать с тезиса “транспорт задаётся протоколом”, затем разобрать три случая — HTTP/1.1/2 (TCP), HTTP/3 (QUIC/UDP) и отдельные протоколы (WebSocket, WebRTC), после чего описать механизмы обнаружения HTTP/3 через Alt-Svc и DNS HTTPS/SVCB и обязательный fallback при блокировке UDP.","**Правильный ответ: 1** - Выбор TCP или UDP определяется прикладным протоколом и механизмами согласования: для HTTP/1.1 и HTTP/2 применяется TCP, для HTTP/3 применяется QUIC поверх UDP; при невозможности UDP выполняется откат на TCP-версии HTTP.  ","Как браузер решает, какое соединение ему открывать, TCP или UDP?","quizQuestion",{"title":71,"description":72,"ogTitle":7,"ogDescription":72,"ogImageUrl":73,"canonical":19,"ogLocale":74,"ogSiteName":75,"ogImageType":76,"ogImageWidth":77,"ogImageHeight":78,"ogType":79,"ogUrl":19},"Как браузер решает, какое соединение открывать, TCP или UDP?","Разбор выбора транспорта в браузере: TCP, UDP, QUIC/HTTP3, Alt-Svc, SVCB/HTTPS, WebSocket и WebRTC, с примерами и схемами","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","website",{"siteName":81,"siteUrl":82},"GOOD WEB JOB!","https://goodwebjob.ru",[84],{"label":85,"slug":86,"to":87},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":89,"navigationSublist":97},[90,93],{"path":87,"isActive":59,"name":91,"icon":92,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":94,"isActive":8,"name":95,"icon":96,"isNavbarMobileDisabled":59},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[98,107,134,146,152,293,317,326,332,394,415,421],{"title":99,"list":100,"isOpened":59},"Bash",[101,104],{"name":102,"path":103,"isActive":59},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":105,"path":106,"isActive":59},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":108,"list":109,"isOpened":59},"CSS",[110,113,116,119,122,125,128,131],{"name":111,"path":112,"isActive":59},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":114,"path":115,"isActive":59},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":117,"path":118,"isActive":59},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":120,"path":121,"isActive":59},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":123,"path":124,"isActive":59},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":126,"path":127,"isActive":59},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":129,"path":130,"isActive":59},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":132,"path":133,"isActive":59},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":135,"list":136,"isOpened":59},"Git",[137,140,143],{"name":138,"path":139,"isActive":59},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":141,"path":142,"isActive":59},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":144,"path":145,"isActive":59},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":147,"list":148,"isOpened":59},"HTML",[149],{"name":150,"path":151,"isActive":59},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":153,"list":154,"isOpened":59},"JavaScript",[155,158,161,164,167,170,173,176,179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290],{"name":156,"path":157,"isActive":59},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":159,"path":160,"isActive":59},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":162,"path":163,"isActive":59},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":165,"path":166,"isActive":59},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":168,"path":169,"isActive":59},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":171,"path":172,"isActive":59},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":174,"path":175,"isActive":59},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":177,"path":178,"isActive":59},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":180,"path":181,"isActive":59},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":183,"path":184,"isActive":59},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":186,"path":187,"isActive":59},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":189,"path":190,"isActive":59},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":192,"path":193,"isActive":59},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":195,"path":196,"isActive":59},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":198,"path":199,"isActive":59},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":201,"path":202,"isActive":59},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":204,"path":205,"isActive":59},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":207,"path":208,"isActive":59},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":210,"path":211,"isActive":59},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":213,"path":214,"isActive":59},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":216,"path":217,"isActive":59},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":219,"path":220,"isActive":59},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":222,"path":223,"isActive":59},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":225,"path":226,"isActive":59},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":228,"path":229,"isActive":59},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":231,"path":232,"isActive":59},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":234,"path":235,"isActive":59},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":237,"path":238,"isActive":59},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":240,"path":241,"isActive":59},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":243,"path":244,"isActive":59},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":246,"path":247,"isActive":59},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":249,"path":250,"isActive":59},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":252,"path":253,"isActive":59},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":255,"path":256,"isActive":59},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":258,"path":259,"isActive":59},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":261,"path":262,"isActive":59},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":264,"path":265,"isActive":59}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":267,"path":268,"isActive":59},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":270,"path":271,"isActive":59},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":273,"path":274,"isActive":59},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":276,"path":277,"isActive":59},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":279,"path":280,"isActive":59},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":282,"path":283,"isActive":59},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":285,"path":286,"isActive":59},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":288,"path":289,"isActive":59},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":291,"path":292,"isActive":59},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":294,"list":295,"isOpened":59},"React",[296,299,302,305,308,311,314],{"name":297,"path":298,"isActive":59},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":300,"path":301,"isActive":59},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":303,"path":304,"isActive":59},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":306,"path":307,"isActive":59},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":309,"path":310,"isActive":59},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":312,"path":313,"isActive":59},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":315,"path":316,"isActive":59},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":318,"list":319,"isOpened":59},"Алгоритмы",[320,323],{"name":321,"path":322,"isActive":59},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":324,"path":325,"isActive":59},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":327,"list":328,"isOpened":59},"Дебаггинг",[329],{"name":330,"path":331,"isActive":59},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":333,"list":334,"isOpened":59},"Компьютерные сети",[335,338,341,344,346,349,352,355,358,361,364,367,370,373,376,379,382,385,388,391],{"name":336,"path":337,"isActive":59},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":339,"path":340,"isActive":59},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":342,"path":343,"isActive":59},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":68,"path":345,"isActive":59},"/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":347,"path":348,"isActive":59},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":350,"path":351,"isActive":59},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":353,"path":354,"isActive":59},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":356,"path":357,"isActive":59},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":359,"path":360,"isActive":59},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":362,"path":363,"isActive":59},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":365,"path":366,"isActive":59},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":368,"path":369,"isActive":59},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":371,"path":372,"isActive":59},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":374,"path":375,"isActive":59},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":377,"path":378,"isActive":59},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":380,"path":381,"isActive":59},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":383,"path":384,"isActive":59},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":386,"path":387,"isActive":59},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":389,"path":390,"isActive":59},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":392,"path":393,"isActive":59},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":395,"list":396,"isOpened":59},"Отрисовка в браузере",[397,400,403,406,409,412],{"name":398,"path":399,"isActive":59},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":401,"path":402,"isActive":59},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":404,"path":405,"isActive":59},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":407,"path":408,"isActive":59},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":410,"path":411,"isActive":59},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":413,"path":414,"isActive":59},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":416,"list":417,"isOpened":59},"Ревью кода",[418],{"name":419,"path":420,"isActive":59},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":422,"list":423,"isOpened":59},"Теория вероятности",[424,427,430],{"name":425,"path":426,"isActive":59},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":428,"path":429,"isActive":59},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":431,"path":432,"isActive":59},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":434},[435,438,440,442,444,447,450,452,454,456,458,460,463,465,467,469,471,473,475,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,544,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644,645,647,649,651,653],{"name":436,"value":437},"Теоретические задания","theoretical-tasks",{"name":192,"value":439},"what-this-code-will-return-typeof-function",{"name":91,"value":441},"where-to-begin",{"name":159,"value":443},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":445,"value":446},"Backend","backend",{"name":448,"value":449},"Frontend","frontend",{"name":156,"value":451},"prototype-what-logical-values-will-be-received-in-console-log",{"name":273,"value":453},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":264,"value":455},"find-non-repeating-numbers-in-an-array",{"name":237,"value":457},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":243,"value":459},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":461,"value":462},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":249,"value":464},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":165,"value":466},"what-value-will-the-console-output-with-object-property",{"name":168,"value":468},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":240,"value":470},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":270,"value":472},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":276,"value":474},"determines-whether-a-word-is-a-palindrome",{"name":255,"value":476},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":282,"value":478},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":246,"value":480},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":252,"value":482},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":258,"value":484},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":291,"value":486},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":261,"value":488},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":267,"value":490},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":171,"value":492},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":174,"value":494},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":186,"value":496},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":189,"value":498},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":288,"value":500},"unifying-values-in-an-array",{"name":279,"value":502},"flattening-the-array",{"name":177,"value":504},"what-will-the-book-get-upper-name-method-return",{"name":285,"value":506},"string-compression",{"name":183,"value":508},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":195,"value":510},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":336,"value":512},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":342,"value":514},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":68,"value":516},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":347,"value":518},"key-differences-between-tcp-and-udp",{"name":350,"value":520},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":353,"value":522},"what-is-http-and-what-does-it-consist-of",{"name":356,"value":524},"what-are-http-headers-and-why-do-we-need-them",{"name":359,"value":526},"what-are-http-parameters",{"name":362,"value":528},"where-is-the-html-code-located-in-the-http-response-structure",{"name":150,"value":530},"what-is-html",{"name":365,"value":532},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":368,"value":534},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":371,"value":536},"what-is-a-cookie",{"name":374,"value":538},"who-initiates-the-cookie-recording-in-the-browser",{"name":377,"value":540},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":542,"value":543},"Лайвкодинг","livecoding",{"name":162,"value":545},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":383,"value":547},"is-everything-that-goes-through-https-secure",{"name":386,"value":549},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":389,"value":551},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":401,"value":553},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":398,"value":555},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":404,"value":557},"what-is-blocking-the-page-rendering-in-the-browser",{"name":407,"value":559},"what-is-dom-in-a-browser-what-is-cssom",{"name":410,"value":561},"what-are-nodes-in-the-dom",{"name":413,"value":563},"what-does-cssom-consist-of",{"name":111,"value":565},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":114,"value":567},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":117,"value":569},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":120,"value":571},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":123,"value":573},"there-is-an-html-code-will-font-weight-affect-span",{"name":126,"value":575},"what-are-the-differences-between-flexbox-and-grid",{"name":129,"value":577},"do-flexbox-and-grid-replace-each-other",{"name":132,"value":579},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":95,"value":581},"tasks",{"name":198,"value":583},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":201,"value":585},"what-is-this-in-javascript",{"name":204,"value":587},"what-is-an-event-loop-and-how-does-it-work",{"name":207,"value":589},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":210,"value":591},"what-does-the-typeof-operator-show-in-javascript",{"name":213,"value":593},"what-types-of-data-exist-in-javascript",{"name":216,"value":595},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":219,"value":597},"what-will-typeof-return-for-an-array",{"name":222,"value":599},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":225,"value":601},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":228,"value":603},"what-does-typeof-return-for-new-set-in-javascript",{"name":297,"value":605},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":303,"value":607},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":306,"value":609},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":309,"value":611},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":312,"value":613},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":330,"value":615},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":138,"value":617},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":141,"value":619},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":144,"value":621},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":419,"value":623},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":102,"value":625},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":105,"value":627},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":321,"value":629},"what-is-algorithmic-complexity",{"name":324,"value":631},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":231,"value":633},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":392,"value":635},"how-can-a-user-be-authorized-on-a-website",{"name":234,"value":637},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":425,"value":639},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":428,"value":641},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":431,"value":643},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":85,"value":86},{"name":380,"value":646},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":339,"value":648},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":180,"value":650},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":300,"value":652},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":315,"value":654},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":656,"copyright":659,"reportError":660,"socialNetwork":662},{"link":657,"title":658},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":661,"link":657},"Сообщить об ошибке",{"label":663,"socialNetworkList":664},"Мы в соцсетях:",[665,668,671],{"icon":19,"link":666,"title":667},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":669,"link":657,"title":670},"ic:baseline-telegram","Telegram",{"icon":672,"link":673,"title":674},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":676,"body":677},{},{"type":678,"children":679},"root",[680],{"type":681,"tag":682,"props":683,"children":684},"element","p",{},[685],{"type":686,"value":68},"text",{"data":688,"body":689},{},{"type":678,"children":690},[691],{"type":681,"tag":682,"props":692,"children":693},{},[694],{"type":686,"value":695},"Выбор TCP или UDP определяется прикладным протоколом и механизмами согласования: для HTTP/1.1 и HTTP/2 применяется TCP, для HTTP/3 применяется QUIC поверх UDP; при невозможности UDP выполняется откат на TCP-версии HTTP.",{"data":697,"body":698},{},{"type":678,"children":699},[700],{"type":681,"tag":682,"props":701,"children":702},{},[703],{"type":686,"value":704},"Браузер открывает и TCP, и UDP к каждому сайту, затем оставляет то соединение, где средняя задержка меньше; транспорт может меняться в ходе одной и той же загрузки без участия HTTP/TLS.",{"data":706,"body":707},{},{"type":678,"children":708},[709],{"type":681,"tag":682,"props":710,"children":711},{},[712],{"type":686,"value":713},"Браузер выбирает TCP или UDP по номеру порта: “стандартные” порты означают TCP, “нестандартные” — UDP; поэтому HTTPS на 443 всегда только TCP, а HTTP/3 работает лишь на отдельных UDP-портах.",{"data":715,"body":716},{},{"type":678,"children":717},[718],{"type":681,"tag":682,"props":719,"children":720},{},[721,723,730,732,738],{"type":686,"value":722},"Выбор TCP или UDP задаётся из JavaScript через параметры ",{"type":681,"tag":724,"props":725,"children":727},"code",{"className":726},[],[728],{"type":686,"value":729},"fetch()",{"type":686,"value":731},"/",{"type":681,"tag":724,"props":733,"children":735},{"className":734},[],[736],{"type":686,"value":737},"XMLHttpRequest",{"type":686,"value":739},", где можно указать желаемый транспорт; браузер создаёт UDP-сокет при наличии такого флага.",{"data":741,"body":742},{},{"type":678,"children":743},[744],{"type":681,"tag":682,"props":745,"children":746},{},[747],{"type":686,"value":66},{"data":749,"body":750},{},{"type":678,"children":751},[752],{"type":681,"tag":682,"props":753,"children":754},{},[755,761],{"type":681,"tag":756,"props":757,"children":758},"strong",{},[759],{"type":686,"value":760},"Правильный ответ: 1",{"type":686,"value":762}," - Выбор TCP или UDP определяется прикладным протоколом и механизмами согласования: для HTTP/1.1 и HTTP/2 применяется TCP, для HTTP/3 применяется QUIC поверх UDP; при невозможности UDP выполняется откат на TCP-версии HTTP.",{"data":764,"body":765},{},{"type":678,"children":766},[767],{"type":681,"tag":682,"props":768,"children":769},{},[770,772,776],{"type":686,"value":771},"Браузер не “выбирает TCP или UDP” как взаимозаменяемые аналоги для одного и того же протокола, а следует стеку: прикладной протокол задаёт транспорт (например, HTTP/3 определён как отображение HTTP-семантики поверх QUIC).",{"type":681,"tag":773,"props":774,"children":775},"br",{},[],{"type":686,"value":777},"\nQUIC, в свою очередь, определён как транспорт, пакеты которого переносятся в UDP-датаграммах, из-за чего “HTTP/3 = UDP” на практике означает “HTTP/3 = QUIC поверх UDP”.",{"data":779,"body":780},{},{"type":678,"children":781},[782],{"type":681,"tag":682,"props":783,"children":784},{},[785],{"type":686,"value":18},{"data":787,"body":788},{},{"type":678,"children":789},[790,795],{"type":681,"tag":682,"props":791,"children":792},{},[793],{"type":686,"value":794},"Схема уровней (упрощённо):",{"type":681,"tag":796,"props":797,"children":801},"pre",{"className":798,"code":800,"language":686},[799],"language-text","браузер (URL, политика безопасности, кэш Alt-Svc/HTTPS RR)\n↓\nHTTP/1.1 или HTTP/2 (поверх TCP)  |  HTTP/3 (поверх QUIC)\n↓                                  ↓\nTCP                                 QUIC\n↓                                  ↓\nIP                                  UDP\n↓                                  ↓\nсеть                                сеть\n",[802],{"type":681,"tag":724,"props":803,"children":805},{"__ignoreMap":804},"",[806],{"type":686,"value":800},{"data":808,"body":809},{},{"type":678,"children":810},[811,821,826],{"type":681,"tag":682,"props":812,"children":813},{},[814,816,819],{"type":686,"value":815},"HTTP/2 исторически использовался преимущественно как “TLS поверх TCP”, а HTTP/3 определён как перенос HTTP-семантики на QUIC.",{"type":681,"tag":773,"props":817,"children":818},{},[],{"type":686,"value":820},"\nСпецификация HTTP/3 фиксирует поведение при проблемах связности уровня UDP: при неудаче установления QUIC (например, когда UDP блокируется) клиенту следует попытаться использовать TCP-версии HTTP.",{"type":681,"tag":682,"props":822,"children":823},{},[824],{"type":686,"value":825},"Три наиболее частые ситуации в веб-разработке:",{"type":681,"tag":827,"props":828,"children":829},"ul",{},[830,844,865],{"type":681,"tag":831,"props":832,"children":833},"li",{},[834,836,842],{"type":686,"value":835},"Обычная загрузка страниц и API через ",{"type":681,"tag":724,"props":837,"children":839},{"className":838},[],[840],{"type":686,"value":841},"https://...",{"type":686,"value":843},": возможна попытка HTTP/3 (QUIC/UDP) при наличии сигналов обнаружения, иначе HTTP/2 или HTTP/1.1 по TCP.",{"type":681,"tag":831,"props":845,"children":846},{},[847,849,855,857,863],{"type":686,"value":848},"WebSocket (",{"type":681,"tag":724,"props":850,"children":852},{"className":851},[],[853],{"type":686,"value":854},"ws://",{"type":686,"value":856},", ",{"type":681,"tag":724,"props":858,"children":860},{"className":859},[],[861],{"type":686,"value":862},"wss://",{"type":686,"value":864},"): протокол является независимым TCP-ориентированным протоколом и концептуально является слоем поверх TCP, а связь с HTTP ограничена рукопожатием Upgrade.",{"type":681,"tag":831,"props":866,"children":867},{},[868],{"type":686,"value":869},"WebRTC: стек реального времени включает транспортные варианты (TCP и UDP) и компоненты вроде ICE/STUN/TURN; обзорные документы описывают транспортный слой как область, где фигурируют TCP и UDP, и указывают на обязательность набора транспортных протоколов в профиле WebRTC.",{"data":871,"body":872},{},{"type":678,"children":873},[874],{"type":681,"tag":682,"props":875,"children":876},{},[877],{"type":686,"value":32},{"data":879,"body":880},{},{"type":678,"children":881},[882,907,920,951,956,965,970,979,992,1001],{"type":681,"tag":682,"props":883,"children":884},{},[885,887,893,895,900,902,905],{"type":686,"value":886},"В HTTP/3 описано, что клиент может попытаться открыть QUIC-соединение к endpoint и использовать ALPN-токен ",{"type":681,"tag":724,"props":888,"children":890},{"className":889},[],[891],{"type":686,"value":892},"h3",{"type":686,"value":894}," в ходе TLS-рукопожатия, а наличие HTTP/3 endpoint может объявляться через Alt-Svc/ALTSVC с токеном ",{"type":681,"tag":724,"props":896,"children":898},{"className":897},[],[899],{"type":686,"value":892},{"type":686,"value":901},".",{"type":681,"tag":773,"props":903,"children":904},{},[],{"type":686,"value":906},"\nAlt-Svc определяется как способ, которым origin может рекламировать альтернативные сервисы в ответах, при этом получатель может игнорировать Alt-Svc, а порядок значений отражает предпочтение сервера.",{"type":681,"tag":682,"props":908,"children":909},{},[910,912,918],{"type":686,"value":911},"Последовательность (типовая, упрощённая) для ",{"type":681,"tag":724,"props":913,"children":915},{"className":914},[],[916],{"type":686,"value":917},"https://site.example/",{"type":686,"value":919},":",{"type":681,"tag":921,"props":922,"children":923},"ol",{},[924,929,934,946],{"type":681,"tag":831,"props":925,"children":926},{},[927],{"type":686,"value":928},"Выполняется разрешение имени в адрес (обычно через ОС или встроенный резолвер).",{"type":681,"tag":831,"props":930,"children":931},{},[932],{"type":686,"value":933},"Проверяется локальное знание об HTTP/3 для origin: кэш Alt-Svc или данные из DNS HTTPS/SVCB.",{"type":681,"tag":831,"props":935,"children":936},{},[937,939,944],{"type":686,"value":938},"Если известен доступный HTTP/3 endpoint, выполняется попытка QUIC (UDP) и согласование приложения ",{"type":681,"tag":724,"props":940,"children":942},{"className":941},[],[943],{"type":686,"value":892},{"type":686,"value":945}," через ALPN во время рукопожатия.",{"type":681,"tag":831,"props":947,"children":948},{},[949],{"type":686,"value":950},"Если QUIC не устанавливается из‑за проблем связности (например, блокировка UDP), выполняется попытка “TCP-based versions of HTTP” (например, HTTP/2 или HTTP/1.1).",{"type":681,"tag":682,"props":952,"children":953},{},[954],{"type":686,"value":955},"Псевдокод логики (на уровне “как это выглядит концептуально”, не API браузера):",{"type":681,"tag":796,"props":957,"children":960},{"className":958,"code":959,"language":686},[799],"function connectForHttpsOrigin(origin):\n  hints = loadCachedAltSvc(origin) + loadHttpsSvcb(origin)\n  if hints.supports(\"h3\"):\n    if tryQuicUdp(origin, alpn=\"h3\") == success:\n      return transport=\"udp\", protocol=\"http3\"\n  return transport=\"tcp\", protocol=negotiateHttp1or2WithTlsAlpn(origin)\n",[961],{"type":681,"tag":724,"props":962,"children":963},{"__ignoreMap":804},[964],{"type":686,"value":959},{"type":681,"tag":682,"props":966,"children":967},{},[968],{"type":686,"value":969},"Пример сигналов “сервер поддерживает HTTP/3”:",{"type":681,"tag":796,"props":971,"children":974},{"className":972,"code":973,"language":686},[799],"Alt-Svc: h3=\":443\"; ma=86400\n",[975],{"type":681,"tag":724,"props":976,"children":977},{"__ignoreMap":804},[978],{"type":686,"value":973},{"type":681,"tag":682,"props":980,"children":981},{},[982,984,990],{"type":686,"value":983},"Примеры DNS HTTPS RR (идея параметров ALPN показана в документах про HTTPS/SVCB, где встречается ",{"type":681,"tag":724,"props":985,"children":987},{"className":986},[],[988],{"type":686,"value":989},"alpn=h2,h3",{"type":686,"value":991},"):",{"type":681,"tag":796,"props":993,"children":996},{"className":994,"code":995,"language":686},[799],"alt.example. IN HTTPS 1 . alpn=h2,h3\n_8443._https.example.com. IN HTTPS 1 alt3.example. ( port=9443 alpn=h2,h3 )\n",[997],{"type":681,"tag":724,"props":998,"children":999},{"__ignoreMap":804},[1000],{"type":686,"value":995},{"type":681,"tag":682,"props":1002,"children":1003},{},[1004],{"type":686,"value":1005},"Ключевой момент: DNS HTTPS/SVCB предназначены для передачи клиенту параметров, нужных для установления соединения к сетевому сервису, а также могут согласовываться по смыслу с уже закэшированным Alt-Svc.",{"data":1007,"body":1008},{},{"type":678,"children":1009},[1010,1020,1025],{"type":681,"tag":682,"props":1011,"children":1012},{},[1013,1015,1018],{"type":686,"value":1014},"Практическая проверка обычно делается инструментами разработчика (инициатор, протокол, наличие “h3”), либо внешними утилитами, потому что из JavaScript транспорт напрямую не выбирается.",{"type":681,"tag":773,"props":1016,"children":1017},{},[],{"type":686,"value":1019},"\nДля HTTP/3 важно помнить, что обслуживание возможно на любом UDP-порту, но альтернативный сервис всегда указывает порт явно.",{"type":681,"tag":682,"props":1021,"children":1022},{},[1023],{"type":686,"value":1024},"Таблица “прикладной протокол → транспорт”:",{"type":681,"tag":1026,"props":1027,"children":1028},"table",{},[1029,1058],{"type":681,"tag":1030,"props":1031,"children":1032},"thead",{},[1033],{"type":681,"tag":1034,"props":1035,"children":1036},"tr",{},[1037,1043,1048,1053],{"type":681,"tag":1038,"props":1039,"children":1040},"th",{},[1041],{"type":686,"value":1042},"Сценарий в браузере",{"type":681,"tag":1038,"props":1044,"children":1045},{},[1046],{"type":686,"value":1047},"Прикладной протокол",{"type":681,"tag":1038,"props":1049,"children":1050},{},[1051],{"type":686,"value":1052},"Транспорт",{"type":681,"tag":1038,"props":1054,"children":1055},{},[1056],{"type":686,"value":1057},"Что влияет на выбор",{"type":681,"tag":1059,"props":1060,"children":1061},"tbody",{},[1062,1092,1127,1159],{"type":681,"tag":1034,"props":1063,"children":1064},{},[1065,1077,1082,1087],{"type":681,"tag":1066,"props":1067,"children":1068},"td",{},[1069,1071],{"type":686,"value":1070},"Обычный ",{"type":681,"tag":724,"props":1072,"children":1074},{"className":1073},[],[1075],{"type":686,"value":1076},"https://",{"type":681,"tag":1066,"props":1078,"children":1079},{},[1080],{"type":686,"value":1081},"HTTP/1.1 или HTTP/2",{"type":681,"tag":1066,"props":1083,"children":1084},{},[1085],{"type":686,"value":1086},"TCP",{"type":681,"tag":1066,"props":1088,"children":1089},{},[1090],{"type":686,"value":1091},"Согласование по TLS ALPN для HTTP/2, совместимость и политика клиента.",{"type":681,"tag":1034,"props":1093,"children":1094},{},[1095,1106,1111,1116],{"type":681,"tag":1066,"props":1096,"children":1097},{},[1098,1099,1104],{"type":686,"value":1070},{"type":681,"tag":724,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":686,"value":1076},{"type":686,"value":1105}," при поддержке HTTP/3",{"type":681,"tag":1066,"props":1107,"children":1108},{},[1109],{"type":686,"value":1110},"HTTP/3",{"type":681,"tag":1066,"props":1112,"children":1113},{},[1114],{"type":686,"value":1115},"QUIC поверх UDP",{"type":681,"tag":1066,"props":1117,"children":1118},{},[1119,1121,1126],{"type":686,"value":1120},"Обнаружение endpoint через Alt-Svc/ALTSVC и/или DNS HTTPS/SVCB, затем ALPN ",{"type":681,"tag":724,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":686,"value":892},{"type":686,"value":901},{"type":681,"tag":1034,"props":1128,"children":1129},{},[1130,1145,1150,1154],{"type":681,"tag":1066,"props":1131,"children":1132},{},[1133,1138,1140],{"type":681,"tag":724,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":686,"value":854},{"type":686,"value":1139}," / ",{"type":681,"tag":724,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":686,"value":862},{"type":681,"tag":1066,"props":1146,"children":1147},{},[1148],{"type":686,"value":1149},"WebSocket",{"type":681,"tag":1066,"props":1151,"children":1152},{},[1153],{"type":686,"value":1086},{"type":681,"tag":1066,"props":1155,"children":1156},{},[1157],{"type":686,"value":1158},"Протокол является TCP-ориентированным; HTTP нужен для Upgrade-рукопожатия.",{"type":681,"tag":1034,"props":1160,"children":1161},{},[1162,1167,1172,1177],{"type":681,"tag":1066,"props":1163,"children":1164},{},[1165],{"type":686,"value":1166},"Видеосвязь/RTC",{"type":681,"tag":1066,"props":1168,"children":1169},{},[1170],{"type":686,"value":1171},"WebRTC suite",{"type":681,"tag":1066,"props":1173,"children":1174},{},[1175],{"type":686,"value":1176},"Обычно UDP (возможны TCP/TLS через реле)",{"type":681,"tag":1066,"props":1178,"children":1179},{},[1180],{"type":686,"value":1181},"ICE/STUN/TURN и транспортный профиль, где рассматриваются TCP и UDP.",{"data":1183,"body":1184},{},{"type":678,"children":1185},[1186],{"type":681,"tag":682,"props":1187,"children":1188},{},[1189],{"type":686,"value":49},1775735660369]