HTTP 概述 | 青训营笔记

188 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的的第 4 天。

昨天下午的 HTTP 课程非常完整地讲解了 HTTP 相关的知识点,总结在这篇文章中。主要以大纲的形式列举知识点并作简要介绍,具体细节每个知识点都可以写一篇文章。

浏览器输入 URL 后发生了什么?

这是一个面试常考的问题,能够考察面试者的网络基础 (DNS、HTTP 等) 和对浏览器原理的了解,此处引用老师的一张图来简单概括,详细过程可以看一下这篇文章:深入理解现代浏览器

截屏2022-07-31 10.01.04.png

HTTP 在其中负责向服务端请求数据,供浏览器渲染给用户看。

HTTP 简介

HTTP (HyperText Transfer Protocol,超文本传输协议) 是基于 TCP 的应用层协议,使用请求/响应的简单交互模型,无状态确保了服务端能高性能、高并发地处理请求,使用 Header 传输元数据使协议可扩展。

截屏2022-07-31 10.07.01.png

HTTP 在 OSI 7 层协议栈和 TCP/IP 4 层协议栈中都属于应用层。

截屏2022-07-31 10.10.43.png

HTTP 通信前通常需要使用 DNS 获取域名对应的 IP,传输层依赖于 TCP 协议,HTTPS 在 TCP 之上添加了一层 TLS 层,实现了防窃听、防篡改、防冒充。

HTTP 版本发展

  • HTTP/0.9
    • 只能 GET 请求 HTML 文档
  • HTTP/1.0
    • 添加了 Header
    • 添加了 Status Code
    • 支持多种文档类型
  • HTTP/1.1
    • 链接复用
    • 缓存
    • 内容协商
  • HTTP/2
    • 二进制协议
    • 压缩 Header
    • 服务器推送
  • HTTP/3 (草案)

HTTP 报文结构

HTTP 报文主要分为请求报文 (Request) 和响应报文 (Response)。

请求报文的结构为:

  • 第一行包含 3 个字段:HTTP 方法 (Method)、请求的路径 (Path)、使用的 HTTP 版本 (Version),用空格分隔
  • 紧接着的若干行为 Request Headers,每行一个键值对
  • 一行空行
  • 请求体 (Request Body)

响应报文的结构为:

  • 第一行包含 3 个字段:HTTP 版本 (Version)、状态码 (Status Code)、状态消息 (Status Message)
  • Response Headers
  • 空行
  • Response Body

httpmsgstructure2.png

Method

HTTP 方法可以看 MDN 的这篇文章:HTTP request methods

HTTP 部分方法有两个特性:安全性 (Safe) 和幂等性 (Idempotent)。

  • 安全性:不会修改服务器数据,包括 GET/HEAD/OPTIONS
  • 幂等性:执行多次与执行一次的效果相同,包括 GET/HEAD/OPTIONS/PUT/DELETE

Status Code

HTTP 状态码可以分为 5 类,具体看这篇文章:HTTP response status codes

  • 1xx:Informational,指示一些信息
    • 100 Continue
  • 2xx:Successful,请求成功
    • 200 OK
    • 201 Created
    • 204 No Content
  • 3xx:Redirection,重定向
    • 301 Moved Permanently
    • 302 Found
    • 304 Not Modified
  • 4xx:Client error,客户端的请求有问题
    • 400 Bad Request
    • 401 Unauthorized
    • 404 Not Found
    • 410 Gone
  • 5xx:Server error,服务端处理合法请求中出错
    • 500 Internal Server Error
    • 501 Not Implemented
    • 502 Bad Gateway
    • 504 Gateway Timeout

Headers

HTTP Headers 可以分为 Request Headers 和 Response Headers,也有一些 Headers 在请求报文和响应报文中都可以使用,具体看这篇文章:HTTP headers。最好根据使用场景来学习,比如缓存、跨域、Cookie 等。

REST

REST (Representational State Transfer,表现层状态转化) 是 Roy Thomas Fielding 在他 2000 年的博士论文中提出的一种 API 设计风格,特征如下:

  • 每个 URI 代表一个资源
  • 客户端和服务端之间传递资源的一种表现层
  • 客户端通过 HTTP 方法操作服务端资源,实现状态转化

AJAX

除了通过浏览器发出 HTTP 请求,也可以通过 JavaScript 发出请求,这种技术称为 AJAX (Asynchronous JavaScript And XML),包括 XMLHttpRequestfetch

Node 提供了内置的 httphttps 模块用于发送 HTTP 请求。

实际开发中主要使用封装好的请求库,比如 Axios

性能优化

为了快速加载出页面,实现良好的用户体验,需要进行网络优化和稳定性优化。

截屏2022-07-31 10.51.21.png

截屏2022-07-31 10.51.51.png