HTTP

定义

HTTP:超文本传输协议
超文本:文字、图片、视频等的混合体,例如HTML,本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,再经过浏览器的解释,呈现给我们的就是一个文字、有画面的网页了。
传输:是说HTTP是一种两点之间传输数据的约定和规范,并且这里的两点之间可以有中转,并且是双向的
协议:协表明有两个以上的参与者,议表明它是一种约定和规范
综上所述:HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。

常见状态码

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

  • 200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
  • 204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
  • 206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
    3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
  • 301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
  • 302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
  • 304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
    4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
  • 400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
  • 403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
  • 404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
    5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
  • 500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
  • 501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
  • 502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
  • 503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

常见字段

请求字段(Request Headers)

  1. Host:请求的服务器地址。
  2. User-Agent:发出请求的用户代理的详细信息,通常是浏览器或其他客户端软件。
  3. Accept:客户端能够接收的内容类型,如text/htmlapplication/json等。
  4. Accept-Language:客户端希望接受的语言,如en-USzh-CN等。
  5. Accept-Encoding:客户端支持的编码方式,如gzipdeflate
  6. Connection:控制不同请求/响应之间连接的选项,常见值为keep-alive
  7. Authorization:包含证明客户端有权查看特定资源的凭证信息。
  8. Content-Type:请求体中内容的类型,如application/x-www-form-urlencodedmultipart/form-data
  9. Content-Length:请求体的长度。
  10. Cookie:服务器发送的cookie。

响应字段(Response Headers)

  1. Status Code:响应状态码,如200 OK404 Not Found
  2. Content-Type:响应内容的MIME类型。
  3. Content-Length:响应内容的长度。
  4. Content-Encoding:响应内容的编码方式。
  5. Set-Cookie:服务器向客户端发送的cookie。
  6. Cache-Control:告诉浏览器关于缓存如何处理响应的指令。
  7. ETag:资源的特定版本标识符。
  8. Expires:响应过期的日期/时间。
  9. Last-Modified:资源最后修改的日期和时间。
  10. Server:服务器软件信息。

常见方法

HTTP请求方法主要用于定义对资源的操作。这里有一些常见的HTTP方法和它们的基本用途:

  1. GET
    • 用途:请求指定的页面信息,并返回实体主体。
    • 特点:幂等(多次请求同一资源的效果相同),通常用于获取数据,不应当引起服务器状态的改变。
  2. POST
    • 用途:向指定资源提交数据,请求服务器进行处理(例如提交表单或上传文件)。
    • 特点:数据被包含在请求体中,可以引起服务器状态的改变,不是幂等的。
  3. PUT
    • 用途:从客户端向服务器传送的数据取代指定的文档的内容。
    • 特点:幂等,通常用于更新资源。如果资源不存在,PUT方法可以创建一个新资源。
  4. DELETE
    • 用途:请求服务器删除指定的页面。
    • 特点:幂等,用于删除资源。

GET和POST对比

GET用于获取资源,POST用于修改资源
GET请求参数位于url路径,明文显示,长度有限制,只支持askii编码
POST请求参数位于请求体,相对安全,理论上没有长度限制,支持多种编码形式(字段定义)

各版本对比

