HTTP权威指南--如果你不喜欢看书,那么我来总结你直接学

1,016 阅读9分钟

前言

最近花了一个多月的时间读完了HTTP权威指南,虽然这本书已经出很多年了但是其中很多内容并不过时值的深度阅读,读完之后有很大的收货,在这个过程中进行了许多精华的总结,今天来分享一下,希望对看到的你有所收获

HTTP五层模型

1.http 应用层

2.TCP 传输层

3.IP 网络层

4.网络特有的链路接口 数据链路层

5.屋里网络硬件 物理层

代理与网关对比

1.代理连接的是两个或多个使用相同协议的应用程序

2.网关连接的则是两个或多个使用不同协议的端点,网关扮演的协议转换器的角色,即时客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理

区分强缓存是否命中

HTTP没有为用户提供一种手段来区分响应的数据是来自缓存的还是原始服务器的。在这两种情况想下响应码都是200 OK,但是有些商业代理会加一写信息

1.第一种情况在响应体的首部有个Via字段有些商业代理会在该字段中说明缓存信息客户端可以根据这个做区分

2.第二种情况就是使用Date首部将响应体中的Date首部与当前时间进行比较,如果响应时期较早那么数据可能就来自缓存

HTTP识别用户

http中交互的事务通常是没有状态的在历史的发展过程中有一下几种阶段来记录客户端和服务端交互的状态

1.承载用户信息的HTTP首部

首部名称首部类型描述
From请求代表用户的E-mail地址
User-Agent请求用户的浏览器软件
Referer请求用户是从这个页面依照链接跳转过来的
Authorization请求用户名和密码
Client-IP扩展(请求)客户端的IP地址
X-Forwarded-For扩展(请求)客户端的IP地址
Cookie扩展(请求)服务器产生的ID标签

2.客户端IP地址跟踪,通过用户的IP地址对其进行识别

3.用户登录,通过认证方式来识别用户

4.胖url,一种在url中嵌入识别信息的技术

5.cookie,一种强大且高效的持久身份识别技术

承载用户信息首部的操作现在基本已经就不用了,因为针对用户没办法精确的识别是同一个用户因为存在更换客户端比如换个手机之类的

SSL握手过程

1.交换协议版本号

2.选择一个两端都了解的密码

3.对两端的身份进行认证

4.生成临时的会话秘钥,以便加密信道

内容编码类型

HTTP定义了一些标准的内容编码,并允许用户扩展编码的形式增添更多的编码由互联网号码分配机构(INAN)对各种编码进行标准化,它给每个内容编码算法分配了唯一的代号。Content-Encoding首部就用这些标准化的代号来说明编码时使用的算法

Content-Encoding值描述
gzip表明实体采用Uzip
compress表明使用采用Unix文件压缩操作
deflate表明实体是用zlib的格式压缩的
identity表明没有对实体进行编码。当没有Content-Encoding首部时,就默认为这种情况

gzip、compress以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。这些算法中,gzip通常是效率最高的,使用范围最广

Content-length对于长连接的作用

如果响应通过持久链接传送数据就可能有另一条HTTP响应紧随其后,客户端通过Content-Length首部就可以找到报文在何处结束,下一条报文从何处开始。因为是持久链接,客户端无法依赖链接关闭来判断报文的结束。如果没有Content-Length首部,HTTP应用程序就不知道某个实体在哪里结束,下一条报文从哪里开始

范围请求

常见的场景假设你正在通过慢速的调节器连接下载最新的热门软件,费劲巴拉的下载了四分之三,结果因为一个网络故障,啪的一下很快喔,连接断了,本来已经等了很久而现在还要从头再来(以前下载游戏的时候体验过这种感觉真的很崩溃😒),如果我们能做到从断的地方在继续下载剩余的就比较爽了

我们可以使用范围请求HTTP客户端可以通过请求获取失败实体的一个范围或者一部分,来恢复下载该实体。当然这有一个前提,那就是从客户端上一次请求该实体到这次发出范围请求的时段内,该对象没有改变过,主要是利用HTTP首部字段Range进行范围请求值的类型是字节,比如:Range: bytes=4000-的意思是客户端请求文档开头4000字节之后的部分(不需要给出结尾字节数,因为不知道具体文档的大小)

