第2章-简单的HTTP协议

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

相关推荐
lunzi_fly7 天前
第1章-了解Web及网络基础
读书笔记
程序媛一枚~14 天前
202611读书笔记|《飞花令·柏》——身如古柏童童老,心似平江湛湛流
读书笔记·诗集·诗词·飞花令·素心落雪
Better Bench21 天前
《八十天环游地球》阅读笔记
笔记·读书笔记·八十天环游地球
雷工笔记22 天前
以复盘为镜,赴自我蜕变之约——《复盘自己:从记录到蜕变的行动指南》读书笔记
读书笔记
Rubin智造社1 个月前
Dankoe新作《使命与收益》读书笔记9|AI时代,写作是比编程更核心的元技能
人工智能·读书笔记·dankoe·个人公司·元能力·使命与收益
躺柒4 个月前
2025年总结及2026年目标之关键字【保持】
读书笔记·个人总结·随笔·年度总结·目标·工作总结·未来计划
躺柒4 个月前
2025年12月总结及随笔之海市蜃楼
人工智能·程序人生·读书笔记·个人总结·随笔
MJJ_7 个月前
从零构建大模型 Build a large language model from scratch by Sebastian Raschka 阅读笔记
大语言模型·读书笔记·ai学习
卷心菜的学习路7 个月前
《计算》第九十章读书笔记
java·读书笔记·编程思维