初步搞懂HTTP

一.HTTP协议是什么

  • (HyperText Transfer Protocol)字面意思就是超文本传输协议;是因特网上应用最为广泛的网络传输协议;所有www文件都必须遵守的协议;整个传递过程依赖于TCP/IP通信协议;OSI七层模型最顶层的应用层协议
  • HTTP协议作用于客户端和服务端(C/S)之间的通信,状态过程为请求→响应。
  • HTTP本身是无状态协议(不对历史发送的请求和响应的状态进行管理,可以减少服务器的CPU及内存资源的消耗),为了实现保存状态的功能,引入了cookie技术。
  • 我们所能使用的HTTP方法:
    1. GET:用来请求访问已被URI(统一资源标识符Uniform Resource Identifiers)识别的资源,指定的资源经服务器解析后返回响应内容。
    2. POST:传输实体主体。
    3. PUT:传输文件,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的网站不建议使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST标准的同类Web网站,就可能会开放PUT方法。
    4. HEAD:获得报文的头部,和GET一样,只是不返回报文主题部分,用于确认URI的有效性及资源更新的日期时间等。
      • HEAD传输拓展
    5. DELETE:删除文件,和PUT方法一样不带验证机制。
    6. OPTIONS:用来查询针对请求URI指定的资源支持的方法。
    7. TRACE:追踪路径,客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的,如通过代理中转连接到源目标服务器,而该方法可以用来确认连接过程总发生的一系列操作。
    8. CONNECT:要求用隧道协议连接代理,CONNECT方法在与代理服务器通信时建立隧道,实现用隧道协议的TCP通信。
  • 持久连接:在旧版的HTTP协议(无连接)中,每进行一次HTTP通信就需要断开一次TCP连接(若页面中带有大量其他类型的资源,每次请求都会造成无谓的TCP连接建立断开,增加通信量开销);后续出现HTTP keep-alive方法(客户端/服务端没有提出断开连接请求,则保持TCP的连接状态)。所以不得不了解下管线化技术
  • 媒体独立:只要客户端和服务端知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

二.HTTP协议的工作原理

HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求;Web服务器根据接收到的请求后,向客户端发送响应信息。下图为HTTP协议的通信流程:

HTTP协议的通信流程

三.HTTP协议的报文结构

从上文我们已经了解到,HTTP是基于客户端/服务端的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。

一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。

HTTP使用统一资源标识符(URI)来传输数据和建立连接。

一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送(笔者还未能深入了解)。

客户端请求消息和服务器响应消息

都由4部分构成,请求消息为 请求行(request line)/请求头(header)/空行/请求数据 ;响应消息为 状态行/消息报文/空行/响应正文

image
image

那么请求字段都有哪些呢,请看

作为前端开发至少要能熟练的辨认出请求/返回报文的内容,以便于debug,请求字段的部分常用的大家都耳熟能详,对于此类知识能够驾轻就熟的大佬我也是由衷敬佩。

四.HTTP状态码

为了便于记忆,这里总结归纳以下:

1**:表示服务器已经接受了客户端请求,客户端可以继续发送请求

2**:请求正常处理完毕

3**:需要进行附加操作来完成请求

4**:表示客户端的请求有非法内容

5**:服务器处理请求出错

这里可以查询到完整的状态码

五.HTTP响应模型

服务器收到HTTP请求之后,会有多种方法响应这个请求,四种响应模型以下

  • 单进程I/O:服务器开启一个进程,一个进程只能处理一个请求,并对请求按照顺序处理;
  • 多进程I/O:服务端并行开启多个进程,同样的一个进程只能处理一个请求,如此,服务器可以同时处理多个请求;
  • 复用I/O:服务端开启一个进程,同时开启多个线程,一个线程响应一个请求,同样可以达到同时处理多个请求,线程间并发执行;
  • 复用多线程I/O:服务端并行开启多个进程,同时每个进程开启多个线程,这样的服务端可以同时处理M*N(进程数 * 线程数)个请求

线程和进程

六.HTTP协作

前文中提到过http的请求通过访问服务器来实现,但是一个服务器上可以搭建的独立域名是不唯一的,这些域名可以作为通信途中的中转站来提升访问及传输效率,而当我们接收到请求的时候,无法分清哪个域名时,就需要在Host Head内指定主机名或者域名的URI。如此,我们即使不自己搭建服务器,也需要了解代理,网关,隧道以下:

  • 代理:具备转发功能的应用程序,它不改变请求的URI,基本行为即接收客户端发送的请求,转发给其他服务器。至于为什么要使用代理服务器,因为可以利用缓存技术减少网络带宽负荷。常见的代理使用方法包括但不限于(使用缓存/修改报文)

这里提一下缓存代理,指的是代理服务器转发响应时,缓存代理会预先将资源副本保存在代理服务器上,下次请求相同的资源时,则将之前缓存的资源作为响应返回。此举可以优化服务端性能及提升页面加载性能。当然需要注意的是缓存的有效期限,同时也不能过分依赖缓存。

  • 网关:在通信线路上提供非HTTP协议的服务,是的,没有看错,网关可以将HTTP请求转换成为其他协议的通信方式,工作机制和代理类似,具体内容同学们可以自行了解,笔者没有过分研究。
  • 隧道:前文也提到过这个名词,其意是在C/S中进行中转,并保持双方连接的应用程序,它可以按要求建立起一条通信线路,保证双方的安全通信,本身不会解析HTTP请求,此步骤中可以使用SSL等加密手段,这类后文再述。

七.HTTP安全

安全的问题主要可以从两个方面来了解

其一:HTTP协议自身的不足之处
  • 明文通信,没有加密,内容容易被窃听
  • 没有身份验证(此处指的不是登陆操作那类由服务端验证的name/pass,而是指代请求本身),容易被伪装
  • 无法证明报文的完整性,即使被篡改,接收方也无法辨别
其二:针对上类问题的解决方案
  • HTTPS:HTTPS并非应用层的新协议,只是使用SSL和TSL协议代替了HTTP通信接口部分,使用SSL时,由
    在这里插入图片描述
    变成了
    在这里插入图片描述
    所谓HTTPS其实就是HTTP套了个马甲。而这之后,就拥有了加密,证书和完整性保护这些功能,同时SSL协议是针对应用层的协议,所以使用范围不局限于HTTP,是目前世界上应用最为广泛的网络安全技术之一。

而更深入,便是加密算法部分,加密分为对称加密非对称加密,HTTPS则是两者混合的模式,对于对称加密来说:高效率的同时,密钥传输时不安全的;而后者效率低下,安全性高;两者结合,互补有无。这部分的基础内容可以参考这篇文档

  • 身份认证:简单的来说,就是证明我是我,这是必须严肃对待的一个问题,但无奈需要核对的信息不仅有密码,动态码,数字证书,生物认证等等,还有诸如BASIC认证,DIGEST认证,SSL客户端认证的各类认证方式。人的精力是有限的,笔者认为这部分工作是可以交由专精此类研究的大佬来协作的。

八.提升编码传输效率

HTTP协议中有一种被称为内容编码的功能,可以把需要传输的内容压缩之后,保持实体信息的结构,然后交由服务端接收。

常用的内容编码以下:

  • gzip(GNU zip)
  • compress(UNIX系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

如果需要发送的内容量过大,浏览器会无法显示请求页面。所以在传输大容量数据时,通过对数据进行分割,能够让浏览器逐步显示页面,这种功能称为分块传输编码

此外,还有断点续传,可以理解为常见的暂停功能,由于涉及一些服务端的技术,感兴趣的同学可以自行了解。

然后再提一下发送多种数据的多部分对象集合,用处在于同时上传多种数据类型的实体信息,好比我们发邮件的时候,同时发送的内容中包含了图片,文件及附件。

  • 多部分对象集合

九.从HTTP1.0到HTTP2.0(转自一只好奇的茂 code小生

  • 从1.0到1.1
  1. 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  2. 带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  3. 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  4. Host请求头的处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
  5. 长连接:HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
  • 从1.1到1.x
    2012年google如一声惊雷提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,以下:
  1. 降低延迟:针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
  2. 请求优先级:多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
  3. header压缩:前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
  4. 服务端推送:采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。SPDY构成:
    在这里插入图片描述
  • 性能惊人的HTTP2.0,同样是基于SPDY设计的,支持明文HTTP传输,而SPDY则强制使用HTTPS,消息头的压缩算法也与SPDY采用的DEFLATE不同,而是选择了HPACK。以下是一些新的特性:
  1. 新的二进制格式:HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
  2. 多路复用:如上文所说即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
  3. header压缩:如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
    4.服务端推送:同SPDY一样,HTTP2.0也具有server push功能。

后记

本文是个人对HTTP的认识结合一些优秀文章之后总结的,首先是对HTTP的认识有了更深入的一个了解,也方便下次复习的时候,可以快速的拿起这部分知识。同时也说点个人看法,互联网技术发展至今,各端技术多如牛毛,种种协议接口算法浩如烟海,越是深入越是觉得自己只是在管中窥豹,也希望自己能记住今天写的博客,戒骄戒躁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值