前言
历时两个多月,终于把经典图书《HTTP权威指南》读完了。虽然看上去厚厚的一本,实际上只要有一些计算机网络基础,读起来还是很顺利的,并没有想象中那么难啃。
全书讲的很细致,涵盖了HTTP的方方面面,其中有一些都是些众所周知的常识,比如前几张关于HTTP的基本介绍、URL与资源等,但是也值得读一读,能够把之前碎片化的认知给系统起来。
本文着重记录一些笔者在读书过程中印象比较深刻有趣的点。
第三章 HTTP报文
报文的格式
请求报文
响应报文
方法
方法 | 简述 | 是否包含主体 | 详述 |
---|---|---|---|
GET | 从服务器获取一份文档 | 否 | |
HEAD | 获取文档的HTTP首部,而不需要具体内容 | 否 | 主要用于在不获取资源的情况下获取资源的状态,比如资源的类型,是否存在,是否过期等信息 |
POST | 向服务器发送需要处理的数据 | 是 | |
PUT | 将请求的主体部分存储到服务器上 | 是 | |
DELETE | 从服务器上删除一个文档 | 否 | |
TRACE | 对可能经过代理服务器传送到服务器上去的报文进行追踪 | 否 | |
OPTIONS | 决定可以在服务器上执行那些方法 | 否 |
方法不仅仅只有这七种,还有一些扩展的方法,另外服务器不一定把这七种全部都实现。
状态码
范围 | 简述 | 典型 |
---|---|---|
1xx | 信息提示 | 100:让客户端继续它的表演,,用的不多 101:切换协议,根据Update首部来切换协议,比如切换websocket协议 |
2xx | 成功 | 200:成功 |
3xx | 重定向 | 300:返回多个资源的URL供客户端选择,比如返回多种语言的相同文档 301:永久重定向 302、303:临时重定向 304:资源没有被改变,比如客户端发送了一个特殊的If-Modified-Since首部,说明只读取某个时间之后修改的文档,而该文档实际没被修改,服务端就会返回一个304 |
4xx | 客户端错误 | 401:授权错误 402:需要host字段 403:禁止访问 404找不到 |
5xx | 服务端错误 | 502 |
首部
通用首部
首部名 | 描述 | 备注 |
---|---|---|
Connection | 描述连接有关的选项,比如keep-alive | |
data | 日期和时间标志,说明报文是什么时候创建的 | |
Update | 给出发送端想要升级的新版协议 | |
Via | 显示了报文经过的中间节点(代理和网关) |
请求首部
首部名 | 描述 | 备注 |
---|---|---|
client_ip | 客户端IP | |
From | 客户端用户的email地址 | |
User-Agent | 将发起请求的应用程序名称告知服务器 | |
Host | 给出了接收请求的服务器的主机号和端口号 | |
Referer | 从哪里来的 | |
Accept | 告诉服务器能够发送的媒体类型,比如text,html,mp3等 | |
Accept-charset | 告诉服务器能够发送哪些字符集,比如utf-8 | |
Accept-language | 告诉服务器能够发送哪些语言 | |
Accept-Encoding | 告诉服务器能够发送哪些编码方式,这个编码方式是对实体进行编码,比如gzip | |
if-match | 如果实体标记与文档当前的实体标记相匹配,就获取这份文档,比如MD5值匹配 | |
if-modified-since | 如果在某个时间之后该文档被修改过,就获取这份文档 | |
if-none-match | 如果标记不匹配就获取,说明文档可能被修改过 | |
if-Range | 允许对文档的某个范围进行条件请求,常用于断点续传 | |
if-unmodified-since | 如果某个时间之后该文档没被修改过,就获取这份文档 | |
Range | 如果服务器支持范围请求,就请求资源的指定范围,用于断点续传 | |
Authorization | 包含客户端提供给服务器的认证数据 | |
cookie | 客户端向服务器传送一个令牌 | |
Max-forward | 从客户端到服务器的路上,最大能经过的次数 | |
Proxy-Authorization | 代理认证时使用 | |
Proxy-connnect | 与代理建立连接时使用 |
响应首部
首部名 | 描述 | 备注 |
---|---|---|
server | 服务器应用程序软件的名称和版本 | |
Accept-ranges | 对此资源来说,服务器可接收的范围类型 | |
set-cookie | 在客户端设置一个令牌 |
实体首部
首部名 | 描述 | 备注 |
---|---|---|
location | 资源的实际位置,用于重定向 | |
Content-Base | 解析实体中的相对URL时使用的基础URL | |
Content-Length | 实体的长度 | |
Content-Encoding | 实体的编码方式,比如gzip | |
Content-Language | 实体的语言,比如en-US | |
Content-MD5 | 主体的MD5校验和 | |
Content-Range | 在整个资源中此实体表示的字节范围 | |
Content-Type | 这个主体的对象类型 | |
Expires | 过期时间,缓存时使用 | |
Last-modified | 最后一次被修改的时间 |
第四章 连接管理
TCP对HTTP时延的影响
- TCP的三次握手
- TCP慢启动
- 数据聚集的Nagle算法,攒够一波再发送
- 捎带确认的TCP延迟确认算法,TCP可能不会立即确认而是要等一会看在确认报文里能不能捎带一些其他报文
- TIME_WAIT累积与端口耗尽
某个TCP端点关闭连接时,会在内存中维护一个小的控制块,用来记录最近所关闭链接的IP地址和端口号。这类信息会保存一段时间(称为2MSL,通常为两分钟),用来确保两分钟内不会创建具有相同地址和端口号的新连接。
客户端在两分钟内无法重复使用同一个端口,而且端口的数量有限。所以连接率就被限制在了60000/120=500次/秒了。
连接管理
- 串行连接
- 并行连接
建立多条连接,不一定会更快。 - 持久连接
复用同一条连接,避免了TCP的慢启动的拥塞适应阶段 - 管道化连接
可以一次性发送多条请求,但是请求和响应的顺序必须一一对应。可能会有队头阻塞的问题 。
关于连接管理,HTTP/2版本做出了很多优化,可以参考《HTTP/2基础教程》协议、特性、详解
第二部分 HTTP结构
代理
代理的作用:内容过滤、安全防火墙、缓存、文档访问控制、匿名者、转码器
流量如何通过代理?
- 修改客户端,比如浏览器设置代理
- 修改网络,修改网络的基础设施,比如修改交换机,将HTTP请求转发给代理
- 修改DNS,将DNS解析的IP地址直接指向代理服务器
- 修改服务器,服务器在302重定向报文中填写代理服务器的地址
缓存
缓存的处理步骤:接收、解析、查询、新鲜度检测、构造响应、发送、日志
新鲜度检测相关:Expires首部说明过期时间,max-age最大生存时间。if-modified-since和if-none-match等首部可以与服务器验证是否新鲜、
网关
协议网关:Web网关在一侧使用HTTP协议,在另一侧使用其他协议,比如邮件协议、FTP、HTTPS协议等
资源网关:收到HTTP请求,调用其他应用程序API返回相应的资源。
隧道
HTTP隧道中可以传输一些其他协议,比如SSH等,这样就可以通过80端口传输其他协议使得其他协议可以通过防火墙。
HTTPS:在SSL隧道中的HTTP,SSL先握手建立安全的隧道,然后在隧道中进行HTTP协议的传输。
中继
没毛用
第十一章 客户端识别与cookie机制
个性化接触
服务端想为每个用户提供个性化的服务,就需要能够区分不同的客户端,有以下几种机制:
- HTTP首部
客户端在HTTP首部填写一些信息,比如User-Agent等 - IP地址
服务端根据客户端的IP地址区分客户端 - 用户登陆
每次请求都需要用户登陆一下 - 胖URL
根据不同的用户产生特殊的URL - cookie
最常用的机制
第十二章 基本认证机制
服务端返回401要求客户端输入认证信息
客户端将认证信息(用户名、密码)填在Authorization首部中,Base64加密,传送给服务端。
基本认证是非常不安全的,多用于企业内部。
第十三章 摘要认证
摘要认证还没有得到广泛应用
主要思想是通过随机数和密码摘要来进行握手。
第十四章 安全HTTP
- 对称秘钥加密技术
双方拿的秘钥一致。常见算法DES。优点是加解密迅速。缺点是不安全、繁杂。 - 非对称秘钥
分为私钥和公钥。常见算法RSA。尽管每个人都可以用同一个密钥发给X的报文进行编码,但是除了X,其他人都无法对报文进行解码。 - 混合加密
非对称加密虽然安全,但是比较慢,常见的实现是用非对称加密建立安全会话,然后再通过对称秘钥进行数据传输。 - 数字签名
数字签名不可否认,防止报文被篡改。通过私钥加密,可以达到数字签名的效果。 - 数字证书
权威机构可以颁发数字证书,证书中包含发布者的基本信息和对象的公开秘钥以及证书颁发机构的签名。 - HTTPS
先建立TCP连接,在进行SSL握手对加密参数进行沟通并交换秘钥。然后在SSL隧道中进行HTTP传输。
第四部分 实体、编码和国际化
- 内容编码
对具体的内容进行编码,比如对一个HTML文档进行压缩。内容编码代号有:gzip、compress、deflate、identity - 传输编码
传输编码是为了改变报文中的数据再网络上的传输方式。最新的HTTP规范只定义了一种传输编码,就是分块编码 - 分块编码
允许服务器把主题逐块发送
第二十章 重定向与负载均衡
重定向的方法:
- HTTP重定向
- DNS重定向
- 任播寻址
几个地理上分散的Web服务器拥有完全相同的IP地址。任播寻址仍然是项实验性技术 - MAC转发
- IP地址转发
- 网元控制协议