本文摘自以下文章:
https://www.cnblogs.com/ncy1/p/9466021.html
https://www.cnblogs.com/an-wen/p/11180076.html
http://www.blogjava.net/zjusuyong/articles/304788.html
一、http 基础介绍
- HTTP–Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接
- 基本的工作流程:
- 客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作;
- 服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源;
- 最后通过发送HTTP响应把结果返回给客户端。
- 一个请求的开始到一个响应的结束称为:事务,当一个事物结束后还会在服务端添加一条日志条目
二、URL
- HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
- http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
- 输入:www.guet.edu.cn 浏览器自动转换成:http://www.guet.edu.cn/
- 超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
- 传送协议。
- 层级URL标记符号(为[//],固定不变)
- 访问资源需要的凭证信息(可省略)
- 服务器(通常为域名,有时为IP地址)
- 端口号(以数字方式表示,若为HTTP的默认值“:80”可省略)
- 路径(以“/”字符区别路径中的每一个目录名称)
- 查询(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
- 片段,以“#”字符为起点
- 以** http://www.luffycity.com:80/news/index.html?id=250&page=1** 为例, 其中:
http
:是协议;www.luffycity.com
:是服务器;80
,是服务器上的默认网络端口号,默认不显示;/news/index.html
:是路径(URI:直接定位到对应的资源);?id=250&page=1
:是查询。- 大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。
- 由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。
三、http请求
- HTTP请求由状态行、请求头、请求正文三部分组成:
- 状态行:包括请求方式Method、资源路径URL、协议版本Version;
- 请求头:包括一些访问的域名、用户代理、Cookie等信息;
- 请求正文:就是HTTP请求的数据。
- **请求方式 Method **一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除
- GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP请求数据中,请求正文部分可以省略,直接将想要获取的资源添加到URL中
- GET请求,没有请求正文
- POST请求的格式,有状态行、请求头、请求正文三部分
四、http响应
响应数据格式
- 服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。
- HTTP响应由三部分组成:状态码,不同的状态码代表不同的含义
常见的状态码含义
200—OK/请求已经正常处理完毕
301—/请求永久重定向
302—/请求临时重定向
304—/请求被重定向到客户端本地缓存
400—/客户端请求存在语法错误
401—/客户端请求没有经过授权
403—/客户端的请求被服务器拒绝,一般为客户端没有访问权限
404—/客户端请求的URL在服务端不存在
500—/服务端永久错误
503—/服务端发生临时错误HTTP响应模型
- 服务器收到HTTP请求之后,会有多种方法响应这个请求,下面是HTTP响应的三种模型
- **单进程I/O模型:**服务端开启一个进程,一个进程仅能处理一个请求,并且对请求顺序处理;
- **多进程I/O模型:**服务端并行开启多个进程,同样的一个进程只能处理一个请求,这样服务端就可以同时处理多个请求;
- **复用I/O模型:**服务端开启一个进程,但是呢,同时开启多个线程,一个线程响应一个请求,同样可以达到同时处理多个请求,线程间进程数M*每个进程的线程数N个请求。
五、http报文格式
- HTTP报文分为HTTP请求报文和HTTP响应报文;
- 无论哪种报文,他的整体格式是类似的,大致都是由起始、首部、主体三部分组成;
- 起始说明报文的动作,首部说明报文的属性,主体则是报文的数据;
- HTTP请求报文
请求报文的起始由请求行(状态行)构成,用来说明该请求想要做什么,由、、 三个字段组成,注意每个字段之间都有一个空格
其中字段有不同的值:
GET — 访问服务器的资源
POST — 向服务器发送要修改的数据
HEAD — 获取服务器文档的首部
PUT — 向服务器上传资源
DELETE— 删除服务器的资源字段表示服务器的资源目录定位
字段表示使用的http协议版本
首部行由多个请求头构成,那些首部字段名有如下,不全:
Accept 指定客户端能够接收的内容格式类型
Accept-Language 指定客户端能够接受的语言类型
Accept-Ecoding 指定客户端能够接受的编码类型
User-Agent 用户代理,向服务器说明自己的操作系统、浏览器等信息
Connection 是否开启持久连接(keepalive)
Host 服务器域名
…主体部分就是报文的具体数据
- HTTP响应报文
响应报文的起始由状态行构成,用来说明服务器做了什么,由、、三个字段组成,同样的每个字段之间留有空格;
- 状态码见第三章内容
首部行由多个响应头构成,首部字段名如下,不全:
Server 服务器软件名,Apache/Nginx
Date 服务器发出响应报文的时间
Last-Modified 请求资源的最后的修改时间
…主体部分是响应报文的具体数据
六、网站访问量
- IP IP访问量
相同的公网IP计算一次,就是同一个局域网内的所有用户访问一个网站,但是他们都是借助一个公网IP去访问那个网站的(NAT),因此这也只能算作一个IP访问量。换一次公网IP则会加1。
- PV 网页访问量
用户访问的页面数就是PV访问量,同一个局域网的不同用户,而且就算是同一个用户,只要刷新一次网站页面,PV访问量就加1,三个访问量的值往往数PV的值最大。
- UV 访客访问量
这里的访客不是用户,而是电脑,一台电脑算一个访客,即使是同一台电脑的不同用户,访问同一个网站UV也只能加1,只有更换电脑才会使UV加1,因为服务端会记录客户端电脑的信息。