《图解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 的包裹,看看里面到底装了什么。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