但是并不是所有服务器都可以接受范围请求 ,但很多服务器可以。服务器可以通过在响应中包含Accept-Range首部的像是告知客户端说明可以接受范围请求,这个首部就是计算范围的单位,通常以字节计算,例如下面这样👇🏻

Accept-Range:bytes

具体操作流程可以看下面例子🌰

L1VzZXJzL2dhb3hpbnhpYW8vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L0RpbmdUYWxrTWFjLzU1ODAzNzM2N192Mi9JbWFnZUZpbGVzLzE2NDE5ODc5MzI3ODJfNkU0MTJBMTYtOEJBMS00NDM5LUI0NUYtRTE0QUM0MDMzRjEwLnBuZw==.png

Vary首部

有一种情况是需要根据HTTP首部来订制返回不同的客户端需要的内容这就需要Vary首部,在Vary首部中列出了所有客户端请求的首部,服务器可以用这些首部来指定文档或产生文档内容,例如客户端想要的文档需要根据机型来决定,就需要在Vary中放入User-Agent,看下面例子

L1VzZXJzL2dhb3hpbnhpYW8vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L0RpbmdUYWxrTWFjLzU1ODAzNzM2N192Mi9JbWFnZUZpbGVzLzE2NDE5ODgzNTMwNTVfN0M4NTY4MjUtRjM1Ri00MDQzLUEzM0QtRkMzQjMwNzJBM0IyLnBuZw==.png

区分客户端访问的是代理还是实际服务器

对于客户端如果想知道当前访问的请求是来自代理服务器还是实际服务器,可以通过报文中的url来决定

客户端向web服务器发送请求,可以看到请求的不是完整的url只有一个index.html

GET /index.html HTTP/1.0
User-Agent: SuperBrowser v1.3

客户端向代理发送请求时,请求中则包含完整的URL

GET http://www.marys-antiques.com/index.html HTTP/1.0
User-Agent: SuperBrowser v1.3

那么问题来了,为什么会有两种不同的格式一种用于服务器一种用于代理呢?看👇🏻

在最开始的HTTP设计中,客户端会直接与单个服务器对话。不存在虚拟主机,也没有为代理制定什么规则。单个服务器都知道自己的主机名端口,所以为了避免冗余信息就没必要发送主机名和端口等,但是代理出现之后,使用部分url就有问题了。代理需要知道目标服务器的名称,这样它们才能正确的与自己服务器链接。基于代理的网关要知道URL的方案才能正常连接到FTP资源和其他方案上去。HTTP/1.0要求代理请求发送完整URL,解决了这个问题,但它为服务器请求保留部分URL的形式

DNS实现负载均衡

DNS轮转是最常见的重定向技术之一也是最简单的重定向技术之一。DNS轮转使用了DNS主机名解析中的一项特性,在web服务器集群中实现负载均衡,实际原理是对主机名下的所有IP进行轮转

  • 主机下面有10个IP会随着访问一个一个向后移动

  • 一个IP访问完成之后就会把第一个ip放到最后面

  • 次访问的就是第二个IP,之后访问完成在把第二个IP放到最后面

  • 依次按照顺序访问就被称为轮转

  • 想象为一个队列从队头拿出来用完在放到队尾等待下次使用

状态码分类

总体范围已定义范围类别
100-199100-101信息
200-299200-206成功
300-399300-305重定向
400-499400-415客户端错误
500-599500-505服务端错误

来看几个常见的状态码👇🏻

状态码描述
200服务器成功处理请求
204响应报文包含一些首部和一个状态行,没返回主体内容
206返回部分内容代表部分请求成功
301永久重定向根据响应信息首部Location进行跳转
302临时重定向也会根据响应信息首部Location进行跳转,并且会缓存当前的URL
304协商缓存必并且会更新本地强缓存
305需要使用代理访问
307重定向类似302不过是给http/1.1用的
400客户端请求错误
401没有权限可能是token过期
403服务器拒绝请求从根本上就没有权限
404找不到要访问的目标URL
405资源被禁止访问
408请求超时
500服务器处理错误
502网关故障,多半是作为网关或者代理的时候上游的服务器处理错误没办法正常返回
504网关超时 与408类似,但是响应是来自网关或者代理的上游服务器
505服务器不支持当前传输的协议

结束

书中自有颜如玉,书中自由黄金屋,老话总是没错的,多谢欣赏