HTTP协议

157 阅读8分钟

定义:超文本传输协议(HyperText Transfer Protoco),超文本指的是带标记的文本。

HTTP协议定义web客户端如何从web服务器请求web页面,以及服务器如何把web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文中包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

HTTP是不保存状态的协议,即无状态协议,协议本身对于请求或响应直接的通信状态不进行保存,因此连接双方不能知晓对方当前的身份和状态。这也是cookie技术产生的重要原因之一,客户端的状态管理,浏览器会根据从服务器发送的响应报文内set-cookie首部字段信息自动保持cookie,而每次客户端发送HTTP请求,都会在报文中携带cookie,作为服务端失败客户端身份状态的标识。

从URL输入到页面展现到底发生什么?

  • DNS解析:将域名解析成IP地址;
  • TCP连接:TCP三次握手;
  • 发送HTTP请求
  • 服务器处理请求并返回HTTP报文
  • 浏览器解析渲染页面
  • 断开连接:TCP四次挥手

URI

HTTP协议使用URI定位互联网上的资源:

  • URI:(Universal Resource Identifier统一资源标识符)
  • URL:(Universal Resource Locator统一资源定位符)
  • URN:(Universal Resource Name统一资源名称)

常用的状态码:

1xx:接受的请求正在处理(信息性状态码);

2xx:请求正常处理完毕(成功状态码);

3xx:需要进行附加操作以完成请求(重定向状态码);

4xx:服务器无法处理请求(客户端错误状态码);

5xx:服务器处理请求出错(服务器错误状态码);

304:表示资源被浏览器缓存了不需要重新请求服务器;

400:用于参数验证,少了一个参数或者参数类型错误;

401:权限不足;

403:资源禁止访问(如果你的IP被列为黑名单就会发生这种错误)

502:后端服务挂掉或者压力过大;

请求方法:

  • GET:一般用于获取服务器资源,由于浏览器或web服务器对URL长度有限制,故get请求有大小限制,不同的浏览器或web服务器限制的最大长度不一样;
  • POST:一般用于传输实体主体;
  • PUT:一般用于传输文件;
  • DELETE:用于删除文件;
  • HEAD:用于获取报文首部,不返回报文主体;
  • OPTIONS:用于询问请求URI资源支持的方法;

TCP三次握手

  • 客户端发送带有SYN标志的数据包--一次握手--服务端
  • 服务端发送带有SYN/ACK标志的数据包--二次握手--客户端
  • 客户端发送带有ACK标志的数据包--三次握手--服务端

TCP四次挥手

  • 发起方向被动方发送报文,FinAckSeq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态
  • 被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态
  • 被动方向发起方发送报文段,FinAckSeq,请求关闭连接。并进入 LAST_ACK 状态
  • 发起方向被动方发送报文段,AckSeq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。

HTTP缓存

强制缓存:

  1. 当缓存数据库中已有所请求的数据时,客户端直接从缓存数据库中获取数据,当缓存数据库中没有所请求的数据时,客户端才会从服务端获取数据。
  2. 服务器响应的header中的两个字段来表明:ExpiresCache-Control;
  3. Expires的值为服务端返回的数据到期时间,当再次请求的请求时间小于返回的时间,则直接使用缓存数据。缺陷:由于服务端与客户端时间可能有误差,这也将导致缓存命中的误差,另一方面ExpiresHTTP1.0的产物,故现在大多使用Cache-Control替代;
  4. Cache-Control有很多属性,不同属性代表的意义也不同。
  • private:客户端可以缓存;
  • public:客户端和代理服务器都可以缓存;
  • max-age=t:缓存内容将在t秒内失效;
  • no-cache:需要使用协商缓存来验证缓存数据;
  • no-store:所有数据都不会缓存;

协商缓存:

  1. 客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务端验证是否失效,如果没有失效服务端会返回304,此时客户端会直接从缓存中获取所请求的数据,如果标识失效,服务端会返回更新后的数据。
  2. 协商缓存使用的header字段:Last-ModifiedEtag
  3. Last-Modified:服务器在响应请求时,会告诉浏览器资源的最后修改时间,浏览器再次发起请求时会携带if-Modified-Since请求头,服务端会与被请求资源的最后修改时间进行对比,如果一致则返回304和响应报文头,浏览器只需要从缓存中获取信息即可。缺陷:1.只能以秒计时,如果在一秒只能发生了修改时间不会变更,仍会命中缓存;2.内容没有变更的情况下仍有可能更新最后修改时间,导致无法命中缓存;
  4. Etag:服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识,此标识是文件内容的唯一标识,文件内容发生变更时,此标识才会更新。缺陷Etag的计算是使用算法得出的,而算法会占用服务端计算的资源,所有服务端资源都是宝贵的,所以就很少使用Etag了。

如果两种缓存机制同时存在,强缓存的优先级高于协商缓存,如若强缓存命中则直接使用缓存数据库中的数据,不再进行协商缓存。

HTTP和HTTPS

  1. HTTPS协议需要到CA(证书颁发机构)申请证书,一般免费的证书很少,需要交费;
  2. HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都是经过加密的;
  3. HTTPHTTPS使用的是完全不同的连接方式,用的端口号也不一样,前者是80,后者是443;
  4. HTTP的连接很简单,是无状态的,HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,可以有效防止运营商劫持,解决了防劫持的一个大问题,比HTTP协议安全;

web安全防范:

  1. XSS:跨站脚本攻击,是利用HTML可以执行,<script>alert('a')</script>的特性,想尽办法将脚本注入页面中的攻击手段。XSS攻击有两种:
  • 通过修改浏览器URL导致脚本被注入到页面,会被Chrome浏览器字段防御攻击;
  • 通过输入框将脚本代码注入数据库,需要手动防御,推荐使用'XSS'库的白名单过滤防御方法;
  1. CSRF:跨站请求伪造,源于web的隐式身份验证机制,web的隐式身份验证机制虽然可以保证一个请求是开自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。CSRF攻击一般是由服务端解决,常见的是请求携带验证信息,如验证码或token
  2. 点击劫持:是一种视觉欺骗的攻击手段,攻击者将需要攻击的网站通过iframe嵌入自己的网页中,并将iframe设置为透明,然后诱导用户在该页面上操作。防御方法:后端大佬解决,使用一个HTTP响应头--X-Frame-options,它有三个可选的值:
  • deny:该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许;
  • sameorigin:该页面可以在相同域名页面的 frame 中展示;
  • allow-from uri:该页面可以在指定来源的frame中展示;
  1. 中间人攻击:攻击方同时与服务端和客户端建立了连接,并让对方认为连接是安全的的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。中间人攻击的本质是客户端和服务端之间的认证和信任问题;防御方法:对称加密、非对称加密、混合加密技术都没能有效防止中间人攻击,因为中间人可以截取首次传输的秘钥偷天换日,而客户端或服务端无法得知。HTTPS作为防止中间人攻击的终极手段,引入证书机制解决了客户端和服务端的信任问题,从而较为有效的防止了中间人攻击。