HTTP回顾

444 阅读10分钟

HTTP

基本概念

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识

名称拆分:

  • 超文本:需要传输的内容(html/css/js/视频/图片等)

  • 传输:将超文本从服务端发送到客户端

    请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端

  • 协议:计算机与计算机之间通信的规范

http状态码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

常见问题:

常见状态码有哪些,怎么处理接口返回的错误状态码?
  1. 常见状态码
  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误
  1. 处理
  • 网络错误针对要求做统一处理
  • 特殊状态做特殊处理,例如登录状态,权限问题,数据已存在等提示

http字段

Host 字段

表示访问资源所在的主机名,即URL中的域名部分,如:www.baidu.com

Accept-Encoding字段

表示客户端支持的内容编码(压缩)格式

常用的内容编码:

  • gzip: 由文件压缩程序gzip生成的编码格式
  • compress: 由Unix文件压缩程序compress生成的编码格式
  • deflate: 组合使用zlib和deflate压缩算法生成的编码格式
  • identity:默认的编码格式,不执行压缩

Referer

告知服务器请求是从哪个页面发起的

Connection

常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用

HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive

Accept

声明自己可以接受哪些数据格式

text/html,text/plain,text/css,application/xml,iamge/jpeg,image/gif,image/png,video/mpeg等

Content-Type 字段

Content-Type字段用于服务器回应时,告诉客户端,本次数据是什么格式

...

常见问题:

http缓存
强缓存
  • Expires

缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点,Expires=max-age + 请求时间,需要和Last-modified结合使用

  • Cache-Control

Cache-Control是一个相对时间,例如Cache-Control:3600,代表着资源的有效期是3600秒。由于是相对时间,并且都是与客户端时间比较,所以服务器与客户端时间偏差也不会导致问题。 Cache-Control与Expires可以在服务端配置同时启用或者启用任意一个,同时启用的时候Cache-Control优先级高

协商缓存
  • Last-Modify/If-Modify-Since

浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间

当浏览器再次请求该资源时,发送的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存

如果命中缓存,则返回http304,并且不会返回资源内容,并且不会返回Last-Modify。由于对比的服务端时间,所以客户端与服务端时间差距不会导致问题。但是有时候通过最后修改时间来判断资源是否修改还是不太准确(资源变化了最后修改时间也可以一致)。于是出现了ETag/If-None-Match

  • ETag/If-None-Match

与Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一个校验码(ETag: entity tag)。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。ETag值的变更则说明资源状态已经被修改。服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存

http无状态

使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的

http通过URL定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到

http请求方法

  • GET方法。获取资源。用来请求访问一杯URI识别的资源。指定的资源经过服务器解析后返回的响应内容

  • POST方法。传输内容实体。虽然GET方法也可以用来传输内容实体,但是我们一般都不怎么做。POST的主要目的并不是获取响应的主体内容

  • PUT方法。传输文件。就想FTP协议中的请求文件上传一样,要求在请求报文的实体中包含文件内容,然后保存到请求的URI指定的位置。但是鉴于HTTP1.1的PUT方法自身不带有验证机制,任何人都可以上传文件,存在安全问题,因此一般的网站不选用这种方式。如果配合Web应用程序的验证机制,或架构设计采用REST标准的同类Web网站,就可能会开放使用PUT方法

  • HEAD方法。获取报文首部 。HEAD方法和GET方法一样,只是不返回报文的主体部分。用于确认URI的有效性以及资源更新的日期时间等

  • DELETE方法。删除文件。与PUT方法相反,按照请求的URI删除指定的资源

  • OPTIONS方法用来查询针对请求的URI指定的资源支持的方法

  • TRACE。追踪路径。让web服务器将之前的请求通信环回给客户端的方法。发送请求的时候,在Max-Forwards首部字段中加入数值,每经过一个服务器端该数字就减一,当数值刚好减到0的时候,就停止传输,最后收到请求的服务器返回的200OK的响应

但是TRACE方法本来就不怎么常用,而且它容易引发XST(跨站追踪),通常就更加不会用到了

CONNECT方法。要求隧道协议连接代理 CONNECT方法要求在与代理服务器通信的时候建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(secure sockets layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经过网络隧道传输。 CONNECT方法的格式如下: CONNECT代理服务器名:端口号 HTTP版本

最后,我们要知道,方法的作用在于,可以指定请求的资源按照期望产生某种行为。而且方法的名称分大小写之分,记得使用大写

在这里列举的众多方法中,LINK 和 UNLINK 已被 HTTP/1.1 废弃,不再支持

常见问题:

get/post区别?
  1. get用来获取数据,post用来提交数据

  2. get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制

  3. get请求的数据会附加在url之 ,以 " ? "分割url和传输数据,多个参数用 "&"连接,而post请求会把请求的数据放在http请求体中

  4. get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具/浏览器开发者工具看到(等于明文)

  5. get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中

http持久链接

持久链接

HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP连接

为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态

管线化

持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求

使用 Cookie

cookie相关

优点:简单、灵活和易于扩展,应用广泛,无状态的,可以轻松实现集群化,扩展性能,可以利用Cookie技术实现“有状态

HTTPS

http缺点

  • 通信使用明文,可能被窃听
  • 不验证通信方的身份,可能遭遇伪装
  • 无法证明报文的完整性,有可能遭遇篡改

为了提供对网站服务器的身份认证,保护交换资料的隐私与完整性。网景公司(Netscape)在1994年首次提出超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure),随后扩展到互联网上(HTTP+SSL = HTTPS)

差异

  • URL地址不同,http开头为http://,https开头为https://

  • 端口不同,http默认使用80端口,https默认使用443端口

  • HTTP是不安全(明文)的,而且攻击者可以通过监听和中间人攻击(抓包工具)等手段,获取网站帐户和敏感信息等。HTTPS的设计(SSL/TLS 安全协议,内容加密)可以防止前述攻击,在正确配置时是安全的

  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的

SSL

SSL(Secure Socket Layer)安全套接层,是一种位于应用层与传输层之间,为网络通信提供安全及完整性验证的一种网络协议

推荐阅读:HTTPS详解

拓展

  1. get/post安全性问题

  2. 加密,对称加密/非对称加密

  3. RESTful API架构和相关规范

  4. http优化/缓存等

  5. http1.1/2/3优缺点

参考文章/书籍:

图解HTTP

传输层安全性协议

HTTP状态码

超文本传输协议

HTTP和HTTPS详解

浅析HTTP协议的特点以及优缺点

硬核!30 张图解 HTTP 常见的面试题

juejin.cn/post/684490…

HTTPS详解

RESTful架构API风格与相关规范