万字长文,掌握必备网络知识(下篇)来了解一下HTTP协议的相关知识

目录

一、HTTP/1.1
  URI与URL
  报文结构
  状态码
  Cookie
  常用方法
二、HTTP/2.0
三、HTTPS
四、跨域
  同源策略
  解决方案
五、攻击
  XSS
  CSRF
六 、缓存
  强缓存
  协商缓存
七、其它
  fetch与ajax
  性能优化
附录
复制代码

本文为原创文章,万字长文,建议先码后读。

一、HTTP/1.1

HTTP 于 1990 年问世,直到 1996 年 5 月才被正式作为标准公布,HTTP/1.0 就此诞生。1999 年,HTTP/1.1 公布,这个也是目前主流的 HTTP 协议版本。

HTTP 协议工作在应用层,请求从客户端发出,最后服务器响应请求并返回。

URI 与 URL

URI 是 Uniform Resource Identifier 的缩写,译为 “统一资源标识符”,用来标示抽象或物理资源。

URI

URI 可以分为 URL、URN 或 同时具备 locators 和 names 特性的一个紧凑字符串。

  • URN 好比是名字,确定了它的身份。
  • URL 就好比是地址,提供了找到它的方式

HTTP 报文结构

HTTP 协议交互的信息称为 HTTP 报文。

⇩ HTTP 报文结构

http 报文结构

HTTP 报文由三个部分组成

  • 报文首部:服务端或客户端需要处理的请求或响应的内容及属性
  • 空行(CR+LF):CR-回车符,LF-换行符
  • 报文主体:被发送的数据

客户端发起的 HTTP 报文称为 请求报文,服务端返回的 HTTP 报文称为 响应报文;主要差异体现在 报文首部。

请求报文首部自上而下分别是:

  • 请求行:包含用于请求的方法,请求 URI 和 HTTP 版本
  • 首部字段
    • 请求首部字段
    • 通用首部字段
    • 实体首部字段
  • 其它字段

响应报文首部自上而下分别是:

  • 状态行:表明响应结果的状态码,原因短语和 HTTP 版本
  • 首部字段
    • 响应首部字段
    • 通用首部字段
    • 实体首部字段
  • 其它字段

HTTP/1.1 规范定义了 47 种首部字段,见文末附录。这里先讲一下常用的 Content-Type,后面小节还会讲到其它常用的首部字段。

Content-Type:说明了实体主体内对象的媒体类型

  • text/html:HTML 文档标记
  • text/plain:普通 ASCII 文档标记
  • text/xml:忽略 xml 头所指定编码格式而默认采用 us-ascii 编码
  • image/jpeg:JPEG 图片标记
  • image/gif:GIF 图片标记
  • application/javascript:js 文档标记
  • application/xml:xml 文件标记;使用 xml 格式的数据
  • application/octet-stream:任意二进制数据
  • application/x-www-form-urlencoded:用于表单提交,将请求参数用 key1=val1&key2=val2 的方式进行组织,并放到请求实体里
  • application/json:以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是 json 格式的数据,参数会被直接放到请求实体里,不进行任何处理
  • multipart/form-data:多部分多媒体类型;首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以——boundary 开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个 boundary 块。如果参数是文件会有特别的文件域。最后以——boundary–为结束标识。multipart/form-data 支持文件上传的格式,一般需要上传文件的表单则用该类型。

只列出部分常用可选值,完整版请跳转到这里 MIME 参考手册

常见状态码

状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。

1xx:Informational(信息性状态码),接收的请求正在处理

  • 100:请求已被部分处理
  • 101:切换协议

2xx:Success(成功状态码),请求正常处理完毕

  • 200:请求成功
  • 204:请求处理成功,但是没有内容返回
  • 206:返回指定范围的内容

3xx:Redirection(重定向状态码),需要进行附加操作以完成请求

  • 301:永久重定向
  • 302:临时重定向
  • 303:临时重定向,要求使用 GET 方法
  • 304:请求资源未更改,直接使用缓存

4xx:Client Error(客户端错误状态码),服务器无法处理请求

  • 400:请求出错
  • 401:未授权
  • 403:被服务器拒绝访问
  • 404:服务器上没有请求的资源

5xx:Server Error(服务器错误状态码),服务器处理请求出错

  • 500:服务器内部错误
  • 503:服务器暂时无法处理请求
  • 504: 服务器作为网关或代理,没有及时从上游服务器收到请求,请求超时

Cookie

HTTP 是一种 无状态(stateless) 协议。看到这有的同学可能要说了,它不是有状态码吗?怎么无状态了?

这话没错,状态码是指通信状态,而 无状态 指的是 不保存状态。每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这么设计主要是为了能处理大量事务,确保协议的可伸缩性。

假设是需要登录的网页,但是 HTTP 本身又不能记录之前的状态,所以每次跳转新页面都要再次登录。

保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了 Cookie。

Cookie 的工作机制是用户识别及状态管理。Web 网站为了管理用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该 Web 网站时,可通过通信方式取回之前发放的 Cookie。

Cookie 由以下字段组成

  • name:名称
  • value:值
  • domain:允许访问此 cookie 的域名
  • path:允许访问此 cookie 的页面路径
  • expires/Max-Age:超时时间,不设置则于 session 一起失效(关闭浏览器)
  • size:cookie 的大小
  • httponly:若为 true,则只有在 http 请求头中会带有此 cookie 的信息,而不能通过 document.cookie 来访问此 cookie(可以一定程度上地防止信息盗取)
  • secure:是否只能通过 https 来传递此条 cookie

示例:username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT

常用方法

HTTP/1.1 提供了 GET、POST、PUT、HEAD、DELETE、OPTIONS、TRACE、CONNECT 八个可使用的方法

  • GET:获取资源。参数直接拼接在 url,对长度有限制,不同浏览器、服务器限制长度各不相同。
  • POST:传输实体主体。参数(实体主体)作为请求的有效载荷数据(补充项)被传输
  • PUT:用来传输文件。自身不带验证机制,因此任何人都可以上传文件,不推荐
  • HEAD:获取报文首部。不返回报文主体部分,多用于确认 URI 的信息
  • DELETE:删除文件。与 PUT 一样不带验证机制,一般不用
  • OPTIONS:查询针对请求 URI 指定的资源所能支持的方法。
  • TRACE:追踪路径。可以查询发送出去的请求是怎样被加工修改/ 篡改的。容易造成 XST(跨站追踪)攻击,通常不使用。
  • CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

网上还有说 post 请求会发出两个数据包,先发 header 再发实体;get 只发一个数据包。
这个说法其实是没错的,发几个包取决于客户端如何实现,目前已知的只有 ruby 会这里处理,大部分都是发一个数据包

注:实体主体指作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成

二、HTTP/2.0

2015 年 5 月,HTTP/2.0 协议正式版发布。相比于 HTTP 1.x ,大幅度的提升了 web 性能。在与 HTTP/1.1 完全语义兼容的基础上,进一步减少了网络延迟。

先借助 Chrome Developer Tools 来看看 HTTP/2.0 与 HTTP/1.1 性能差多少

http/1.1

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享