HTTP全称为HyperText Transfer Protocol,翻译为中文为“超文本传输协议”。HTTP属于TCP的一种应用协议,它主要的作用是把服务器上的文本、图形、音乐、视频等多谋体资源展现给用户,用户通过User agent(如:浏览器)来查看这些信息
1、HTTP/0.9版本
HTTP第一个版本与1991年发布。仅支持html的文本。只有一个GET命令。
2、HTTP/1.0版本
1.0版本支持更多文件格式,支持更多方法:GET\POST\HEAD。
3、HTTP/1.1版本
1997年1月发布了HTTP1.1版本,目前主流的HTTP版本依然是1.1。1.1版本支持了持久连接,一个连接可以发送多个请求,并且支持一个连接同时发送多个请求(服务器端需要按顺序返回结果)。在上一版的基础上又支持了更多的方法:PUT、PATCH、DELETE、OPTIONS。另外,1.1版本在客户端请求头信息增加了Host字段,定义了服务器的域名,从而服务器上支持了虚拟主机,即一台机器多个站点。
4、HTTP/2版本
HTTP的2版本(注意,这里并不是2.0)于2015年发布,目前还未正式大规模使用,但大多数浏览器已经支持。在之前版本里,HTTP header必须是文本(ASCII编码格式),body部分可以是文本也可以是二进制,但在HTTP/2版本,无论是header还是body都是二进制数据。HTTP/2支持了在一个连接里,客户端和服务端同时发送多个请求,这个特性和1.1版本有很大的差异。如下图:
由于支持了在一个连接里同时发送多个请求和多个回应,为了区分它们就需要对数据做标记,每个请求或回应的所有数据包为一个数据流(stream),每个数据流都有一个唯一的ID,客户端发送的请求ID为奇数,服务端返回的为偶数。
HTTP/2支持header压缩,并且支持header信息索引,客户端和服务端有一张相同的索引表,不同的header对应不同的索引号,发送请求时不会再发header,而是索引号,这样大大节省了传输header的时间。
HTTP/2还支持了服务端主动推送功能,如果一个网页中含有大量的静态资源(js、cs、图片等)、之前版本是当该网页传输完成后解析所有html代码后,然后再去传输网页中包涵的资源,而HTTP/2版本可以在网页没有传输完之前就主动把该网页中包含的静态资源推送到客户端,这样省去了客户端再次发请求的过程。
HTTP Method即上面提到的“方法”,指的是客户端向服务端发起请求时的动作,常见方法如下:
HTTP 方法 |
说明 |
GET |
客户端向服务端请求某个资源,并返回实际主体,例如 <br> 请求 html 、图片、 js 等 |
POST |
客户端向服务端提交指定数据,例如,提交表单 |
HEAD |
类似 GET 请求,只不过返回的响应中没有具体的内容,只有头部信息 |
PUT |
类似 POST ,也是向服务端提交数据,不过 PUT 有指定数据存储位置 |
DELETE |
请求服务器删除指定的页面 |
OPTIONS |
获取服务端支持的方法,它还可以查看服务端的性能 |
TRACE |
回显服务器收到的请求,主要用于测试或诊断 |
CONNECT |
把请求连接转换到透明的 TCP/IP 通道 |
客户端发送请求到服务端,然后服务端会回应结果给客户端,回应的数据会包含一个三位数字的状态码,用来标识该请求是否成功,比如是正常还是错误等。HTTP/1.1中状态码可以分为五大类。
HTTP 状态码 |
说明 |
1xx |
信息,服务器收到请求,需要请求者继续执行操作 |
2xx |
成功,操作被成功接收并处理 |
3xx |
重定向,需要进一步的操作以完成请求 |
4xx |
客户端错误,请求包含语法错误或无法完成请求 |
5xx |
服务器错误,服务器在处理请求的过程中发生了错误 |
以下几个为常见的状态码
HTTP 状态码 |
说明 |
200 |
客户端成功接收到了服务端返回的数据,正常 |
206 |
客户端发完请求后,服务端只是返回了部分数据,就会出现该状态码,例如当下载一个很大的文件时,在没有下载完成之前就会出现该状态码 |
301 |
永久移动,请求的资源已被永久的移动到新 URI ,返回信息会包含新的 URI ,浏览器会自动定向到新 URI 。用作域名重定向。 |
302 |
临时移动,与 301 类似, URI 被移动到了一个新的地址,但资源只是临时被移动,无论是 301 还是 302 对于客户端来说,结果是一样的,这两个状态码针对搜索引擎是有差异的,考虑 SEO 的话,要使用 301 |
400 |
客户端请求语法错误,服务端无法理解 |
401 |
服务端如果开启了用户认证,而客户端没有提供正确的验证信息就会返回该状态码 |
403 |
服务端不允许客户端访问 |
404 |
客户端请求的资源不存在 |
413 |
客户端向服务端上传一个比较大的文件时,如果文件大小超过了服务端的限制就会出现该状态码 |
500 |
服务端出现了内部错误 |
502 |
服务器充当代理角色时,后端被代理的服务器不可用或者没有正常回应。如: nginx tomcat 的环境中,如果 tomcat 出现故障, nginx 就会出现该状态码 |
503 |
服务此时不可用,由于超载或系统维护,服务器暂时无法处理客户端的请求。如:当 nginx 限速后,客户端请求超过限制就会收到该状态码 |
504 |
和 502 类似,充当代理角色时,后端的服务器没有按时返回数据,超时了 |
从客户端发往服务端的HTTP报文叫做HTTP Request Message。HTTP请求报文由请求行、请求头部(header)、空行、请求数据几个部分组成,如下图所示:
从服务端回应的HTTP报文叫做HTTP Response Message。HTTP Response也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。示例如下:
HTTP/1.1 200 OK 状态行
Server: nginx/1.12.2 消息报头
Date: Tue, 03 Jul 2018 07:28:58 GMT 消息报头
Content-Type: text/html; charset=UTF-8 消息报头
Connection: keep-alive 消息报头
X-Powered-By: PHP/5.6.10 消息报头
空行
响应正文
URI,全称叫做"Uniform Resource Identifier",中文名字叫做“统一资源标识符”,它用来唯一的标识一个资源。 WEB上可用的每种资源如HTML文档、图像、视频片段、程序等都是用一个URI来定位的,电话号码也可以用URI来标识。
URL,全称叫做"Uniform resource locator",中文名叫做“统一资源定位器”,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源。 URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。 采用URL可以用一种统一的格式来描述各种信息资源。 URL一般由三部组成:
1)协议(或称为服务方式),如 http://,ftp://,rsync://等
2)存有该资源的主机IP地址或主机名(有时也包括端口号)
3)资源的具体地址,如目录和文件名等
URL是URI的一个子集,所有的URL都是URI。
随着HTTP版本的更新换代,它支持了越来越多的文件类型,如图片、音频、视频、Flash等等,那么这么多的文件类型,浏览器是如何区分它们的?
其实,浏览器之所以可以准确无误地识别不同类型的文件,是因为HTTP里面有一个叫做MIME Type的家伙,它规定了所有它能识别的文件。请往上翻到本文HTTP Response那部分内容,里面的示例中有一个字段叫做Content-Type,这个就是和服务器上的MIME Type相关联的。
MIME Type并不是随便定义的,而是由IETF组织协调,最终以RFC的形式作为建议的标准发布到网上的,所有的WEB服务器和浏览器都要遵循这个标准。
浏览器到服务器上访问一个网页时,浏览器接收到的数据除了网页数据之外,还有一个header数据,header即我们平时说的“头部”,在上面内容提到的HTTP Request、HTTP Response、HTTP Method、HTTP状态码、MIME Type等信息都属于header的一部分。我们可以把header划分为Request header和Response header两部分。
1)解析域名
用户要访问一个网站,他需要在浏览器里输入要访问网站的地址,例如http://www.linux.com/index.html 。在互联网里我们是无法直接通过一个域名找到对应服务器的,而是需要把域名解析为一个IP地址,所以在这儿出现了一个服务叫做DNS,它的目的是把域名转换为IP地址。
如果,浏览器第一次请求一个域名,它需要找DNS去把这个域名转换为IP地址。反之,若之前请求过这个域名,则浏览器就会把DNS转换成的IP地址缓存起来,这样它就很快地给出IP地址是什么,省去了让DNS再查询域名对应的IP地址是什么,因为这个查询过程是需要耗费一定时间的。
还有一种情况,若浏览器所在的计算机中定义了hosts记录,即在这个文件里把www.linux.com 指定到了一个IP地址,则浏览器直接读取hosts文件里面的记录,而不再去查找DNS里面的记录。
2)封装HTTP请求数据包
浏览器会把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3)建立TCP连接(TCP的三次握手)
在HTTP 工作开始之前,客户端(浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才 能进行更高层协议的连接,因此,首先要建立TCP连接,连接的端口号是80。
4)客户端发起请求
客户端和服务器建立TCP连接后,客户端发送一个请求给服务器,请求方式的格式即Request header 请求具体数据,其中包含了Method、版本号、URL、MIME type、User-agent、数据等信息。
5)服务器响应客户端返回数据
服务器接到请求后,给予相应的响应信息,包括Response header 响应数据。
6)关闭TCP连接或保持连接
当数据传输完后,服务器会根据预设配置选择关闭连接或者保持长连接。