Http协议构成

什么是协议

词条解释:通过谈判、协商而制定的共同认可、共同遵照的规定与条款。
标准协议:买票上车,司机与乘客都认同协议,只要乘客买了票,司机必须让乘客上车。
流氓协议:生米煮成熟饭。html

什么是Http协议

Http协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。
客户端与服务端都是认同的,简单一点理解就是客户端找服务端要东西,也就是请求,服务端必须给客户端东西,也就是响应。nginx

在浏览器端输入域名,会发生什么

发生了什么:

搜索本地Dns > 本地host > 向宽带运营商服务器发起Dns解析请求 > 创建TCP链接(三次握手) > 数据传输 > TCP链接断开(也就是挥手)chrome

什么是Dns

Dns是domain name service的缩写,它的做用是将域名翻译成ip地址。服务器或者应用,对于域名是无感知的,它们只会IP地址查找网络节点,Dns其实就是一个翻译,将服务器看不懂的域名地址翻译成Ip地址,这样用户在浏览器中输入域名,服务器就能够经过dns知道用户请求的是哪一个网站,而后才将对应的网站内容返回给用户。
Dns找不到的状况下会从本地host中查找;
chrome查看本地Dns缓存 chrome://net-internals/#dnsjson

Http协议分为三部分,Http状态行、Http请求头,Http响应segmentfault

Http状态行

必应的:
clipboard.png跨域

百度的:
clipboard.png浏览器

上面的图片是firefox的,chrome的长这样
clipboard.png缓存

状态行由包含了请求方式,请求路径,协议版本等数据构成
常见属性:服务器

clipboard.png

Request URL:请求Url
Request Method: 请求方式,除了经常使用的GET、POST外还有PUT与DELETE
Status Code: 经常使用的状态码有以下几种cookie

1xx 信息处理状态码

表示数据正在处理中

2xx 成功状态码
* 200:数据被正常处理
* 204: 服务器接受数据并请求成功处理,但没有资源可返回
3xx 重定向状态码
* 302:临时性重定向
* 301:永久重定向,与302的区别是对于SEO更加友好,搜索引擎到页面后爬虫会记录重定向的地址
* 304:重定向到本地缓存,浏览器中存在访问页面时会用到
4xx 客户端错误
* 400:错误的请求,好比本地开发nginx配置错误后,访问某个本地站点返回400
* 403:服务端收到了请求,但拒绝访问,好比普通员工请求管理员数据提示403
* 404:找不到该路径对应的资源
5xx 服务端错误
* 500:服务器端执行请求时发生错误
* 503:服务器处于超负载或者正在停机维护,如今没法处理请求  

固然Http状态码包含六七十种,具体能够看W3C关于状态码的规范)

Remote Address: 请求远程Ip地址
Referrer Policy: Referrer策略,当咱们在页面中请求图片、Js、接口的时候浏览器通常会加上表示来源的Reffer数据,该数据有5个值。

* no-referrer: 全部状况下都不发送referrer
* no-referrer-when-downgrade: 协议降级时不发送 Referrer 信息,好比Https页面中请求http资源,大部分浏览器默认所采用的
* Origin Only: 发送只包含host部分的Reffer信息,好比“101.101.0.3/main的referrer”值就是“101.101.0.3”
* origin-when-crossorigin: 只有跨域是才发送只包含host部分的reffer值,(域名,协议,端口其中任何一个值不一致则被认为是跨域)
* unsafe-url: 不管任何状况下都发送reffer信息,不多使用

Http请求头

包含3部分,请求行、请求首部、请求体。

请求行

clipboard.png

相似于上图的一串数据,默认为空

请求首部

clipboard.png

请求首部就是客户端向服务器提供的额外信息,好比User-Agent代表客户端身份,代表客户端的身份,常见的请求首部以下:

  • Accept: 告知服务端客户端接受的MIME类型数据,好比“text/html,image/jpeg”表示接受“html”文本与“jpeg”格式图片文件
  • Accept-Charset: 浏览器接受字符集类型,默认“utf-8”,不少中文网页中是“gb2312”
  • Accept-Encoding: 浏览器能解压数据的解码方式,常见的有“gzip、deflate、 br”,存在多个的状况下使用逗号隔开,在浏览器支持的状况下优先使用后置解压方式,如“gzip,deflate,br”三个中优先使用br解码
  • Connection: 链接方式,默认“Keep-Alive”,表示须要持续链接,但此处的持续链接指的并非永久链接,而是指在必定时间内若是存在数据请求则会复用通一个Tcp容器传输数据,不然断开
  • Content-Length: 设置请求正文长度,对于Post请求无效
  • Scheme: 使用协议,默认Http/Https,默认Http
  • Host:浏览器请求的主机与端口,与Scheme配合能够在服务端进行第三方接口转发代理
  • User-Agent:浏览器信息,能够用来进行获取访问浏览器类型占比分析。“GOOGLEBOT-IMAGE”是google的图片爬虫User-Agent信息,能够用来分析网页图片被爬虫抓取次数。
  • Content-Type: 内容格式,好比“text/html”表示html文本,“Application/json”表示传输json数据。
  • Cache-control: 缓存控制,这里不作细讲,详细原理能够看这篇博文

请求体

clipboard.png

Get类型的请求请求内容是有长度限制的,好比IE中限制是2KB,Post中无限制。

Http响应

HTTP响应是服务器在接收客户端发送请求后通过一些处理而作出的响应,Http响应与Http请求相似,也由三个部分组成,分别是:状态行,响应头,响应正文

状态行

与Http请求状态行一致,不深究

响应头

clipboard.png

响应头就是服务端想客户端提供的额外信息,常见的响应头以下:

  • Connection: 链接方式,默认“Keep-Alive”,若是服务端不支持长链接方式则会返回close
  • Content-Type: 内容格式,好比“text/html”表示html文本,“Application/json”表示传输json数据。
  • Set-Cookie: 设置cookie数据,包含cookie主体内容,过时时间,做用域等信息
  • ...不少数据与Http请求头一致,数据在来回传递

响应正文

与Http请求正文一致,区别是数据由服务度发送给客户端

会话跟踪

因为Http协议是一个无状态协议,该协议不能保存客户信息,一旦数据传输完毕,下次数据请求须要从新链接,因此须要会话跟踪

Cookie

简单一点理解就是Cookie是服务端颁发给客户端的一个通行证,用来确认客户信息,浏览器获得这个通行证后,会在本地保存起来,当浏览器再次请求该网站是,浏览器将这个通行证一并提交给服务器,服务器检查该通行证,一次来确认用户信息。
Cookie在请求头和响应头之间来回传递,因此客户端与服务端都能获取到Cookie数据。

Session

在不理解Http协议是一个无状态协议的状况下,初学者每每会有一个误区,认为Session是保存在服务端的,当服务端与客户端链接关闭的时候Session会被清空。
正确的理解应该是Session实际上是一个特殊的Cookie。

  • 当服务端须要未客户客户端的请求建立一个Session的时候,首先会检查客户端是否存在sessionId标识,存在SessionId的状况下,则说明之前已经为此客户端建立过Session,服务器就按照SessionId把这个Session检索出来使用。
  • 客户端不存在SessionId的状况下,服务端会新建一个Session,而且生成一个与该Session相关联的SessionId,SessionId通常都是通过加密计算,很难找到规律的字符串,
  • 这个session id将被在本次响应中返回给客户端保存。
  • 客户端保持SessionId的方式仍然是采用Cookie进行保存,这样在交互过程当中浏览器能够自动的按照规则把这个标识发挥给服务器。
  • 般这个cookie的名字都是相似于“SEEESIONID”,而。例如:xxxSESSIONID=KI98uvjFDJu671F7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWKjHb!-135785664。
  • 当服务端在设置的时间段内没有与客户端进行Session数据的传输状况下,会自动清除服务端Session对象。

举个例子:
clipboard.png

上图在koaJs中添加session

