一文建立你自己的HTTP体系

652 阅读28分钟

了解http

日常的使用过程

首先先放置一张图

我们在日常访问网站的过程中。实际上访问的是 所在的 IP地址, 域名是什么?,一个代称。方便我们用户对网站进行访问

我们在发送请求的过程中。所遵循的规则(也就是协议)。就是 http协议

为什么要遵守规则(协议)?

举例,就好比打电话。 你说中文。对方讲英语。你们肯定都互相听不懂对方说的什么啊。所以,我们必须规定一个统一的对话格式。也就被称为 规则或者协议

接下来。我们就引出了 http的概念

什么是http

HTTP超文本传输协议(Hypertext Transfer Protocol)) 是一种 通讯协议,它允许将 **超文本标记语言(html)**文档从web服务器传送到客户端的浏览器。

再来一个官方一点的概念

HTTP是一个属于应用层的面向对象的协议,由于其简捷快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。

我们可以把它拆分来解释

  1. 超文本

    早期互联网,我们输入的信息只能以 文本的形式存在。但是随着互联网的发展,我们不满足只能传输文字,还想要传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转。这时候,文本的语义和范围进行的了扩大。所以被称为超文本

  2. 传输

    什么是传输? 两台计算机之间进行通信

    这就涉及到了计算机网络通讯.在 网络边缘的端系统之间的通信方式可划分为 C/S(客户-服务器方式)P2P(对等连接方式)。这里我们主要说一下 C/S(客户-服务器方式)

    通常,我们把发送请求得一方称之为**客户(Clint)**,也就是请求方。接收到请求的称之为服务器(serve),也就是应答方。他们之间的关系,如上图浏览器和web服务器的关系

  3. 协议

    上面我们已经解释过了一次。再具体的说明一下

    网络协议就是网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议

  4. 总结一下以上几点。我们再总结一下什么是http?,

    HTTP 是一个两个计算机进行通讯之间传输超文本数据的约定和规范

扩充,什么是web

web是一种基于超文本和http的 ,全球性的。动态交互的,跨平台的分布式图形信息系统, 建立在Internet的一种网络服务,为浏览者在Internet查找和浏览信息提供图形化,易于访问的界面

internetInternet是有区别的,前者表示互联网,代之多个计算机网络互联形成的网络。

后者表示因特网,代之 当前全球最大的,开放的,特定的计算机网络

透过 TCP/IP 来了解 HTTP

TCP/IP 协议你一定听说过,TCP/IP 我们一般称之为协议族,因为它不仅仅包含tcp协议IP协议是一些列与互联网相关联的协议集合起来的总称。其最重要的特征就是 分层管理http就属于TCP/IP协议族

TCP/IP协议族分层

分为4 层 , 自上而下分别是

  1. 应用层

    ​ 因特网的应用层包括许多协议,例如支持万维网的 HTTP协议,电子邮件传送协议 SMTP、端系统文件上传协议 FTP,域名解析的 DNS 协议。 我们将应用层交互的数据单元成为 报文

    ​ 任务是 通过应用进程的交互完成特定的网络应用

    ​ 协议定义的是 应用进程通信和交互的规则

  2. 传输层

    任务: 向两个主机中进程之间的通信提供通用的数据传输服务

    主要使用以下 两种协议

    1. TCP 传输控制协议。 面向连接,可靠的数据传输服务。传输单位: 报文段
    2. UDP 用户数据报协议。 无连接的,尽最大努力的数据传输服务( 不保证数据可靠性)。传输单位:用户数据报
  3. 网络层

    任务:

    1. 负责为分组交换网上的不同主机提供通信服务
    2. 选择合适的路由。是通过传输层传下来的分组能通过路由器找到主机

    数据包,网络传输的最小单位

    因特网的网络层也叫做网际层 或者 IP层

    ​ 原因: 因特网主要的网络层协议是无连接的网际协议IP和许多种路由选择协议

  4. 网络接口层

    从实质上讲。最后一层 网络接口层,和一般的通信链路在功能上没有多大差别

    任务: 把网络层交下来的IP数据报 组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(同步信息等)

关系如图所示

扩充 OSI和五层协议体系结构

