HTTP
HTTP介绍
- HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等
- HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
- 浏览器请求流程:
- 域名解析 -->
- 发起TCP的3次握手 -->
- 建立TCP连接后发起http请求 -->
- 服务器响应http请求,浏览器得到html代码 -->
- 浏览器解析html代码,并请求html代码中的资源(如js、css等) -->
- 浏览器对页面进行渲染呈现给用户
- 为什么HTTP协议要基于TCP来实现?
- TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。
- 建立TCP连接后发起http请求
HTTP版本
- HTTP/0.9
- 1991年发布,只有GET请求
- 服务器只能回应HTML格式的字符串,不能回应别的格式。
- 服务器发送完毕,就关闭TCP连接。
- HTTP/1.0
- 1996年5月发布,任何格式的内容都可以发送。
- 引入了POST命令和HEAD命令
- 增加请求头(HTTP header)
- 还新增包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
- HTTP/1.1
- 1997年1月发布
- 主要是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
- 目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。
- 引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。
- PUT、PATCH、HEAD、 OPTIONS、DELETE。
- SPDY 协议
- 2009年,谷歌公开了自行研发的 SPDY 协议
- HTTP/2 继承了它很多特性。
- HTTP/2
- 2015年,HTTP/2 发布。它不叫 HTTP/2.0,是因为标准委员会不打算再发布子版本了,下一个新版本将是 HTTP/3。
- 头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
- 在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。
- 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。
- 客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。
- 头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,
- 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。
URL
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
-
scheme:指定低层使用的协议,一般是http,如果强调安全的话可以是https
-
host:HTTP服务器的IP地址或者域名
-
port:HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明
-
path:访问资源的路径
-
url-params:URL的参数,例如:id=8079
-
query-string:发送给http服务器的数据
-
anchor:锚
客户端请求消息
-
请求行:请求方法空格URL空格协议版本换行
-
请求头
-
空行
-
请求数据
服务器响应消息
-
状态行:协议版本空格状态码空格状态描述信息换行
-
消息报头
-
空行
-
响应正文
HTTP常见的请求头
-
If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
-
If-None-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能。
-
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样。Pargma只有一个用法, 例如: Pragma: no-cache。注意: 在HTTP/1.0版本中 没有实现Cache-Control
-
Cache-Control:指定请求和响应遵循的缓存机制。
-
Accept:浏览器端可以接受的MIME类型。例如 Accept: / 代表浏览器可以处理所有类型
-
Accept-Encoding:浏览器申明自己可接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
-
Accept-Language:浏览器申明自己接收的语言。
-
Accept-Charset:浏览器可接受的字符集。
-
User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
-
Content-Type:用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
-
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
-
Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。HTTP 1.1默认进行持久连接。
-
Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。
-
Host:(发送请求时,该头域是必需的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
-
Cookie:将cookie的值发送给HTTP服务器。
-
Content-Length:表示请求消息正文的长度。
-
Authorization:授权信息
-
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
HTTP常见的响应头
- Allow:服务器支持哪些请求方法(如GET、POST等)
- Date:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。
- Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它,重新从服务器获取,会更新缓存。过期之前使用本地缓存。HTTP1.1的客户端和缓存会将非法的日期格式(包括0)看作已经过期。
- eg:为了让浏览器不要缓存页面,我们也可以将Expires实体报头域,设置为0。
- 例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
- P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
- Set-Cookie:用于把cookie发送到客户端浏览器。
- ETag:和If-None-Match 配合使用。
- Last-Modified:用于指示资源的最后修改日期和时间。Last-Modified也可用setDateHeader方法来设置。
- Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。
- Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。
- Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
- Content-Language:WEB服务器告诉浏览器自己响应的对象所用的自然语言。
- Server:指明HTTP服务器用来处理请求的软件信息。
- X-Powered-By:表示网站是用什么技术开发的。例如: X-Powered-By: ASP.NET
- Connection:keep-alive/close
- Location:用于重定向一个新的位置,包含新的URL地址。
- Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。不属于HTTP 1.1正式规范,Netscape和IE支持
- WWW-Authenticate:该响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
HTTPS传输协议原理
- HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
- HTTP下加入SSL层,HTTPS的安全基础是SSL
- HTTP|TCP|IP
- HTTPS|SSL or TLS|TCP|IP
- SSL(Secure Socket Layer,安全套接字层)
- TLS(Transport Layer Security,传输层安全)
- 优点:
- HTTP + 加密 + 认证 + 完整性保护 = HTTPS
- 客户端产生的密钥只有客户端和服务器端能得到;
- 加密的数据只有客户端和服务器端才能得到明文;
- 客户端到服务端的通信是安全的。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。