我们每天都在跟http打交道,却未必敢说对它了如指掌。最近花了点时间阅读了这份十年前的协议,借此机会分享感受较深的几点。
1.请求/响应链(Request and Response Chain)
如图,一则请求在最终抵达我们的应用服务器之前,可能会经过像A、B、C那样层层的代理服务器、缓存服务器的中转,请求和响应就像接力棒一样在整个网络中穿梭。这种结构给分布式缓存埋下了伏笔,也让我意识到CDN不是后人的发明,而是前人精心的设计。虽然缓存相关的语法破坏了HTTP语义的透明,但其对性能深厚的影响迫使协议的制定者们不惜将其“浮出水面”。Caching in http是专门的一章,主要介绍了两种模型,一是Expiration Model,二是Validation Model。前者即直接复用本地缓存的策略,彻底省去了网络上来回的开销;后者则在302等响应码中得以体现,确保内容最新的同时省去了重复传输的开销。
request chain ---------->
UserAgent -----v----- A -----v----- B - - - - - - C - - - - - - Orignal Sever
<--------- response chain
2.消息和实体(Message and Entity)
可能是因为我们的业务少有涉及原生的http文件上传,即使需要也大多出于性能和交互的考量转而采用flash(细节被封装),实体的概念几乎无人问津。
下面是我在stackoverflow.com中试图回答“What's an HTTP Entity”: