http协议
- http协议的主要特点
1、简单快速:可以通过一个uri(统一资源符)获取数据 2、灵活:通过head,通过http协议可以完成不同数据类型传输 3、*无连接:连接一次就会断 4、*无状态:服务端是不能从http区分两次请求的
- 请求行:请求方法/页面地址/http协议/版本
GET/HTTP/1.1
- 请求头:key/value值,告诉服务端我需要什么类型以及注意是什么类型
host:www.imooc.com
connection: keep-alive
- 空行:告诉服务端往下按照请求体解析
- 请求体:数据部分
- 状态行:协议/版本/状态
HTTP/1.1 200 0K
- 响应头:key/value值
host:www.imooc.com
connection: keep-alive
- 空行:告诉服务端往下按照响应体体解析
- 响应体:一些数据
- http方法
get: 获取资源
post: 传输资源
put: 更新资源
delete: 删除资源
- *post和get的区别
*1.get在浏览器回退时是无害的,但是post会再次提交请求;
2.get产生的url地址是可以被收藏的,但是post不可以;
*3.get请求会被浏览器主动缓存,而post不会,除非手动设置;
4.get请求只能进行url编码,而post支持多种编码方式;
*5.get请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留;
*6.get 在url中传送的参数是有长度限制的,而post没有限制;
7.对参数的数据类型,get只接受ASCALL字符,而post没有限制;
8.get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息;
*9.get参数通过url传递,post是放在request body中
- http状态码
1xx: 指示信息-表示请求已接收,继续处理
2xx: 成功-表示请求已被成功接收;
1.206 ok: 客户端请求成功;
2.206 partial Content: 客户端发送了一个带有Range头的GET请求,服务器完成了她;
3xx: 重定向-要完成请求必须进行更进一步操作;
1.301 moved permanently: 所请求的页面已经转移至新的url;(永久重定向)
2.302 Found: 所请求的页面已经临时转移至新的url;(临时重定向)
3.304 Not Modified: 客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原本缓冲的文档可以继续使用
4xx: 客户端错误-请求有语法错误或请求无法实现;
1.400 bad request: 客户端请求有语法错误,不能被服务器所理解;
2.401 Unauthorizad: 请求未经授权,这个状态码必须和www-Authenticate报头域一起使用
3.403 Forbidden: 对被请求的页面禁止访问;(不允许直接访问,只能通过服务器才能访问)
4.404 not Found: 请求资源不存在;
5xx: 服务器错误-服务器未能实现合法的请求
1.500 Internal Server Error : 服务器发生不可预期的错误,原来缓冲的文档还可以继续使用;
2.503 S尔尔Unavailable: 请求未完成,服务器临时过载或当机,一段时间回恢复正常;
-
什么是持久链接
1.普通模式
http协议采用"请求-应答"模式,当前使用普通模式,即非Keep-Alive模式时,每个请求/应答客户和服务器都要新建一个链接,完成之后立即断开连接(http为无连接的协议)2.持久连接
当使用keep-Alive模式(又称持久链接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive功能避免了建立或者重新建立连接
注意点: *持久连接http1.1才支持,1.0版本不支持
-
什么是管线化
在使用持久连接的情况下,某个连接上的消息的传递是类似于:未断开,共用一个通道
请求1->响应1->请求2->响应2->请求3->响应3
管线化:通道是持久建立的,请求打包一次传输,响应也是打包后一次返回
某个连接上的消息变成了类似这样
请求1->请求2->请求3->响应1->响应2->响应3
管线化的特点:
1.管线化通关持久连接完成,仅HTTP/1.1支持此技术
2.只有GET和HEAD请求可以进行管线化,而POST则有所限制
3.初次创建连接时不应启动管线机制,因为对方(服务器)不一定支持http/1.1版本的协议
4.管线化不会影响响应到来的顺序,如上图得到例子所示
5.http/1.1要求服务端支持管线化,但并不要求服务端也对响应进行管线化处理,只是要求对于冠县话的请求不失败即可
4.由于上面提到的服务端问题,开启管线化很可能并不会带来大幅度的性能提升,而且很多服务器端和代理程序对管线化的支持并不好,因此现代浏览器如:chrome 和 firefox默认未开启管线化支持