对HTTP协议的理解
主要从两个角度来理解,计算机网络和前端的角度。
一、HTTP简介
在计算机网络协议的发展史中,目前主流的HTTP1.1依旧霸占着市场,新出的HTTP2.0正以兴起之势慢慢浮出水面,它在各大浏览器中的兼容性问题还得进一步解决。
HTTP协议又名超文本传输协议,只要用于从万维网服务器传输文本到本地浏览器的传送协议。它是一个基于TCP/IP的应用层协议,
主要特点:
1.支持B/S和C/S模式;
2.限制每次连接只能处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,就断开连接;
3.HTTP允许传输任意类型的数据对象。传输的类型由content-type标记;
4.客户端向服务器请求服务时,只用发送请求方法和请求路径。也就是常说的输入一个url,并且告诉他我需要用get或者post方法传输。
5.HTTP是无记忆能力的协议,如果后面的处理需要前面的信息,则它必须重传。
二、计算机网络协议角度
HTTP/1.1
HTTP/1.1从1997年发布到现在,过了二十年,它仍旧是目前最流行的版本。
1.它最大的变化时引入了长连接,即TCP连接默认不关闭,不用再像HTTP/1.0那样需要申明connection:keep-alive,只有当客户端和服务器发现对方一段时间没有活动,才会关闭连接。
2.HTTP1.1还引入了管道机制,保证客户端可以同时发送多个请求,解决了客户端只能发送一个请求的窘境,大大提高HTTP协议的效率。
3.加入了content-length字段。既然现在TCP可以传送多个响应,势必要有一种机制,区分数据是属于哪一个响应的。content-length指定本次响应的数据长度。后面的字段就属于下一个响应了。
HTTP/2
2015年发布HTTP/2,它是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧。
1.多工工作方式。HTTP1.1只是解决了客户端一个只能发送一个请求的问题,而HTTP2则让服务器一个也能同时发送多个响应,即到了版本2,客户端和服务器都可以同时发送多个请求和响应,而且不用排队,避免了“”队列堵塞“”。
2.二进制协议。HTTP1.1的头部信息是文本,数据部分可以是文本,也可以是二进制编码,而HTTP2是彻底的二进制。
3.头信息压缩。HTTP2对每次的请求头采用gzip压缩,这样避免了每次请求头中重复出现相同的信息。
4.服务器主动推送。客户端向服务器请求资源A,服务器预测客户端可能需要B,顺便把B也推送给了客户端,避免了客户端多次请求。
HTTPS
HTTP协议因为是明文传输,未加密,极其不安全,于是网景公司设计了SSL协议,用于对HTTP协议传输的数据进行进行加密,从而诞生了HTTPS。后来SSL安全协议升级为了TSL协议,所以现在的HTTPS协议用的是TSL.
三、前端中的HTTP
状态码
请求方法Get和Post
GET请求实例:
1.0 GET http://weibo.com/signup/signup.php?inviteCode=2388493434
2.0 Host: weibo.com
3.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
POST请求实例:
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18
item=bandsaw 2647
区别
1.最直观的区别
就是GET把参数包含在URL中,POST通过request body传递参数。
2.GET请求会被浏览器主动缓存,POST不会。
3.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
4.GET请求在URL中传送的参数是有长度限制的,会受到URL长度的限制,一般URL最长为2KB,而POST没有限制。
5.GET安全性明显低于POST,因为参数在URL中的暴露。
6.GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
相同点:
它们都是HTTP协议中发送请求的方法,HTTP的底层是TCP/IP协议,因此GET和POST也是TCP/IP。
HTTP Hearder详解
HTTP协议采用了请求/响应模型,就整个网络资源传输而言,包括message-header和message-body两部分。先传递message-header,即httpheader消息。http header 消息通常被分为4个部分:general header, request header, response header, entity header。但是这种分法就理解而言,感觉界限不太明确。根据维基百科对http header内容的组织形式,大体分为Request和Response两部分。
以新浪首页为例
General
Request URL :Client请求地址
Request Method:请求类型 get、post、put、delete等
Status Code:响应状态码 200、404、503等
Remote Address:域名对应的真实ip:port
Request header
Accept:客户端/发送端能够接收的数据类型 text/html,application/xhtml+xml,application/xml; Accept-Encoding:浏览器可以支持的- web服务器返回内容压缩编码类型 gzip, deflate
Accept-Language:浏览器可接收的语言 zh-CN,zh;q=0.8
Cache-Control:请求和响应遵循的缓存机制,当前请求的Cache-Control不会影响另一个请求的缓存处理。private(默认)、no-cache、must-revalidate、max-age。这个参数有几种不同的使用场景:
打开一个新的窗口。private、no-cache、must-revalidate会重新请求服务器; max-age在超过时间年龄值时才会重新请求。
地址栏回车。private、must-revalidate只有第一次时会请求服务器; no-cache每次都会请求;max-age在超过时间年龄值时才会重新请求。
后退按钮。只有no-cache每次都重新请求服务器。
刷新。全部重新请求服务器
Connection: 是否保持与服务器的tcp长连接。keep-alive(默认)、close。Keep-alive代表服务会保留当前连接一段时间被其他请求重复使用;close代表请求之后关闭连接。
Content-Length: 请求体的长度
Content-Type: 请求内容的格式/类型 application/x-www-form-urlencoded application/json
Cookie: 客户端缓存的Cookie,在请求发送时会发送到服务端
Host: 请求的服务器域名
Referer: 当前请求的来源
User-Agent: 发出请求的客户端信息 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
请求头
Response header
Cache-Control:请求和响应遵循的缓存机制
Connection:是否保持与服务器的tcp长连接。keep-alive(默认)、close。Keep-alive代表服务会保留当前连接一段时间被其他请求重复使用;close代表请求之后关闭连接。
Content-Type:响应内容的格式/类型text/html;charset=UTF-8标识返回的内容是文本类型,html格式。
Content-Encoding:web服务器支持的返回内容压缩编码类型 gzip
Content-Language:响应体的语言
Content-Length:响应体的长度
Date: 消息发出时间(GMT) Sat, 23 Apr 2016 07:47:54 GMT GMT+8=北京时间
Expires: 响应过期时间
Transfer-Encoding:文件传输编码chunked标识传输内容长度不确定,如果以gzip方式输出时,就不必申请一个很大的字节数组了,可以一块一块的输出,更科学,占用资源更少。
Vary: 提示使用缓存响应还是从原始服务器请求,即当缓存中存在一个未过期的响应是否能被后续的请求服用,Accept-Encoding、User-Agent。如果vary的值中返回了User-Agent,那么通过不同的浏览器打开相同的页面都会重新请求服务器;如果Vary中没返回User-Agent,那么客户端缓存把它看成是相同的页面,相同的请求,直接给用户返回缓存的内容;如果返回的值是Accept-Encoding,将请求头信息中的Accept-encoding字段的值(gzip等)作为缓存的key;如果vary的值为*表示缓存不会去做判断;
额外:
Form data(post)
这个版块是在Request Method为post请求类型时显示的post表单数据。
Query String Parameter(get)
这个版块是在Request Method为get请求类型时向服务端传递的请求参数。
具体reasponse和Requese的参数解释参看:
https://kb.cnblogs.com/page/92320/
HTTP状态码参看
http://tool.oschina.net/commons?type=5