HTTP:超文本传输协议
什么是超文本:
包含有超链接(Link)和各种多媒体元素标记(Markup)的文本。这些超文本文件彼此链接,形成网状(Web),因此又被称为网页(Web Page)。这些链接使用URL表示。最常见的超文本格式是超文本标记语言HTML。
什么是URL:
URL即统一资源定位符(Uniform Resource Locator),用来唯一地标识万维网中的某一个文档。URL由协议、主机和端口(默认为80)以及文件名三部分构成。如:
什么是超文本传输协议:
是一种按照URL指示,将超文本文档从一台主机(Web服务器)传输到另一台主机(浏览器)的应用层协议,以实现超链接的功能。
工作过程
以一次连接举例
DNS 解析:
浏览器首先会查找本地缓存和 hosts 文件,看是否有
www.example.com
对应的 IP 地址。如果没有,浏览器会向配置的 DNS 服务器发起查询,获取该域名对应的 IP 地址(例如
93.184.216.34
)。
建立 TCP 连接:
浏览器拿到 IP 地址后,会通过操作系统 API(Socket)向服务器的 80 端口(HTTP 默认端口)发起一个 TCP 连接请求。
经过经典的“三次握手”后,一个可靠的、双向的 TCP 连接就建立好了。这是 HTTP 消息传输的可靠通道。
发送 HTTP 请求:
连接建立后,浏览器会组装一个 HTTP Request 消息,并通过已建立的 TCP 连接发送给服务器
服务器处理请求并返回响应:
服务器接收到请求消息后,解析其内容。
根据请求的方法(如 GET、POST)、路径(
/index.html
)和头部信息,服务器会执行相应的操作(例如在硬盘上找到index.html
文件)。服务器将请求的资源数据组装成一个 HTTP Response 消息,并通过同一个 TCP 连接发回给客户端。
浏览器渲染页面:
浏览器接收到响应后,会首先解析状态行和头部。如果状态码是
200 OK
,表示成功。然后,浏览器会根据
Content-Type
字段(如text/html
)来决定如何解析响应体数据。浏览器开始解析 HTML,构建 DOM 树,加载 HTML 中引用的其他资源(如 CSS、JavaScript、图片),并可能再次发起新的 HTTP 请求来获取这些资源。
关闭连接:
在 HTTP/1.0 中,默认每次请求-响应后都会关闭 TCP 连接。
在 HTTP/1.1 中,默认使用持久连接(Connection: keep-alive)。同一个 TCP 连接可以用于多次请求和响应,以减少频繁建立和断开连接的开销。在空闲一段时间或无新请求后,连接才会被关闭。
HTTP中的请求方法
方法(Method)是对所请求对象所进行的操作,也就是一些命令。请求报文中的操作有:
HTTP的响应

