HTTP/HTTPS
前言
上一篇传输层讲完 TCP&UDP、三次握手四次挥手。本篇落到应用层,讲解浏览器和服务器的通信协议 HTTP / HTTPS。
传输层TCP、UDP完成了主机上进程与进程的数据传输。但浏览器、后端服务之间,需要一套统一的格式约定:请求长什么样、响应长什么样、要携带哪些附加信息,这就是HTTP协议。
HTTP是基于TCP的应用层协议,明文传输;HTTPS则是在HTTP基础上引入加密,解决窃听、篡改、中间人劫持问题。
本篇覆盖:报文格式、URL、请求方法GET/POST、请求头响应头、Cookie、状态码、HTTPS加密原理、证书。
HTTP基础概念
- HTTP:超文本传输协议,应用层协议,默认基于 TCP。
- 版本演进:
(1)HTTP/1.0:每次请求新建 TCP 连接,请求完断开;
(2)HTTP/1.1:长连接(默认),管线化,面试最常考;
(3)HTTP/2:二进制帧、多路复用。- 工作模式:一问一答,客户端发起请求,服务器返回响应。
- 抓包工具:Fiddler / Wireshark
(1)Fiddler:代理抓 HTTP/HTTPS,观察请求响应报文
(2)Wireshark:抓取底层 TCP/IP 数据包
URL
URL:唯一资源定位符,描述了一个资源在网络上的位置。
协议方案名://主机:端口/资源路径?query参数#片段
例如 http://blog.test.com:8080/network/article?chapter=6\&keyword=http#summary
- 协议方案名:http/https
- 主机+端口:定位服务器程序(哪个主机上的哪个程序)
- 资源路径:描述了要访问服务器的哪个资源
- query 查询字符串:key=value&key=value,键值对结构的数据,以?开头。是针对此次请求进行了补充说明。
- URL编码:中文、特殊符号要做urlencode,否则浏览器可能会解析失败,导致请求无法正常进行。
HTTP报文结构
请求报文
-
首行
首行包含三部分信息:请求方法、URL、HTTP版本号,中间用空格分隔。
例如:GET /index.html HTTP/1.1
-
请求头header
一组key: value键值对,注意键和值之间用:+空格来分隔,每个键值对单独占一行。
常见请求头:
(1)Host:目标主机端口
(2)User‑Agent:客户端浏览器 / 设备信息
(3)Referer:从哪个页面跳转过来
(4)Content‑Length:body 长度
(5)Content‑Type:请求 body 的数据格式
-
空行
请求头的结束标记,分割头部和正文。
-
正文body
POST/PUT携带数据;GET一般没有body。
GET vs POST
GET和POST没有本质区别,双方可以替换对方的场景。
但在使用习惯上有差异:
- GET经常把传递给服务器的数据放到query string中;POST则经常放到body中。
但上述情况并非绝对,GET也可以用body,POST也可以用query string,使用的前提是客户端/服务器都要按照一样的方式处理代码。- 语义上有差异,GET大多数用来获取数据,POST大多数用来提交数据。
响应报文
- 首行
包含HTTP版本+状态码+状态码描述,中间用空格分隔。
状态码描述了请求的结果。
例如:HTTP/1.1 200 OK - 响应头 header
键值对,返回服务器附加信息。 - 空行
响应头的结束标记。 - 正文body
返回给浏览器的数据 (html、json、图片等)
常见请求头&响应头重点
- User‑Agent:浏览器+操作系统的属性(版本)。以前用来区分新旧浏览器,现在用来区分PC端还是移动端。
- Referer:来源页面。
- Content‑Type:body 格式:application/json、text/html、form‑data等
- Content‑Length:body 字节长度
- Cookie
Cookie 由服务器下发,保存在浏览器本地;后续每次请求自动携带 Cookie 发给服务器。
作用:会话保持,记住用户状态。
服务器通过响应头Set‑Cookie设置;浏览器请求头携带Cookie。
HTTP状态码
- 2xx 成功
200 OK:正常成功返回 - 3xx 重定向
301 永久重定向会被浏览器缓存;302 临时重定向不会缓存;响应头Location给出跳转地址 - 4xx 客户端错误
400 参数错误;404 资源找不到;403 权限不足拒绝访问 - 5xx 服务端错误
500 服务器内部异常;503 服务不可用
HTTPS
HTTP 是明文传输,存在窃听、篡改、中间人攻击风险;HTTPS = HTTP + TLS 加密。
两种加密方式
- 对称加密
同一个密钥,加密解密都用它。速度快,但是密钥传输容易泄露。
- 非对称加密
公钥加密、私钥解密。公钥公开,私钥服务器自己保存。加密解密速度慢。
中间人攻击问题
如果只用非对称加密传输对称密钥:客户端拿到的公钥有可能是黑客伪造的,无法辨别公钥真假。
数字证书CA机构
解决公钥真伪问题。
- 服务器向 CA 申请证书,证书包含服务器公钥、域名信息,CA 数字签名。
- 客户端拿到证书,用 CA 根证书校验签名,确认公钥是真实服务器的,不是黑客伪造。
HTTPS握手简单流程
- 客户端请求服务器,服务器返回 CA 数字证书。
- 客户端校验证书合法无误,取出服务器真实公钥。
- 客户端生成随机对称密钥,使用服务器公钥加密,发给服务器。
- 服务器用自己私钥解密,拿到对称密钥。
- 后续所有 HTTP 数据,全部使用这套对称密钥加密通信。
非对称加密只用来安全传递对称密钥;真正业务数据传输使用对称加密兼顾安全与性能。
总结
- HTTP 作为应用层协议,定义了客户端与服务器之间请求响应的格式规范。
- GET/POST、请求响应头、Cookie、状态码是日常开发和面试高频。
- HTTP 明文不安全,HTTPS 结合对称加密、非对称加密、CA 数字证书,解决窃听篡改中间人劫持。
- 传输层 TCP 保证可靠传输,HTTP 约定数据语义,HTTPS 负责数据加密,三者配合完成网页、接口的网络通信。
本篇是「Java后端编程系列」的连载内容,点击链接查看完整系列: