HTTP协议
HTTP:Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议
一、工作原理
HTTP协议是工作于客户端------服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务器发送所有请求
HTTP服务器根据接收到的请求,向客户端发送响应信息
HTTP默认端口80(可修改)
注意事项:
1、HTTP是无连接:无连接即限制每次连接只处理一个请求;
服务器处理完客户端请求,并收到客户端应答后断开连接(这种方式可以节省传输时间)
2、HTTP是媒体独立的
只要客户端知道如何处理数据结构,HTTP可发送任何类型的数据。客户端及服务器指定使用适合的MIME-type内容类型
3、HTTP是无状态的
协议对于处理没有记忆能力:后续处理需要前面的信息,需要重传,可能会导致每次连接传送的数据量增大。另一方面,服务器不需要先前信息时,它的应答就比较快
二、请求格式
请求行(request line)
请求头部(header)
空行
请求数据
三、响应消息格式
状态行
消息报头
空行
响应正文
四、通用首部字段
1、Cache-Control
:操作缓存的工作机制
参数:
- public:明确表明其他用户也可以利用缓存
- private:缓存只给特定的用户
- no-cache:客户端发送这个指令,表示客户端不接收缓存过的响应,必须到服务器取;服务器返回这个指令,指缓存服务器不能对资源进行缓存。其实是不缓存过期资源,要向服务器进行有效期确认后再处理资源。
- no-store:指不进行缓存
- max-age:缓存的有效时间(相对时间)
2、Connection
:
- Connection:keep-Alive (持久连接)
- Connection:不再转发的首部字段名
3、Date
:表明创建http报文的日期和时间
4、Pragma
:兼容http1.0,与Cache-Control:no-cache含义一样。但只用在客户端发送的请求中,告诉所有的中间服务器不返回缓存。形式唯一:Pragma:no-cache
5、Trailer
:会事先说明在报文主体后记录了哪些首部字段,该首部字段可以应用在http1.1版本分块传输编码中。
6、Transfer-Encoding
:chunked (分块传输编码),
规定传输报文主体时采用的编码方式,http1.1的传输编码方式只对分块传输编码有效
7、Upgrade
:升级一个成其他的协议,需要额外指定Connection:Upgrade。服务器可用101状态码作为相应返回。
8、Via
:追踪客户端和服务器之间的请求和响应报文的传输路径。可以避免请求回环发生,所以在经过代理时必须要附加这个字段。
五、请求首部字段
1、Accept:通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
q表示优先级的权重值,默认为q = 1.0,范围是0~1(可精确到小数点后3位,1为最大值)
当服务器提供多种内容时,会先返回权重值最高的媒体类型
2、Accept-Charset:支持的字符集及字符集的相对优先顺序,跟Accept一样,用q来表示相对优先级。这个字段应用于内容协商机制的服务器驱动协商。
3、Accept-Encoding:支持的内容编码及内容编码的优先级顺序,q表示相对优先级。
内容编码:gzip、compress、deflate、identity(不执行压缩或者不会变化的默认编码格式)。
可以使用*作为通配符,指定任意的编码格式。
4、Accept-Language:能够处理的自然语言集,以及相对优先级。
六、状态码
101 协议升级
,主要用于升级到websocket,也可以用于http2
200 OK
204 No content
,服务器成功处理请求,但是返回的响应报文中不含实体的主体部分
206 Partial Content
,表示客户端像服务器进行了范围请求(Content-Range字段),服务器成功返回指定范围的实体内容
301 永久性重定向
,表示请求的资源已经被分配了新的url,旧地址以后都不能再访问了,服务器会返回location字段,包含的是新的地址。
302 临时性重定向
,表示请求的资源临时移动到一个新地址
注意:尽量使用301跳转,因为302会造成网址劫持,可能被搜索引擎判为可疑转向,甚至认为是作弊。
原因:从网站A(网站比较烂)上做了一个302跳转到网站B(搜索排名很靠前),这时候有时搜索引擎会使用网站B的内容,但却收录了网站A的地址,这样在不知不觉间,网站B在为网站A作贡献,网站A的排名就靠前了。
303 See Other
,与302功能相同,但是它明确规定客户端应采用GET方法获取资源
304 未修改
,协商缓存中返回的状态码
307 临时重定向
,与302功能相同,但规定不能从POST变成GET
当301、302、303响应状态码返回时,几乎所有浏览器都会把post改成get,并删除请求报文内的主体,之后请求会自动再次发送。然而301、302标准是禁止将post方法改变成get方法的,但实际使用时大家都会这么做。所以需要307。
400 Bad Request
,表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容再次发送请求
401 unauthorized
,表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。如果之前已经进行过一次请求,表示用户认证失败。
403 禁止
,表示拒绝对请求资源的访问
404 Not Found
,表明服务器上无法找到请求的资源
500 Internet Server Error
,该状态码表示服务器在执行请求时发生了错误
500 Service Unavailable
,表示服务器暂时处于超负荷或者处于停机维护状态,现在无法处理请求
七、缓存机制
HTTP的缓存分为强缓存和协商缓存(对比缓存)。
1.强制缓存
在缓存数据未失效的情况下,可以直接使用缓存数据;在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中。
- Expires:缓存过期时间(HTTP1.0)
缺点:生成的是绝对时间,但是客户端时间可以随意修改,会导致误差。
- Cache-Control :HTTP1.1,优先级高于Expires
可设置参数:
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用协商缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发
Expires和Cache-Control决定了浏览器是否要发送请求到服务器,ETag和Last-Modified决定了服务器是要返回304+空内容还是新的资源文件。
2.协商缓存
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
- Last-Modified / If-Modified-Since
Last-Modified
:服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since
:再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。
缺点:Last-Modified 标注的最后修改时间只能精确到秒,如果有些资源在一秒之内被多次修改的话,他就不能准确标注文件的新鲜度了。如果某些资源会被定期生成,当内容没有变化,但 Last-Modified 却改变了,导致文件没使用缓存有可能存在服务器没有准确获取资源修改时间,或者与代理服务器时间不一致的情形。
- Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)
Etag
:给资源计算得出的一个唯一标志符。
If-None-Match
:再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识。
八、HTTP请求方法
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。