相比较上面的几层。多了

  1. 物理层

    物理层的作用是将中的一个个 比特 从一个节点运输到另一个节点,物理层的协议仍然使用链路层协议,这些协议与实际的物理传输介质有关

  2. 会话层

    提供了数据交换的定界和同步功能,包括建立检查点和恢复方案。

  3. 表示层

    主要包括数据压缩和数据加密以及数据描述,数据描述使得应用程序不必担心计算机内部存储格式的问题

http传输过程

文字解释就是。发送端发送数据时, 数据每经过一次都需要添加上本层的一些头部信息 (控制信息)(第一层物理层不加头部信息)

接收端 会每经过一层。会把对应的头部信息都给消去

OSI参考模型对等层次之间传送的数据单位称之为该层的 协议数据单元 (PDU)

把数据通过 虚线直接传递给对方。称之为 对等层之间的通信

传输层---三次握手

使用TCP协议进行通讯必须先建立连接。才可以传输数据,在双方建立连接的时候。TCP协议采用了三次握手的策略

图片来自百度。侵权删除

第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;

第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态; 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

然后可以开始进行数据传输

为什么要进行三次握手?

确定 客户端服务端的收发能力都是正常的

DNS域名解析

通常我们访问一个网站, 使用的是主机名或者域名来进行访问的。因为相对于IP地址(一组纯数字),域名更容易让人记住。 但TCP/IP协议使用的是IP地址进行访问的,所以必须有个机制或服务把域名转换成IP地址DNS服务就是提供域名到IP地址之间的解析服务。

图解见最开始的 日常的使用过程中图片

再识http

通过以上的介绍,我们对http协议有了一定的了解。接下来,我们将更具体介绍一下

http协议 特点

  1. 支持C/S 客户/服务器模式

    http是TCP/IP协议族的一员,可以用于客户/客户端模式

    客户/服务器模式工作方式是由客户端向服务器发出请求,服务器端响应请求,并进行相应服务

    如图所示

  2. 简单快速

    客户向服务器请求服务时,只需传送请求方法和路径 请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

  3. 灵活

    HTTP允许传输任意类型的数据对象,通过Content-Type(ontent-Type是HTTP包中 用来表示内容类型的标识)控制和标记

  4. 无连接

    含义: 每次连接只处理一个请求

    服务器处理完客户的请求,并收到客户的应答后,即断开连接 采用这种方式可以节省传输时间

  5. 无状态

    HTTP协议是无状态协议 无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次 连接传送的数据量增大。服务器处理时间就长。反之,数据小,处理时间就快

    为了解决这个。我们可以利用cookie session来解决

URI 和 URL

这里先放一张图

