предисловие
В этой статье будет продолжаться запись некоторых вещей, которые автор освоил в процессе обучения.HTTP
,TCP/IP
Принцип и некоторые сценарии применения этих сетевых коммуникационных технологий, статья будет постоянно обновляться, что эквивалентно краткому изложению и вводу этих знаний. Если есть какие-либо неточности, пожалуйста, укажите и исправьте их вовремя ~
Контур
- что происходит, когда вы посещаете веб-страницу
- Классическая сетевая пятислойная модель
- URI, URL и URN
- Набор протоколов TCP/IP
- TCP-соединение
- Трехстороннее рукопожатие TCP и четырехсторонняя волна
- Определение HTTP
- История развития HTTP
- Состав HTTP-сообщения
- HTTP-согласование данных
- длинное HTTP-соединение
- HTTP-кеш
- Политика одинакового происхождения браузера
- Схема оптимизации производительности HTTP
что происходит, когда вы посещаете веб-страницу
Когда пользователь вводит адрес в адресную строку браузера и нажимает клавишу Enter, до отображения веб-интерфейса обычно проходит около двух-трех секунд. Однако в этот момент компьютер фактически завершил очень сложную операцию. На самом деле большая часть того, что произошло в этом процессе, была связана сHTTP
TCP/IP
Для этого мы можем кратко описать общий процесс.
Первый шаг — найти IP-адрес сервера.
Когда пользователь вводит URL-адрес и нажимает клавишу ввода, браузер получает доменное имя. В реальном процессе коммуникации браузеру нужноIP
адрес. чтобы достичьIP
адрес, браузер выполнит следующие операции, обычно мы используем браузер, чтобы найти соответствующий адрес через доменное имяIP
поведение называетсяDNS
Разбор.
- Найдите локальный кеш вашего браузера
- Найдите жесткий диск
host
файл, есть ли запись этого доменного имени иIP
отношения отображения - Я действительно не мог его найти, поэтому мне пришлось обратиться к провайдеру доменного имени, чтобы проверить его через сетевую ссылку.
Второй шаг — установить соединение TCP/IP.
- Браузер получает соответствующий сервер
IP
, будет соответствоватьIP
сервер отправленTCP
Запрос на подключение. - Ответ сервера на получение запроса после того, как обе стороны неоднократно подтвердили установление
TCP 双向连接
.
От клиента, инициирующего запрос на соединение, до
TCP
Установление соединения, процесс, называемый三次握手
.
Если запрос HTTPS, также необходимо
TCP
подключиться, затем пройтиSSL
илиTLS
Обеспечить зашифрованную обработку данных, проверку личности другой стороны и целостности данных для обеспечения безопасности передачи данных.
Третий шаг — запросить ресурсы
-
TCP
После создания соединения браузер начинает отправлять официальнуюHTTP
запрошенный пакет. - Сервер принимает запрос, анализирует запрос и возвращает пакет данных, требуемый клиентом после обработки данных.
Четвертый шаг, рендеринг в браузере
После того, как браузер получает необходимые данные, он объединяет, анализирует и выполняет данные и, наконец, рисует полную веб-страницу на странице.
Пятый шаг, кеш браузера
После того, как браузер получит данные, возвращенные сервером, он кэширует данные в соответствии с определенной стратегией, чтобы при следующем запросе тех же данных он мог перейти непосредственно к кешу, чтобы получить их, не запрашивая сервер.
Вышеупомянутый процесс можно рассматривать как практический сценарий, применяемый в полном процессе сетевого взаимодействия, который выявляет множество точек знаний о сетевом общении.Далее эта строка будет использоваться в качестве указателя для иллюстрации и объяснения задействованных фрагментов знаний.
Классическая сетевая пятислойная модель
На каждом компьютерном устройстве имеется такой набор системных ссылок для обеспечения нормального хода передачи по сети.Поскольку такой набор классических моделей интегрирован, используемый вами компьютер также может быть использован в качестве сервера для предоставления сетевых Услуг.
Слой приложений:
Прикладной уровень содержит то, что мы называемHTTP
Протокол предоставляет множество сервисов для каждого прикладного программного обеспечения.Общие сервисы прикладного уровня включают:HTTP
Служить ,FTP
Служить ,Email
обслуживание и т. д. Прикладной уровень скрывает важные детали базовой модели и в качестве поддержки приложений предоставляет пользователям только некоторые необходимые методы использования.
транспортный уровень
Общие протоколы транспортного уровняTCP
а такжеUDP
, транспортный уровень, как основа прикладного уровня, определяет метод передачи данных «из конца в конец», например: как установить соединение между двумя устройствами? Какие спецификации требуются для передачи данных между устройствами? Каким образом необходимо выполнять фрагментацию, реорганизацию и объединение данных? Они определяются транспортным уровнем для нас.
Сетевой уровень
Обычно мы говоримIP
Протокол находится на этом уровне. Сетевой уровень создает логические связи для передачи данных между узлами.Когда мы набираем доменное имя в браузере, как браузер находит соответствующее доменное имя в сети через это доменное имя?IP
Сопоставления, логические отношения и связи этого запроса задаются и определяются сетевым уровнем.
канальный уровень
Уровень канала передачи данных устанавливает соединения канала передачи данных между объектами связи.После того, как физические устройства подключены, требуется соответствующее программное обеспечение и драйверы для подключения и открытия этих физических устройств и создания соединений каналов.
физический слой
Определите, как физические устройства передают данные.Общие физические уровни включают сетевые кабели, оптические кабели, сетевые карты, звуковые карты и т. д. Физический уровень является основой всего программного обеспечения.
URI, URL и URN
дляURL
В принципе мы с ним знакомы, ноURI
а такжеURN
может меньше осознавать,URI
,URL
а такжеURN
— это стандартный способ идентификации, поиска и именования ресурсов в Интернете.
Когда мы вводим доменное имя в адресную строку браузера, мы фактически имеем дело с этими тремя понятиями.
URI
- Унифицированный идентификатор ресурса, Унифицированный идентификатор ресурса, называемый
URI
. - У каждого веб-сервера есть один
URI
Идентификатор, который является уникальным в мире для идентификации и локализации информационных ресурсов, ресурсной информации сURI
После идентификации доступ к ресурсу возможен через фиксированный адрес в сети Интернет. - Он имеет две формы: URN (унифицированное имя ресурса), URL (унифицированный указатель ресурса), что означает
URL
а такжеURN
является его подмножеством.
URL
Унифицированный указатель ресурсов, Унифицированный указатель ресурсов, сокращение отURL
, следующий рисунок является полнымURL
сочинение.
полныйURL
Слева направо он содержит следующие разделы:
-
schemaИдентифицирует протокол доступа, на котором основан этот адрес ресурса, например:
HTTP
а такжеFTP
. - user informationИнформация о пользователе идентифицируется (если ресурс требует аутентификации информации о пользователе), но, как правило, текущая аутентификация не использует этот метод, во-первых, очень хлопотно вводить, а во-вторых, небезопасно.
-
hostИнформация о домене, идентифицирующая ресурс, которая может быть именем домена или
IP
, функция этого блока — найти адрес физического сервера, на котором хранится ресурс. - portНомер порта, физический сервер, открывая разные порты, может одновременно запускать несколько веб-серверов, файлы ресурсов будут развернуты в определенном месте веб-сервера, а номер порта используется для определения местонахождения веб-сервера, на котором находится ресурс. существует.
- pathПуть или маршрут, на веб-сервере есть много каталогов.Как правило, путь используется для поиска каталога, в котором хранятся файлы ресурсов. Поскольку многие веб-приложения сейчас очень большие, этот путь не обязательно является адресом каталога, но также может быть адресом запроса файла статического ресурса, указанного веб-сервером.
-
queryстрока запроса, обычно используемая для
GET
Запрос, передать параметры запроса. - fragmentФрагменты, хэши или привязки в основном используются для позиционирования интерфейсных документов или в качестве средства управления переходами маршрутизации во время внешнего рендеринга.
Здесь следует отметить, что
URL
отличается от URL-адресов.URL
Он не только содержит адрес ресурса веб-страницы, но также включает гипертекстовые ресурсы, такие как изображения и видео, необходимые для создания веб-страницы, а также адреса ресурсов, такие как css js. URL-адрес по существуIP
Более избирательное сопоставление адресов вDNS
После синтаксического анализа первое, что получает браузер, — это html-документ.URL
Адрес, согласно синтаксическому анализу HTML-документа браузером, продолжает проходить через другие файлы ресурсов на веб-странице.URL
Получите соответствующий файл ресурсов.
URN
Единое имя ресурса, Единое имя ресурса, аббревиатураURN
, он используется просто для постоянного нахождения ресурсов, потому что тот же ресурс может изменить место хранения. После изменения места хранения вы определенно не сможете получить доступ к исходному URL-адресу. URN должен решить эту проблему, независимо от того, как местоположение ресурса перемещается. , просто получите доступ к тому жеURN
может быть расположен.
Набор протоколов TCP/IP
TCP
Установление соединения является обязательным шагом в успешной сетевой коммуникации, поэтомуTCP/IP
Это также стало очень важным пунктом знаний.
TCP/IP
Протокол (Transmission Control Protocol/Internet Protocol) — это не простой протокол, а набор специальных протоколов, в том числе: TCP, IP, UDP, ARP и т. д. Они называются подпротоколами. Среди этих соглашений наиболее важным и известным являетсяTCP
а такжеIP
. Поэтому мы привыкли называть все семейство протоколовTCP/IP
.
-
IP-протокол
-
IP
Протоколы делают Интернет сетью, позволяющей соединять разные типы компьютеров и разные операционные системы. -
IP
адресIP
Унифицированный формат адреса, предоставляемый протоколом, он назначает логический адрес каждой сети и каждому хосту в Интернете, который эквивалентен временному имени этой машины, и другие машины могут найти его по этому имени, а затем могут устанавливать соединения. друг с другом общаться и общаться.
-
-
TCP-протокол
-
TCP
Протокол представляет собой полнодуплексный протокол, ориентированный на соединение, поэтому и клиент, и сервер могутTCP
Получать и отправлять данные пиру по каналу соединения. -
TCP
в сравнении сUDP
Его преимущество заключается в стабильности передачи: перед передачей данных необходимо установить соединение через трехстороннее рукопожатие, в процессе передачи данных необходимо убедиться, что данные передаются на противоположный конец упорядоченным и полным образом. -
TCP
в сравнении сUDP
Недостатком является его сложность, установление и отключение соединения являются относительно большими затратами на производительность, и как только процесс передачи данных зависает, последующие данные должны ждать отправки предыдущих данных, прежде чем последующие данные смогут продолжить передачу. - Поддерживается каждым сервером
TCP
Количество подключений ограничено, что также делаетTCP
Связи становятся дефицитным ресурсом, который нельзя тратить впустую.
-
-
UDP-протокол
-
UDP
Протокол не требует установления соединения и не требует установления соединения перед передачей данных. -
UDP
Работа заключается только в обработке пакетов, и она не отвечает за упорядоченную доставку на противоположный конец без потерь, поэтому она склонна к потере пакетов. -
UDP
Поддерживает не только режим передачи «один к одному», но также поддерживает режимы «один ко многим», «многие ко многим» и «многие к одному», то естьUPD
Обеспечивает функции одноадресной, многоадресной и широковещательной передачи. -
UDP
в сравнении сTCP
Преимущество в том, что он легкий, эффективный и гибкий, его нужно использовать в некоторых сценариях с высокими требованиями к приложениям реального времени.UDP
, такие как прямая трансляция, видеоконференция, LOL и другие боевые игры в реальном времени. -
UDP
в сравнении сTCP
Недостатком является его ненадежность и нестабильность.
-
TCP-соединение
отправить официальноеHTTP
Перед запросом необходимо создатьTCP
соединение, созданное вTCP Connect
канал, всеHTTP
Запрос и ответ могут быть отправлены и получены в обычном режиме.
в различныхHTTP
В версии протокола этоTCP
Механизм создания и сохранения каналов подключения также отличается.
- существует
HTTP1.0
в, каждый разHTTP
запросы создадутTCP
соединение, после отправки запроса и ответа сервера, этоTCP
Соединение автоматически разрывается. - существует
HTTP1.1
, вы можете установить вручнуюConnection: keep-alive
заголовок запроса на созданиеTCP
постоянные соединения, несколькоHTTP
Запросы могут совместно использоватьTCP
соединять. ноTCP
Соединение блокируется в начале очереди, то есть несколько запросов ставятся в очередь на отправку.По истечении времени ожидания запроса последующие запросы могут быть только заблокированы. - существует
HTTP2
, используется мультиплексирование каналов, поэтомуTCP
Соединения поддерживают одновременные запросы, то есть несколько запросов могут выполняться параллельно в одном соединении в одно и то же время. Определенная задача запроса занимает много времени и не повлияет на нормальное выполнение других соединений, поэтому большинство запросов могут использоватьTCP
подключение без создания новогоTCP
Канал соединения не только экономит накладные расходы на трехстороннее рукопожатие, но и экономит обслуживание сервера.TCP
Стоимость порта.
Трехстороннее рукопожатие TCP и четырехсторонняя волна
трехстороннее рукопожатие
Совет: О
ACK
,FIN
,SYN
Значение кодов состояния
ACK
Он используется для подтверждения, что означает уведомление другой стороны о том, что я получил сообщение от вас.FIN
Используется для завершения, это означает сообщить другой стороне, что моя сторона закончилась, все данные отправлены, последующего вывода нет, и соединение запрошено на разрыв.SYN
Он используется для синхронизации и установления соединения, что означает информирование другой стороны о том, что я запрашиваю синхронное соединение.
- Первое рукопожатие: клиент отправляет серверу запрос на подключение
SYN
Сегмент сообщения содержит свой начальный порядковый номер передачи данных.После отправки запроса клиент входит вSYN-SENT
условие. - Второе рукопожатие: после того, как сервер получит сегмент запроса на подключение, если он согласен на подключение,отправит
ACK
а такжеSYN
Ответ информации о сообщении, ответ также будет содержать свой собственный начальный порядковый номер передачи данных.(Во время отключенных «Четырех волн»,ACK
а такжеSYN
Эти два сообщения отправляются независимо как два ответа, поэтому будет четыре взмаха рук), и сервер войдет после завершения отправки.SYN-RECEIVED
условие. - Третье рукопожатие: когда клиент получает ответ о согласии на подключение, он также отправляет подтверждающее сообщение на сервер. После того, как клиент отправляет этот сегмент, он входит
ESTABLISHED
состояние, сервер также входит после получения этого ответаESTABLISHED
Статус, в настоящее время соединение установлено успешно.
Один из вопросов, который могут задать во время собеседования: зачем нужно трехстороннее рукопожатие, если связь можно определить двумя рукопожатиями? Потому что из-за многих неконтролируемых факторов, таких как сетевые причины, это может привести к тому, что первый запрос поступит на сервер через долгое время.В это время клиент долго ждал ответа, а ранее инициированный запрос истекло время ожидания, и клиент отказался от него Drop больше не продолжает охранять монитор. Однако через долгое время сервер получил брошенный отложенный запрос и запустил новый, инициируя ответ.
TCP
Подключитесь к порту и ждите там клиента. Сервер может поддерживатьTCP
Соединения ограничены, и эта пустая бесполезная ссылка будет тратить ресурсы на сервере. Итак, сервер отправляетSYN
а такжеACK
После ответа необходимо получить повторное подтверждение от клиента, прежде чем соединение между двумя сторонами может быть официально установлено. Трехстороннее рукопожатие позволяет избежать проблемы дополнительных накладных расходов на сервер из-за задержки в сети.
помахал четыре раза
и построитьTCP
подключить как, отключитьTCP
Соединение также требует двусторонней связи между клиентом и сервером, поскольку для завершения всего действия по отключению требуется в общей сложности 4 пакета данных, отправленных с обеих сторон, поэтому оно называется «четырьмя взмахами рук».
- Первая волна: клиент считает, что все данные на его стороне были отправлены, поэтому он отправляет
FIN
Используется для закрытия передачи данных от клиента к серверу.После завершения передачи клиент входит вFIN_WAIT_1
условие. - Вторая волна: сервер получает сообщение, отправленное клиентом
FIN
Позже прикладному уровню будет предложено разорвать TCP-соединение и отправитьACK
Для клиента это означает, что он получил запрос на освобождение от клиента и больше не будет принимать данные, отправленные клиентом.CLOSE_WAIT
положение дел. - Третья волна: Если на сервере все еще есть данные, которые не были отправлены в это время, он может продолжить отправку.После отправки сервер также отправит сообщение об освобождении соединения.
FIN
Запрос используется для закрытия передачи данных от сервера к клиенту, после чего сервер входитLAST_ACK
условие. - Четвертая волна: клиент получает сервер
FIN
После запроса отправить последнийACK
на сервер, затем введитеTIME_WAIT_2
состояние, это состояние будет длиться 2MSL (максимальное время жизни сегмента, которое относится к времени, в течение которого сегмент сохраняется в сети, тайм-аут будет отброшен) время, если в течение этого периода времени от сервера не будет запроса на повторную передачу, клиент войтиCLOSED
Статус.После того как сервер получит ответное сообщение, он также войдетCLOSED
состоянии, процесс четырехкратного махания руками завершен, и обе стороны официально разъединены.
Вышеупомянутое содержание все еще может быть немного неинтуитивным, поэтому я также подготовил абзац для описания всего процесса:
- Клиент: Здравствуйте, я в порядке.
- Сервер: О, ты в порядке? Я знаю, я не в порядке, подожди минутку.
- Сервер: Хорошо, теперь я тоже в порядке.
- Клиент: Да, в этот раз я хорошо провел время, мы договоримся о встрече в следующий раз.
Некоторые интервьюеры могут спросить, почему три рукопожатия для установления соединения и четыре раза для отключения? Это связано с тем, что в процессе установления соединения сервер получает клиента, но запрос на соединение устанавливается.
SYN
После сообщения,ACK
а такжеSYN
Поместите его в сообщение и отправьте клиенту. Когда соединение закрыто, сервер получает клиентскийFIN
Сообщение просто означает, что клиент больше не отправляет данные, но все еще может получать данные, а на сервере могут быть еще данные, которые не были отправлены, поэтому они не могут быть отправлены немедленно.FIN
сообщение, может быть отправлено только первымACK
Сообщение сначала отвечает клиенту, и только после подтверждения того, что все данные были отправлены на его собственной стороне, будет отправлено.FIN
. Итак, при отключении серверACK
а такжеFIN
Как правило, они отправляются отдельно, что приводит к тому, что для отключения требуется на одну операцию отправки больше, чем для запроса подключения.
Определение HTTP
После того, как сквозное соединение будет успешно установленоTCP
Подключайтесь, следующий шаг — начать отправку официальногоHTTP
просил. течет вTCP Connect
в каналеHTTP
Он отвечает только за передачу пакетов данных, и нет понятия соединения, поэтомуHTTP
Также известен как «протокол без сохранения состояния».
HTTP
Протокол — это аббревиатура от Hyper Text Transfer Protocol (Протокол передачи гипертекста), который обычно работает наTCP
Выше, через браузер и сервер для взаимодействия данных, предусмотрена передача гипертекста (текст, изображения, видео и т. д.). То есть,HTTP
Протокол определяет правила, которым необходимо следовать при передаче гипертекста.
-
HTTP
Протоколы не имеют состояния. Это означает, что клиент и сервер не могут узнать информацию о текущем состоянии друг друга.HTTP
Сам запрос не содержит никакого хранилища состояния. Но на практике клиент и сервер должны требовать государственной аутентификации и взаимодействия, поэтому введениеCookie
, используемый для хранения некоторой информации о состоянии текущего браузера, каждый раз через независимыйHTTP
Запрос отправляется и принимается для решения этой проблемы. -
HTTP
запросы не зависят друг от друга.HTTP
Каждый из них представляет собой самостоятельный индивидуальный запрос.В большинстве случаев, когда клиент запрашивает веб-страницу, это не является успешным запросом.Сначала отвечает сервер.HTML
странице, и после того, как браузер получит ответ, он обнаружит, что страница также ссылается на другие ресурсы, такие как файлы CSS, JS, изображения и т. д., и также автоматически отправитHTTP
Запросите доступ к этим необходимым ресурсам. -
HTTP
протокол, основанный наTCP
протокол.HTTP
Целью протокола является указание формата и поведения взаимодействия данных при передаче данных клиента и сервера, и он не несет ответственности за детали передачи данных.TCP
осуществленный. Используемая в настоящее время версия является постоянным соединением по умолчанию, т. е. несколько раз.HTTP
запрос на использованиеTCP
соединять.
Уведомление:
HTTP
запрос иTCP
Связи не те,HTTP
вTCP
Запрос передачи инициирован на основе соединения, в том жеTCP
Под каналом соединения вы можете отправить несколькоHTTP
Запрос, например, это отношения между шоссе и автомобилем.
История развития HTTP
HTTP версии 0.9
- единственный
GET
Заказ. - Нет заголовков запросов и заголовков ответов для описания информации, связанной с передачей данных.
- После того, как сервер отправил данные, закройте его напрямую
TCP
подключение, не поддерживаетсяTCP
Постоянное соединение.
HTTP версии 1.0
- Добавлено много команд,
HEAD
,POST
,PUT
,DELETE
Ждать. - Добавлен
status code
код состояния иheader
заголовки запросов и ответов. - Добавлена поддержка нескольких кодировок, многокомпонентная отправка, разрешения, кэширование и многое другое.
- можно включить через
Connection: keep-alive
указать использованиеTCP
Длинное соединение
HTTP 1.1 (в настоящее время широко используется)
- Постоянные подключения поддерживаются по умолчанию
- По умолчанию поддерживается PersistentConnection, который по умолчанию включен.
Connection: keep-alive
. - Поддерживает конвейерную обработку запросов, т.е.
TCP
Можно отправить несколько соединенийHTTP
запрос и ответ. - повысился
host
поля заголовка запроса, черезhost
Синтаксический анализ позволяет запускать несколько программных служб на одном физическом сервере, что значительно повышает эффективность использования сервера. токnginx
Обратный прокси основан наHTTP
в заголовке запросаhost
различать разные запросы, чтобы проксировать эти запросы к разным программным службам на одном сервере.
HTTP 2.0
-
HTTP1.x
Пашин основан на тексте и имеет анализ недостатков; покаHTTP2.0
Вместо этого напрямую используйте метод бинарного синтаксического анализа.HTTP 1.X
Разбор строк более эффективен и надежен. -
HTTP2.0
Все данные передаются в «кадрах», поэтому больше не нужно последовательно возвращать несколько запросов, отправленных по одному и тому же соединению, и можно обеспечить параллельную передачу данных. -
HTTP2.0
Информация заголовка сжатия используется для оптимизации объема передаваемых данных.HTTP1.x
Заголовки запроса несут много информации, и каждый раз их приходится отправлять повторно,HTTP2.0
использоватьencoder
Чтобы уменьшить размер заголовка запроса, который необходимо передать, каждая сторона связи кэширует копию.header fields
Таблица не только позволяет избежать повторной передачи, но и уменьшает размер передаваемой информации. -
HTTP2.0
недавно добавленныйserver push
(server push), сервер может активно инициировать отправку некоторых данных. Например, когда сервер получает сообщение от браузераHTML
Одновременно с запросом он может активно передавать клиенту соответствующие файлы ресурсов (js/css) и отправлять их параллельно для повышения эффективности передачи и рендеринга веб-страницы. - В настоящее время, если вы хотите использовать
HTTP2
нужно использовать в первую очередьHTTPS
На этой основе можно использоватьHTTP2
HTTP 2.0
в сравнении сHTTP 1
Самое интуитивно понятное улучшение производительности загрузки изображений, которое вы можете увидетьHTTP 2
Официальная демонстрация повышения производительности
HTTPS
Мы часто видим плавающие всплывающие окна или рекламу на некоторых веб-страницах, а иногда даже видим эту спам-рекламу на веб-страницах, которые мы написали.Однако разработчики явно не это написали, а такая ненужная информация Как она попала вверх?
Основная причина кроется в различных прокси-сервисах, когда мы инициируемHTTP
Запрос не передается напрямую на целевой сервер, и в течение этого периода он будет проходить через уровни прокси-сервисов.Мы обычно используемnginx
, И вDNS
Все операторы широкополосного доступа, которые должны быть переданы в процессе синтаксического анализа, являются прокси-сервисами.
из-заHTTP
При использовании незашифрованных строк для передачи данных эти данные могут быть легко прочитаны или даже изменены промежуточной службой, после чего промежуточная служба получает оригинал.HTML
Данные, в него несложно вставить небольшую рекламу.
HTTPS
это решитьHTTP
Механизм решения проблем безопасности, возникающих при передаче открытого текста —— ДаHTTP
Информация в запросе шифруется и передается, тем самым эффективно предотвращая проблему перехвата или подделки информации промежуточной прокси-службой.
HTTPS
Это на самом деле расширенная версия.HTTP 1.1
Следует отметить несколько моментов:
-
HTTPS
соглашение должноCA
Подать заявку на сертификат, вообще бесплатных сертификатов очень мало, и нужно платить пошлину -
HTTP
Протокол работает наTCP
Выше весь передаваемый контент в открытом виде,HTTPS
действующийSSL/TLS
над,SSL/TLS
действующийTCP
Выше весь передаваемый контент шифруется. -
HTTP
а такжеHTTPS
Он использует совершенно другой метод подключения и использует другие порты.80, последний443. -
HTTPS
Это может эффективно предотвратить угон носителя и решить большую проблему защиты от угона.
Состав HTTP-сообщения
HTTP
Это существует в форме запроса и ответа, потому что инициатор активно инициируетHTTP
Затем ответчик отвечает на запрос, и две стороны передают данные друг другу в соответствии с определенным форматом сообщения, полнымHTTP
сообщения обычнопервая строка,столицаа такжеосновной корпуссоставляют.
первая строка
Первая строка не принадлежитHttp Headers
, который содержит:
-
HTTP Method(
GET
,POST
,PUT
,DELETE
д.), разныеHTTP Method
имеют разные значения.HTTP Method соответственно GET Обычно используется для получения ресурсов сервера POST Обычно используется для передачи тела объекта PUT Обычно используется для передачи файлов DELETE для удаления файлов HEAD Он используется для получения заголовка сообщения и не возвращает тело сообщения. OPTIONS Метод, используемый в предварительном запросе для запроса поддержки ресурсов URI запроса. HTTP Method
ТолькоHTTP
Норма, продвигаемая протоколом, напримерESLint
, вы можете следовать или не следовать, то, что они делают, по сути то же самое, но семантика более явная. -
URLАдрес запрошенного ресурса, этот адрес будет содержать только запрошенный адрес маршрутизации.
-
версия протокола,
HTTP 1.0 / HTTP 1.1 / HTTP 2
. -
Код состояния возврата HTTP(указывается в первой строке ответного сообщения)
HTTP
Определено 40 стандартных кодов состояния, которые можно использовать для передачи результатов клиентских запросов.Коды состояния делятся на следующие пять категорий.Информацию о возвращаемых кодах состояния для каждого сегмента см.Код HTTP-ответа:
Здесь следует отметить, что хорошая служба приложений HTTP должна иметь полную возвращаемую информацию о коде состояния HTTP, то есть посетитель может узнать информацию о состоянии текущего HTTP-запроса только из состояния HTTP > кода. В настоящее время большинство кодов возврата HTTP в нашем режиме разработки являются только
200
а также500
. Студенты на стороне сервера сначала200
Вернитесь и расскажите, что не так с «Нет входа» / «Нет аутентификации» / «Нет разрешений». В индустрии тоже есть шутка:Дело не в том, что его нельзя использовать, На самом деле этот метод разработки неверен, независимо от того, с точки зрения удобства обслуживания кода или личного развития, нам нужно максимально избегать этой проблемы.
HTTP-заголовки
Информация заголовка HTTP, то естьHTTP Header
, информация после переноса первой строкиHTTP Header
.HTTP header
Некоммерческая информация о взаимодействии между клиентом и сервером обычно сохраняется, например: тип данных этого запроса, дата запроса, поддержка набора символов, настраиваемые поля заголовка, некоторые учетные данные связи и поддержка кэша.HTTP Header
Полный список полей:портал
основной корпус
предмет, то естьHTTP body
,HTTP Header
Сообщение и основное сообщение разделяются пустой строкой + перевод строки.HTTP body
Некоторая конкретная деловая информация запроса обычно помещается в
HTTP-согласование данных
В протоколе HTTP согласование данных — это механизм, в котором клиент информирует сервер через заголовок запроса о формате данных, форме представления и методе сжатия данных, которые запрос хочет получить. Согласование общих данных — это, например, естественный язык, используемый документом, формат изображения или форма кодирования содержимого. Сервер может проанализировать поле согласования данных, содержащееся в заголовке запроса, а затем использоватьотносительное полеЧтобы уведомить клиента: формат данных, метод сжатия и другая информация, возвращенная на этот раз. Таким образом, браузер может использовать определенный метод синтаксического анализа для анализа, обработки и отображения этих ресурсов.
Ниже приведен краткий список некоторых часто используемых полей согласования данных.Завершите шлюз сообщений согласования данных
-
Accept
Поле заголовка запроса, указывающее ожидаемый тип данных -
Accept-Encoding
Поле заголовка запроса указывает метод кодирования, в котором должны быть переданы нужные данные. Оно часто используется для ограничения метода сжатия данных сервером. Этот метод используется в стандартном сжатии GZIP, оптимизированном для размера пакета JS-файла. -
Accept-Language
Поле заголовка запроса указывает желаемый тип языка данных: китайский, английский или другие языки.Это поле заголовка обычно добавляется браузером автоматически. -
User-Agent
Поле заголовка запроса указывает информацию о браузере этого запроса.Сервер может выбирать страницы с различной совместимостью для возврата пользователю на основе этой информации или вести статистику по информации о браузере пользователя, операционной системе и другим данным. -
Content-Type
Поле заголовка ответа в заголовке запросаAccept
Поле может указывать несколько допустимых форматов данных, и сервер в конечном итоге вернет формат данных клиенту. -
Content-Encoding
Поле заголовка ответа, соответствующееAccept-Encoding
-
Content-Language
Поле заголовка ответа, соответствующееAccept-Language
длинное HTTP-соединение
КаждыйHTTP
запросы должны бытьTCP
Только в канале связи можно отправлять и получать сообщения. существуетHTTP
В более ранних версиях протокола каждыйHTTP
Перед отправкой запроса создается новыйTCP
канал соединения, после того как этот запрос будет выполнен,TCP
Канал автоматически закроется.
Проблема в том, что одинTCP
Невозможно повторно использовать соединение, что приводит к большой трате новой энергии. К счастью, эта проблемаHTTP
Было рассмотрено постепенное уточнение протокола.
существуетHTTP 1.0
введен вConnection
поле заголовка, которое разрешено устанавливатьKeep-Alive
илиClose
чтобы решить, следует ли повторно использовать TCP-соединение или закрыть его сразу после завершения запроса. пока вHTTP 1.1
По умолчанию оба конца будут включать это поле по умолчанию, то есть поддержка по умолчаниюHTTP
долгая связь.
нужно знать, это:
Connection: Keep-Alive
Оба конца должны быть включены одновременно, чтобы начатьHTTP
долгое соединение, если какой-либо сегмент установлен вручнуюConnection
дляClose
, длинное соединение не может быть обнаружено, так как установление и сохранение TCP-соединения — это интерактивный процесс с двумя терминалами.
Итак, как мы видим локальноTCP
Как насчет идентификатора соединения, вы можете открытьChrome
инструменты отладки для просмотра:
Как видно на рисунке, есть разныеConnection ID
, что означает, что этот запрос на самом деле открывает новыйTCP
соединение, нижняя часть запросаConnection ID
одинаковые, представляющие несколькоHTTP
Запрос повторно использует один и тот жеTCP
соединять.
Максимальное количество одновременных TCP-подключений, которое может поддерживать браузер Chrome, равно6, И в
HTTP 2.0
нижеHTTP
версии запрос блокируется. То есть, как только шесть соединений заполнены, а предыдущий запрос не выполнен, последующий запрос будет заблокирован до тех пор, пока предыдущий запрос не вернется, и последующие запросы могут быть отправлены.
HTTP-кэш
Хотя кэширование HTTP не требуется, часто необходимо повторно использовать кэшированные ресурсы. Однако обычные кэши HTTP могут хранить только ответы GET и ничего не могут делать с ответами других типов. Ключ к кэшированию в основном включает
request method
и целевой URI (обычно кэшируются только запросы GET).
стратегия чтения кэша
Кэш файлов во внешней среде разделен на несколько разных мест. Когда мы откроем консоль Chrome и проверим параметр размера каждой записи запроса в разделе «Сеть», мы найдем очень богатую исходную информацию.
Для интерфейсной среды браузера позиции чтения кеша расположены в последовательном порядке, а порядок следующий (поиск сверху вниз, если вы его найдете, верните его; если вы не можете его найти, продолжите).
- Service Worker
- Memory Cache
- Disk Cache
- сетевой запрос
Service Worker
Кэш Service Worker отличается от других встроенных механизмов кеширования в браузерах, он позволяет нам свободно контролировать, какие файлы кешируются, как сопоставлять кеш, как читать кеш, и кеш является постоянным.
- Сначала поиск в браузере.
- постоянное хранение.
- Вы можете более гибко управлять хранимым содержимым, выбирать файлы для кэширования, определять правила сопоставления маршрутов для кэшированных файлов и т. д.
- Его можно посмотреть по F12 в Chrome, Application -> Cache Storage.
Memory Cache
-
memory cache
является хранилищем кеша в памяти. - Быстрое чтение.
- Место для хранения небольшое.
- Время хранения короткое, когда браузер
tab
Страница закрывается, а ресурсы памяти освобождаются. - Если явно указано
Cache-Control
дляno-store
, браузер не будет использоватьmemory-cache
.
Disk Cache
-
Disk Cache
Кэш-память на жестком диске. - читать медленнее, чем
Memory Cache
, быстрее сетевых запросов. - Место для хранения большое.
- постоянное хранение.
-
Disk Cache
Строго следоватьHTTP
Поля в заголовке для определения возможности кэширования ресурса, аутентификации и т. д. - Часто слышимые «принудительный кеш», «контрастный кеш» и т.д.
Cache-Control
д., попадают в эту категорию.
сетевой запрос
Если ни один из запрошенных файлов ресурсов не соответствует указанной выше политике кэширования, будет инициирован сетевой запрос. После того, как браузер получит ресурс, он добавит новый ресурс в кеш.
Cache-Control
Заголовок Cache-Control, определенный в HTTP/1.1, используется для обозначения поддержки механизма кэширования.Этот атрибут поддерживают как заголовки запросов, так и заголовки ответов. Стратегия кэширования определяется различными значениями, которые она предоставляет. Следует отметить, что сценарии с быстрой сменой данных не подходят для открытия
Cache-Control
.
инструкция | эффект |
---|---|
public | Общедоступный кэш: указывает, что ответ может быть кэширован любым посредником (например, промежуточным прокси, CDN и т. д.). |
private | Частный кеш: указывает, что ответ предназначен для одного пользователя, посредник не может кэшировать ответ, и ответ может использоваться только в частном кеше браузера. |
max-age | (единица/секунда) Установите время истечения кэша, если он истекает, вам нужно повторно запросить, иначе локальный кеш читается и запрос фактически не отправляется. |
s-maxage | (единица/секунда) Переопределить max-age, эффект тот же, действует только на прокси-сервере |
max-stale | (единица/секунда) указывает, что этот просроченный кеш используется, даже если срок действия кеша истек |
no-store | Отключить кеширование |
no-transform | Ресурс не должен быть преобразован или сжат, а заголовки HTTP, такие как Content-Encoding, Content-Range и Content-Type, не могут быть изменены прокси-сервером (иногда, когда ресурс относительно велик, прокси-сервер может выполнять обработку сжатия самостоятельно). , чтобы предотвратить это). |
no-cache | Обязательное подтверждение кеша: то есть перед каждым использованием локального кеша нужно запрашивать у сервера проверку недействительности кеша, если срок его действия не истек (примечание: на самом деле возвращает 304), то кеш будет только использовать копию локального кэша. |
must-revalidate | Подтверждение проверки кеша: означает, что кеш должен проверить свое состояние, прежде чем рассматривать использование устаревшего ресурса, а кеш с истекшим сроком использования не будет использоваться. |
proxy-revalidate | То же, что и must-revalidate, но работает только для общих кэшей (таких как прокси) и игнорируется частными кэшами. |
проверка кеша
В процессе использования кэша в браузере, чтобы сотрудничать без кэша в Cache-Control, нам также нужен механизм для проверки того, действителен ли кеш. Например, ресурсы сервера обновляются, и клиент должен вовремя обновлять кеш; или ресурсы клиента истекли истек, но ресурсы на сервере все еще старые, и в настоящее время нет необходимости повторно проходить. Проверка кеша используется для решения этих проблем. В HTTP 1.1 мы в основном сосредоточены на следующем
Last-Modified
а такжеETag
эти два поля.
Last-Modified
Как следует из названия, это время последней модификации ресурса. Когда клиент обращается к ресурсам сервера, серверLast-Modified
Значение возвращается клиенту. После того, как клиент его получит, сервер вернет его при следующей отправке запроса.Last-Modified
значение, загруженное вIf-Modified-Since
илиIf-Unmodified-Since
, отправленный на сервер для проверки кеша.
Таким образом, сервер может читатьIf-Modified-Since
(чаще используется) илиIf-UnModified-Since
значение, а местныеLast-Modified
значение для сравнения. Если проверка обнаружит, что эти два значения совпадают, это означает, что запрошенный файл ресурса на этот раз не был изменен, тогда сервер сообщит браузеру, что ресурс действителен и может продолжать использоваться, в противном случае последний ресурс нужно использовать.
Взгляните на два изображения ниже:
при запросе сервераscript.js
, вы можете видеть, что сервер вернулсяLast-Modified
, который записывает время последней модификации ресурса
Когда клиент снова инициирует запрос в следующий раз, он перенесет время истечения на сервер для проверки.
Давайте взглянем на часть кода на стороне сервера:
const http = require('http');
const fs = require('fs');
http.createServer((request, response) => {
const ifModifiedSince = request.headers['If-Modified-Since'];
const lastModified = 'Web Aug 19 2019 19:01:15 GMT+0800 (China Standard Time)';
if (request.url === '/') {
const html = fs.readFileSync('test.html', 'utf-8');
response.writeHead(200, {
'Content-Type': 'text/html'
});
response.end(html);
}
if (request.url === '/script.js') {
const js = fs.readFileSync('script.js', 'utf-8');
let status = 200;
// 如果读取到的 If-Modified-Since 和 lastModified 相同,则设置头部 304 表示可使用缓存
if (ifModifiedSince === lastModified) {
status = 304;
response.end('');
}
response.writeHead(status, {
'Content-Type': 'text/javascript',
'Cache-Control': 'no-cache,max-age=2000',
'Last-Modified': lastModified
});
response.end(js);
}
});
ETag
Etag
Эффект по существу иLast-Modified
не много отличий. в сравнении сLast-Modified
Стратегия проверки кэша, использующая дату последнего изменения для сравнения ресурсов на предмет недействительности.ETag
черезподпись данныхсделать более строгую проверку кеша.
так называемыйподпись данных, на самом деле, помечая содержимое ресурса уникальной подписью, как только содержимое ресурса изменится, подпись изменится, и сервер использует эту подпись в качестве секретного кода, чтобы отметить действительность кеша. Типичный подход заключается в вычислении хеш-функции содержимого ресурса, подобно хеш-метке, добавляемой веб-пакетом для упаковки онлайн-ресурсов.
а такжеLast-Modified
вести перепискуIf-Modified-Since
такой же,ETag
также будет соответствоватьIf-Match
илиIf-None-Match
(If-None-Match
используется чаще), если подпись до и после одинакова, нет необходимости возвращать новое содержимое ресурса.
Разумное использование проверки кеша
Last-Modified
а такжеETag
Просто дает серверу возможность контролировать срок действия кеша, нет необходимости принудительно применять роль кеша и, наконец, определять, использовать ли кеш, или использовать новый файл ресурсов, или нужно указать серверомhttp code
решать. Для файлов, сохраненных на сервере, есть атрибут даты последнего изменения, при использованииLast-Modified
Вы можете использовать этот допустимый атрибут для проверки кэша данных или ввестиupdatetime
поле для определения конкретной даты модификации, чтобы определить, действителен ли кеш. Как построить сервер, который может разумно использовать кеш, требует дополнительных внутренних знаний и не будет здесь подробно описываться.
Политика одинакового происхождения браузера
Ограничение браузера на одно и то же происхождение: когдабраузерURL доступаПротокол (схема) / порт (порт) / доменное имя (хост), когда какой-либо из трех не соответствует информации о текущем фрагменте URL, возникает междоменная проблема.
текущий адрес | адрес запроса | был ли запрос успешным |
---|---|---|
www.juejin.com:80 | www.juejin.com:80 | Междоменный (разные протоколы) |
www.juejin.com:80 | www.juejin.cn:80 | Междоменные (разные доменные имена) |
www.juejin.com:80 | www.juejin.com:90 | Междоменный (разные порты) |
Необходимо прояснить несколько моментов, касающихся междоменного доступа:
-
Кроссдоменность — это средство защиты, предоставляемое браузерами., на стороне сервера нет кросс-домена. Вот почему интерфейс больше зависит от режима разработки, в котором интерфейс и сервер разделены.
webpack-dev-server
Причина запуска прокси-сервиса для ретрансляции и проксирования бэкэнд-интерфейса в том, что между двумя серверами, взаимодействующими друг с другом, нет междоменного барьера. -
Междоменный, для XMLHttpRequest нет междоменных ограничений для браузеров для получения статических ресурсов с разных исходных серверов., что также
JSONP
Суть реализации междоменных запросов. - В отличие от XMLHttpRequest,Для ресурсов сценария, загруженных через атрибут src, браузер ограничивает разрешения Javascript, чтобы он не мог читать, записывать и возвращать содержимое..
- Для браузеров, в дополнение к ограничениям политики одного источника, налагаемым DOM, Cookie и XMLHttpRequest, некоторые распространенные подключаемые модули, такие как Flash, Java Applet, Silverlight, Google Gears и т. д., также имеют свои собственные политики управления.
Когда браузер отправляет запрос на сервер в другом домене, запрос действительно может быть отправлен, другой сервер действительно может получить запрос и действительно может дать ответ вашему браузеру, и браузер действительно может получить достоверные данные. Однако если в случае кроссдоменности сервер возвращает данные в заголовке ответа
Access-Control-Allow-Origin
Поле, текущее доменное имя не включено в белый список, то браузер будет скрывать данные, возвращаемые сервером, не говоря, а затем броситьAccess-Control-Allow-Origin
ошибка.
Что касается того, почему файлы ресурсов не ограничены политикой одного и того же происхождения? Вы можете себе представить, что если файлы ресурсов также ограничены от междоменного доступа, то широко используемая сегодня стратегия кэширования CDN в основном бесполезна. Кроме того, файлы ресурсов многих веб-сайтов теперь размещаются на OSS облачного сервера, URL-адреса, соответствующие ресурсам OSS, должны находиться в разных доменах, чтобы эти ресурсы нельзя было использовать.
Access-Control-Allow-Origin
Access-Control-Allow-Origin
Определяет междоменный белый список, разрешенный сервером. Он имеет следующие методы настройки:
- установить напрямую
*
Подстановочные знаки просты и грубы, но это эквивалентно полному открытию всех интерфейсных ресурсов сервера для внешнего мира, что небезопасно. - Установите указанный домен, например
Access-Control-Allow-Origin: https://www.baidu.com
, который разрешает междоменный доступ только для запросов из указанного домена. - Динамически устанавливается серверной частью.
Access-Control-Allow-Origin
Ограничение состоит в том, чтобы написать только один белый список, но что, если у нас есть несколько доменов, требующих междоменных запросов? В это время сервер может сам поддерживать набор списков белого списка, и когда приходит запрос, можно проверить источник запроса.host
Выполните сравнение белого списка, если он есть в белом списке, поставьте этоAccess-Control-Allow-Origin
Динамически настройте его, а затем верните ответ.
Предварительный запрос CORS
Если мы сделаем, как указано выше, и установим толькоAccess-Control-Allow-Origin
Может ли белый список быть полностью беспрепятственным для междоменного доступа? Не совсем.
Даже если на удаленной стороне включена проверка подлинности по белому списку доменных имен, некоторые операции все равно требуют дополнительной проверки подлинности.CORS 预请求
.
Процесс триггера предварительного запроса
Условия срабатывания для предварительных запросов браузера,заключается в том, чтобы судить, является ли этот запрос простым запросом.
Если этот запрос принадлежитсложный запросЗатем, затем перекрестный домен перед отправкой формального запроса, браузер сначала подготовит файл под названиемOPTIONS
изHTTP Method
, отправлено в качестве предварительного запроса.
После того, как сервер передаст предварительный запрос, следующий браузер выполнит формальный запрос данных. Весь процесс запроса фактически представляет собой два запроса: предварительный запрос и последующий фактический запрос данных.
простой запрос
- Метод запроса может быть только
GET
POST
HEAD
- Поля заголовка запроса позволяют только:
Accept
Accept-Language
Content-Language
Content-Type
-
Content-Type
Значения ограничены:text/plain
multipart/form-data
application/x-www-form-urlencoded
-
XMLHttpRequestUpload
Ни у одного из объектов не зарегистрированы прослушиватели событий (просто знайте). - не используется в запросе
ReadableStream
Объект (просто знайте это).
сложный запрос
За исключением тех, которые определены в простых запросах, все они являются сложными запросами, и все они требуют предварительных запросов.
предварительно запрошенная аутентификация
Так как же сделать предварительный запрос успешно аутентифицированным? Еще нужно, чтобы сервер продолжал помогать устанавливать белый список заголовка запроса:
-
Access-Control-Allow-Headers
, который устанавливает разрешенные дополнительные поля заголовка запроса. -
Access-Control-Allow-Methods
, который устанавливает разрешенные дополнительные методы запроса. -
Access-Control-Max-Age
(единица/секунда), указывает, как долго результат предварительного запроса может кэшироваться.В течение этого времени повторно отправленный междоменный запрос не будет предварительно проверяться.
Все больше конкретных политик междоменных ограничений могутНажмите сюда, чтобы увидеть больше
Схема оптимизации производительности HTTP
- добросовестное использование
HTTP
Стратегия кэширования позволяет избежать дополнительных потерь производительности, вызванных множественными запросами к серверу одного и того же ресурса. - использовать как можно больше
HTTP
Длинное соединение, избегайте перестроения каждый разTCP
Потеря времени соединения - использовать как можно больше
HTTPS
для обеспечения безопасности передачи по сети. - можно использовать
HTTP2
Чтобы значительно повысить эффективность передачи данных, используйтеserver push
включиHTTP2
функция отправки сервера - Клиент открыт
Accept-Encoding
Поддержка сжатия, сервер передает сжатые файлы для уменьшения размера передаваемых данных