📘 图解HTTP
照着《图解HTTP》([日] 上野 宣 著,于均良 译,人民邮电出版社 · 图灵程序设计丛书,2014 年 5 月第 1 版,250 页,OWASP 日本分会监修;日文原书《今夜ワカルHTTP》)做的自学笔记 —— 本仓库 Web 与网络方向已有四本:计算机网络是教材体系,讲五层模型与典型协议;图解TCP/IP讲协议栈为什么必须分层;Web技术原理讲一个网站前后端怎么拼起来;网络与信息安全讲攻防全景。这一本只讲一个协议——但把它从报文格式、首部字段、状态码一路讲到攻击面,厚度刚好卡在「知道 HTTP 是什么」和「敢改代码上线」之间。全书 11 章 167 篇:第 1 章 13 篇了解 Web 及网络基础(一个网址敲下去,谁在替你做决定);第 2 章 9 篇简单的 HTTP 协议(请求和响应到底长什么样);第 3 章 8 篇 HTTP 报文内的 HTTP 信息;第 4 章 15 篇返回结果的 HTTP 状态码(那一串三位数字是谁定的);第 5 章 6 篇与 HTTP 协作的 Web 服务器(代理、网关、缓存在中间干了什么);第 6 章 60 篇 HTTP 首部(六十多个首部字段各管什么,全书最厚的一章);第 7 章 8 篇确保 Web 安全的 HTTPS(为什么必须再加一层 TLS);第 8 章 8 篇确认访问用户身份的认证(服务器怎么确认「你是你」);第 9 章 9 篇基于 HTTP 的功能追加协议(SPDY 被 HTTP/2 收编之后往哪走);第 10 章 11 篇构建 Web 内容的技术(HTML/CSS/DOM/CGI/Servlet/RSS/JSON);第 11 章 20 篇 Web 的攻击技术(前面十章写的每一条规矩,攻击者是怎么绕过去的)。本课是 原理课:能算的全部真算(报文逐字节长度、首部开销占比、TLS 握手多出几个往返、base64 与摘要的体积变化);能用 Python 真跑的全部真跑(起真 HTTP 服务收发真报文、用 socket 手工拼请求、真解 chunked、真做 Range 请求、真验 ETag 与 If-None-Match、真连一次 HTTPS 抓证书链、真算 HMAC 与 PBKDF2);必须有公网服务器、证书或第二个客户端的写成【📋 实操清单】加【🐍 Python 等价物】。技术事实按 2026 年当下核实过,与 2013 年成书时的差异(SPDY 废弃、HTTP/2 与 HTTP/3、TLS 1.3、X-XSS-Protection 移除、SameSite 迟到等)用【⚠️ 2026 现状】单列。大白话、不跳步骤、必带生活比喻、常见误区、可折叠自测题。
内容来自我的 Obsidian 自学笔记 · 全书 11 章 167 篇已全部写完 · 全书完结 🎉
第一章 了解Web及网络基础
使用HTTP协议访问Web
一次访问分三段:解析名字→建连接→发请求…
为知识共享而规划Web
先有超文本后有 Web;链接才是骨架,正…
Web成长时代
页面重了上百倍;gzip 剩 9.4%…
驻足不前的HTTP
三种走法 510/310/110 毫秒…
TCP/IP协议族
一族协议不是两个;一次请求上线 122…
TCP/IP的分层管理
层的边界=头的边界;换 IPv4→IPv…
TCP/IP通信传输流
发送逐层加头、接收逐层剥头;MTU 15…
负责传输的IP协议
IP 头没有序号与确认号;MTU 150…
确保可靠性的TCP协议
握手=1 个往返;本机中位 0.63 毫…
负责域名解析的DNS服务
手工查询报文 29 字节,域名占 13…
各种协议与HTTP协议的关系
一条链路 4 个往返=160 毫秒;往返…
统一资源标识符
URI 是总称,URL 给位置、URN…
URI格式
百分号编码上限 3 倍;中文路径 19…
第二章 简单的HTTP协议
HTTP协议用于客户端和服务器端之间的通信
角色按「谁先发起」分;一条连接靠四元组唯…
通过请求和响应的交换达成通信
四段结构:首行+首部+空行+正文;分界全…
HTTP是不保存状态的协议
三次请求逐字节相同,服务端认不出;无状态…
请求URI定位资源
请求目标四种形态;直连用路径、代理用绝对…
告知服务器意图的HTTP方法
八个方法只用五个;幂等指重执行结果不变…
使用方法下达命令
十次 GET 计数仍 0、十次 POST…
持久连接
1.1 默认保持连接;本机只快 1.11…
管线化
管线化三请求 108 字节一次发出;响应…
使用Cookie的状态管理
Set-Cookie 发、Cookie…
第三章 HTTP报文内的HTTP信息
HTTP报文
报文=首部+空行+主体;111 字节里首…
请求报文及响应报文的结构
两种报文只差首行;四段一一对应,请求 3…
报文主体和实体主体的差异
报文主体是传输字节、实体主体是解码内容…
压缩传输的内容编码
两句话完成协商;2320 压到 104…
分割发送的分块传输编码
十六进制块长+CRLF;8 块开销 60…
发送多种数据的多部分对象集合
boundary 是唯一分隔依据;374…
获取部分内容的范围请求
Range 两端口都含;206 必须带…
内容协商返回最合适的内容
Accept 四项+q 值;Vary 少…
第四章 返回结果的HTTP状态码
状态码告知从服务器端返回的请求结果
状态码是给人看的结论、不是给机器的开关…
200 OK
2xx 指「收到了并办好了」;200 响…
204 No Content
204 响应 81 字节、正文 0;有首…
206 Partial Content
206 必须带 Content-Rang…
301 Moved Permanently
301 永久,默认被缓存;两跳走完,ma…
302 Found
302 临时,标准不许改方法;实测 PO…
303 See Other
303 明确要求换 GET;POST 6…
304 Not Modified
304 无正文;620→0→620,靠…
307 Temporary Redirect
307 不许改方法;两次都是 POST…
400 Bad Request
400 是格式错;四条畸形请求四种原因…
401 Unauthorized
401 缺的是身份;base64 是编码…
403 Forbidden
403 身份有了但没权限;未登录与普通用…
404 Not Found
404 与 410 的区别是「没有过」与…
500 Internal Server Error
500 是服务端自己崩;同一台机器 /o…
503 Service Unavailable
503 是暂时扛不住,必须配 Retry…
第五章 与HTTP协作的Web服务器
用单台虚拟主机实现多个域名
一个 IP 一个端口挂多站,分派只看 H…
代理
代理两头说话,Via 每跳追加;两级实测…
网关
网关做协议翻译;同一查询 HTTP 42…
隧道
CONNECT 之后连接变成字节管道;2…
缓存的有效期限
max-age 赢过 Expires;四…
客户端的缓存
强缓存省往返、协商缓存省流量;三次 26…
第六章 HTTP首部
HTTP报文首部
四段固定:首行、首部、空行、正文;GET…
HTTP首部字段传递重要信息
同一个 URL 靠首部给出四种响应;Va…
HTTP首部字段结构
四条规矩:名字不分大小写、值去空白、同名…
4种HTTP首部字段类型
通用 9/请求 19/响应 9/实体 1…
HTTP/1.1首部字段一览
47 个里一次真跑只碰到 17 个(36…
非HTTP/1.1首部字段
Cookie 与 X- 系列都不在 47…
End-to-end首部和Hop-by-hop首部
八个固定逐跳字段+Connection…
Cache-Control
四族指令:能不能存、存多久、过期怎么办…
Connection
close 五次 35.08 毫秒、ke…
Date
Date 只认 RFC 1123 加 G…
Pragma
只有一个值有意义;出现 Cache-Co…
Trailer
尾块必须在首部先声明,且只能配分块;三块…
Transfer-Encoding
gzip, chunked 从右往左读…
Upgrade
101 之后连接上不再是 HTTP;发…
Via
格式「协议版本 代理名」,最左是最近;可…
Warning
三段格式带双引号说明;1xx 缓存问题…
Accept
Accept 逗号分隔、分号带 q;q…
Accept-Charset
字符集只能挑「有对应解码器」的;要 as…
Accept-Encoding
gzip;q=0.3, deflate;…
Accept-Language
按序打分,最高分胜;没有可接受的语言就退…
Authorization
Basic 只是 base64,不是加密…
Expect
小正文先回 100 再回 200;要不到…
From
From 是给人看的联系方式;服务端通常…
Host
HTTP/1.1 唯一必填首部;缺、重复…
If-Match
强校验;不匹配回 412 且必须带当前…
If-Modified-Since
弱校验,比秒级时间;没改就 304,省…
If-None-Match
比指纹不比时间;一出现它就完全盖住 If…
If-Range
Range 的守门人;资源没变才给片段…
If-Unmodified-Since
与 If-Match 反向:没改才干活…
Max-Forwards
代理每跳减一;减到 0 就停;TRACE…
Proxy-Authorization
凭据只给第一跳代理;源服务器看不到它,却…
Range
bytes 单位不给就忽略;-48 是最…
Referer
只管来源不管权限;查询串会原样带出去,五…
TE
不发 TE 就没有 Trailer;发了…
User-Agent
UA 只供统计与兼容判断;六个客户端实测…
Accept-Ranges
报能力不报意愿;bytes 时 206…
Age
只有缓存才加;逐跳累加,实测 0 到 2…
ETag
按内容算指纹,改一个字就变;带新指纹 3…
Location
配 3xx 是去这里、配 201 是东西…
Proxy-Authenticate
407 必须带,否则客户端拼不出凭据;和…
Retry-After
秒数与 HTTP 日期两种写法;照它睡…
Server
报软件名版本系统,一行 43 字节;关掉…
Vary
它是缓存 key 的扩展;漏写就把 15…
WWW-Authenticate
401 必须带;方案名加 realm 加…
Allow
405 必须带;OPTIONS 回 20…
Content-Encoding
按施加顺序列、解码倒着来;630 字节…
Content-Language
描述实际语言,不是客户端想要的;要法语没…
Content-Length
声明 0 实发 50 就留 50 字节污…
Content-Location
和 Location 差一个词差一次往返…
Content-MD5
十六字节摘要转 24 字符;只防意外损坏…
Content-Range
闭区间,0-99 是一百个;416 写…
Content-Type
类型加参数决定渲染还是下载;48 字节正…
Expires
绝对时刻靠时钟对齐;与 max-age…
Last-Modified
秒级精度且认文件时间不认内容;四次请求只…
Set-Cookie
一个 cookie 一行不能合并;Max…
Cookie
回送只有一行、分号加空格;Path 一换…
X-Frame-Options
DENY 与 SAMEORIGIN 靠得…
X-XSS-Protection
过滤器已被 Chrome 移除;现在建议…
DNT
只认 0 和 1;三重自愿等于没有,20…
P3P
CP=ALL 与只写一个标签同为 126…
第七章 确保Web安全的HTTPS
通信使用明文可能会被窃听
明文不是「不好懂」而是「谁都能读」;中间…
不验证通信方的身份就可能遭遇伪装
验证要过两关:链追得到受信根、名覆盖主机…
无法证明报文完整性,可能已遭篡改
MD5 能挡意外、挡不住顺手重算;分水岭…
HTTP加上加密处理和认证以及完整性保护后即是HTTPS
加密认完整性三样齐备;握手 4053 字…
HTTPS是身披SSL外壳的HTTP
TLS 夹在应用层与传输层之间;实连 T…
相互交换密钥的公开密钥加密技术
公钥保密私钥签名;1 MB 逐块 RSA…
证明公开密钥正确性的证书
子证书 Issuer 等于父证书 Sub…
HTTPS的安全通信机制
五阶段五步;三段实测 5.4/1236.…
第八章 确认访问用户身份的认证
何为认证
认证是确认「你是你说的那个人」;账号不存…
BASIC认证
BASIC 只做 base64,14 字…
DIGEST认证
DIGEST 用 nonce 防重放且不…
SSL客户端认证的认证步骤
SSL 客户端认证验的是「客户端证书」…
SSL客户端认证采用双因素认证
证书加表单即双因素;有证书无密码照样 4…
SSL客户端认证必要的费用
费用在三处:证书签发、分发与更新、专用读…
认证多半为基于表单认证
表单认证没有标准可依,靠 cookie…
Session管理及Cookie应用
登录必须换 ID:不换攻击者拿旧 ID…
第九章 基于HTTP的功能追加协议
基于HTTP的协议
HTTP 只肯被问不肯主动发;8 请求串…
HTTP的瓶颈
六请求排队 455.2 对六连接 203…
SPDY的设计与功能
帧加流号交错;同样 1500 字节,流…
SPDY消除Web瓶颈了吗
治应用层不治 TCP;ALPN 报 sp…
WebSocket的设计与功能
握手仍是 GET 加 Upgrade;A…
WebSocket协议
帧头只 2 字节;掩码多 4 字节涨 6…
期盼已久的HTTP/2.0
语义不变只换传输;帧头 9 字节;首部…
扩展HTTP/1.1的WebDAV
加 7 个方法共 12 个;207 装一…
WebDAV内新增的方法及状态码
13 个请求 8 种码;重名 MKCOL…
第十章 构建Web内容的技术
Web页面几乎全由HTML构建
标签说「是什么」不说「长什么样」;342…
HTML的版本
doctype 管版本也管渲染模式;15…
设计应用CSS
(a,b,c) 三元组逐位比;#top…
让Web页面动起来的动态HTML
SSR 1756 对 CSR 668(骨…
更易控制HTML的DOM
14 个节点 5 层;按 id 8 步…
通过Web提供功能的Web应用
同一地址参数不同结果不同;中文进 URL…
与Web服务器及程序协作的CGI
参数走环境变量与标准输入;每次 496…
因Java而普及的Servlet
常驻 6.9 毫秒对每请求一进程 495…
可扩展标记语言
标签自己起但语法严格;坏一个标签整篇不认…
发布更新信息的RSS/Atom
RSS 675 对 Atom 778;A…
JavaScript衍生的轻量级易用JSON
675 压到 350 省 48%;反过来…
第十一章 Web的攻击技术
HTTP不具备必要的安全功能
改个方法改个路径照样 200;服务端只看…
在客户端即可篡改请求
价格参数一改从 5900 变 1;服务端…
针对Web应用的攻击模式
主动与被动两类;回显 73 字节里那段脚…
跨站脚本攻击
三种 payload 不转义全进去,加一…
SQL注入攻击
拼接版四问回了 1/0/3/1 行,参数…
OS命令注入攻击
和号与管道在本机能接命令,分号与反引号不…
HTTP首部注入攻击
一个换行符就多出一行首部;注入后首部从…
邮件首部注入攻击
多出的 Bcc 让邮件抄送给别人;过滤后…
目录遍历攻击
五个路径朴素版泄了两个;加 realpa…
远程文件包含漏洞
参数直接当文件路径,三个全 200;白名…
强制浏览
页面上没链接的路径照样 200;加鉴权后…
不正确的错误消息处理
详细报错 294 字节泄三样东西,笼统版…
开放重定向
next 直接写进 Location;双…
会话劫持
换台设备重放会话 ID 照样 200;绑…
会话固定攻击
登录不换 ID,攻击者手里那个就成了登录…
跨站点请求伪造
用户什么都没点,余额 1000 变 50…
密码破解
20 条字典 46 次尝试撞开 2 个账…
点击劫持
一行 135 字节的透明 iframe…
DoS攻击
四个慢连接把 15 毫秒拖到 4027…
后门程序
扫八个路径多出两条 200;guest/…