阅读 140

http协议基本知识

参考链接:

juejin.cn/post/684490…

1:http协议特点

  • 无状态:请求之间无任何关系,无事务记忆能力,通过Cookie和Session来解决
  • 多次HTTP请求:在客户端请求网页时多数情况下并不是一次请求就能成功的,服务端首先是响应HTML页面,然后浏览器收到响应之后发现HTML页面还引用了其他的资源,例如,CSS,JS文件,图片等等,还会自动发送HTTP请求这些需要的资源。
  • 基于TCP协议:现在使用的版本当中是默认持久连接的(connection:keep-alive),也就是多次HTTP请求使用一个TCP连接。减少TCP链接多次开启或断开的性能消耗

2:http报文

2.1 请求报文

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

在这里插入图片描述

示例:

HTTP/1.1 200 OK
Date: Tue, 12 Jul 2016 21:36:12 GMT
Content-Length: 563
Content-Type: text/html

<html>
    <body>
    Hello http!
    </body>
</html>

复制代码
  • 请求行:指定的是请求方法、请求URL、协议版本
  • 请求头:以键值对形式存在的字段,展示该请求的一些规则参数
  • 空行
  • 请求体:该请求所传递的数据

2.2 响应报文

与请求报文同理,HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

在这里插入图片描述 响应正文就是你所需要拿到的数据

3. 请求方法

  • GET:get方法一般用于获取服务器资源
  • POST:post方法一般用于传输实体主体
  • PUT:put方法一般用于传输文件
  • DELETE:delete方法用于删除文件
  • HEAD:head方法用于获取报文首部,不返回报文主体
  • OPTIONS:options方法用于询问请求URI资源支持的方法

其中最常用的是GET和POST方法,它们的区别主要有:

  • GET提交请求的数据实体会放在URL的后面,用?来分割,参数用&连接,举个栗子:/index.html?name=wang&login=1;而POST的参数主要是放在request body中
  • GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。
  • GET提交的数据不安全,因为参数都会暴露在URL上。
  • GET 会被缓存,而post不会
  • 保留浏览器历史记录:GET可以,而POST不能

4. HTTP首部

HTTP首部字段是构成HTTP报文最重要的元素之一。在客户端与服务端之前进行信息传递的时候请求和响应都会使用首部字段,会传递一些重要的元信息。首部字段是以键值对的形式存在的。包含报文的主体大小、语言、认证信息等。HTTP首部字段包含4种类型:

  通用首部字段(General Header Fields)

  代表请求报文和响应报文都会使用的字段

在这里插入图片描述

  请求首部字段(Request Header Fields)

  是客户端向服务端发送请求时使用的首部字段。包含请求的附加内容、客户端信息、响应内容相关优先级等信息。 在这里插入图片描述

  响应首部字段(Response Header Fields)

  是服务端向客户端返回响应时使用的首部字段,包含响应的附加内容,可能也会要求客户端附加额外的内容信息。

在这里插入图片描述

  实体首部字段(Entity Header Fields)

  是针对请求报文和响应报文的实体部分使用的首部。包含资源内容更新时间等和实体有关的信息。 在这里插入图片描述 关于content-type的常见类型:

  • application/x-www-form-urlencoded

    最常见的 POST 提交数据的方式,原生Form表单,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。数据被编码成以 '&' 分隔的键-值对, 同时以 '=' 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替). 在这里插入图片描述

  • multipart/form-data

    一般用于涉及文件的表单提交,

  • application/json

    用来告诉服务端消息主体是序列化后的 JSON 字符串,其中一个好处就是JSON 格式支持比键值对复杂得多的结构化数据。

    随着json这种轻量级的数据交互格式的流行,特别是和脚本交互的便利,使得在前后接口中,越来越多采用json格式。

5. 响应状态码

2XX 成功

200 OK,表示从客户端发来的请求在服务器端被正确处理 204 No content,表示请求成功,但响应报文不含实体的主体部分 206 Partial Content,进行范围请求

3XX 重定向

301 moved permanently,永久性重定向,表示资源已被分配了新的 URL

302 found,临时性重定向,表示资源临时被分配了新的 URL

303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源

304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况

307 temporary redirect,临时重定向,和302含义相同

4XX 客户端错误

400 bad request,请求报文存在语法错误

401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息

403 forbidden,表示对请求资源的访问被服务器拒绝

404 not found,表示在服务器上没有找到请求的资源

405 Method Not Allowed, 客户端请求中的方法被禁止

5XX 服务器错误

500 internal sever error,表示服务器端在执行请求时发生了错误

503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求

504:Getaway Timeout ,网关超时,是代理服务器等待应用服务器响应时的超时

6. HTTPS:

HTTPS和HTTP的区别主要如下:

  • HTTPS协议需要到CA(证书颁发机构)申请证书,一般免费证书很少,需要交费。

  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。

  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  • http的连接很简单,是无状态的;HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,可以有效的防止运营商劫持,解决了防劫持的一个大问题,比http协议安全。

既然HTTPS这么安全可靠为什么不一直用HTTPS?

  • 加密通信会消耗更多的CPU和内存资源
  • 购买证书需要一定的开销成本

7. HTTP2.0

HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提升了 web 性能

1.多路复用

多路复用允许通过单一的HTTP2.0连接同时发起多重的请求-响应消息,而在HTTP1.0中,浏览器客户端在同一时间,针对同一域名的请求有一定数量的限制,超出限制数目的请求会被阻塞HTTP2.0 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。

2.二进制分帧

HTTP2.0在应用层(HTTP2.0)和传输层(TCP/UDP)之间增加一个二进制分帧层,在二进制分帧层中,HTTP2.0会将所有的信息分割为更小的消息和帧,并采用二进制格式编码 HTTP2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。 在过去, HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于HTTP 的性能提升。

3.首部压缩

HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。

4.服务端推送

服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。服务端推送让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;如果一个请求是由你的主页发起的,服务器很可能会响应主页内容、logo 以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送还有一个很大的优势:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。

8. 输入网址访问后发生了什么

  1. DNS域名解析;
  2. 建立TCP连接;
  3. 发送HTTP请求;
  4. 服务器处理请求;
  5. 返回响应结果;
  6. 关闭TCP连接;
  7. 浏览器解析HTML;
  8. 浏览器布局渲染;
文章分类
前端
文章标签