HTTP头部字段
通用头:适用于请求和响应消息,但与最终传输的数据内容无关。
Cache-Control
:这是控制缓存行为最重要的指令。它告诉浏览器、代理服务器等是否可以缓存资源,以及如何缓存。Connection
:控制本次请求/响应完成后,网络连接是否保持打开。
请求头:由客户端发送给服务器,包含关于请求和客户端本身的更多信息。
Host
:HTTP/1.1 唯一强制要求的请求头。指定请求服务器的域名和端口号。这使得一个服务器可以用一个IP地址托管多个网站(虚拟主机)。User-Agent
:包含一个字符串,使得服务器能够识别客户使用的操作系统、浏览器及版本、设备类型等信息。常用于内容协商(返回移动版或桌面版页面)和统计。Accept
系列:用于内容协商,告知服务器客户端能够处理什么类型的内容。Cookie
:将由服务器通过Set-Cookie
头部设置并存储在本地的 Cookie 信息一并发送给服务器。用于维持会话状态、用户身份等。Referer
:表示当前请求是从哪个页面链接发起的(即来源页面的URL)。常用于分析流量来源、防盗链等。
响应头:由服务器发送给客户端,包含关于响应的补充信息。
Server
:告知客户端当前服务器使用的软件名称和版(如nginx/1.18.0
,Apache/2.4.41
)。出于安全考虑,生产环境通常建议隐藏或简化此信息。Set-Cookie
:服务器通过此头部向客户端(浏览器)发送 Cookie 信息,浏览器会将其存储并在后续请求中通过Cookie
头发回。Location
:与 3xx 重定向状态码配合使用,告诉浏览器应该跳转到的新地址(URL)。
实体头:描述请求或响应所传输内容(消息主体)的元信息。
Content-Type
:极其重要。指明消息主体的媒体类型(MIME type)和字符编码。浏览器根据它来决定如何解析内容。Content-Length
:消息主体的大小(单位:字节)。对于可持久化的连接是必需的。
HTTPS
是HTTP的安全版,HTTPS默认使用TCP端口443,也可以指定其他的TCP端口。HTTPS中S,实际上是SSL(Secure Sockets Layer)协议。
原理:
第一阶段:协商与认证
1.Client Hello
内容:客户端(如浏览器)向服务器发送一条消息,包含:
- SSL/TLS 版本号:客户端支持的最高版本(如 TLS 1.2)。
- 加密套件列表:客户端支持的所有加密算法组合(如
TLS_RSA_WITH_AES_256_GCM_SHA384
)。 - 压缩算法列表:支持的压缩方法(现在通常已禁用,因存在安全风险)。
- 客户端随机数:一个由客户端生成的随机字符串,用于后续生成主密钥。
- Session ID:如果为0,表示希望建立一个新会话。
目的:向服务器打招呼,并告知服务器自己的“能力”。
2.Server Hello
内容:服务器从客户端提供的列表中,选择一个它支持的最佳配置,并返回给客户端。
- SSL/TLS 版本:双方将使用的版本。
- 加密套件:双方将使用的具体加密算法组合。
- 压缩算法:双方将使用的压缩方法。
- 服务器随机数:一个由服务器生成的随机字符串,用于后续生成主密钥。
- Session ID:服务器为新会话分配的ID,用于后续会话恢复。
目的:确认本次通信所使用的安全参数。
3.Server Certificate
内容:服务器将自己的 SSL 证书发送给客户端。
目的:向客户端证明自己的身份。证书中包含服务器的公钥、域名、颁发机构等信息。客户端会验证证书的有效性(是否由受信任机构颁发、域名是否匹配、是否在有效期内)。这是身份认证的核心,防止中间人攻击。
4.Client Certificate Request
内容:这是一个可选步骤。服务器向客户端请求其证书。
目的:用于双向认证。通常只在银行、政府系统等高安全场景下使用,要求客户端(用户)也证明自己的身份。普通网站访问不需要这一步。
5.Server Hello Done
内容:服务器告诉客户端:“我第一阶段的问候和所有必要信息都已经发送完了。”
目的:标志着服务器问候阶段的结束。
第二阶段:客户端响应
1.Client Certificate
内容:仅在服务器请求了客户端证书(第4步)时,客户端才会发送自己的证书。
目的:客户端向服务器证明自己的身份。
2.Client Key Exchange
内容:这是密钥交换的核心。客户端生成一个预主密钥。然后用从服务器证书中获取的公钥对这个预主密钥进行加密,发送给服务器。
目的:安全地交换生成主密钥所需的第三个参数(预主密钥)。只有持有对应私钥的服务器才能解密它。结合之前的“客户端随机数”和“服务器随机数”,双方就能独立计算出相同的主密钥,进而生成用于实际数据传输的会话密钥。
3.Certificate Verify
内容:仅在发送了客户端证书后才有此步骤。客户端用自己的私钥对之前所有握手消息的摘要进行签名,并发送给服务器。
目的:向服务器证明:“我不仅拥有这个证书,我还拥有与之匹配的私钥。” 这完成了客户端的身份认证。
4.Change Cipher Spec
内容:一条非常简单的通知消息。
目的:客户端通知服务器:“我这边已经准备好,从下一条消息开始,我将使用我们刚刚协商好的加密套件和会话密钥来加密发送数据。”
5.Client Finished Message
内容:这是握手过程中第一条被加密的消息!它包含一个所有之前握手消息的摘要(MAC)。
目的:服务器收到后,会用它来验证:密钥是否正确:如果能正确解密和验证,说明双方拥有相同的会话密钥。握手完整性:确保握手过程没有被篡改。
第三阶段:服务端确认
1.[Server] Change Cipher Spec
内容:与客户端的 Change Cipher Spec
对应。
目的:服务器通知客户端:“我这边也准备好了,从下一条消息开始,我也将使用协商好的加密套件和会话密钥来加密发送数据。”
2.Server Finished Message
内容:服务器发送的第一条被加密的消息,同样包含之前所有握手消息的摘要。
目的:客户端用它来验证服务器的密钥和握手过程的完整性。
第四阶段:安全通信
Application Data
内容:双方应用程序(如浏览器和Web服务器)需要传输的实际数据(HTTP请求/响应)。
方式:所有这些数据都将使用握手阶段协商出的对称会话密钥进行加密和解密,从而保证传输的保密性和完整性。