《图解HTTP》学习笔记
书籍信息 :《图解HTTP》作者:上野宣,译者:于均良
出版社:人民邮电出版社,2014年5月第1版
上一章我们认识了 HTTP 的"同事们",这章轮到 HTTP 本尊登场了。说实话,HTTP 是个挺"轴"的协议------你说什么它就做什么,做完就忘,绝不记仇。这种"渣男"性格在计算机术语里叫"无状态协议"。不过别担心,它后来学会了用 Cookie 来记事,算是浪子回头了。
第2章 简单的HTTP协议
📌 核心知识点
-
HTTP通信模型:HTTP协议用于客户端和服务器端之间的通信,一条通信线路上必定一端是客户端,另一端是服务器端。
-
请求与响应:请求必定由客户端发出,服务器端在没有接收到请求之前不会发送响应。
-
请求报文结构:由方法、请求URI、HTTP版本、请求首部字段、内容实体构成。
-
响应报文结构:由HTTP版本、状态码、原因短语、响应首部字段、实体主体构成。
-
HTTP是无状态(stateless)协议:HTTP协议自身不保存请求和响应之间的通信状态。这是为了快速处理大量事务、确保协议可伸缩性而做的设计。
-
Cookie技术 :为解决无状态协议无法保持用户状态的问题,引入Cookie。服务器通过
Set-Cookie首部字段通知客户端保存Cookie,客户端后续请求自动携带Cookie。 -
HTTP方法(HTTP/1.1):
| 方法 | 说明 | 版本 |
| GET | 获取资源 | 1.0、1.1 |
| POST | 传输实体主体 | 1.0、1.1 |
| PUT | 传输文件(无验证机制,安全性差) | 1.0、1.1 |
| HEAD | 获得报文首部(不返回主体) | 1.0、1.1 |
| DELETE | 删除文件(无验证机制,安全性差) | 1.0、1.1 |
| OPTIONS | 询问支持的方法 | 1.1 |
| TRACE | 追踪路径(易引发XST攻击,不常用) | 1.1 |
| CONNECT | 要求用隧道协议连接代理(SSL/TLS加密) | 1.1 |
LINK和UNLINK已被HTTP/1.1废弃。方法名区分大小写,必须使用大写。
-
持久连接(Persistent Connections):HTTP/1.1默认所有连接都是持久连接,只要任意一端没有明确提出断开,就保持TCP连接状态。好处是减少TCP连接建立/断开的开销,提高页面加载速度。
-
管线化(Pipelining):在持久连接的基础上,不用等待响应即可直接发送下一个请求,实现并行发送多个请求。
-
请求URI的指定方式 :可以是完整的请求URI(
GET http://hackr.jp/index.htm HTTP/1.1),也可以在Host首部字段中指定域名(GET /index.htm HTTP/1.1+Host: hackr.jp)。对服务器本身发起请求时可用*代替URI。
💻 实践用例
1. 使用curl模拟各种HTTP方法
# GET方法 - 获取资源
curl -X GET http://httpbin.org/get
# POST方法 - 传输实体主体
curl -X POST http://httpbin.org/post
-H "Content-Type: application/x-www-form-urlencoded"
-d "name=ueno&age=37"
# PUT方法 - 传输文件
curl -X PUT http://httpbin.org/put
-H "Content-Type: text/html"
-d "<h1>Hello, HTTP</h1>"
# DELETE方法 - 删除资源
curl -X DELETE http://httpbin.org/delete
# HEAD方法 - 仅获取响应首部
curl -I http://www.example.com/
# OPTIONS方法 - 查询服务器支持的方法
`curl -X OPTIONS `http://httpbin.org/` `
`
-i # 显示响应头,查看Allow字段`
2. 观察Cookie的交互过程
# 第一次请求(无Cookie),服务器返回Set-Cookie
curl -v -c cookies.txt http://httpbin.org/cookies/set/session_id/abc123
# 第二次请求(自动携带Cookie)
curl -v -b cookies.txt http://httpbin.org/cookies
# 查看保存的Cookie文件
`cat cookies.txt`
3. 对比持久连接与非持久连接
# 使用HTTP/1.1(默认持久连接),一次TCP连接发送多个请求
curl --http1.1 -v http://www.example.com/ http://www.example.com/
# 使用Connection: close强制关闭持久连接
`curl -v -H "Connection: close" `http://www.example.com/
4. 使用CONNECT方法建立隧道(通过代理访问HTTPS)
# 通过HTTP代理建立SSL隧道
curl -x http://proxy.example.com:8080 -v https://www.example.com/
📝 学习笔记
-
无状态协议是一把双刃剑:优点是服务器不需要保存状态,减少CPU和内存消耗,天然支持水平扩展;缺点是无法识别同一用户的连续请求。Cookie/Session/Token等技术都是对这一缺陷的补充方案。
-
GET vs POST的本质区别:GET用于获取资源,POST用于传输实体主体。GET的参数放在URL中,POST的参数放在请求主体中。实际开发中,GET请求应具有幂等性(多次请求结果一致),POST请求通常不具有幂等性。
-
PUT和DELETE的安全性问题:HTTP/1.1的PUT和DELETE方法自身不带验证机制,一般Web网站不直接使用。在RESTful API中,PUT和DELETE通常配合身份认证(如OAuth、JWT)使用。
-
持久连接和管线化是HTTP性能优化的基础:HTTP/1.1默认持久连接,这解释了为什么现代浏览器能快速加载包含大量资源的页面。但管线化在实际中支持不佳,大多数浏览器并未真正实现管线化,这也是HTTP/2多路复用要解决的问题。
-
TRACE方法的安全隐患:TRACE方法容易引发XST(Cross-Site Tracing)攻击,攻击者可利用TRACE获取敏感的Cookie信息。现代Web服务器通常默认禁用TRACE方法。
到这里你应该搞清楚了几件事:GET 和 POST 不是一家人,PUT 和 DELETE 是危险分子,Cookie 是 HTTP 的备忘录。记住,HTTP 方法就像餐厅菜单上的选项,选对了才能吃到想吃的菜。下一章我们拆开 HTTP 的包裹,看看里面到底装了什么。