一、HTTP基础知识
1、HTTP概念
HTTP:HyperText Transfer Protocol,超文本传输协议,既然是协议就是对某种东西的规范,规范了客户端和服务器数据传输的标准,定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从网络模型的层次角度看,HTTP是应用层协议,也是web服务最基础用的最广泛的协议。但是http是不加密的,所以才会出现加密的协议——https协议。
HTML:HyperText Mark Language,超文本标记语言,开发人员通过HTML语言,写出HTML文档,然后展示出来。
2、HTTP的工作原理
HTTP协议的工作工程大致如下图所示:
1、浏览器会将访问的域名地址发送给DNS服务器,由DNS服务器解析成IP地址。
2、浏览器根据服务器IP地址,和服务器三次握手建立TCP连接。
3、浏览器发送请求报文给服务器。
4、服务器接受请求,并处理请求,处理完成后,构建响应报文,回复给浏览器。
5、如果数据传送完成,则四次断开TCP连接。
流程说明:
1、如果用IP地址直接访问,就无需DNS解析了,因为DNS的功能就是把域名解析成IP地址的。
2、从上图可以看出,HTTP应用层协议是在TCP协议基础上进行的,只有先建立了TCP连接,才有HTTP通信,符合网络5层通信模型。
3、web资源、连接数、请求数基本概念
web资源:我们在浏览器访问一个页面的时候,要知道,一个html页面,是由很多web资源组成的,比如一个图片算一个web资源,一段文字算一个web资源,所以一个完整的html页面是由很多web资源组成的。
连接数:指的是客户端和服务器建立的连接数量,这里的连接一般是TCP连接。
请求数:我们访问一个HTML页面的时候,一个web资源需要发送一次请求给服务端,所以一个HTML页面,有多少个Web资源就有需要多少个请求数。
所以一般我们访问HTML页面的时候,流程应该是这样的:
1、首先,客户端和服务器建立一个或多个连接,这里的连接一般是TCP连接。
2、然后在这些连接当中,客户端向服务端发送请求,有多少个web资源就需要发送多少个请求。
3、服务端响应请求,然后客户端将这些响应资源,进行整合,最终形成我们的HTML页面。
从上面可以看出,连接数和请求数没有直接的关系,请求数取决于你的HTML页面有多少个web资源。
4、HTTP的特点
C/S架构:
client:客户端,一般就是各种浏览器
server:服务器端,主流的Web服务器有httpd(Apache),nginx,IIS,tomcat
无连接:正常情况,一般客户端和服务器建立了一个TCP连接,只处理一个请求,请求处理完就会断开连接,多个请求需要建立多个连接,但是很明显,这非常消耗不要的网络资源,所以现在一般web服务器都有个特性,保持长连接,在一个连接内,就可以处理多个请求。
无状态:服务端不会记录你客户端的信息,意思就是说,你第一次访问服务端,处理了请求后,断开连接,当再次建立连接的时候,服务端是不知道你之前请求过什么数据的,对服务端而言,每个客户端的每次连接,都是新的连接。
5、HTTP标识资源的方法:
URL完整格式:scheme://[username:password@]HOST:port/path/to/source
二、请求报文和响应报文
请求报文和响应报文都是由这三部分组成:
-
起始行(start line)
-
首部(header) :首部有多个,最常用的有通用首部、请求/响应首部、实体首部
-
主体(body)
1. 请求报文格式
常见的HTTP请求方法:
GET:完整请求一个资源
HEAD:仅请求响应首部(不需要主体内容)
POST:提交表单及附件
PUT:上传资源的方法
DELETE:删除资源的方法
2. 响应报文格式
2xx: 成功状态码
200:OK
3xx: 重定向状态码
301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐式重定向;
302: 临时重定向,显式重定向, Location响应首部的值为新的URL
4xx: 客户端错误状态码
404: Not Found
5xx: 服务器端错误状态码
502: Bad Gateway(任何一个代理找不到其上游的代理了)
说明:关于404和502的错误代码,具体情况得具体分析,404不一定就是客户端错误,502不一定就是服务器错误
3. HTTP报文的首部
通用首部:请求和响应均可使用
Connection:允许客户端和服务器指定与请求/响应连接有关的选项
Date:提供日期和时间标志,说明报文是什么时间创建的
MIME-Version: 给出了发送端使用的MIME版本
Trailer:如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文trailer部分的首部集合。
Transfer-Encoding :告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。
Update:给出了发送端可能想要"升级"使用的新版本或协议
Via:显示了报文经过的中间节点(代理、网关)
请求首部:
Host: 所请求的主机,apache基于主机名做虚拟机的场景下,就是用这个字段进行识别的。
Referer: 提供了包含当前请求URI文档的URL
Accept: 接受的MIME类型
Accept-Charset:浏览器接受的字符集
Accept-Encoding:浏览器支持的编码类型
Accept-Lanague: 告诉服务器能够发送哪些语言
条件请求首部:用于控制缓存
If-Modified-Since:除非在某个指定的日期之后资源被修改过,否则就限制这个请求
If-None-Match:和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
安全请求首部:
Authorization: 客户端提供给服务器的认证信息;
Cookie:客户端用它向服务器传送一个微小的信息片–它并不是真正的安全首部,但却是隐含了安全功能
Cookie2:用来说明请求端支持的cookie版本
响应首部:
Age:(从最初创建开始)响应持续时间
PUBLIC:是否可以在公共缓存上缓存
Server:服务器软件名称及版本
Vary:服务器查看的其他首部的列表,可能会使响应发生变化;也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出最合适的资源版本发送给客户端(会影响缓存机制);
Set-Cookie:设置cookie
Set-Cookie2 :与Set-Cookie类似
实体首部:
Allow: 允许的请求方法
Location: 资源的实际位置
Content-Language:理解主体时最适宜使用的自然语言
Content-Location:资源实际所处的位置
Content-Type:资源的MIME类型
ETag: 实体标记
Expires:实体不在有效,要从原始的源端再次获取此实体的日期和时间
Last-Mofified:这个实体最后一次被修改的日期和时间