clipboard.png

上图是服务端返回的cookie,这个cookie与通常的cookie的区别是是带一串session标识加密字符串(koa:sess.sig=Dp_qBm3JsJX1rxvx9kgEQi64TV0)
clipboard.png

上图是客户端发送的cookie,与通常的cookie的区别也是呆了一串session标识加密字符串

对比cookie:

  • 若是浏览器禁用了Cookie,Session一样不可以使用。
  • 对比于Cookie,Session对于服务器消耗更大。

Http1.1缺点

目前大部分网站使用的都是Http1.1协议,Http1.1协议存在如下缺点

  • Http1.1是文本协议,对与人类来讲是很容易理解的,但对于计算力来讲及其不友好,转换效率低
  • Tcp启动与链接都很慢,虽然可使用keep-alive复用Tcp连接(这也是为何网页中的图片资源为何须要使用精灵图的缘由)。
  • 当网页中资源较多的状况下,浏览器处于资源控制对于单个域名会有最多同时发起6-8个链接请求限制
  • 统一域名下Http请求头重复
  • 资源加载不能设置优先级

Http2

了解Http2一开始可能会有两个误区

  • 不少教程中都把Https当作Http2来说解,╯□╰,Https是针对网页数据加密传输的一种认证机制。
  • Http2协议并非Http2.0协议,后续官方把后面的版本叫作http3.0了,因此2就是2了,22222222~

Http2协议专门针对Http1.1协议缺点作了改进

二进制文本协议

HTTP/2 采用二进制格式传输数据,而非HTTP1.1 中的文本格式,对于计算机解析起来会更高效二进制协议解析起来更高效。

单一链接

在同一个域名下,Http2只会建立一个Tcp或者Tls链接,减小了链接数,对于多个资源的页面Http1.1中会建立6~8个链接。
而且因为Tcp的滑动链接(链接刚开始数据传输很慢,后续会愈来愈快),Http1.1中多个Tcp链接会致使每一个资源的请求都至关慢,Http2中因为只建立一个链接,完美的避免了这种情形。
Http2中的这个链接能够承载任意数量的双向数据流。每一个数据流都以消息的形式发送,而消息由个帧(HTTP2中数据通讯的最小单位)组成。多个帧之间能够乱序发送,由于根据帧首部的流标识能够从新组装。
关于帧的格式(官方)以下:

+-----------------------------------------------+
|                 Length (24)                   |
+---------------+---------------+---------------+
|   Type (8)    |   Flags (8)   |
+-+-------------+---------------+-------------------------------+
|R|                 Stream Identifier (31)                      |
+=+=============================================================+
|                   Frame Payload (0...)                      ...
+---------------------------------------------------------------+

多路复用

多路复用是经过在一个流上分配多个HTTP请求响应交换来实现的。流在很大程度上是相互独立的,所以一个请求上的阻塞或终止并不会影响其余请求的处理。下图一目了然
clipboard.png

请求头优化

HTT2在客户端和服务器端使用“请求对照表”来跟踪和存储以前发送的请求头key-value,对于相同的数据,再也不经过每次请求和响应发送;
在必定的时间内,在HTTP/2的链接存续期内始终存在,由客户端和服务器共同渐进地更新;
每一个新的首部键-值对要么被追加到当前表的末尾,要么替换表中以前的值
而且Http2对请求头进行数据进行“HPACK”数据压缩,╯□╰说实话我也不知道这个是个什么鬼~

服务端推送

服务端能够在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端能够主动把 JS 和 CSS 文件推送给客户端,而不须要客户端解析 HTML 再发送这些请求。
该如何开启,如何设置,好像没有比较好的教程~

资源传输优先级

资源传输设置优先级,好比优先加载js脚本,让页面尽快出现动态效果
还没研究过怎么进行设置~

clipboard.png

参考资料

http状态码:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
浏览器缓存:https://segmentfault.com/a/1190000012233230
Session原理:https://zhuanlan.zhihu.com/p/33925382

相关文章
相关标签/搜索