一、HTTP 是什么

HTTP 是超文本传输协议,核心作用是完成客户端与服务端之间的数据请求和响应。

原笔记从几个角度解释了这个概念:

  • 默认端口是 80
  • “传输”强调网站数据如何传递给用户
  • “超文本”不只是文本,还包括图片、视频等内容
  • 用户打开网站,本质上就是客户端向服务端发起请求
  • 网站把内容返回给用户,本质上就是服务端给出响应

也可以把它简单理解为:

  • request:打开网站、访问网站
  • response:服务端把内容返回给客户端

二、用 curl -v 观察一次访问过程

原笔记用 curl -v baidu.com 展示了一次典型 HTTP 访问:

[root@oldboy01 ~]# curl -v baidu.com
* About to connect() to baidu.com port 80 (#0)
*   Trying 39.156.66.10...
* Connected to baidu.com (39.156.66.10) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Wed, 27 Dec 2023 12:29:49 GMT
< Server: Apache
< Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
< ETag: "51-47cf7e6ee8400"
< Accept-Ranges: bytes
< Content-Length: 81
< Cache-Control: max-age=86400
< Expires: Thu, 28 Dec 2023 12:29:49 GMT
< Connection: Keep-Alive
< Content-Type: text/html
<
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

这个输出里最关键的观察点有两类:

  • > 开头的是客户端发出的请求内容
  • < 开头的是服务端返回的响应内容

也就是说,哪怕只用命令行工具,也能直接看到请求和响应的边界。

三、用 wget --debug 区分请求区和响应区

原笔记又用 wget --debug baidu.com 演示了另一种更直观的查看方式:

[root@oldboy01 ~]# wget --debug baidu.com
---request begin---
GET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: baidu.com
Connection: Keep-Alive

---request end---
已发出 HTTP 请求,正在等待回应...
---response begin---
HTTP/1.1 200 OK
Date: Wed, 27 Dec 2023 12:31:58 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Thu, 28 Dec 2023 12:31:58 GMT
Connection: Keep-Alive
Content-Type: text/html
---response end---

curl -v 相比,wget --debug 的好处是把请求区和响应区明确标出来了,更适合初学时理解协议交互过程。

四、HTTP 各版本的核心区别

原笔记把常见版本差异整理成了一张表,核心信息如下:

版本 主要特点 连接与协议
HTTP/1.0 短连接,每次请求都要重新建立和断开连接 基于 TCP
HTTP/1.1 引入长连接 keepalive,企业中仍大量使用 基于 TCP
HTTP/2.0 支持更强的并发处理,访问更快 默认更多与 HTTPS 搭配
HTTP/3.0 基于 UDP,适合更高效的传输场景 基于 UDP

原笔记还提到当前的实际情况:

  • 大部分企业仍在使用 HTTP/1.1
  • 一部分场景已经使用 HTTP/2.0
  • HTTP/3.0 与 QUIC 更多见于流媒体直播等场景

五、小结

学习 HTTP 的第一步,不是先记所有字段名,而是先建立一个直觉:
访问网站时,客户端会发出请求,服务端会返回响应,而 curlwget 都可以帮助我们把这个过程直接看出来。

当你把这层基础理解清楚之后,后面再学习请求报文、响应报文、状态码和 Nginx 配置时,就会顺畅很多。