URI的全称是(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源

URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是 URI 的一个子集。除了确定一个资源,还提供一种定位该资源的主要访问机制

URN统一资源名(URN,Uniform Resource Name)是带有名字的因特网资源。

URL,URI最大的差别在于他们的 访问机制不同

可能这三者关系还是不太明确。我们利用维基百科上的解释

  1. URI可以分为URL,URN或同时具备 locators 和 names 特性的一个东西
  2. URN作用就好像一个人的名字,URL就像一个人的地址
  3. 换句话说:URN确定了东西的身份,∪RL提供了找到它的方式

HTTP报文结构分析

HTTP 协议主要由三大部分组成:

  • 起始行(start line):描述请求或响应的基本信息;
  • 报文头(header):使用 key-value 形式更详细地说明报文;
  • 报文体(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

四种报文头总结

  1. 通用报文头

  2. 请求报文头

  3. 响应报文头

  4. 实体报文头

请求报文

最开始的时候我们已经说过是由3部分组成 ( 起始行,报文头,报文体 )

这里我们先介绍一些常用的 报文头

  1. ACCEPT:浏览器端可以接受的媒体类型

    ACCEPT:*/* 代表接收所有类型,如果说无法返回我们需要的请求类型。则会报406错误(Non Acceptable)

  2. Accept-Encoding : 表明自己接收的编码方式。通常指定压缩方式。是否支持压缩,支持什么压缩方法(常用gzip,deflate)

  3. Accept-Language: 浏览器接收的语言

    举例:

    Accept-Language: zh-cn, zh; q=0.7,en-us, en; q=0.3

    q代表权重值。 权重值越高,越优先返回( 最高为1 ,且不用相加为1 )

  4. Connection

    keep-alive

    当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

    close

    这个相比较上面,就是会关闭连接,再次发送 request. 需要重新连接

  5. Host

    主要用于指定被请求资源的主机和端口号

  6. Referer

    从那个页面过来的。服务器可以借此获得一些有用信息

  7. User-Agent

    客户端的操作系统,浏览器的名称版本

  8. Content-Type

    报文体对象的媒体类型. 总结如下

请求方法与解析

HTTP 请求方法一般分为 8 种,它们分别是

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

    如果请求的资源是文本,那就保持原样返回;

  • POST 传输实体,虽然 GET 方法也可以传输主体信息,但是便于区分,我们一般不用 GET 传输实体信息,反而使用 POST 传输实体信息,

  • PUT 传输文件,PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。

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

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

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

  • TRACE 追踪路径,回显服务器收到的请求。 主要用于测试或者诊断。

  • CONNECT 要求用隧道协议连接代理,与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加 密后经网络隧道传输。

我们一般最常用的方法也就是 GET 方法和 POST 方法,其他方法暂时了解即可。

响应报文

响应头

HTTP/1.1 200 0k 
Server: aChen
Date: Sat, 10 Aug 2020 03: 31: 25GMT
Cache-control: no-cache
Expires: 0
Content-length: 413
Content-type: text/html; charset=ISO-8859-1
Date: Sat, 10 Aug 2020 03: 31: 25 GMT
Expires: 5S

响应体

<html>
<title>测试</title>
<body>
    返回你对应的 响应内容
    </body>
</html>

状态码

用来表示网页服务器超文本传输协议响应状态的三位数字代码

分类含义
1XX表示消息。这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
2XX表示成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
3XX表示重定向。这类状态码代表需要客户端采取进一步的操作才能完成请求。通常这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location域中指明
4XX表示请求错误。这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
5XX表示服务器错误。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。

常用状态码

状态码状态码英文名称描述
200OK请求已成功,请求所希望的响应头或数据体将随此响应返回
202Accepted已接受,已经接受请求,但未处理完成
206Partial Content部分内容,服务器成功处理了部分GET请求(断点续传)

| 301 | Moved Permanently | 永久移动,请求的资源已被永久的移动到新UR,返回信息会包活新的UR,浏览器会自动定向 到新UR|。今后任何新的请求都应使用新的UR代替 | | 302 | Found | 临时移动,与301类似。但资源只是临时被移动。客户端应继续使用原有UR | | 400 | Bad Request | 服务器接收并处理了。但是与客户端请求的类型不同,服务器无法理解 | | 401 | Unauthorized | 请求要求用户的身份认证(没有权限) | | 403 | Forbidden | 服务器理解请求客户端的请求但是拒绝执行此请求(权限不够或者错误) | | 404 | Not found | 服务器无法根据客户端的请求找到资源(网页)。 | | 500 | nterna| Server erro | 请求没问题,服务器错误 | | 502 | Bad Gateway | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求 |

HTTP 状态管理。Cookie和Session

Cookie

Cookie实际上是一小段文本信息。用来记录用户状态,如果服务器需要记录该用户状态, 就向客户端浏览器颁发一个 Cookie(第一次),客户端浏览器会把 Cookie保存起来。当浏览器再请求时,浏览器把Cookie一同提交给服务器。服务器检查该 Cookie,以此来辨认用户状态

Session

Session是另一种记录客户状态的机制。

就是把客户端信息保存到服务器上。再次访问时只需要从该Session中查找该客户的状态就可以了

但是会增加服务器压力。这就要考虑设置Session有效期。可以缓解服务器压力

对比

  1. 存放位置

    cookie存在与 浏览器。 Session存放在 服务器

  2. 安全性不同

    原因同上。浏览器的一些操作可以修改或者盗取cookie

  3. 有效期不同

  4. 对服务器压力不同(已解释过)

Cookie && session

深入HTTP

字符集和编码

什么是编码?

大家都知道,计算机存储时二进制的。但是我们需要看到的。应该是英文,中文 或者其他。怎么让计算机的二进制 变成我们所能看懂的中文或者其他呢。这时候我们就需要用到了 编码

简单来说。编码就是让 计算机里面的二进制 编译成我们所能理解文字

不同的语言有不同的编码规范(把相同的二进制编程不同语言的文字),例如 中文的GBK

用一个图来表示。这里只简单介绍一下,有兴趣的朋友自己百度

解码与乱码

解码 是 编码的逆过程

而乱码。是在解码过程中, 使用了与 编码方式不一样的解码方式。使得信息显示 与预期不符。被称为乱码

长连接与短链接

HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP请求就结束了。

HTTP的长连接和短连接本质上TCP长连接和短连接。

HTTP的长连接与短链接

之前我们说过。在 开发者工具里。找到Network 点击一个网页。找到 Response Headers 里面的

这个代表 我们与服务器之间建立了 长连接。一定时间内。我们可以一直走这个连接,会加快访问速度等

简单来说

短链接

建立连接 --> 数据传输 --> 断开连接 ........... 建立连接 --> 数据传输 --> 断开连接

长连接(请求频繁)

建立连接 --> 数据传输 ---> 保持连接------>数据传输 --> 断开连接

代理中介

这个也就是我们常说的Proxy代理。想必也不用多说。我们都经常用到

就是当了一个中间人的角色。

例如 前端可以使用node服务器作为代理。对数据进行清洗。跳出 浏览器的跨域机制等等。

这里就不再多做叙述

网关中介

这里只简单介绍。有兴趣的朋友自行百度了解更多

网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。 简单来说。就是作为协议转换器

由此可以看出。代理走的是同协议之间的, 网关走的是不同协议之间的

这样 网关就分为了两种

  1. 服务器端网关(HTTP/):通过HTTP协议与客户端对话,通过其他协议与服务器通信。
  2. 客户端网关(/HTTP):通过其他协议与客户端对话,通过HTTP协议与服务器通信

HTTP缓存

客户端每次请求。服务端都要进行返回。如果请求人数过多,文件过多,对服务器也会有很大的压力。

如果把有些静态资源,不常变化的资源存储起来。客户端再次请求的过程中。只需要请求自己没有的或者变化的文件。这样也缓解了服务器的压力。同样也加快了网页加载速度

缓存控制

  1. 请求/响应头Cache-Control字段。称为控制缓存字段. 常用值有

    no- store : 所有内容都不缓存 no- cache: 缓存,但是浏览器使用缓存前,都会请求服务器判断缓存资源是否是最新 max-age=x:(单位秒)请求缓存后的λ秒不再发起请求。 s- maxage=x:(单位秒)代理服务器请求源站缓存后的λ秒不再发起请求,只对CDN缓存有效。 public:客户端和代理服务器(CDN都可缓存。 private:只有客户端可以缓存

  2. Last-Modified

    响应头,资源最新修改时间,由服务器告诉浏览器。

    if-Modified-Since 请求头,资源最新修改时间,由浏览器告诉服务器,和LastModified是一对,它两会进行对比。

  3. Etag 响应头,资源标识,由服务器告诉浏览器。 if-None-Match 请求头,缓存资源标识,由浏览器告诉服务器(其实就是上次服务器给的Etag,和Etag是一对,它两会进行对比。

工作方式

  1. 设置一个文件过期时间Expires,时间没过期,走浏览器的缓存,过期了就重新请求服务器
  2. 设置文件过期时间的基础上,再加个文件最新修改时间的对比Last-Modifiedif Modified-Since, 如果文件过期了。对比一下修改时间。如果对比的上。还是走缓存
  3. 在上面的基础上。再增加一个文件内容唯一对比标记——Etagif-NoneMatch。 Expires不稳定,再加入一个max-age(优先级大于Expires)来加以代替。这样请求的max-age内,走缓存。超出时间。对比Etag(优先级)。 变化了走请求,不变化走缓存

改进方案

客户端 没有办法主动查询到 服务器的文件变化,为了解决这个问题。我们又有了新的方法

  1. MD5/Hash缓存,通过给静态文件加上 MD5或者Hash标识,这样请求文件,如果文件发生变化。hash/md5 也会变化,客户端就会请求新的文件

  2. CDN缓存

    CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。

    举例来说就是 有城市里有许多 火车票代售点。 这样我们买票就不用去火车站买了,去代售点就可以。既缓解了火车站的压力。加快了 购买火车票的速度

内容协商机制

指客户端和服务器端就响应的资源內容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言,字符 集,编码方式等作为判断的基准。

三种方式

  1. 客户端驱动

    客户端发起请求,服务器发送可选项列表,客户端作出选择后在发送第二次请求。

  2. 服务器驱动 (应用最广)

    服务器检查客户端的请求头部集(Accpet)并决定提供哪个版本的页面。

  3. 透明协商

    某个中间设备(通常是缓存代理)代表客户端进行协商。

请求/响应 首部集

在上面 HTTP报文结构分析写出来了,这边再写一下

Accept:告知服务器发送何种媒体类型 Accept-Language:告知服务器发送何种语言 Accept- Charset:告知服务器发送何种字符集 Accept-Encoding:告知服务器采用何种编码

下面的与上面的相对应

Content-Type Content-Language Content-Type Content-Encoding

还可以通过q,来进行 近似匹配。权重越高,越优先

断点续传 和 多线程下载

HTTP是通过在Header里两个参数实现的,客户端发请求时对应的是 Range,服务器端响应时对应的是 Content- Range.

Range

用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式 Range: unit=(first byte pos)-[last byte pos]

Content- Range

用于响应头中,在发出带 Range的请求后,服务器会在Content-Range头部返回当前接受的范围和文件总大小。一般 格式

Content-Range: bytes(unit first byte pos)-[last bytepos]/[entity legth]

而在响应完成后,返回的响应头内容也不同

  1. HTTP/1.1 200 ok(不使用断点续传方式)
  2. HTTP/1.1 206 PartialContent(使用断点续传方式)

HTTPS

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1] HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 来自百度百科

Https可以认为是HTTP+TLS,TLS是传输层加密协议,它的前身是SSL协议。

用图来表示的话

HTTP 与 HTTPS 的区别

  • HTTP 是明文传输,HTTPS 通过 TLS/SSL进行了加密
  • HTTP 的端口号是 80,HTTPS 是 443
  • HTTPS 需要申请证书,费用不等
  • HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

优缺点

优点

  1. 数据安全性,使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器
  2. 数据完整性,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性
  3. 增加了攻击成本 ,HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本

缺点

  1. 加大网络开销,占用带宽,增加耗电,相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加 10%到 20%的耗电。此外,HTTPS 协议还会影响缓存,增加数据开销和功耗 [2] 。
  2. 安全范围有限,HTTPS 协议的安全是有范围的,在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用 [2] 。
  3. 受限与SSL体系,最关键的是,SSL 证书的信用链体系并不安全。特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行 [2] 。
  4. 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本。在大规模用户访问应用的场景下,服务器需要频繁地做加密和解密操作,几乎每一个字节都需要做加解密,这就增加了服务器成本。

webSocket

Websocket是基于HTTP协议之上的另一个协议

webSocket是什么?我们为什么需要它?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。

浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的报文头,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。或许我们可以采用的 长链接的方式,但也会消耗服务器资源。为了解决这个问题,WebSocket就发明出来了。

对比HTTP

Websocket是一个持久化的协议 。 相对于HTTP这种非持久的协议来说。

HTTP的生命周期通过Request来界定,也就是一个Request 对应一个ResponseHTTP1.0,这次HTTP请求就结束了。 HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。 但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起

再把上面的图拿过来。

WebSocket

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

相比较 HTTP请求。

Upgrade: websocket  
Connection: Upgrade

多了这两个东西 ,告诉服务器 我发送的是WebSocket协议

浏览器随机生成的 用来验证
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==   
区分 服务协议
Sec-WebSocket-Protocol: chat, superchat
协议版本。不过现在已经定下了
Sec-WebSocket-Version: 13

返回 如下。 证明切换协议成功

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

Sec-WebSocket-Accept: 加密过后的 Sec-WebSocket-Key Sec-WebSocket-Protocol: 使用的协议

Websocket的作用

在这之前,先解释一下 ajax轮询以及 long poll(长轮询)

ajax轮询

简单理解。就是写了一个定时器。每隔一段时间就请求一次服务器,查看是否有消息返回

function ajax(){
    axios.get().then(res=>{
 		alert('ajax的信息是'+' '+res);
    })
}
setTimeout (function(){
  ajax();
},1000);

图片表示

long poll(长轮询)

long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

废话不多说。直接上图

webSocket的方式

直接上图

参考资料

百度百科-http

百度百科-https

慕课网 - 大话HTTP

计算机网络 (第六版) 谢希仁著

看完这篇HTTP,跟面试官扯皮就没问题了

WebSocket 是什么原理