HTTP
基本概念
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识
名称拆分:
-
超文本:需要传输的内容(html/css/js/视频/图片等)
-
传输:将超文本从服务端发送到客户端
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端
- 协议:计算机与计算机之间通信的规范
http状态码
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
常见问题:
常见状态码有哪些,怎么处理接口返回的错误状态码?
- 常见状态码
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
- 处理
- 网络错误针对要求做统一处理
- 特殊状态做特殊处理,例如登录状态,权限问题,数据已存在等提示
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区别?
-
get用来获取数据,post用来提交数据
-
get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制
-
get请求的数据会附加在url之 ,以 " ? "分割url和传输数据,多个参数用 "&"连接,而post请求会把请求的数据放在http请求体中
-
get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具/浏览器开发者工具看到(等于明文)
-
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技术实现“有状态
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详解
拓展
-
get/post安全性问题
-
加密,对称加密/非对称加密
-
RESTful API架构和相关规范
-
http优化/缓存等
-
http1.1/2/3优缺点
参考文章/书籍:
图解HTTP