到目前为止,HTTP 常见到版本有 HTTP1.0,HTTP/1.1,HTTP/2.0,HTTP/3.0,不同版本的 HTTP 特性是不一样的。
图片损坏
(图源小林coding

HTTP/1.0

优点:

  • 简单易懂:非常基础,易于理解和实现。
  • 适合小型请求:对于小型或简单的文档传输效率较高。
    缺点:
  • 无连接持续:每个请求都需要建立和关闭新的 TCP 连接,增加了延迟。
  • 重复的TCP连接开销:多个请求需要重复进行连接建立和断开,消耗资源且慢。

HTTP/1.1

优点:

  • 连接持久化:通过重用 TCP 连接,减少了连接建立的延迟。
  • 管线化技术:允许在同一连接上同时发送多个请求,理论上可以提高页面加载速度。
  • 更丰富的缓存处理和错误通知:增加了缓存控制选项和更详细的状态响应。
    缺点:
  • 管线化受限:实际应用中管线化往往受到队头阻塞问题的影响,效果不明显。
  • 头部未压缩:尽管增加了许多功能,但头部数据未压缩,导致冗余数据传输。
  • 被动响应:请求只能从客户端开始,服务器只能被动响应。

HTTP/2

优点:

  • 基于HTTPS:保证了数据安全性。
  • 多路复用:允许多个请求在单一TCP连接上并行传输,多个 Stream 复用在一条 TCP 连接,通过唯一的Stream ID区分。
  • 头部压缩:使用 HPACK 压缩算法,减少了头部大小。
  • 服务器推送:客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。
    缺点:
  • 加密要求:虽然提高了安全性,但加密操作也增加了计算开销。
  • 队头阻塞问题仍存在:虽然改善了,但仍然存在于TCP连接中,TCP 是字节流协议,必须等待收到的字节数据完整到达,如果没有需要等待重传

HTTP/3

优点:

  • 基于 QUIC:基于UDP,改善了建立连接的延迟,支持更快的错误恢复,并且解决了队头阻塞问题
  • 改善恶劣网络性能:在网络条件变化大的环境下保持连接的稳定性更好。
  • 更细粒度的控制:单独的流控制减少了队头阻塞的问题。
    缺点:
  • 普及程度:因为是基于 UDP,需要更多的基础设施更新和优化。
  • 资源使用:QUIC 协议可能会比基于 TCP 的协议使用更多的计算资源。

HTTPS

HTTPS(超文本传输协议安全)并不是 HTTP 的一个版本,而是对 HTTP 协议的一个扩展,其主要目的是增强安全性。HTTPS 通过在 HTTP 顶层运行 SSL/TLS 加密协议,确保了数据传输的安全性和完整性,以及服务器和客户端的身份验证。
下面是 HTTPS 的一些核心特点:

  1. 加密:HTTPS 通过使用 SSL/TLS 协议,对传输的数据进行加密,这保证了数据在互联网上传输过程中不能被窥视或篡改。这包括 URL、请求内容、响应内容以及 HTTP 头部信息。
  2. 身份验证:HTTPS 使用 SSL/TLS 中的公钥和私钥机制,帮助确保通信双方的身份。这通常通过使用证书实现,证书由可信的第三方证书颁发机构(CA)签发。这个过程帮助客户端确认它所连接的服务器就是其期望连接的服务器,防止了中间人攻击。
  3. 数据完整性:通过加密过程中使用的完整性校验,HTTPS 确保数据在传输过程中没有被更改。这意味着发送方和接收方都能验证数据的完整性。
  4. 使用端口和协议:HTTPS 通常运行在 TCP 端口 443 上,而不是 HTTP 默认的端口 80。这是从技术上区分 HTTP 和 HTTPS 的一个方式,但它们在应用层使用的是相同的协议。
  5. 性能考虑:虽然 HTTPS 在安全性方面提供了显著的优势,但加密和解密过程需要额外的处理资源,这可能影响性能。随着技术的发展,这种性能差距已经大大减少,现代的网络基础设施和优化算法使得 HTTPS 可以在保持高安全性的同时,接近 HTTP 的性能。

DNS

DNS协议(域名系统协议)是一个位于应用层的协议,它定义了域名和IP地址之间的查询和响应过程。DNS 协议允许用户通过域名访问网站,而无需记住复杂的IP地址。以下是DNS协议在计算机网络层面的详细描述:

工作原理

DNS 协议的基本功能是解析域名到 IP 地址,即域名和 IP 地址的映射问题。这个过程通过一系列网络请求和响应实现:

  1. 用户输入域名:用户在浏览器等客户端应用程序中输入一个域名,如 www.example.com
  2. 本地 DNS 解析器查询:客户端首先查询本地 DNS 缓存(在这之前还会先查本地hosts列表),查看是否已经有这个域名的解析结果。如果没有,客户端的 DNS 解析器会向配置的 DNS 服务器发送一个 DNS 查询请求。
  3. 递归和迭代查询
    • DNS服务器:依次为根、顶级、权威、本地DNS服务器。
    • 递归查询:客户端的请求通常发送到一个递归DNS服务器,这通常由用户的ISP(互联网服务提供商)提供。这个服务器起着代理的作用,会负责处理完整的解析过程,向客户端提供最终结果。
    • 迭代查询:递归DNS服务器接收到查询后,可能会从根DNS服务器开始,逐级查询顶级域名服务器(TLD服务器)和权威DNS服务器,直到找到具体的IP地址。

传输协议

DNS 通常使用 UDP 协议在端口 53 上运行,因为 UDP 允许快速的查询和响应,适合DNS的需求,不需要建立连接。在需要更可靠传输或数据量较大(如区域传输)时,DNS 会使用 TCP 协议。

DNS记录

DNS 服务器在响应查询时,需要查询自己的数据库,数据库中的条目被称为 资源记录(Resource Record,RR) 。RR 提供了主机名到 IP 地址的映射。RR 是一个包含了Name, Value, Type, TTL四个字段的四元组。
TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。
NameValue字段的取值取决于Type:例如A(主机名–>IPv4)、AAAA(主机名–>IPv6)、CNAME(主机名–>主机名)等。

DHCP

DHCP(动态主机配置协议,Dynamic Host Configuration Protocol)是一个应用层协议,它位于TCP/IP模型的应用层,主要用于自动分配网络配置给网络设备,从而简化网络管理。它广泛应用于各种网络环境中,尤其是在大型网络中,能够有效地管理IP地址分配和配置。

DHCP的主要功能

  1. 自动分配IP地址:DHCP服务器能够自动为网络中的设备分配IP地址,这些地址可以是永久分配(静态)或临时分配(动态)。
  2. 配置更新:除了IP地址,DHCP还可以自动分配子网掩码、默认网关、DNS服务器地址等网络配置信息。
  3. 租约机制:DHCP分配给客户端的IP地址具有一定的有效期(称为租约),租约到期后,客户端需要重新请求IP地址续约。

DHCP的工作原理

DHCP的操作包含以下四个基本步骤,通常被称为DORA过程:

  1. Discover(发现)
    • DHCP客户端在网络上发送一个DHCP发现(Discover)广播包,寻找可用的DHCP服务器。
  2. Offer(提供)
    • DHCP服务器接收到发现请求后,向客户端发送一个DHCP提供(Offer)广播包,提供一个IP地址和其他网络配置信息。
  3. Request(请求)
    • 客户端从一个或多个DHCP服务器收到提供后,选择一个,并通过发送DHCP请求(Request)广播包向选定的服务器请求这些网络配置信息。
  4. Acknowledgment(确认)
    • DHCP服务器接收到请求后,发送一个DHCP确认(Acknowledgment)包给客户端,确认网络配置信息的分配和IP地址的租约。

补充

HPACK 算法

在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号。如果同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分

HTTPS加密方式

对称加密和非对称加密
在进行身份验证时进行非对称加密,后续数据传输进行对称加密
对称加密:加密方和解密方使用同一密钥,互相加解密
非对称加密:分为公钥和私钥,公钥可以随意发放,私钥自己留用,公钥可以解密私钥加密的数据,私钥可以解密公钥加密的数据
HTTPS怎么保证对方可信
服务器需要向CA机构获取认证证书,证书上有用机构的私钥加密的电子签名
认证阶段服务器向对方发送认证证书,对方通过电子签名的公钥解析电子签名,确保对方被认证过
认证完成后通信过程中使用对称加密来加密数据
HTTP 与 HTTPS 有哪些区别

  • HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
  • HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
  • 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的