HTTP--Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目。
- 无状态的含义:是指协议对于事务的处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
一,HTTP请求:
- HTTP请求报文:
- 请求行:请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
- GET:当客户端要从服务器中读取某个资源时,使用GET 方法。GET 方法要求服务器将URL 定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用GET 方法时,请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表URL 的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
- POST:当客户端给服务器提供信息较多时可以使用POST 方法,POST 方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。GET 一般用于获取/查询资源信息,POST 会附带用户数据,一般用于更新资源信息。POST 方法将请求参数封装在HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据;
- 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
- User-Agent:产生请求的浏览器类型;
- Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;
- Accept-Language:客户端可接受的自然语言;
- Accept-Encoding:客户端可接受的编码压缩格式;
- Accept-Charset:可接受的应答的字符集;
- Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
- connection:连接方式(close 或 keepalive);
- Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
- 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;
- HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。
- HTTP请求由状态行、请求头、请求正文三部分组成:
- 状态行:包括请求方式Method、资源路径URL、协议版本Version;
- 请求头:包括一些访问的域名、用户代理、Cookie等信息;
- 请求正文:就是HTTP请求的数据。
- 备注:请求方式Method一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除,其中GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP请求数据中,请求正文部分可以省略,直接将想要获取的资源添加到URL中。下图所示就是GET的请求,没有请求正文。详细的说明在下边
二:HTTP响应:
- HTTP响应报文:
- 服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。
- HTTP响应由三部分组成:状态行、响应头、响应正文;
- 状态行:包括协议版本Version、状态码Status Code、回应短语;
- 响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;
- 响应正文:就是响应的具体数据。
- 状态码:
- 1xx 表示HTTP请求已经接受,继续处理请求
- 2xx 表示HTTP请求已经处理完成
- 3xx 表示把请求访问的URL重定向到其他目录
- 4xx 表示客户端出现错误
- 5xx 表示服务端出现错误
- 常见状态码的含义:
- 200---OK/请求已经正常处理完毕
- 301---/请求永久重定向
- 302---/请求临时重定向
- 304---/请求被重定向到客户端本地缓存
- 400---/客户端请求存在语法错误
- 401---/客户端请求没有经过授权
- 403---/客户端的请求被服务器拒绝,一般为客户端没有访问权限
- 404---/客户端请求的URL在服务端不存在
- 500---/服务端永久错误
- 503---/服务端发生临时错误
- HTTP响应模型
- 服务器收到HTTP请求之后,会有多种方法响应这个请求,下面是HTTP响应的四种模型:
- 单进程I/O模型
- 服务端开启一个进程,一个进程仅能处理一个请求,并且对请求顺序处理;
- 多进程I/O模型
- 服务端并行开启多个进程,同样的一个进程只能处理一个请求,这样服务端就可以同时处理多个请求;
- 复用I/O模型
- 服务端开启一个进程,但是呢,同时开启多个线程,一个线程响应一个请求,同样可以达到同时处理多个请求,线程间并发执行;
- 复用多线程I/O模型
- 服务端并行开启多个进程,同时每个进程开启多个线程,这样服务端可以同时处理进程数M*每个进程的线程数N个请求。
三,HTTP工作原理
- HTTP 协议采用请求/响应模型。客户端向服务器发送一个请求报文,服务器以一个状态作为响应
- 以下是 HTTP 请求/响应的步骤:
- 客户端连接到web服务器:HTTP 客户端与web服务器建立一个 TCP 连接;
- 客户端向服务器发起 HTTP 请求:通过已建立的TCP 连接,客户端向服务器发送一个请求报文;
- 服务器接收 HTTP 请求并返回 HTTP 响应:服务器解析请求,定位请求资源,服务器将资源副本写到 TCP 连接,由客户端读取;
- 释放 TCP 连接:若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
- 客户端浏览器解析HTML内容:客户端将服务器响应的 html 文本解析并显示;
- 例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
- 3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 5、释放 TCP 连接;
- 6、浏览器将该 html 解析为文本并显示内容;
- 四,HTTP的工作特性:
- 1,HTTP 无状态性:
- HTTP 协议是无状态的(stateless)。也就是说,同一个客户端第二次访问同一个服务器上的页面时,服务器无法知道这个客户端曾经访问过,服务器也无法分辨不同的客户端。HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP 请求。(即为对请求没有标记,没有存储请求的过程)
- 2,HTTP 持久连接
- HTTP1.0 使用的是非持久连接,主要缺点是客户端必须为每一个待请求的对象建立并维护一个新的连接,即每请求一个文档就要有两倍RTT 的开销。因为同一个页面可能存在多个对象,所以非持久连接可能使一个页面的下载变得十分缓慢,而且这种短连接增加了网络传输的负担。HTTP1.1 使用持久连接keepalive,所谓持久连接,就是服务器在发送响应后仍然在一段时间内保持这条连接,允许在同一个连接中存在多次数据请求和响应,即在持久连接情况下,服务器在发送完响应后并不关闭TCP 连接,而客户端可以通过这个连接继续请求其他对象。
- HTTP/1.1 协议的持久连接有两种方式:
- 非流水线方式:客户在收到前一个响应后才能发出下一个请求;
- 流水线方式:客户在收到 HTTP 的响应报文之前就能接着发送新的请求报文;
- 1,HTTP 无状态性:
- 五,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版本。
- HTTP/0.9
- 六,网站访问量
- IP访问量
- 相同的公网IP计算一次,就是同一个局域网内的所有用户访问一个网站,但是他们都是借助一个公网IP去访问那个网站的(NAT),因此这也只能算作一个IP访问量。换一次公网IP则会加1。
- PV 网页访问量
- 用户访问的页面数就是PV访问量,同一个局域网的不同用户,而且就算是同一个用户,只要刷新一次网站页面,PV访问量就加1,三个访问量的值往往数PV的值最大。
- UV 访客访问量
- 这里的访客不是用户,而是电脑,一台电脑算一个访客,即使是同一台电脑的不同用户,访问同一个网站UV也只能加1,只有更换电脑才会使UV加1,因为服务端会记录客户端电脑的信息。
- IP访问量