http: 应用层超文本传输协议
HTTP特点 常见content-type字段类型
HTTP请求方法 GET与POST区别: 1. GET在浏览器回退时是无害的,而POST会再次发起请求 2. GET请求会被浏览器主动缓存,而POST不会,除非手动设置 3. GET请求参数会被安逗保留在浏览器历史记录里,而POST中的参数不会被保留 4. GET请求在URL中传递的参数有长度限制(浏览器限制大小不同),而POST没有限制 5. GET参数通过URL传递,POST放在Request body中 6. GET产生的URL地址可以被收藏,而POST不可以 7. GET没有POST安全,因为GET请求参数直接暴露在URL上,所以不能用来传递敏感信息 8. GET请求只能进行URL编码,而POST支持多种编码方式 9. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制 10. GET产生一个TCP数据包,POST产生两个数据包(Firefox只发一次)。GET浏览器把 http header和data一起发出去,响应成功200,POST先发送header,响应100 continue,再发送data,响应成功200
HTTP常见状态码:
HTTP1.1比较于1.0 特点: 1. keep-alive长连接,但是HTTP始终是无连接协议,这里的长连接的是TCP,即是TCP复用,可以支持接收/发送多个HTTP请求 2. 流水线(Pipelining),并行发送,但服务器会根据请求顺序依次返回。 3. 请求头中新增range,它允许只请求资源都某个部分(返回码206)。 这样做的优点?:
- 在一个TCP连接上可以传输多个HTTP请求/响应,减少了建立和关闭连接的消耗(TCP三次握手、四次挥手),减少了网络堵塞。
- 带宽优化以及网络连接的使用,请求头的range字段允许了之请求资源的某个部分。
长连接情况下,建立通道后,请求链路如下: 管道化连接后, 下一个请求不必再等待上一个请求的响应后才可发送,但是服务器还是会依据请求的顺序返回响应,这样做虽然减少了整体的响应时间,但是如果在前面请求响应很慢,就会产生队头阻塞,如下图: 管道化特点:
- 管道化机制通过持久连接完成,在HTTP1.1才支持。
- 只有GET HEAD请求才可以管道化(幂等的请求)
- 客户端和服务端都支持管道化,但并不要求服务端也对响应进行管线化处理,只是要求对于管道化的请求不失败即可
- 初次建立连接不适启动管道化机制,因为不知道服务器是否支持HTTP1.1。
管道化机制引发队头阻塞解决方法: 1. 域名分片,资源分布在多个子域名,因浏览器限制一个域名同时并发6-8请求,针对这一点我们可以准备多个二级域名,分散资源的域名分布,增加连接数。 2. 资源合并,这里涉及到的是资源的整合,如精灵图,js文件合并(燃鹅合并可能会导致单一js文件体积增大),合并请求减少请求数。 HTTP2.0 优点: 1. 使用新的二进制协议,不再是纯文本,避免文本歧义,缩小了请求体积 2. 多路复用,通域名下所有通信都是在单连接接(双向数据流),提高了复用率,在拥塞方面有了更好的提升。 3. 使用HACK算法将头部进行压缩,用哈夫曼树建立索引表,传送索引大大节约带宽。 4. 允许服务端主动推送给客户端。 5. 增加了安全性,使用HTTP2.0,必须要求至少使用TLS1.2 6. 使用虚拟的流传输消息,解决了应用层的队头阻塞问题。 缺点:
- TCP的队头阻塞还没有彻底解决。在HTTP2.0中,多个HTTP请求在一个TCP管道里,当出现HTTP2.0丢包时,整个TCP都需要等待开始重传输,那就会阻塞该TCP连接中的所有请求。
- TCP以及TCP+TLS建立的延时,HTTP用TCP来传输,而如果使用HTTPS的话,还需要TLS协议进行安全传输(下面会讲),在传输数据前的握手会花掉3~4个RRT。
HTTP1 较于HTTP2 1. HTTP2是一个二进制协议,HTTP1是超文本协议,传输的内容都不是一样的 2. HTTP2报头压缩,可以使用HPACK进行头部压缩,HTTP1则不论什么请求都会发送 3. HTTP2服务端推送(Server push),允许服务器预先将网页所需要的资源push到浏览器的内存当中 4. HTTP2遵循多路复用,代替同一域名下的内容,只建立一次连接,HTTP1.x不是,对域名有6~8个连接限制 5. HTTP2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况,同样是因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情。HTTP2对同一域名下所有请求都是基于流的,也就是说同一域名下不管访问多少文件,只建立一次连接 HTTP缓存 HTTP缓存就是将要获取的资源文件存储在本地,之后直接在本地获取而不用请求服务器,响应速度更快,下面是HTTP缓存过程 :
强缓存: Cache-Control:响应头字段,相对时间,代表资源有效期,一般由多个字段组成,如下图: 协商缓存: 如上流程图,不再赘述。
HTTP代理 1.普通代理(中间人代理) 如图,这种代理模式,代理服务器相当于传话筒,客户端将其视为服务器,作为请求发送的靶向、以及响应的来源,这种的好处在于可以充当中间层进行缓存、过滤、以及负载均衡(在多台服务器公用一台代理器的情况下将多个请求分配到多个服务器) 2.隧道代理(使用CONNECT方法建立隧道,进行数据透传) 好处: 1. 突破访问限制:远程访问公司内网常(使用的办公VPN)、或者翻墙 2. 安全性更高:上网者可以通过这种方式隐藏自己的IP,免受攻击。还可以对数据过滤,对非法IP限流等 3. 负载均衡:客户端请求先到代理服务器,而代理服务器后面有多少源服务器,IP是多少,客户端是不知道的。因此,代理服务器收到请求后,通过特定的算法(随机算法、轮询、一致性hash、LUR(最近最少使用) 算法这里不细说了)把请求分发给不同的源服务器,让各个源服务器负载尽量均衡 4. 缓存代理:将内容缓存到代理服务器(这个下面一节详细说)
HTTPS:(HTTP + SSL/TLS) 优点: 1. HTTPS协议认可客户端以及服务端,确保数据传输的准确性以及安全性。 2. 身份认证,确保用户访问正确。在访问某个站点时,即使DNS劫持到第三方站点,也会提醒用户没有访问初始站点,可能被劫持。 3. 虽然不是绝对安全,但是在现行架构下是最安全的解决方案,大大增了中间人的攻击成本。 4. 内容加密,中间无法查看原始内容。 缺点: 1. CA证书要钱,功能越强大、证书越贵。 2. 证书需要绑定IP,不能在同一个IP上绑定多个域名 3. HTTP双方需要加密解密,耗服务器资源 4. HTTP握手阶段更耗时,会降低一定的访问速度 HTTP与HTTPS的区别
- HTTP是明文传输,是不安全的,HTTPS是加密传输,会相对安全
- HTTP标准窗口是80,HTTPS标准端口是443。
- HTTP不用认证证书(免费),HTTPS需要认证证书。
- 连接方式不同,HTTP三次握手,HTTPS在TLS1.2版本是7次(TCP三次,TLS四次),TLS1.3中是6次((TCP三次,TLS三次))。
- HTTP是无状态的,HTTPS是有状态的
图解TSL四次握手
①:CLIENTHELLO:在TLS握手阶段,客户端首先要告知服务端,自己支持那些加密的算法,所以客户端需要将支持的加密算法列表告知服务端,即发送给服务端,除此之外,客户端还需要一个随机数(client-radom),这个随机数一方面需要存在客户端,也要发送给服务端(后面会将客户端、服务端随机数结合生成MASTER SECRET) ②:SERVER-HELLO: 在上图中,服务端收到客户端的CLIENT HELLO后,服务端需要将自己的证书发送给客户端,用于对服务器的认证(该证书是CA审核后颁发的证书),同时证书颁发会有一个公钥和私钥,私钥交由服务端保存,公钥则附带在证书信息中发送给客户端,服务端也需生成一个随机数(server-random,与客户端生成的随机数组合加密生成MASTER SERCET)以及加密算法、会话ID发送给客户端。此外,对于比较重要的信息,服务端需要对客户端进行验证( Cerficate Request 客户端证书合法性验证),以保证数据安全合法的传送给了客户端。最后,服务端会发送一个SERVER HELLO DONE,表示SERVER HELLO结束。 ③:客户端收到服务端的加密算法、会话ID以及证书等信息后,验证服务端的证书,向服务端发送Client Key exchange消息,包含使用服务端公钥加密的随机字符串(Pre Master Secret)。向服务端发送Change Cipher Spec消息,通知服务端后面的数据会加密;最后向服务端发送Finished消息,消息包含加密后的握手信息。 ④:服务端收到Change Cipher Spec 以及Finished消息后,会向客户端发送Change Cipher Spec消息,通知客户端后面的数据会加密传输,最后向客户端发送Finish消息,验证客户端的Finished消息并完成TLS握手。 结语 感谢你的观看,第一次写关于HTTP的文章,还望大佬门指出知识点误区。
|