HTTP--Hyper Text Transfer Protocol,超文本传输协议,是一种创建在TCP上的无状态链接,整个基本的工做流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动做,服务端收到请求以后,服务端开始处理请求,并根据请求作出相应的动做访问服务器资源,最后经过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目。html
目录浏览器
HTTP请求缓存
HTTP响应服务器
HTTP报文格式多线程
HTTP协议版本更替并发
网站访问量ide
1、HTTP请求网站
HTTP请求是客户端往服务端发送请求动做,告知服务器本身的要求。
编码
HTTP请求由状态行、请求头、请求正文三部分组成:
spa
状态行:包括请求方式Method、资源路径URL、协议版本Version;
请求头:包括一些访问的域名、用户代理、Cookie等信息;
请求正文:就是HTTP请求的数据。
备注:请求方式Method通常有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除,其中GET方式仅仅为获取服务器资源,方式较为简单,所以在请求方式为GET的HTTP请求数据中,请求正文部分能够省略,直接将想要获取的资源添加到URL中。下图所示就是GET的请求,没有请求正文。详细的说明在下边。
如今大多数协议版本为http/1.1
下图所示为POST请求的格式,有状态行、请求头、请求正文三部分。
2、HTTP响应
2.1 响应数据格式
服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动做要求,服务端作出具体的动做,将结果回应给客户端,称为HTTP响应。
HTTP响应由三部分组成:状态行、响应头、响应正文;
状态行:包括协议版本Version、状态码Status Code、回应短语;
响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;
响应正文:就是响应的具体数据。
备注:咱们主要关心而且可以在客户端浏览器看获得的是三位数的状态码,不一样的状态码表明不一样的含义,其中
1xx | 表示HTTP请求已经接受,继续处理请求 |
2xx | 表示HTTP请求已经处理完成 |
3xx | 表示把请求访问的URL重定向到其余目录 |
4xx | 表示客户端出现错误 |
5xx | 表示服务端出现错误 |
具体HTTP响应实例以下图:
2.2 常见状态码的含义
200---OK/请求已经正常处理完毕
301---/请求永久重定向
302---/请求临时重定向
304---/请求被重定向到客户端本地缓存
400---/客户端请求存在语法错误
401---/客户端请求没有通过受权
403---/客户端的请求被服务器拒绝,通常为客户端没有访问权限
404---/客户端请求的URL在服务端不存在
500---/服务端永久错误
503---/服务端发生临时错误
2.3 HTTP响应模型
服务器收到HTTP请求以后,会有多种方法响应这个请求,下面是HTTP响应的四种模型:
单进程I/O模型
服务端开启一个进程,一个进程仅能处理一个请求,而且对请求顺序处理;
多进程I/O模型
服务端并行开启多个进程,一样的一个进程只能处理一个请求,这样服务端就能够同时处理多个请求;
复用I/O模型
服务端开启一个进程,可是呢,同时开启多个线程,一个线程响应一个请求,一样能够达到同时处理多个请求,线程间并发执行;
复用多线程I/O模型
服务端并行开启多个进程,同时每一个进程开启多个线程,这样服务端能够同时处理进程数M*每一个进程的线程数N个请求。
3、HTTP报文格式
HTTP报文是HTTP应用程序之间传输的数据块,HTTP报文分为HTTP请求报文和HTTP响应报文,可是不管哪一种报文,他的总体格式是相似的,大体都是由起始、首部、主体三部分组成,起始说明报文的动做,首部说明报文的属性,主体则是报文的数据。接下来具体说明。
3.1 HTTP请求报文
请求报文的起始由请求行构成(有些资料称为状态行,名字不同而已,都是指的一个东西),用来讲明该请求想要作什么,由<Method>、<URL>、<Version> 三个字段组成,注意每一个字段之间都有一个空格。
其中<Method>字段有不一样的值:
GET --- 访问服务器的资源
POST --- 向服务器发送要修改的数据
HEAD --- 获取服务器文档的首部
PUT --- 向服务器上传资源
DELETE--- 删除服务器的资源
<URL>字段表示服务器的资源目录定位
<Version>字段表示使用的http协议版本
首部部分由多个请求头(也叫首部行)构成,那些首部字段名有以下,不全:
Accept 指定客户端可以接收的内容格式类型
Accept-Language 指定客户端可以接受的语言类型
Accept-Ecoding 指定客户端可以接受的编码类型
User-Agent 用户代理,向服务器说明本身的操做系统、浏览器等信息
Connection 是否开启持久链接(keepalive)
Host 服务器域名
...
主体部分就是报文的具体数据。
3.2 HTTP响应报文
响应报文的起始由状态行构成,用来讲明服务器作了什么,由<Version>、<Status-Code>、<Phrase>三个字段组成,一样的每一个字段之间留有空格;
<Status-Code> 上边已经说明;
首部由多个响应头(也叫首部行)组成, 首部字段名以下,不全:
Server 服务器软件名,Apache/Nginx
Date 服务器发出响应报文的时间
Last-Modified 请求资源的最后的修改时间
...
主体部分是响应报文的具体数据。
小tips:关于更多请求头和响应头(即首部字段名)的说明请参考http://tools.jb51.net/table/http_header
4、HTTP协议版本更替
HTTP/0.9
HTTP协议的最第一版本,功能简陋,仅支持请求方式GET,而且仅能请求访问HTML格式的资源。
HTTP/1.0
在0.9版本上作了进步,增长了请求方式POST和HEAD;再也不局限于0.9版本的HTML格式,根据Content-Type能够支持多种数据格式,即MIME多用途互联网邮件扩展,例如text/html、image/jpeg等;同时也开始支持cache,就是当客户端在规定时间内访问统一网站,直接访问cache便可。
可是1.0版本的工做方式是每次TCP链接只能发送一个请求,当服务器响应后就会关闭此次链接,下一个请求须要再次创建TCP链接,就是不支持keepalive。
HTTP/1.1
解决了1.0版本的keepalive问题,1.1版本加入了持久链接,一个TCP链接能够容许多个HTTP请求; 加入了管道机制,一个TCP链接同时容许多个请求同时发送,增长了并发性;新增了请求方式PUT、PATCH、DELETE等。
可是还存在一些问题,服务端是按队列顺序处理请求的,假如一个请求处理时间很长,则会致使后边的请求没法处理,这样就形成了队头阻塞的问题;同时HTTP是无状态的链接,所以每次请求都须要添加剧复的字段,下降了带宽的利用率。
HTTP/2.0
为了解决1.1版本利用率不高的问题,提出了HTTP/2.0版本。增长双工模式,即不只客户端可以同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题;HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并无真正的数据,所以在2.0版本中将全部的信息字段创建一张表,为表中的每一个字段创建索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了1.0旧版本的重复繁琐的字段,并以压缩的方式传输,提升利用率。
另外也增长服务器推送的功能,即不经请求服务端主动向客户端发送数据。
当前主流的协议版本仍是HTTP/1.1版本。
5、网站访问量
IP IP访问量
相同的公网IP计算一次,就是同一个局域网内的全部用户访问一个网站,可是他们都是借助一个公网IP去访问那个网站的(NAT),所以这也只能算做一个IP访问量。换一次公网IP则会加1。
PV 网页访问量
用户访问的页面数就是PV访问量,同一个局域网的不一样用户,并且就算是同一个用户,只要刷新一次网站页面,PV访问量就加1,三个访问量的值每每数PV的值最大。
UV 访客访问量
这里的访客不是用户,而是电脑,一台电脑算一个访客,即便是同一台电脑的不一样用户,访问同一个网站UV也只能加1,只有更换电脑才会使UV加1,由于服务端会记录客户端电脑的信息。