HTTP协议与HTTPS协议

/ 前端 / 没有评论 / 470浏览

浏览器请求和返回数据主要是基于HTTP协议。而HTTP协议是基于TCP协议出现的。 TCP 协议是一条双向的通迅通道,http 协议在TCP协议的基础上,规定了 request-response 的模式。这个模式决定了通迅必定是由浏览器端首先发起的。

HTTP 协议是纯粹的文本协议,它是规定了使用 TCP 协议来传输文本格式的一个应用层协议。

一次完整的 HTTP 请求主要包含了,请求部分和响应部分,是在 TCP 通道传输的,完全是文本。

在请求部分,第一行被称作request line,包含三个部分,HTTP Method (也就是请求的“方法)、请求的路径、协议的版本。 在响应的部分,第一行被称作response line ,也分为三个部分,协议和版本、状态码和状态文本。

在request line或者response line之后,是请求头/响应头,这些头由若干行组成。每行是用冒号分割的名称和值。 在头之后,以一个空行(两个换行符)为分割,是请求体/响应体,请求体可能包含文件或者表单数据,响应体则是HTML代码。

alt

HTTP Method (方法)

  1. GET
  2. POST
  3. HEAD
  4. PUT
  5. DELETE
  6. CONNECT
  7. OPTIONS
  8. TRACE

浏览器通过地址栏访问页面都是GET方法,提交表单产生 POST 方法。 HEAD 则是跟 GET 类似,只返回响应头,多数由 Javascript 发起。 PUT 和 DELETE 分别表示添加资源和删除资源,但这只是语义上的约束并没有强制的约束。 CONNECT 现在多用于 HTTPS 和 WebSocket。 OPTIONS 和 TRACE一般用于调试,多数线上服务都不支持。

HTTP status code (状态码)和status text (状态文本)

常见的状态码有以下几种:

1xx: 临时回应,表示客户端请继续。 2xx:请求成功。 3xx: 表示请求目标有变化,希望客户端进一步处理。

4xx:客户端请求错误。

5xx:服务器端错误

HTTP head (HTTP头)

常见的request header

Request Header规定
Accept浏览器端接受的格式。
Accept-Encoding浏览器端接收的编码方式。
Accept-Language浏览器端接受的语言,用于服务端判断多语言。
Cache-Control控制缓存的时效性。
Connection连接方式,如果是keep-alive,且服务端支持,则会复用连接。
HostHTTP 访问使用的域名。
If-Modified-Since上次访问时的更改时间,如果服务端认为此时间后自己没有更新,则会给出304响应。
If-None-Match上次访问时使用的E-Tag,通常是页面的信息摘要,这个比更改时间更准确一些。
User-Agent客户端标识,多数浏览器的这个字端都十分复杂,区别十分微妙。
Cookie客户端存储的cookie字符串。

常见的 response header

ResponseHeader 规定
Cache-Control缓存控制,用于通知各级缓存保存的时间,例如max-age=0,表示不要缓存。
Connection连接类型,Keep-Alive表示复用连接。
Connection-Encoding内容编码方式,通常是gzip。
Content-Length内容的长度,有利于浏览器判断内容是否已经结束。
Content-Type内容类型,所有请求网页的都是text/html。
Date当前服务器日期。
ETag页面的信息摘要,用于判断是否需要重新到服务器取回页面。
Expires过期时间,用于判断下次请求是否需要到服务端取回页面。
Keep-Alive保持连接不断时需要的一些信息,如timeout=5,max=100.
Last-Modified页面上次修改时间。
Server服务端软件的类型。
Set-Cookie设置cookie,可以存在多个。
Via服务端的请求链路,对一些调试场景至关重要的一个头。

HTTP request body

请求的body主要用于提交表单的场景。实际上HTTP请求的body是比较自由的,只要浏览器端发送的body服务端认可就可以了。一些常见的body格式是:

application/json application/x- www-form -urlencoded multiparty / form-data text/xml

HTTPS

在HTTP的基础上,HTTPS和HTTP2规定了更复杂的内容。 https有两个作用,一是确定请求的目标服务端身份,二是保证传输的数据不会被网络中间节点窃听或者篡改。 https的标准也是由RFC规定的,它使用加密通道来传输HTTP的内容。HTTPS首先与服务端建立一条TLS加密通道。TLS构建于TCP协议之上,它实际上是对传输内容做一次加密,所以从传输内容上看,HTTPS跟HTTP没有位何区别。

HTTP2

HTTP2是HTTP1.1的升级版本。最大的改进有两点:一是支持服务端推送,二是支持TCP连接复用。

服务器端推送能够在客户端发送第一个请求时,提前把一部分内容推送合客户端,放入缓存中,这可以避免请求顺序带来的并行度不高,从而导致的性能问题。

TCP连接复用,则使用同一个TCP连接来传输多个HTTP请求,避免了TCP连接建立时的三次握手开销,和初建TCP连接时传输窗口小的问题。

更多的优化涉及更下层的协议。ip层的分包情况,和物理层的建连时间是需要被考虑的。